A thin client in front of one engine.

Nucleora is a hosted application. The interface you work in, in a browser at app.nucleora.org or in the desktop app, draws the screen and does no computation. Each calculation travels over HTTPS to api.nucleora.org, a Cloudflare Worker that checks who you are, and from there to the 1,609-route Flask application and its 422-module Python design engine on Google Cloud Run. Every figure on this page was measured from the repository, and the command that measured it is printed beside it.

Four layers, two network hops.

Layer 1 is on your device and holds nothing worth taking. Layers 2 to 4 are Nucleora's servers. Your sequences cross the network twice per calculation, once to the gateway and once to the engine, both over HTTPS. The dashed path leaves Nucleora's servers for a named public database, and only the features that are lookups take it.

FIG. 1 — NUCLEORA RUNTIME DATA FLOW VERSION 0.11.0
Nucleora data flow: browser or desktop app, Cloudflare API gateway, Flask application and design engine on Google Cloud Run, and named public databases The browser front end at app.nucleora.org, or the desktop app that loads it, sends JSON requests over HTTPS to api.nucleora.org, a Cloudflare Worker that checks the session and applies rate limits. The Worker forwards each request over HTTPS to the Flask application (server.py, 74 blueprints, 1,609 routes) on Google Cloud Run in us-central1, which dispatches into engine/, 429 Python modules. The engine reads its reference data, calls in-process scientific libraries such as ViennaRNA, and reaches named public databases only for features that are lookups. Saved projects are stored by storage.nucleora.org in a Cloudflare D1 database. LAYER 1  /  YOUR DEVICE — app.nucleora.org Interface: browser, or the desktop app that loads it HTML and JavaScript only; computes nothing Desktop app stores no password, token or copy of your work HTTPS · JSON session token in header 200 · JSON result + method citation LAYER 2  /  GATEWAY — api.nucleora.org on Cloudflare Cloudflare Worker Checks the session or API key, applies rate limits Saved projects: storage.nucleora.org, Cloudflare D1 HTTPS · forwarded Cloud Run, us-central1 200 · JSON returned unchanged LAYER 3  /  APPLICATION — server.py on Google Cloud Run Flask application 74 blueprints · 1,609 routes · 4,097 lines 1,605 of those routes are under /api/ blueprint dispatch, in-process LAYER 4  /  DESIGN ENGINE — engine/, same process 429 Python modules — the computational core Paired per domain: <domain>.py computes, api_<domain>.py exposes it (73 api_*.py modules). Reference data: 39 species codon tables, 517-entry provenance registry. Libraries linked into the interpreter: ViennaRNA, Biopython, NumPy, SciPy. only for features that are lookups Named public endpoints: NCBI E-utilities · UniProt · Ensembl · RCSB PDB · AlphaFold DB · ESMFold Called from the server, not from your device. ESMFold is the one that receives a sequence. Measured from the repository at VERSION 0.11.0. The command behind every number is listed in the table below.
Solid lines are HTTPS requests between Nucleora's own components, or in-process calls inside the engine. The dashed amber path is the only one that leaves Nucleora's servers. Layer 4 libraries are linked into the same interpreter, so ViennaRNA folding is a library call, not an API call.

Every number, and how to re-measure it.

These counts grow as the application grows, so the command matters more than the figure. Routes and blueprints come from Flask's own URL map after import server; everything else is a file count in the repository.

WhatWhereMeasuredCommand
Flask routesserver.py1,609len(list(app.url_map.iter_rules())) after import server
— of which under /api/server.py1,605same, filtered on rule.startswith('/api/')
— distinct /api/ pathsserver.py1,589unique rule strings under /api/ (_internal/qa/claims_register.py)
Flask blueprintsserver.py + engine/api_*.py74len(app.blueprints)
server.py lengthserver.py4,097 lineswc -l server.py
Engine modulesengine/422ls engine/*.py | wc -l
— of which blueprintsengine/api_*.py73ls engine/api_*.py | wc -l
Front-end JS modulesstatic/253ls static/*.js | wc -l
— of which workspace modulesstatic/ws_*.js141ls static/ws_*.js | wc -l
Workspace viewsstatic/index.html38grep -o 'data-view="[a-z0-9_-]*"' static/index.html | sort -u | wc -l
Tool rail registrationsdata/cad_tools_rail_inventory.json433railItemCount — of which distinctDestinations = 428; 5 keys are registered twice
Codon table filesdata/codon_tables/45ls data/codon_tables | wc -l — 39 species tables, 5 codon-pair files, 1 README
Reference + runtime data entriesdata/30ls data | wc -l
Declared Python dependenciesrequirements.txt14grep -vE '^\s*#|^\s*$' requirements.txt | wc -l
Application versionVERSION0.11.0cat VERSION

The repository README quotes lower figures for several of these rows because it was written at an earlier revision. The table above is the current measurement. Re-run the commands rather than trusting either text.

One mRNA design, end to end.

This is the real call chain for the main mRNA design route, read from server.py and the engine modules it calls. Six steps inside one server process. The only network legs are the HTTPS hops that bring the request to it.

POST /api/design_mrna — server.py:1900
01
POST /api/design_mrna
server.py:1900 — api_design()

The browser posts the antigen sequence and the construct options as JSON over HTTPS to api.nucleora.org, which checks the session and forwards the request to the engine on Cloud Run.

02
codon.validate_protein(raw)
engine/codon.py

Non-standard residues and internal stops are rejected with HTTP 400 and an error_kind of nonstandard_residue, before anything is assembled — rather than silently stripped.

03
mrna.assemble(…)
engine/mrna.py

Codon-optimizes the ORF against the selected organism's table from data/codon_tables/, then assembles 5′ UTR, Kozak, signal peptide, CDS, C-terminal tag, 3′ UTR, stop codons and poly(A) into one construct.

04
structure.qc_report(c)
engine/structure.py

Folds the construct through the ViennaRNA library in the server build and returns the QC scorecard. When ViennaRNA is absent the panel reports it as unavailable instead of substituting another method.

05
mrna.to_fasta(c) · mrna.to_genbank(c)
engine/mrna.py

Serializes the finished construct to FASTA and GenBank in the same response.

06
200 · JSON
server.py — ok(c)

One response object carrying the sequence, the QC report and both export formats. The gateway returns it and the front end renders it.

What runs where.

Stating this precisely matters more than making it sound reassuring. Design runs on Nucleora's servers. Lookups are lookups, and they go to named public endpoints from those servers, not from your device.

NUCLEORA'S SERVERS

Computed by the engine on Cloud Run

  • Codon optimization and CAI against the 39 species tables in data/codon_tables/
  • mRNA and DNA construct assembly, annotation, plasmid and sequence maps
  • Restriction analysis over Biopython's REBASE set
  • Primer thermodynamics (in-house SantaLucia nearest-neighbour)
  • RNA secondary structure through the ViennaRNA library in the server build
  • IVT simulation, yield modelling, virtual gel, in-silico PCR
  • FASTA, GenBank, GFF3 and SBOL export; the provenance citation registry
  • Saved projects, stored by storage.nucleora.org in Cloudflare D1
THIRD PARTIES — ONLY FOR LOOKUPS

Named endpoints, per action

  • eutils.ncbi.nlm.nih.gov — sequence and record retrieval
  • rest.uniprot.org — protein records
  • Ensembl REST — genome and transcript lookup
  • files.rcsb.org — PDB structure files
  • alphafold.ebi.ac.uk — model lookup by UniProt accession
  • api.esmatlas.com — Meta's ESMFold, the one route that sends a protein sequence to a third party

Common questions.

Paste a sequence. See the checks fire.

0 nt
Paste a sequence above — checks fire instantly.

This page's analyzer runs in your browser — no data leaves this page. It is a demonstration of the checks, not the application itself.

Try it yourself.