RC2026

Product Engineering

·
SHIPPED

Yanta MES/LIMS

Bioprocess-native MES + LIMS for fermentation scale-up, at Boston Bioprocess.

Artifacts

Stack

Product EngineeringReact + FastAPIPostgreSQLPerformanceAI Copilot

The Product

Screens & Illustrations
Yanta · Ask AIIllustration · placeholder content
AIAsk AI

Scientist: “Set up next week’s run of BR-0421 on three vessels, then chart titer against the last run and draft the report.”

4 changes kept 1 undone
  1. 1
    Plan01

    Drafted the batch record

    6 steps from the 5 L fed-batch template, media and seed train filled in

    Kept Undo
  2. 2
    Schedule02

    Put the runs on the calendar

    3 vessels, Mon–Wed, inoculation and sampling tasks linked to the protocol steps

    Kept Undo
  3. 3
    Inventory03

    Reserved the materials

    Glucose feed lot G-118 and 2 kits; the scientist preferred lot G-121

    Keep Undone
  4. 4
    Run review04

    Pulled the data and built the chart

    Titer and DO over 72 h for all 3 vessels, added as a notebook cell

    Kept Undo
  5. 5
    Report05

    Drafted the batch-record report

    Process flow, sample table and the titer chart on 4 pages, ready to review

    Keep Undo

Ask AI works where the scientist already is: the batch record, the calendar, inventory, the notebook and the report builder. Each change it makes is shown before it lands, and the scientist keeps or undoes it. The scientist stays the author of record.

Illustration: Ask AI across one batch, from plan to report. Every change it makes is shown first; the scientist keeps or undoes it.
Yanta product collage: dashboard with the batch-record process flow, mixture lineage cards, a vessel result import notice, the inventory purchase orders table and the data transformer import wizard
Dashboard, mixture lineage, vessel result import, purchase orders and the data transformer (Boston Bioprocess marketing material, 2H 2026).
Yanta dashboard showing the batch records list and a process flow diagram of fermenter vessels
Batch records and the unit-operation process flow diagram that the calendar, entity browser and report builder all hang off.

Synopsis

Yanta is Boston Bioprocess's manufacturing execution system and LIMS for fermentation scale-up, sold to CDMOs and pilot facilities and used to run the company's own plant. Boston Bioprocess runs fermentations for other companies, so the product has to plan a batch, walk operators through it step by step, keep every result traceable to the strain, media, vessel and person that produced it, and keep each client's data strictly separate from every other client's.

I was a Software Engineer there from April to October 2026 and worked across the stack: React 19 / TypeScript on the front, FastAPI / SQLAlchemy on the back, AWS underneath. I iterated weekly with the scientists running the plant, turning their review notes into shipped fixes.

The company sells the product on a two-month go-live and an illustrative $82,880 per fermenter per year in saved admin time; those are Boston Bioprocess's marketing figures, not outcomes I measured. What I can speak to is the engineering below.

Architecture

System Layers

Client (React 19)

Strict TypeScript, a shared component library and one virtualized data grid behind every table in the product. The calendar, the report builder and the result graphs are the three big bespoke surfaces.

Iglobe

API (FastAPI)

Endpoints validate input, services own the business rules, models own the schema. The API contract is regenerated into the client's TypeScript types on every change, so the two sides can't drift silently.

IIserver

Data (PostgreSQL)

Every client's data is kept separate, because the clients are competing companies. Every record carries a human-readable register ID, so a scientist can point at a mixture or a client without reading a UUID.

IIIdatabase

Reports + Ask AI

Report PDFs are printed by headless Chromium from one self-contained document, so the preview and the PDF match. Ask AI is an agent that works like a copilot across the product: a scientist gives it a task, and it pulls the run data, builds the charts, fills the notebook and drafts the batch-record report, showing every change for them to keep or undo.

IVcpu

Delivery

GitHub Actions runs linting, the client's unit tests and the backend suite against real PostgreSQL on every pull request, with the backend tests split into timing-balanced shards.

Vlayers

Core Engineering

Field Notes
01.

Batch-record report builder

A paginated, block-based editor scoped to a batch record. Its insert drawer pulls live content: process flow diagrams, sample tables, vessel results, workbook charts and calendar snapshots. Content is copied at insert time (small tables inline, large result graphs as images), so a report doesn't change when its source data does. Export builds one self-contained document, prints it with headless Chromium and returns a download link. The calendar block's editor layout and PDF layout derive the same geometry, so the preview matches the PDF.

02.

Scheduling calendar

Rebuilt the calendar operators plan fermenter work on: day, week and month views, drag to move or create, Outlook-style copy and paste, linking entries to protocol steps and elapsed times, and assignees with completed-by records. Profiling a real batch record showed each date-range change took 865–947 ms to paint, because an unfiltered view drew one column per unit operation per day; drawing one column per day cut it to 58–153 ms and the DOM from ~40,000 elements to 2,818. On the server, a task's linked-record lookup stopped growing with the number of links, and the columns the calendar filters on got indexes.

03.

Ask AI: an agent that works across the batch

Scientists hand Ask AI a task from wherever they are in Yanta: plan a batch from a template, put its runs on the calendar, reserve the materials, compare this run's titer against the last three, write up the batch record. The agent pulls the run data, builds the charts, creates notebook tabs and cells and drafts the report, and every change it makes is shown to the scientist, who keeps or undoes it. It only ever works inside the signed-in client's own data, and the scientist stays the author of record.

04.

One table layer for the whole app

Replaced every MUI DataGrid with one virtualized TanStack Table grid, then removed MUI from the client entirely. Operators got the spreadsheet behaviour they use for data entry: typed cell editors, range selection, Excel paste and drag-fill, pivot and group-by, density and find, and export on every table. A saved layout can't be overwritten by a second tab, and Designer and Operator column views layer template, site and user settings.

05.

Backend test suite from zero

The server had no automated tests when I joined. I built the first suite as integration tests against real PostgreSQL (no mocks) plus the CI gate that runs it on every pull request; writing it surfaced 4 latent API bugs in the first week. Then I made it fast: parallel workers on cloned databases and timing-balanced shards cut the CI test step from 531 s to 366 s.

06.

Result graphs: presets, annotations, scales

A local-first graph settings panel and preset library, annotations by x-range and y-parameter drawn as bands above the data, linear / ln / log10 axis scales per parameter that render the same way in the batch-record report, unit-aware axes and nested facet breakdowns. Multi-result edits save in one request instead of one per result.

07.

Inventory, purchase orders and invoicing

Inventory v2 with a purchase-order lifecycle and lot pricing, plus a spreadsheet-style registration grid for materials. CDMO invoicing, built in seven phases: per-use and whole-lot charges, consumable kits with first-expiry-first-out lot allocation, assay-run pricing, statement-of-work lines and discounts, draft review and templates, and validated late-payment terms with a daily task that accrues late fees.

08.

Isolated PDF renderer (built, not merged)

To take Chromium out of the API, I built a dedicated renderer on AWS Lambda in an isolated network that can reach only the file store, with infrastructure as code and a CI deploy job. It was finished on a branch but not merged.

Execution Flow

Dispatch
Execution Trace5 steps
01

Scientist composes the report

From a batch record, the report builder opens with a pre-filled title block. The insert drawer drills from the process flow to a unit operation to a source (diagram, samples, results, charts, calendar) and drops a block onto the page; the layout autosaves.

02

Content is copied, not referenced

Small tables land in the report's layout, large result graphs are captured as images, and calendar entries are frozen with the report, so later edits to source data don't change a report someone has already reviewed.

03

Preview uses the real components

Charts are configured with the same graph components the result pages use, and the calendar block draws the real calendar grid at report scale, so an inserted figure matches what the scientist saw on screen.

04

Export builds one document

The API lays the blocks out at printable width and inlines every image, so the browser that prints it needs no network access or credentials.

05

Chromium prints, the file store serves

Headless Chromium draws the charts and prints the page; the PDF is stored with the client's own files and returned as a time-limited download link.

Complete✓ OK
Reflections
Outcomes
  • “Snapshot, don't reference. A report that points at live rows silently changes after someone has reviewed it. Copying at insert time (small tables inline, large graphs as images) is what made the report builder trustworthy.
  • “Shared geometry beats pixel-matching. Two renderers that derive layout from the same block data (TypeScript for the editor, Python for the PDF) stay aligned; two renderers tuned by eye drift apart.
  • “Measure what gets drawn before tuning React. The calendar was slow because of layout, one column per unit operation per day, not because of re-renders. Changing what was drawn did more than any memoization would have.
  • “N+1 hides in helper functions. A lookup that issued a few queries per link was invisible at 4 links and expensive at 32; loading each level of the link graph once made it a constant cost.
  • “Ask AI had to be a copilot, not a chat window. Scientists wanted the work done where they already were: in the batch record, the calendar, the notebook, the report. Showing every change and letting them keep or undo it is what made them trust it with a batch.
Next Steps
  • Move PDF printing out of the API onto the isolated renderer, which was built but not merged.
  • Report tables are stored as snapshots with a row limit; a paginated table block would let large sample sets print in full.
  • A Part 11 / GMP approval workflow (e-signatures, change control) is on the company's roadmap; it wasn't built while I was there.

One Last Thing

The core challenge: A CDMO runs fermentations for competing clients. Every batch has to be planned, executed step by step, traced back to the strain, media and vessel that produced it, and handed over as a report a scientist is willing to sign. Most of that lived in spreadsheets, PDFs and tribal knowledge.

✦Built with
intention

More from the Archive

View All