RC2026

Product Engineering

·
SHIPPED

Yanta MES/LIMS

Manufacturing execution system, data manager and AI optimizer in one platform, for fermentation scale-up at Boston Bioprocess.

Artifacts

Stack

Product EngineeringReact + FastAPIPostgreSQLPerformanceAI Copilot

Synopsis

Yanta is Boston Bioprocess's manufacturing execution system, data manager and AI optimizer in one platform, built 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 covers the whole run: create the process flow, track the materials that go into it, execute the protocol step by step, manage the vessels, people and schedule, and analyze the results, with every result traceable to the strain, media, vessel and person that produced it and each client's data kept 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.

Manufacturing execution system, data manager and AI optimizer, all in one platform.

Yanta protocol bundle: the Fermentation inoculation bundle lists its steps, from registering the client, project and mixture to vessel content, events, process samples, sample results, vessel results and process schedules, with the process schedule for temperature open beside it showing start, duration, end, rate and trigger for each vessel result.
A protocol bundle: every step of a fermentation inoculation, with the process schedule for each vessel beside it.
Product features
#1

Create

Design custom process flows, share them with clients and industry partners, and improve production run to run.

Yanta unit-operations process flow diagram: glycerol, methanol, PTM1 and NH4OH feed bottles run through four pumps into the J1-001 main fermenter, with a seed fermenter, an agitator, a 55-gallon primary medium drum, an air compressor, dissolved-oxygen, temperature and pH sensors and a harvest holding tank around it.
#2

Track

Track materials from stock solutions into media and mixtures, manage inventory, and keep every batch traceable to what went into it.

Yanta mixture recipe lineage for MIX004, Flask media + PTM + Antifoam: a biotin stock solution feeds Flask Media (with potassium phosphate and glycerol), which joins a Teknova PTM1 solution and antifoam in the final mixture, each ingredient shown with its concentration.
#3

Execute

Run protocols step by step: every run shows who is on it and how far it has got, so steps aren't skipped and errors are caught early.

Yanta protocol runs grouped by batch record: each run shows its status (in progress, pending, completed), the people assigned, who created it and a steps progress bar such as 3 of 9 steps, with actions to start or view the run.
#4

Manage

Schedule vessels, equipment and staff on one calendar, see utilization, and log hours.

My partI rebuilt this calendar: day, week and month views, drag to move, copy and paste, and paint time per date-range change cut from ~900 ms to under 155 ms.

Yanta scheduling calendar in month view, filtered by event type (process event, sampling, preparation, notes) and batch record BR-2025-08-A; each day shows counted chips per event type, and a popover lists one day's entries with their times, elapsed fermentation time and unit operation, such as Inoculate Main and Sample Main.
#5

Analyze

Store and plot every run, structure batch inputs and outputs, and suggest process improvements.

My partI built the graph settings behind this view: saved presets, annotation bands, and linear, ln or log10 scales per axis that print the same way in the batch report.

Yanta vessel results graph for run BBP-J1-0916: pH, dissolved oxygen, temperature, agitation, air flow and glycerol and NH4OH feed rates plotted against elapsed fermentation time over about 72 hours, each on its own axis, with set-point data shown.

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

Execution Flow

5 steps
  1. Step 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.

  2. Step 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.

  3. Step 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.

  4. Step 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.

  5. Step 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.

  6. Done

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.

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.

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.

CI test step
Before531 sAfter366 s
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.

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.

Paint per date-range change
Before865–947 msAfter58–153 ms
DOM elements
Before~40,000After2,818
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.

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.

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.

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.

More from the Archive

View All