Hi everyone,
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 aTubeRack
,PetriDishRack
,TroughRack
that enables assignment of individualTube
,PetriDish
orTrough
instances to specific positions on said rack.
The only way this is currently possible is via assignment ofTube
orTrough
to entireTubeCarrier
orTroughCarrier
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
aChannelHeadAdapter
…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-Tip
ChannelHeadAdapter
-
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 …
@handle_error(error_types=["no_liquid_detected"],
how={0:"repeat_from_well_bottom",
1: "wait_for_user_input"}
apply_to_channels="all")
await lh.aspirate(source_wells, lld_mode=pressure, vols=[5]*num_channels)
…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 offrontend(backend=backend_instance, physical_definition=resource_instance)
.
Defined as…frontend
- what users interact with in a Python scriptbackend
- 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.