I’d like to propose a biannual “PLR roadmap” discussion where we share our plans and ideas for the next six months.
This is an open invitation to all skill levels—whether you actively develop, contribute ideas, or simply want to see certain features implemented. Here’s how you can participate:
Share what you plan to work on.
Share what you’d love to see developed by the community.
The goal is to align efforts, improve feature development, and collaborate more effectively to make progress together.
Let me start!
By the end of Q2 2025, I plan to work on and/or would love to see progress on the following open-source PLR development projects:
create real ContainerRacks
…currently PLR does not have a TubeRack, PetriDishRack, TroughRack that enables assignment of individual Tube, PetriDish or Trough instances to specific positions on said rack.
The only way this is currently possible is via assignment of Tube or Trough to entire TubeCarrier or TroughCarrier instances.
But physically, racks exist for both and can be placed into the position of an SLAS-standard-sized plate_holder/plate_site.
help create stable versioning
…for PLR to enable proper app development for endusers we must have stable PLR versions → stable versions enable containerisation → simplifies specialised apps and their deployment → simplifiea end user experience.
advertise → more users → more dev → more utility for everyone
create NestedTipRackStack
…up to 4x your tip throughput (without mid-run restacking)
write a lot more documentation
…most common PLR feedback I’ve received: wish for more documentation to accelerate entrance into the PLR ecosystem.
start the PLR Protocol Library
…one subfolder in PLR:main listing protocols users have freely added, organised by application (?) (possibility of automatic one-click conversion to other liquid handlers? ).
create ChannelHeadAdapter (structure: Resource > ChannelHeadAdapter > Tip)
…most channels/pipettes can pick up a lot more than just tips; PLR should enable the use of all adapters if they fulfil pickup requirements; generating this resource subclass aims to start this enablement process.
make Tip a ChannelHeadAdapter
…Tip is currently not a resource; should standardise and giving tips additional (currently not captured) attributes: e.g. tip_conductive?.
look into CO-RE tools like the grippers → make ChannelHeadAdapter
…one example of a non-TipChannelHeadAdapter
implement default firmware error handling
…currently PLR is sending commands to a machine, the machine responds to PLR… PLR doesn’t respond back - very one-sided conversation
After some conversations with @rickwierenga, I propose decorator-based callback functions: e.g. add …
…to enable automatic repeating of any aspiration that failed because the machine erroneously failed to (e.g.) detect a liquid in one of the source_wells.
i.e. PLR uses decorators to dynamically respond to machine responses with pre-defined actions.
standardisation of frontend-backend-physical_definition relationship for machines
…some machines currently have 2 frontends (?) while other machines like the liquid handlers have a simple, easy and effective structure of frontend(backend=backend_instance, physical_definition=resource_instance).
Defined as…
frontend - what users interact with in a Python script
backend - controls the machines functionalities (e.g. heating/cooling/shaking/aspirating/moving resources/…)
physical_definition - defines the physical world 3D shape of the machine (including child location(s)/rails/deck_positions/…)
I would find it a lot more intuitive if this simple structure is applied to all machines (e.g. temperature controllers, shakers, tilter, …).
This would also simplify the use of these machines as simple plate_holders: e.g. a shaker that is bolted into the deck, used in one automated Protocol (aP) but not another → when not used it doesn’t require a programmatic connection but can be usefully integrated into the aP as plate_holder.
New Machine integrations:
new plate washers
first mechanic arm integration (maybe with specified inverse kinematics control )
Looking forward to hearing your thoughts and contributions, and am very happy for others to beat me to implementing any of this or working together on any of these projects!
Of course, there is no obligation to implement (or even stick) to such a roadmap, and plenty of ideas will naturally evolve due to the open-source nature of the project which a roadmap or list of ideas cannot capture a priori.
So please feel free to continue adding new ideas outside the scope of what we write down here.
I’d like to work on better Opentrons (OT2) integration. I think there are some ways to do it well and reliably, but I think it takes a slightly different route than what is currently in PLR.
Share what you’d love to see developed by the community.
I really like the http server bits of PLR, and would like to see that + machine integrations be a thing. For example, if I combine a liquid handler and a centrifuge, I want a way to address both at once over an http server (combining them both as a kind of workcell). These workcells would be easier to reproduce than single machines, and software could be written against them as a unit.
first mechanic arm integration (maybe with specified inverse kinematics control )
I have a lite6 robotic arm from ufactory which is really good - got inverse kinematics built in and a python API and everything. You can get it for $3500. It’s pretty cheap because it is direct from the chinese company that builds em, and they have built them for years (usually larger arms for industrial applications). However, the biogripper is $2100 so I haven’t bought it yet. Good option for a mechanic arm integration.
thank you Camillo for taking the lead on this. Upon reading this I agree that more planned & organized development, rather than schizo ad-hoc development of the past, can be an accelerant for PLR.
All of your suggestions are excellent. For me, I particularly want to focus (and can take the lead on?):
Last week, I was able to create a protocol where every plate/resource/operation was already defined. It took less than an hour to write & water test this protocol with copilot. Since most of our protocols are fundamentally easy to express, writing code (one medium expression) should also be trivial.
I suggest creating a new thread on the forum for every individual action-point to be discussed in more detail. We already have threads for some topics. Let’s keep this thread to what Camillo proposed:
It would also be great to have a look at the EVO backend. It has not been updated for a while and last time i check it could not run.
We would like to do the updates our selvs but with the little time i have i cant keep up with the updates to PLR and dont know where to start. Can we make a EVO backends development plan?
We are currently fixing the problems with the EVO we have. I think the main challenge is that the code has fallen behind the rest of PLR and that we are using fixed tips that probably changes some of the settings on the instrument.
Sorry if the previous message sounded snarky (specially when i have not answered before now).
for a while i had a tecan dev branch (GitHub - PyLabRobot/pylabrobot at tecan-dev-branch) this was >1y ago, but has some new unmerged changes like PnP module. It got messed up when i rewrote git history. I will see if I can merge this into PLR soon, it should be a little bit more up to date than the current code. (Although tests still pass, so the stuff that was working before should still work. If not, we need better tests.) fwiw, we also had fixed tips on the evo that was used to develop the backend initially.