Automated Cell Culture (e. coli, stem cells, immune cells)

Does anyone use their robots to maintain cell culture e.g. media replacement, passaging, plate reader integration for cell density? We use ours for PRANCE (phage-assisted evolution with live culture of e. coli), constant turbidity cell culture (turbidostat), and kinetic luminescence assays. I’ve also worked with the Allen Institute to implement stem cell microscopy and maintenance routines in their workflows, and I’ve seen papers on using STARs to culture embryoid bodies in microwells.

Does anyone else use robots for these types of protocols?


Our plate reader isn’t on deck but OD normalization was one of the first applications for our biomek. Overnight plates with 100-200 cultures then back-diluting individually to 0.1 based off a script + plate reader results to start a series of growth assays.

We’re also trying to spec out a system for performing fed-batch fermentation in plates with cold storage to enable samples to be frozen for metabolite analysis but that’s mostly a dream right now

1 Like

We did an automated Media Exchange workflow for a client. Hamilton integrated with a Liconix store for the cell plates. The application we built for the Media Exchange allows users to create batches by selecting cell plates in the store by the barcode via our GUI, and also specify exchange transfer parameters such as Aspirate and dispense volume, height, speed (uL/s), offset, etc. These batches could be scheduled to run at later times.

1 Like

Highly interested in this. We’re exploring the possibility of doing fully automated bacterial cell culture in 96-well. But I have no idea where to start to be able to automate the process of getting the growth curve in 96-well without some programmatic solution of figuring out proper dilution factors to get your OD600 reads within range of a typical plate reader. Anyone got any cool solutions?

You’ll be happy to hear that my lab has created an on-deck turbidostat method which uses an integrated plate reader to measure OD600 and then uses a growth curve estimate to dilute culture with media provided on-deck. Sorry the documentation is a little sparse (and you’ll have to learn PyHamilton to understand it) but I’m happy to walk you through the code if you’re interested.

1 Like

There’s been a few groups who’ve shown its possible to read yeast/bacterial cell density outside the standard range people use for ocular density, so long as an appropriate calibration curve is fit. I’d see if you’re able to replicate that in your lab first as it doesn’t really have any cost to try.

One of papers covering this technique: link

1 Like

It’s fortunate that I stumble across this! I’m currently automating an end-to-end gene assembly workflow for my company. The original specification for the workflow stopped after the plasmid had been assembled, but in my eyes the logical next steps are to automate the transformations into the cells, the plating of the cells and the incubation. Perhaps colony picking after that, but I’m getting ahead of myself!

@ehung which platform are you working on, what does your system look like, and what equipment do you have available? That will largely dictate what your solution will look like.


Just doing initial brainstorming for this system. But our current integrated system runs on Green Button Go. This workflow would probably involve buying a completely new integrated system to implement. We’ve tested out a Cytomat 2 shaker just to see if our cells grow, and that’s about as far as we got. I’m wondering what others have done, or are trying to do because with synbio blowing up now there has to be people doing/trying to do this. Fun problem to think about. Unfortunately most solutions are based around mammalian instead of bacterial.

1 Like

Hi Stefan,
We see a ton of these applications come through our doors and I am personally working on 2 unique opportunities to automate these style processes. Full disclosure, this is not my field of expertise, but overall, the processes are automation compatible. We advocate customers moving to SBS formatted plates and there is a plethora of instruments for washing, reagent add-ons, and centrifugation. A few of these we have built enclosures to seal the entire system from contamination. I think another consideration is the multiday experiment set up that this would entail. I have seen cell culturing activates be extended out to multiple months with multiple refeeds during that time. This creates a major problem with tracking data and scheduling runs.

@ehung I would say there is a lot of interest in the tower shaker options on the cytomat 2 for this style of assay. I think the only downside for the cytomat 2 is capacity if you are looking at a large-scale operation.

1 Like

Glad to know others are working on it out there. FYI, I was told the Cytomat shaking line is very close to releasing and 8 tower version very soon. Do you have any experience with the Liconic version of shakers? Any downsides?

1 Like

@ehung from an integration standpoint, the only downside for Liconic verse Cytomat from my perspective is the ease of hand off nest adjustability. Cytomats are slightly more adjustable when integrating into automation line fed systems and under table applications. I have not personally implemented the shaking feature on a Liconic.

Yes i have done this. What we did was 2 dilutions. The first one just some 1 in 1000 of the whole plate and let them grow a bit to the point that your plate reader can measure all the wells. They are going to have too much variation so then you have to calculate a new dilution factor for each well and bring it back down and let it grow again

One thing to consider is that you have to stop shaking to get plates in and out of a shaking incubator.

Im not convinced bacterial culture needs to be in an enclosure especially if using two antibiotics.

We use lids for our on deck culture. Otherwise there can be cross contamination due to flyover

If you need shaking in an incubator, cytomat is the way to go. Check out Mike’s post:

If you need to orchestrate a biological process, you should check this out:


I have built a couple of platforms for cell maintenance on and EVO and Fluent with the view to formally integrate a SparkCyto to have a more closed loop cell maintenance based on cell count and viability.

The EVO is more flexible as it has a feature called TeFill so you can pull up to 6 buffers/media through the system liquid. So using the 5ml syringes like pumps to dispense very large volumes so perfect for 5-100ml dispensing. The reason we chose the SparkCyto is it has a wide range of reading modes from Brightfield to fluorescence or luminescence so not limited by assay type. We settle on using Celleca Plates and their reagents as they are able to 24 cell counts in under 3 minute, so the throughput was not too limited. The image analysis needed to be tweaked but if you know your cell thresholds then a logic gate to media change/split/return to incubator was all you needed.

This was done a while ago but you can use a Cellaca or Celigo in place of a Spark Cyto but we were looking for a system that could also support other cell assay work.

1 Like

@Stefan would you be able to repost the github link? It seems to be broken. Thanks!

1 Like


This code is actually going through some major revisions and wasn’t very readable in its original state. Here is the main controller loop in our current implementation. Essentially you want to convert from absorbance measured in a plate reader to a dilution volume for your bacteria wells. I hope this helps!

while True:
    move_plate(ham_int, plate, reader_tray)
    timestamp, plate_data = read_plate(reader_int, plate, protocol_names)
    od, *fluor = plate_data
    db_add_plate_data(od, 'abs', plate, plate_well_idxs, timestamp) 
    for fl in fluor:
        db_add_plate_data(fl, 'flr', plate, plate_well_idxs, timestamp)
    move_plate(ham_int, reader_tray, plate)
    od = convert_ods(od, plate)
    turb_vol = 200 # Make this a variable in plate_ctrlrs
    replace_vols = transfer_function(plate_ctrlrs, turb_vol, od, timestamp)
    dilute_plate(plate, plate_lid, media, media_lid, tips, replace_vols)
    plate_index += 1