Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
Your lab's animals, stocks and supplies in one app: mouse colony, zebrafish, flies, worms, plasmids, inventories, calendar and lab notebook. Free and open source.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Your lab's animals, stocks and supplies — in one place, instead of twenty spreadsheets.
Mice · zebrafish · flies · worms · plasmids · samples · orders · reagents · chemicals · antibodies · viruses · calendar · notebook
Home — every morning, what needs doing today.檢視完整 README ↗BioManager replaces the pile of spreadsheets, whiteboards and paper cage cards most labs run on. You edit records the way you would in a spreadsheet, but underneath is a real database. It knows which mouse is in which cage, when a litter needs weaning, which fly vials need flipping and which antibody is about to expire — and it tells you.
It runs as a desktop app for one person, or on a lab server that everyone signs in to from a browser, including on their phone at the rack.
| Module | In one line | |
|---|---|---|
| 🐭 | Mouse colony | Mice, cages, litters, breeders, strains, experiments and racks |
| 🐟 | Zebrafish | Lines, tanks, fish, clutches, matings and water systems |
| 🪰 | Drosophila & C. elegans | Vials and plates, crosses, and temperature-aware flip schedules |
| 🌱 | Plants and field crops | Sowings, trays or plots, harvests kept as seed lots and sown again, generations and the 3:1 |
| 🦎 | Any other organism | Your own database, in your own words, with no programming |
| 🧬 | Plasmids | Sequences with an interactive map, assembly of new ones, and where each tube lives; primers, glycerol stocks and viruses beside them |
| 🧪 | Lab inventories | Samples, orders, reagents, chemicals, antibodies, viruses, primers, glycerol stocks, cell lines, or a list of your own |
| 📅 | Calendar & notebook | Experiments, to-dos and colony dates; a shared lab notebook with data sheets, protocols, paper notes and meeting notes |
The most complete module, built around how a mouse room actually works. Tabs across the top: Mice, Cages, Litters, Breeders, Experiments, Strains and Dropdowns. My colony, My groups, Shared and Everyone change which mice and cages you see, never what you may edit.
Lines with their ZFIN names and founders, tanks, individual fish, clutches, water systems and a sac log. Set up a mating records which tanks went in and when they go back, and they stay on Home until someone marks them Returned; New clutch records each fertilisation against its cross. Log reading keeps each system's temperature, pH, conductivity and salinity, with a chart, and can raise an alarm. A tank can hold a group with a headcount, or resolve into named individuals. A fish row's dot is blue under 3 months post fertilisation, green to 18 months and red after. The Experiments tab, beside Tanks and Fish, works as the mouse colony's does, with fish in mind: start with a tank's fish rows, or a clutch's larvae, record drug in the water, microinjection, a heat shock or an injury, and follow survival (how many of those at the start are still alive), standard length or a phenotype.
Vial (fly) and plate (worm) databases: vials in racks and plates in boxes, inside incubators, each incubator at its own temperature.
Add database → Plants (pots and trays in growth rooms or a greenhouse) or Field crops (plots in a field, raised first in a nursery and transplanted) makes a database that speaks of plants: it is Sown and Harvested, not born and dead, and has no sex.
Choose Add database in the sidebar, start from a mouse-like, zebrafish-like, plant-like or blank organism, and describe it:
[!TIP] Xenopus, axolotls, cell lines, yeast strains — anything you keep in containers and breed or passage fits here. No code and no migration.
Only what your lab keeps, in the order you work. No database is there by default, the mouse colony, zebrafish and plasmids included: the lab adds what it uses (from the setup survey, or Add database → Ready-made databases), and an admin can switch one off in Settings → Databases without deleting anything; its records come back when it is switched on. An admin drags the databases into the lab's order right in the sidebar (or All databases → Order in the sidebar), the same for everyone. All databases groups them into Animals and Molecular & supplies, and every database has the same two buttons beside its name: Configure (for whoever may change it) and All databases. Icons are picked from a grid of the icons themselves.
Upload a GenBank, FASTA or SnapGene file and BioManager keeps the sequence
and its features, with an interactive map you can edit. Plasmid boxes sit
on the same rack grid as everything else, so every tube has an address.
Each tube keeps its miniprep's concentration (ng/µL) and 260/280, and a
plasmid can be Lab common: anyone can edit it (or, shared with a
project group, its members), while its owner still decides whose it is. A plasmid's page lists the notebook pages that
@plasmid it, and its address is its number (plasmid #12 is /plasmid/12).
Show them as a Table, by storage Boxes, or as a List. In the
sheet, Sequence beside a plasmid's number opens its sequence and map
(Add sequence when it has none yet). Download gives it as
GenBank or FASTA, and Versions keeps every earlier sequence to
restore. Made from records its backbone, insert or template (in the
lab or from Addgene) and how it was made; its page shows what it was made
from and what was made from it, with a family tree. Assemble a
plasmid builds the next one from the ones you have: fill a tray with
fragments — a whole plasmid, one feature, a region, or a piece an enzyme
leaves — and put them together by digest and ligation, by Gibson /
NEBuilder HiFi, or by Golden Gate. Every junction shows its own
bases, and one line says what is wrong and which end it is ("Fragment 2's
3′ end has no overlap with fragment 3") before you make anything. The
product arrives as an ordinary plasmid, with every fragment's features at
their new places, each fragment marked on its map, Made from filled in
for all of them, and — for a Gibson — the primers it needs designed,
costed by melting temperature and waiting in the Primers database to
order. Primers, glycerol stocks and viruses each name the plasmid they came
from, so they are tabs of one area rather than four entries in the
sidebar: Molecular biology, called just Plasmids while the lab
has none of them. The Feature library
keeps the lab's elements (promoters, ITRs, LTRs, WPRE, resistance genes)
by sequence, from any well-annotated map, and Detect features marks
them on another plasmid; a lab that installs pLannotate on its server also gets
Annotate with pLannotate, which finds elements by alignment rather than
exact matching. Nothing is built into the library: its elements come from
your own files (Add to library above a map, or Read elements from
files), and an admin can , about 1,900
elements from widely used plasmids, downloaded when asked for. on its Storage tab keeps
the sequencing reads, gel photos and datasheets that belong with it, and
they come along in Export my data. , below the map,
checks Sanger reads of a miniprep or clone against it: choose the
chromatograms (or FASTA, or paste the bases) and each read is trimmed of
its poor ends, placed on the map on either strand (across the origin
too), and compared base by base. You get a line for the clone ("Matches
the map across 425–1,359, covering EGFP", or "1 difference from the map:
C→A at 740 in EGFP (A14D)"), where the reads lie over the map, and every
mismatch, insertion and deletion with the read's quality there, the
features it falls in and what it does to a coding sequence's amino acid;
one at low quality is marked as a likely sequencing error. From an
, each difference shows its stretch of trace, and a read with
second peaks under many bases is said to look like a mix of two clones
(and where they part, when an insertion or deletion splits them). files them under
, each noted with what it showed, to check again later. An
assistant can do the same with , from reads uploaded
as captures. A primer drawn on the
map is kept in the Primers database, linked to the plasmid; the page lists
where each binds, and or
gives the ticked ones to your oligo supplier. Before ordering another,
looks through every primer the lab has saved,
whichever plasmid it was made for, and lists the ones that bind this
sequence — exact matches, and those matching at the 3′ end with a 5′
tail — and draws them on the map to look at, without
saving them into it.
Every database takes columns of your own — Configure → Your own columns, on the mouse colony, zebrafish and plasmids as on the others: a weight, a score, a date, a choice from your own list. They show in the sheet and in each record, and come along in Export my data. Taking a column away hides it without losing what your records hold in it.
Every inventory runs on the same engine, starting from a preset you can change:
| Preset | Tracks |
|---|---|
| 🧫 Samples | harvested tissue and material, linked to the animal it came from (type its ID in Source, or set a whole harvest at once), with that mouse's Custom tag beside it and its Genotype from the colony, and its sex, age, genotype, status, owner and cage on hovering the arrow that opens it; a tab for each type (tissue, blood, DNA, RNA… and any you add with +), each with its own columns: a tissue's Tissue, Fixation and Orientation, a DNA's or RNA's concentration, unit, 260/280, 260/230 and volume as numbers; stored at RT / 4 °C / −20 °C / −80 °C / LN₂ in a box position |
| 🛒 Orders | a board from requested to ordered to received, with vendor, catalogue number, price and grant account |
| ⚗️ Reagents | quantity (with a Low at level that marks a bottle low as it runs down), concentration, CAS number, hazards (several per bottle), supplier and lot, and expiry dates with warnings |
| 🧂 Chemicals | your lab's chemical list: name, abbreviation, CAS number, molecular weight, purity and density, with lot, expiry and where each bottle is, and its hazards, several at once, including the controlled classes a safety office asks about (drug and explosive precursors, highly toxic); a Formulation in the notebook picks from it and works out the moles, and Utilities' calculators know each molecular weight |
| 🔬 Antibodies | host, clonality, clone, conjugate, reactivity, applications, dilution, RRID and where each vial is stored |
| 🦠 Viruses | AAV, lentivirus, rabies and other vectors: serotype, promoter, payload, titer, biosafety level, the date made, and the plasmid each was made from — which opens that plasmid, or its sequence and map to read, and whose page lists every virus made from it |
| 🧬 Primers & oligos | sequence, direction, target and pair, with length, GC % and Tm worked out from the sequence; Add primer pair makes the forward and reverse at once, linked and side by side in a box; a primer drawn on a plasmid's map lands here with the plasmid named, Find saved primers on a plasmid lists the ones here that already bind it, and Copy for ordering / Export for ordering hand the ticked ones to your supplier |
Each inventory can keep your own stock apart from lab common
stock, and statuses and categories can be renamed without losing items.
Renaming a database moves it to its new name's address; the old one keeps
working, so printed labels, bookmarks and @mentions still find it. Every
database has a name of its own (one another database has is refused), so
@ and a name in a notebook page always means one database.
10 mL), in the dialog and as a column you can show in the sheet.
An AI assistant told "2 mL used" then takes 0.2 of an ampoule off its
quantity; without one it says what is missing rather than guess.Every database has Import from Excel, under ••• at the end of the toolbar above its sheet: mice, fish, plasmids, fly and worm vials, any organism database and every inventory. Upload the workbook (.xlsx, any sheet), CSV or TSV you kept your records in, as it is (up to 15 MB and 5,000 rows):
A1, B2…
is a position in a box, one of Freezer 2 is a location note. Chinese
headers count too (性别, 出生日期, 笼号, 质粒名称), in a CSV
saved by Excel on a Chinese Windows as well. Each match says why it was
made, and you can change any of them.Header: value (or Leave out skips it), so
nothing is lost.12-May-26,
or a date number; a future date of birth is left blank and kept in the
notes), Male/m/♂/公 → M, your lab's own statuses, people by
name, a plasmid's 152.6 ng/µl as its concentration. A cell merged down
over several rows (a Cage # typed once for its mice) counts for each;
typed once with blank cells below instead, a cage, rack, box or tank
column offers Its blank cells take the value above them, ticked
(untick it if a blank means none). Cages the import makes belong to
their mice's owner.Print correctly sized cards and labels: Cage cards on the Cages tab, Tank labels for zebrafish, Labels on a fly or worm database, and Labels on ticked samples, reagents or any inventory's rows. Scan the QR code with any phone camera at the rack and that cage opens, ready to edit — nobody walks back to a computer to type an ID. On a phone every sheet row becomes a card with its columns under their names, and rack grids get a Move button: tap a cage, then where it goes.
On a phone: Android has its own app (BioManager-Android.apk from the download page; Scan reads cage cards). On an iPhone or iPad, open the lab server in Safari and Share → Add to Home Screen: it opens full screen like an app, and the camera scans the cards. Phones reach a lab server, or a desktop that shares its lab on the network. A bar at the bottom of the screen holds Home, Calendar, Databases, Notebook and Scan, with Search beside it.
Label printers: Print on chooses a sheet of cards for any printer, or a label printer's roll — Brother QL (62 × 29, 90 × 29, 100 × 62 mm), Zebra (2 × 1, 3 × 1, 4 × 2, 4 × 2.5 in) or cryo-tube labels — and prints one label a page, typed to fit. Each person's choice is remembered.
What each label says: for tubes, On each label chooses the fields (box, position, lot, a column such as concentration, the day printed…), remembered for each database, and Two lines for long text wraps a cryo label's name and place instead of cutting them.
Zebra: Download for Zebra (.zpl) gives the labels in the printer's own language. Or an admin adds the Zebra's address once, under Send labels straight to a Zebra on the network, and Send to Zebra prints them straight away.
The interface follows Apple's Liquid Glass design: the sidebar, the row of tabs and each page's buttons float as frosted glass over the page, which scrolls beneath them, while the records themselves sit on solid ground so they stay easy to read. On a Mac the desktop app has no title bar; its close, minimise and zoom buttons sit at the top of the sidebar, followed, as in Safari, by buttons to hide the sidebar, search everything, and go back and forward. Hidden, the sidebar narrows to a column of its places, each icon with its name under it. There is a full dark mode, following the system's setting (in the desktop app, View → Appearance chooses Light or Dark), and Reduce Transparency, Increase Contrast and Reduce Motion are honoured. It works in any modern browser on Windows and Linux too.
Text is set in Inter, which tells I, l and 1 apart in IDs and genotypes and looks the same on every computer, with each system's own Chinese font. Settings → Appearance & language → Font switches to the computer's font, and Text size makes everything smaller or larger in the Mac app.
Settings is laid out like the Mac's System Settings: a list of panes on the left (You: Profile, Sign-in & security, Appearance & language, Notifications, AI assistant & tokens, Your data; Lab: Statistics, General, Databases, People & access, Devices & copies, History) and the chosen one beside it, its settings in grouped rows with a short line on what each does. A change is saved as it is made, and the search box at the top finds a setting by name. Your Short name under Profile (up to 5 letters, THX) is what your round badge says, at the top right and on your records; without one it shows your initials. The lab's panes hold its setup and its admin pages: everyone sees them, admins change them. Statistics counts the lab's mice, fish tanks and fly and worm vials, by person, and shows how full each rack and box is.
Each person can pick their own app icon in Settings → Appearance & language: a double helix, mouse, zebrafish, C. elegans, Drosophila, cryobox, microtube or petri dish, in one of six macaron colours. The browser tab and sidebar show it, and the app's accent colour follows it.
BioManager is in English and Simplified Chinese. It follows the language a person's computer or browser asks for first (the desktop app, the computer's); each person can choose for themselves in Settings → Appearance & language, which changes as soon as they pick, or with the 中文 / English switch on the sign-in page, which stays their choice once they sign in. Every page is in both: each database, the calendar, the notebook and experiments, Settings and the lab's panes in it, and the messages and notifications, which reach each person in their own language. Names, notes and everything people type stay as written, and so do exports, labels and the API. The website has a Chinese version too, at biomanager.org/zh.
flowchart TB
subgraph one["💻 Desktop app"]
direction LR
A[You] --> B[BioManager.app] --> C[(SQLite on<br>your computer)]
end
subgraph lab["🏫 Lab server"]
direction LR
D[Lab members<br>laptops & phones] -- HTTPS --> E[BioManager] --> F[(PostgreSQL)]
F -. nightly, tested .-> G[Backups]
end
| 💻 Desktop app | 🏫 Lab server | 🛠️ From source | |
|---|---|---|---|
| For | one person, one computer | a whole lab, from any browser | developers |
| Database | SQLite, on your computer | PostgreSQL | SQLite (or PostgreSQL) |
| Setup | download and open | the desktop app sets it up for you (or Docker by hand) | Python 3.11+ and Node |
| Backups | dbtool.py backup | automatic, nightly, test-restored weekly, optional off-site copy | dbtool.py backup |
| Phones & QR codes | — only your computer, unless it shares its lab on the network | ✅ | on your local network |
[!NOTE] Start on the desktop and move to a server later: Set up a lab server in the desktop app can bring this computer's records along (by hand,
scripts/migrate-to-postgres.pycarries an existing database across).
One device holds the lab's master copy; every other one works on it through its address, so nothing is ever merged and nothing written in two places is lost. Settings → Devices & copies → Devices says which device it is and lists every computer linked to the lab:
Every computer, phone and browser you are signed in on is one of Your devices (Settings → Devices & copies): rename one, or Sign out one (a lost phone) without changing your password. Admins see everyone's.
Animal facilities often have no signal. The Android app and the desktop app keep a copy of what you need there (the colony's racks, cages, mice, litters and recent weights, your to-dos for two weeks, vials and tanks, as you may see them), refreshed when they open, when the network comes back and every 15 minutes; Get ready for the facility (hold the Scan button) takes a fresh one. When the server can't be reached, the app shows offline screens instead of an error: find a cage by its ID or card, or scan it, and Record a weight, Died, Move, Note, Litter born, Genotyping, Wean, tick a to-do, flip or discard a vial. A Breeding cage lists each litter not yet weaned, and Litter born, Genotyping and Wean ask which, as the pages do. Each shows at once, marked waiting. Back in signal the changes reach the lab in the order you made them, through the pages' own rules, as you. One that clashes with a change made meanwhile (the same field, set to something else) waits under Needs your decision (Keep mine, Keep theirs, Edit); a different field is kept along with yours; one the lab refuses is listed with the reason.
BioManager.exe;
at the warning choose More info → Run anyway. Linux: mark
BioManager-Linux.AppImage executable and open it. The apps aren't
signed by Apple or Microsoft, so the system asks once per version.On a Mac the app has a full menu bar: File (New Tab ⌘T, Close Tab ⌘W, Export This Sheet ⇧⌘E, Print ⌘P), Edit (the usual editing commands and Search BioManager ⌘K), View (Reload ⌘R, zoom, Light or Dark whatever the system uses, Full Screen), Go (Back ⌘[, Forward ⌘], Home ⇧⌘H, next and previous tab ⇧⌘] ⇧⌘[, and everything in your sidebar, the databases on ⌘1 to ⌘9), Window and Help (the user guide, keyboard shortcuts, what's new, report a problem). Settings… is ⌘,. On Windows and Linux the same destinations are in File, Go and Help.
Check for Updates… (in the BioManager menu, or Help on Windows and Linux) asks GitHub for the latest release and, if it is newer, shows what's new. Install and Restart downloads it, checks it against the checksum GitHub publishes, and swaps it in as the app quits (the old one is kept until the new one opens); where it can't (the Linux .tar.gz, a folder it can't write to), it opens the download in your browser. The app also checks by itself, at most once a day; turn that off with Check for Updates Automatically. The check sends nothing but the app's version.
A lab server looks for a new version once a day and tells its admins
(a notification, and Settings → Version, with
what's new and a link to the release notes). Update now there takes a
backup, downloads the new version, checks it against the checksum GitHub
publishes, installs it and restarts the server; BioManager is away for a
minute or two and the page comes back on the new version. It needs the
server's helpers installed once (sudo host/install.sh, which every set-up
route runs); without them the pane says so, and the runbook's "Updating
the app" does the same by hand. The check sends only the server's version;
turn it off there, or for the server with BIOMANAGER_UPDATE_CHECK=0. The
phone apps open the server, so they are always on its version.
After an update (the desktop app's, or the lab server's), the first page each person opens shows a short What's new: what is new, what works differently and what was fixed, with a link to the full release notes. Got it closes it for good; Help → What's new opens it again.
The window keeps you signed in and keeps your tabs from one launch to the next, as a browser does.
On Windows the window is Microsoft Edge WebView2, which Windows 11 has. A Windows 10 PC without it gets an offer to download it from Microsoft, and BioManager opens in the web browser meanwhile (leave its message open while you use it); once it is installed, BioManager opens in its own window again.
Your data lives outside the app, so updating or reinstalling never touches it:
| System | Data folder |
|---|---|
| macOS | ~/Library/Application Support/Biomanager/ |
| Windows | %APPDATA%\Biomanager\ |
| Linux | ~/.local/share/Biomanager/ |
./scripts/build-desktop.sh
open dist/BioManager.app
This produces dist/BioManager.app on macOS, or dist/BioManager/ on
Windows and Linux.
The easy way: let the desktop app do it. In the desktop app, choose Set up a lab server (when you start a new lab, or in Settings → Devices & copies) and say where it should run:
It signs in over SSH with your key, or with the account's password if you have no key (as on a NAS: under SSH key, choose No key: sign in with a password), and asks for a password for sudo too when the account needs one; passwords are used for that one run and never saved. It installs Docker (and Tailscale) if needed, downloads the release's server bundle, writes its settings with a fresh database password, can bring the desktop app's records along, starts it (on ports 80 and 443, or others it finds free when the machine already uses those, as a NAS's own web pages often do), sets up alerts and backups, and checks that it answers. Every step and every command is shown before and while it runs; at the end you get the address and the setup code for the admin account.
A lab already in the desktop app goes to a new server whole: in the
desktop app, Settings → Devices → Move this lab to a server, with the
server's address and setup code. Records, accounts and uploaded files go
there; the desktop then opens the server and keeps a daily copy, and its
own lab stays as it was, read only (Use this computer's own lab again
brings it back). A server it can't reach takes the lab as a file instead:
Save the whole lab on the desktop, then Bring a lab from the desktop
app on the server's This server has no lab yet page. To start a
server's lab over, deploy/RUNBOOK.md has a script that sets the lab
aside (and puts it back).
By hand: the supported setup is the Docker stack in deploy/:
HTTPS, PostgreSQL, and a backup service that dumps the database every
night, checks each dump and test-restores one every week.
git clone <this repository> biomanager && cd biomanager/deploy
cp .env.example .env && chmod 600 .env # set DOMAIN, POSTGRES_PASSWORD, TZ
host/ports.sh # 80 and 443, or free ones if those are taken
docker compose up -d --build
docker compose logs app | grep "setup code"
Open https://<your domain>/register (with the port, such as :4443, if
host/ports.sh chose other ones) and create the first account with the
setup code from the log. That account is the admin; signing in, it
answers four questions about the lab, and BioManager sets itself up to
match.
[!IMPORTANT] Keep the server off the open internet: on the campus network, a VPN, or a private network such as Tailscale —
deploy/README.mdwalks through it.deploy/RUNBOOK.mdcovers what to do when something goes wrong.
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
(cd frontend && npm install && npm run build:css)
PORT=5055 python run.py
Open http://127.0.0.1:5055 (on macOS, AirPlay holds port 5000). The first account needs the setup code printed in the terminal.
Want something to click around in? python scripts/demo-data.py /tmp/biomanager-demo builds a made-up lab — the one in these
screenshots — and BIOMANAGER_DATA_DIR=/tmp/biomanager-demo python run.py
opens it.
A walk-through for a mouse colony. The other modules work the same way.
Open the breeding cage, choose Litter born and confirm the date of birth (today unless you change it). The weaning and genotyping dates appear on Home and the calendar when they come due. At weaning, add the pups with Add many and move them to their new cages. If the cage's last litter isn't weaned yet, say whether this is Another litter (both are kept, each with its own dates) or Correct the date.
Tick the mice on Mice (shift-click selects a range). In the bar that rises from the bottom, choose Add to experiment and name the treatment group. On the experiment, list each injection, challenge or weighing day under Regimen, then Record manipulation as each is done: a dose per body weight is worked out from each animal's latest weight. Add to notebook puts all of it in a notebook page.
Open Settings → History and undo the bulk action. For a single edit, the change history shows what the value used to be.
Choose Add database, pick a preset (Drosophila, C. elegans, zebrafish, mouse, plants, field crops) or start blank, name things your way and choose what it needs to track.
| Keys | Does |
|---|---|
| ⌘/Ctrl + K | Search everything |
| ⌘/Ctrl + B | Show or hide the sidebar |
| Alt + 1…9 | Switch to tab 1 to 9 |
| Alt + ← / → | Previous / next tab |
| Alt + W | Close the current tab |
| Middle-click a tab | Close it |
| Shift-click a row | Select a range |
| ⌘/Ctrl + D | Fill down, in the mice's Add many preview |
| Esc | Close a menu or dialog |
The first page is the lab's sign-in: its name and what it keeps on one side, the form on the other. Remember me on this computer offers the account by name next time. Ask to join sends a new person's request to every admin, and their page changes the moment one approves; a visitor enters a guest code, or, without one, asks the lab's admins for one (a notification to each of them, as Forgot your password? is). Before there is any account, it starts a lab instead: on a server it says it has no lab yet; the desktop app first asks whether the lab already has a BioManager to open.
The first account is the admin. On a server it needs the setup code, so nobody else on the network can claim it first.
New sign-ups wait for an admin's approval, under Waiting to join in Settings → People & access; Approve lets them in.
A lab nobody can sign in to on the desktop app (the admin's password
lost, or someone else made the first account): Start a new lab on the
sign-in page (or Settings → Lab) sets it aside in the data folder
under old-labs, deleting nothing, and the next start begins an empty
lab whose first account is the admin. Bring back a lab set aside
lists them and brings one back, setting the present lab aside in its
place, so either step can be undone.
You edit what you own. Your mice, cages and records are yours. Shared cages and anything marked lab common belong to the whole lab. A Breeder cage starts out shared; any other cage starts personal. Only a cage's owner or an admin shares it, makes it personal or gives it away. The same goes for everything with an owner, in every database: editing a shared breeding tank, a lab stock vial or a lab-common plasmid doesn't make it yours to give away (animal care may, for the animals, cages, tanks and vials they look after), and a new owner must be someone in the lab, picked from the list. Admins can change anything, and when a record isn't yours, BioManager says whose it is. Racks & boxes, in Settings → Statistics, says who may change each rack, box and incubator.
Project groups. Some of the lab working on one project can be a group (Settings → People & access → Project groups): an admin makes it, and an admin or the group's leads add and remove people; someone can be in several groups. Each person in a group is a Lead, a Member or , and the group's switches say what its members may do: edit what is shared with it, add and change records in its databases, edit each other's records there, edit its notebook pages, tick off its to-dos, and share their own things with it. They start as groups always worked. Wherever something can be shared with the lab, it can be shared with one of your groups instead: a cage, a breeding tank or a lab stock vial is then its members' to edit (as the group allows), as is a plasmid or reagent shared with it (everyone still sees them). A database made for a group is seen only by its members (and admins), a group's to-dos are on their calendars for any of them to tick off, and a notebook page or template can be shared with a group. The colony's view shows the mice and cages of everyone in your groups. Deleting a group makes what was shared with it its owner's own again (a breeding tank or stock vial the lab's).
[!WARNING] Don't keep the database in a cloud-synced folder (OneDrive, Dropbox, Google Drive, iCloud Drive). Syncing corrupts SQLite files. BioManager warns you at startup if it spots this.
Save the whole lab (Settings → Your data, admins) puts every
record, account and uploaded file in one .biomanager file: a backup to
carry, and the way to bring the lab to another computer (a new desktop
app's first page: Bring a lab file here) or to a new server.
On a single computer, back up BioManager's data folder
(~/Library/Application Support/Biomanager/ on a Mac,
%APPDATA%\Biomanager\ on Windows, ~/.local/share/Biomanager/ on
Linux) with Time Machine or File History. To put a backup back, quit
BioManager, move data/biomanager.db aside and put the backup in its
place (the guide's
Restore a backup
says how). Running from source, scripts/dbtool.py does the same:
python scripts/dbtool.py check # where is it, is it healthy, is it at risk
python scripts/dbtool.py backup # a consistent snapshot; keeps the last 30
python scripts/dbtool.py relocate ~/BioManagerData # move it somewhere safe
python scripts/dbtool.py restore <file>
Upgrading is safe. Before a new version changes a database an older
one made, it copies it (backups/before-upgrade-….db in the data folder;
the last ten are kept), and every release is tested opening a demo lab
made by each earlier release, with nothing lost. To go back, close
BioManager, put that copy in place of data/biomanager.db and open the
version it came from. A lab server takes a backup before every update.
A lab server backs itself up every night, checks every backup and test-restores one every week, with an optional off-site copy and a nightly copy on the admin's Mac. A desktop app that joins the lab keeps a copy of the lab on that computer (Settings → Devices & copies; a computer that shouldn't join can use a key from the server instead): checked when it arrives, refreshed daily, the newest 14 kept, and loadable into a new server if the old one is lost. Admins decide whether members may (guests never). An admin's copy is the whole lab; a member's holds what they can see in the app, without anyone's password, other people's private notebook pages, personal databases, personal to-dos and events, or the Audit log.
The lab's key locks the server's backups, Save the whole lab files and the copies on computers, so a file that leaks can't be read. The server and its admins' desktop apps hold it and open these files for you. Its recovery key (Settings → Your data → Lab key → Show the recovery key, admins) is the one way to open a backup if the server and every admin's computer are lost: keep it on paper or in a password manager, away from the backups. Settings → Your data → Export my data downloads your own mice, cages, weights, experiments, plasmids (each sequence as a GenBank file, with its features), notebook pages and profile as a zip at any time.
| Document | For |
|---|---|
| User guide | Using BioManager, step by step: setting up a lab, every module, phones, backups. Also under Help in the app's sidebar |
deploy/README.md | Setting up a lab server: HTTPS, Tailscale, Google/Microsoft sign-in, backups, updates |
deploy/RUNBOOK.md | Running a lab server: alerts, outages, restores, people joining and leaving |
docs/GOOGLE_CALENDAR_SETUP.md | Connecting Google Calendar |
docs/DEVELOPMENT.md | How BioManager is built: stack, styling, icons, the organism engine, access control, audit and undo, tests, security settings |
docs/TESTING.md | How 1.0 was tested: six areas stress-tested like a lab and an attacker would, what was found and fixed, and the full reports |
Working on BioManager itself? Start with
docs/DEVELOPMENT.md. The test suite runs on SQLite
and PostgreSQL with scripts/test.sh, on every push. To refresh these
screenshots, see scripts/screenshots.py.
BioManager is released under the MIT licence. If you use it in your research, Cite this repository on the GitHub page gives the citation in APA or BibTeX (from CITATION.cff).
Built with Python, Flask, SQLAlchemy, PostgreSQL / SQLite and Tailwind CSS. Icons from Font Awesome Free (CC BY 4.0) and game-icons.net by Delapouite (CC BY 3.0) — the mouse and fly are theirs; the plasmid, petri dish, cage, tank and culture-vial icons were drawn for this project. The people and records in the screenshots are made up.
.ab1.ab1verify_sequencing| 🧪 Glycerol stocks | bacteria carrying each plasmid: the plasmid, strain, colony, resistance, how it was checked and the date frozen, and its place in a −80 °C box; the plasmid's page lists its stocks and where each is |
| 🧫 Cell lines | frozen vials of each line and clone: species, parent, passage, freeze date, cells per vial, mycoplasma result and date, and where each vial sits in the LN₂ boxes |
| 📝 Custom | whatever you define |
@mouse 12@antibodies 5anti-β-actinWaf1/Cip1@antib@jordan@name/分栏Writing as in Notion:
==text== highlights);/page makes a new page inside this one and opens
it; Link to page (or typing [[) links one that exists, and
Turn into page makes a line a page. A link shows the page's title
as it is now, the sidebar nests a page's pages under it, and Linked
from on a page lists the pages that link it. Links to the app's own
pages open in a BioManager tab;It all stays readable Markdown: GitHub's > [!WARNING] alerts,
<details>, and Pandoc's ::: column and [text]{.red}.
Experiments: aim, setup, samples and lot numbers, steps, results and a summary. Start experiment (beside the status) and Finished stamp the times; running ones are listed at the top of the sidebar.
Sign a page when it should be the record of your work (your choice, page by page): you confirm who you are, its exact text is fingerprinted and kept, any live experiment in it is frozen, and it is locked (Sign and lock). A lab mate can Witness it; to change it, its owner gives a reason and Open to amend, and the reason stays in the record with every signature. A signed page can't be deleted.
Colony experiment (/experiment) shows an experiment on any of
your animals in the page: its manipulations, the reagent and lot each
day used (marked (expired) when the lot was past its expiry), when
each was done and by whom, the amount each animal got, and its readout as a table and a
chart (body weight in grams or % of the first, manipulation days
marked), kept up to date. An experiment with other measures (an ELISA
a plate filled) has a button for each beside the main readout; the one
you pick is kept with the block. The block is in the app's language.
Freeze a copy keeps what it shows at that moment in the page. On
the experiment itself, Add to notebook makes your notebook page
for it with that block already in.
Reading notes for papers: authors, journal, year, DOI, a link and a Zotero link as rows under the title. Paste a DOI, a link, or an item copied from Zotero (BibTeX, RIS or CSL JSON: set Zotero's Quick Copy to one of them) into Fill in, or into Paper in New page, and they are filled in, title too; a DOI alone is looked up at Crossref. Open in Zotero opens the item in Zotero. Give the note a cover (a figure from the paper, uploaded or picked from the page's own pictures). Reading in the notebook's sidebar lists every paper and talk you can open as cards with their covers, or as every picture in them, to find a paper by a figure you remember; search reads titles, authors, journals, DOIs, tags and picture captions.
Paper notes straight from Zotero: Zotero on the Reading page takes a read-only API key from zotero.org, then which library (yours or a lab group's), which collection (or all of it) and which topic. Each paper you add there becomes a paper note, with its authors, journal, year, DOI, abstract, tags and Open in Zotero link filled in, the next time you open the notebook (it looks at most every five minutes; Check now looks at once). A paper gets one note, ever, and the papers already there are left out unless you ask for them. Zotero has to sync to zotero.org, and BioManager has to reach it.
Protocols with numbered versions. Start experiment
copies the steps as a checklist and records which version was followed.
Protocols in the notebook's sidebar opens the lab's protocols as a
page of their own: search them, open one to read or change it, make one
with New protocol, and sort them into folders (New folder,
then drag a protocol onto it, or pick its folder on the card or in the
protocol's own bar). Each folder has an icon you pick when you make it;
Edit folder changes its name or icon. Folders are the lab's, shared
by everyone. Below
them are a dozen common protocols built in (genotyping, perfusion,
immunofluorescence, western, BCA, transformation, miniprep, TRIzol,
qPCR, passaging, tamoxifen), to read and Copy into one of your own.
In a page, /protocol opens the same protocols beside it, folder by
folder, to insert one as a checklist.
Run the checklist step by step (▶) goes through it at the bench one step at a time
in large type: each tick gets the time, a deviation is written under the
page's Deviations heading.
Data sheets: paste from Excel or import a CSV, add formula columns
(=B/mean(B)*100), and get a bar, dot, box, scatter or line plot with
SEM or SD error bars, a fitted line, and a t-test, Mann–Whitney or ANOVA
(Holm-corrected pairs) with significance stars. Plots download as SVG or
PNG. A log pasted with its headers (time down the first column and
readings beside it, such as a reactor's temperature and pressure) is
drawn as a line over time; Y picks which reading.
Plate reader and qPCR: paste readings onto a 6- to 384-well heatmap, mark blanks, standards and samples, and read concentrations off the standard curve; paste Ct values and get ΔΔCt fold changes.
Buffer recipes: final volume and concentrations in, grams and millilitres to add out (from molecular weight or a stock); change the volume and every amount follows. Common buffers are built in; the lab's own are saved to a shared library. Recipes in the notebook's sidebar opens that library: open a recipe to change it, make one with New recipe, sort them into folders as protocols are, and Save a copy of a built-in one to make it yours. Load from library in a recipe block lists them by folder.
Formulations (/formulation): what goes into a reaction or a batch,
by mass. Type a chemical's name, abbreviation or CAS number and pick it
from the lab's Chemicals database; its molecular weight, purity,
density and lot come with it. Type what you weigh and get the moles;
or mark one row as the basis and give the others in equivalents, and
the mass to weigh follows. Each row shows its weight %, a liquid its
volume, and the chemical lists the page under Used in notebook
pages.
Calculators: dilution (C₁V₁ = C₂V₂), molarity, master mix, serial dilution, ligation insert, cell counting and seeding, agarose gel, DNA/RNA concentration and copy number, and protein concentration from A₂₈₀ (µM and mg/mL, with ε and MW worked out from a pasted sequence).
Templates: ••• → Save as template keeps the page's type (an Experiment template makes Experiments) and lists it under Start from when someone makes a page of that kind. Structure only keeps the headings, steps and table headers and leaves out the results, ticks, readings, pictures and the writing under Results, Observations or Conclusion; Who can use it is you, the whole lab or a project group.
Timers: every duration written in a step ("incubate 30 min") gets a ⏱ button, named from the step's words; timers keep running across pages and ring, vibrate and notify when they end.
Daily log: Today opens the day's page; each quick entry is added with the time.
Meetings and seminars (Meetings in the notebook's sidebar,
where each series is edited): a rotation of who presents next, notes for
each meeting shared with everyone in it, the coming meetings on the
calendar, and action items (- [ ] @name order primers, due 2026-10-02) sent to each person's to-dos, from any page with ⋯ →
Send @name tasks as to-dos. A Seminar page keeps the speaker
and their affiliation under its title and is listed in Reading
beside the papers.
Markdown, plus: tables, checklists, code, equations in LaTeX
($…$ inline or an equation block), Mermaid diagrams (flowcharts,
sequence, Gantt timelines) and mind maps from an indented list. Edit
the page as Markdown, download it as .md, or import .md files.
Pictures and files: paste, drop, or take a photo on the phone. They open only for the people who can open the page.
Working together: share a page to read or to edit, with lab mates,
the whole lab or a project group. Editors write in it at the same time
and see each other's cursors. Comments sit on a passage of text, and
an @name tells that person, as it does in any record's notes (a
reagent, an order, a plasmid, a cage). Point at a linked record for its
details; ↗ (or ⌘/Ctrl-click) opens it in a new BioManager tab.
Anyone can turn these notebook notices off under Settings →
Notifications.
Version history: every editing session is kept, compared line by line with the page now, and any version can be restored.
Tags and search across every page you own or that is shared with you, by words, kind, status, tag and date.
culture * want / (stock - want)), made on the page and
shared with everyone; the maker or an admin changes them.@samples 12Roles for a facility (Settings → People & access, the ··· beside someone): Animal care (technicians, vets) may change any lab's animals, cages, tanks and vials, but not other people's experiments, notebook pages or settings (their own they keep like a member); a Facility manager also runs the racks, rooms, incubators, water systems and databases' settings, but not accounts.
Sign in with your institution. Besides Google and Microsoft, a server can offer the institution's own sign-in (any OpenID Connect provider: Okta, Keycloak, Azure AD, Shibboleth's OIDC plugin), or a university that only speaks SAML (InCommon, eduGAIN) through CILogon (deploy/README.md).
Everyone sees every lab database — a census with holes is not a census. The My colony / My groups / Shared / Everyone switch filters the view without changing who may edit what.
The lab sees only what it uses. On first sign-in the admin answers four questions: the lab's name, time zone and how dates are written; which databases it keeps; which functions it uses (the calendar, the notebook); and what members may do. Everyone then gets exactly those, in the sidebar and on their home page. Settings → General and Databases change it any time and switch things off (hidden, never deleted); People & access makes someone else an admin and says what members may do. Members see these panes too, read only.
Your own databases. Anyone can add a database just for them, which only they and the admins see, or for one of their project groups, and share it with a group or the lab later. Admins add databases for the whole lab, and decide whether members may too.
Notifications. The bell tells you when someone moves or gives you animals, picks from your breeders, records a genotype for yours, writes @you in a note or a notebook comment, or when an order you placed is ordered, received or cancelled; admins hear of each new order request. Once a day it also says how many animals may need a look (losing weight, not weighed in an experiment, notes with a welfare word): your own, or the lab's for animal care, facility managers and admins. Choose which kinds in Settings → Notifications. New members get a short welcome tour (Settings → Your data → See the welcome tour again).
Guests. An admin can let someone outside the lab in for a day to 30 days with a guest pass: a one-time code instead of a password, an account that stops working when the pass ends, and nothing they can do to the lab's setup or other people's records. New guest pass, under Guests in Settings → People & access, makes one, and End now stops it early. From the internet, someone not signed in only ever sees the page for entering a code.
When someone leaves, Settings → Statistics shows how many animals each person keeps and how full each rack and box is, and the admin hands their racks to someone else there. Set field → Owner on each sheet puts their records in someone else's name, and Disable the account (the ··· beside them in Settings → People & access) closes it; their records and history stay. An AI assistant can write the handover first: everything in their name, by rack and box, with what is due on it in the next 30 days.
An API for scripts and instruments. Settings → AI assistant & tokens
makes a token for R, a Python script, a balance or another tool; it
reads the lab's records as JSON, or changes them, as you and with your
permissions (Read, or Read and change; it can expire, and you or an
admin can revoke it). Mice, cages, litters, strains, tanks and fish,
plasmids, fly and worm vials, every inventory and every experiment can be
read; a mouse's weights and fields, vials, inventory items and an
experiment's readout can be written. A list refuses a filter it doesn't
take, and names the ones it does. A plasmid comes with its box, position
and the glycerol stocks that carry it, and its DNA sequence and map only
when asked (?sequence=1); a litter names the cage its pups are in, and
/api/v1/litters?cage=88 lists a cage's litters. For tools that start from your
own words, such as an AI assistant, it also finds the records a phrase
means (/api/v1/resolve), lists what the lab calls things
(/api/v1/vocabulary) and what is due (/api/v1/due), searches
(/api/v1/search), reads a record's history and family tree, and works
things out from the lab's own records, changing nothing: animals available,
a breeding plan, random groups, animals per group, when stock runs out, the
week's checks (with the animals that may need a look), an experiment's facts for its methods, a derived readout
(a tumour volume, ΔΔCt, fold change) from raw measurements, a plate reader's or qPCR export read onto an
experiment's plate layout (/api/v1/experiments/<id>/plate), the animals used
per protocol over a year (/api/v1/animal-use) and everything one person
looks after (/api/v1/handover: your own, or an admin's of anyone). A Read and
propose token, meant for an AI assistant, changes nothing itself: it
sends its changes as one proposal, which BioManager checks as its pages
would and keeps under Proposed changes (in your account menu and in
Settings → AI assistant & tokens, with a notification) as one plain summary, with warnings
for what else a change would do (a cage no longer shared with the lab, an
item of that name already in stock). To fix what is there it changes it
rather than adding another: a notebook page's title, kind, tags or text
(all of it, or a few parts: a protocol's steps made a checklist for Run),
with each change shown before and after and the old text kept in the
page's History, never on a signed page or one someone has open; a
protocol filed in a folder of Protocols; an inventory renumbered. It
reads a page's current text first (/api/v1/notebook/pages/<id>). Approve makes every change at
once, as one batch you can undo; Discard makes none; only you, signed
in, can approve, or Send back with a reason for the assistant to
correct: its corrected proposal takes the old one's place. Connect an AI assistant, at the top of the same
pane, connects one (it is also under Help). Claude Code, Codex, Cursor,
VS Code and Cherry Studio use BioManager's own MCP address (/api/v1/mcp),
nothing to install: paste the page's message into the assistant and it sets
itself up, or press Add to Cursor, Add to VS Code or Add to Cherry
Studio, then you sign in in the browser (or use such a token); Claude
Desktop runs mcp/biomanager_mcp.py from this repository
(mcp/README.md). On a lab server that is on the internet, claude.ai,
the Claude phone apps and ChatGPT add the same address as a custom
connector and sign in with a one-time connection code. The BioManager
plugin (plugins/biomanager/, added from the gaspolymerase/biomanager
marketplace in Claude, Codex, VS Code or Qwen Code, or from each
release's BioManager-plugin-Kimi.zip in Kimi Code) teaches an
assistant how to work with BioManager, so nobody has to explain it first.
Changes are in the change history
under your name, marked with the token's name. The reference, with
examples in curl, Python and R, is at /api on your BioManager
(/api/v1/openapi.json for tools that read OpenAPI). Members may make
API tokens, under What members may do in Settings → People &
access, can keep them to admins.
curl -H "Authorization: Bearer $BM_TOKEN" "https://your-server/api/v1/mice?alive=true"
Passwords are at least 12 characters, repeated failed sign-ins are locked out, and changing a password (Settings → Sign-in & security) signs out every other session. A forgotten password is reset by an admin, from the ··· beside you in Settings → People & access.
Your data stays with you — on your computer or your lab's server. None of it is sent anywhere unless you connect Google Calendar, put the calendar in your Mac's Calendar (which passes it to that account), Google or Microsoft sign-in, or reminder emails, or a tool you gave a token asks, or you leave Also send this to BioManager's makers ticked on a feedback note (then that note goes, with its page and version).
Anonymous counts, once a day. BioManager is free; these counts are
how its makers can show that labs rely on it and see which parts to
improve first. Each installation sends one short message a day: the
version, desktop app or server, the operating system and database, how
many members and how many were active this week (as ranges: 1, 2–5,
6–15, 16–50, 51+), which built-in functions are on and how many databases
of each kind, and a random id for the installation. Never names, email
addresses, anything anyone wrote, what your databases are called, or the
computer's name or address. It goes to PostHog, which is asked not to
work out where it came from. They are on unless an admin switches them
off, in Settings → General (Share anonymous counts with
BioManager's makers) or on the Usage report (Help → Send
feedback → Usage report), which shows exactly what is sent; the setup
survey says so. On a server, BIOMANAGER_TELEMETRY=0 or
DO_NOT_TRACK=1 turns it off for good.