ResearchOS
/Wiki

Inventory

The inventory you will actually keep. Most lab inventories die because they ask for precision the bench cannot sustain. Inventory in ResearchOS asks for almost nothing (a coarse count and the occasional one-tap status) and computes the signals that actually matter (what is expiring, what is running low) from data you type once, or never.

The Supplies list. Expired, low, and empty items carry status chips so the most urgent reorders stand out.

Why most lab inventories become fiction

Almost every electronic lab notebook ships an inventory, and almost every academic lab abandons the one it has. The reason is always the same. The system stores a precise running amount (for example “47.3 mL remaining”) and expects you to decrement it every time you pipette. Nobody does that for more than a week. Within a month the numbers are wrong, and within a quarter the whole inventory is fiction. A wrong inventory is worse than no inventory, because people trust it, skip a reorder, and find an empty bottle on experiment day.

So Inventory is built around a different question. The question is not what we can track. It is what a busy lab will realistically keep current with near-zero effort, and how to make those few things produce real value. The answer is to count containers instead of volumes, flip status with one tap instead of doing math, and let the passage of time compute the rest.

The big idea, count containers not volumes

The primary number on a stock is a count of physical containers. Three vials, two bottles, one plate, a box of tips. You change that count only when a whole container is finished (you throw out the empty tube, three goes to two) or a new one arrives. That is an event that happens roughly monthly per item, it is unambiguous (the empty tube is in your hand), and it takes one tap. It never asks you to remember how much you used, do arithmetic, or update anything mid-experiment.

There is an optional per-container amount label (for example “1 mL” or “100 ug”) for people who want to record how big each container is, but it is never required and it is never decremented for you. It is a label, not a ledger. A lab that wants more detail can add it, and a lab that wants none never sees a number it is obligated to keep accurate.

Alongside the count, every stock carries a coarse status (in stock, low, empty). You flip it with a one-tap control the moment you notice at the bench, because your eyeball is the sensor and no threshold math is needed for that to be useful. If you also set a low-at-count threshold (for example, flag when vials drop below two), the status flips itself and even the tap becomes optional. The point is that Inventory is useful whether you maintain a count, tap a status, both, or neither, and it degrades gracefully instead of lying.

The zero-upkeep signals

The payoff of an inventory is not the stock list you scroll. It is two signals, and both are derived from data you enter once at receive, or not at all, and then maintained by the calendar and a tap rather than by you. Together they feed the Needs attention filter on the Supplies page, which is the center of the feature, not an afterthought.

  • Expiring soon and expired. Driven by the expiration date you typed once. A supply whose soonest expiry is within 30 days shows an expiry chip such as “expires 12d”, and once the date passes it reads expired. The clock does the rest forever. This is what keeps you from running a failed experiment on dead reagent, or tossing money on an antibody that lapsed months ago.
  • Low or empty. Driven by the container count and an optional low-at-count threshold, or by a single manual low tap. This is what keeps you from re-buying what you already have, and from discovering you are out on experiment day.

Neither needs an accurate running total of anything. Expiry needs zero ongoing input at all, and low or empty needs a count you only touch when a whole container is finished. That is the point. The value lives in signals that the passage of time computes for free.

The Supplies page, where ordering becomes inventory

Inventory does not live alone. It shares one Supplies page with Purchases, because one feeds the other. Purchases answers “what did we buy.” Inventory answers “what do we have, where is it, and is it still good.” So the page is a single list where each row is a supply, and a row shows what you have on hand and what is on order side by side. Three filters above the list (All, Needs attention, and On order) narrow it, and a search box finds a supply by name, vendor, catalog number, or CAS. The page opens on Needs attention when something needs it, so the few rows that want action are not buried under the many that do not.

Click a row and the supply opens with two sections. On hand lists its stocks, each with a count you step up or down, a one-tap In stock, Low, or Empty status, and the dates and location you recorded. Ordering lists its open order lines and where each one stands. The same panel is where you add a new stock when a fresh box arrives.

The receive event is the seam between the two halves. When you mark a purchase order line received, which is something the buyer already does, Inventory asks whether to add it. You can create a new inventory item, add the batch to an item you already have, or skip it for services and one-offs. A new item is pre-filled with the name, vendor, catalog number, and link from the line you bought, the container count defaults to the quantity ordered, the received date is stamped, and you are asked only for expiry and (optionally) a location. The buyer is already standing there with the box, so capturing it costs one extra field. Over a few months of normal ordering, the inventory builds itself out of the reagents the lab actually churns through, with no separate data-entry chore.

The flow runs the other way too. A stock that is running low shows a “Time to reorder” chip, and the Reorder button on the row adds that supply to a reorder cart. Open the cart, set one funding account for the batch, and submit, and the lines become a purchase order without anyone retyping the reagent. Because a reordered line remembers which supply it came from, receiving it later adds the new batch straight to that item with no extra choices. The loop closes (you buy it, you receive it, it becomes stock, you finish it, it goes back on the list to buy) and each hand-off carries the details forward for you.

Barcode scanning from the desktop webcam

Finishing a container is a roughly monthly one-tap event, and a barcode scan is simply that tap made faster. ResearchOS scans through your desktop webcam (the app is Chrome and Edge only, so the browser's built-in barcode reader is available), no separate hardware required. On the Supplies page, open BeakerSearch with Cmd-K (Ctrl-K on Windows) and choose Scan a barcode. If the camera is not available, the scanner offers a box to type the code instead.

There are two things you can scan. A container code is a lab-applied label on one specific tube or box. Scanning it counts that container down by one, re-derives the status (to empty at zero, to low when it crosses your threshold), and drops the item into the reorder queue when it crosses low, all guarded by a quick-undo toast in case you mis-scanned. A product barcode is the manufacturer code shared by every container of a product. Scanning a known one finds the item, and scanning an unknown one starts registering it, either as a new item or by linking the code to one you already have.

Lab reagents from suppliers like NEB, Sigma-Aldrich, and Thermo Fisher mostly do not carry the retail barcodes that consumer databases know, so the high-value path is the lab-applied container code you control, not a manufacturer lookup. ResearchOS does not depend on an online product database, so nothing about a scan waits on one. An unfamiliar manufacturer barcode simply asks you to name the item once, and every later scan of that code finds it.

Where it lives, a location note

When you want to know not just that you own something but where it sits, every stock has a Where it lives field. Type it the way your lab already says it, like “-80 door, left” or “Box 4, B3”. Real labs already label every drawer, shelf and box, so ResearchOS does not ask you to rebuild that as a map of the freezer. You keep your own numbering, and the note shows under the stock on the supply so the answer is one click away.

The location is optional. You can run a perfectly useful inventory with no location at all, and add the note only for the tubes that are worth finding again. If you would rather change it later, edit the stock and type over it.

Where a supply lives is a free-text location note on the supply.

Spreadsheet import for an existing inventory

If your lab already keeps a list somewhere (and most do, usually a spreadsheet), you do not have to re-enter it. The import path lets you paste straight from Excel or Google Sheets to bulk-load what you already have, so an existing inventory comes across in one action instead of one row at a time. On the Supplies page, open BeakerSearch with Cmd-K (Ctrl-K on Windows) and choose Import supplies. You can also pick a CSV file, and a short step lets you match your columns to ResearchOS fields and preview the result before anything is saved. Combined with the self-populating receive flow, this means the cold start, the part where most inventories never get off the ground, is close to free.

Item categories

Every inventory item belongs to exactly one category. The category you choose drives which extra typed fields appear in the detail editor. The full set of categories is listed below.

  • Reagent (the default). Generic chemical or consumable with no typed extension fields.
  • Antibody. Carries target, host species, clonality and clone, conjugate, isotype, reactivity, applications (for example WB, IF, IHC, FACS), recommended dilution, and an RRID for reproducibility. Antibodies are also the textbook case for opt-in precise consumption tracking, since they are expensive, finite, and often shared between users.
  • Plasmid. Carries backbone, insert, resistance, bacterial host, size in base pairs, source and Addgene number, and an attached sequence file. Lines up with the cloning and sequencing work elsewhere in the app.
  • Enzyme, Primer, Cell line, Strain. Plain categories with no extra typed fields today. A future version will add typed fields to each the same way antibodies and plasmids were extended.
  • Kit. A multi-component commercial kit treated as a single inventory record. Track kit lots and expiry dates without splitting the kit into individual components.
  • Equipment. A single piece of shared equipment. Equipment items have no container-count semantics since there is normally one instance, but they carry storage location, expiry (for calibration deadlines), and the same expiry signal as any other item.
  • Other. For anything that does not fit the categories above.

All categories share the same stock list, location note, expiry, low-count threshold, history, trash, search, and sharing. The category only controls which extra fields the detail editor renders.

Precise consumption is opt-in, never the default

The volume-ledger model that sinks most inventories (deduct a few microliters per experiment) is the right tool for a narrow set of cases, like an expensive monoclonal antibody, a controlled substance, or a shared aliquot people argue over. For those, a precise per-use record is worth the effort because the stakes justify it.

So that behavior is opt-in per item and off by default. For the vast majority, the item lives entirely in the count, status, and expiry world above, and you never see a number you are obligated to maintain. When a specific reagent earns it, you start tracking it from the Companion app the first time you scan a new box, by saying how many units one scan uses and how many the box started with. From then on each scan deducts from that stock's units remaining, and the laptop scanner honors it too. Inventory is fully useful with tracking off for every item. It is a power feature you reach for when a specific reagent earns it, not a foundation everything sits on.