FrankenSuite research program · A shareable brief

FrankenOCR A 3-Billion-Parameter Model With No Python, No GPU, No Framework

A shareable brief from the FrankenSuite research program. Every claim below traces to the assessed repository; sources are linked at the end. Assessment pinned September 22, 2026.

Assessment pinned September 22, 2026 (the assessed commit)·~1,174 words·5 sections·Every claim traceable to a source
Six definitions. NODUS is the program’s four-ring verdict scale (Invest, Pilot, Explore, Monitor) assigned per assessment packet. TRL is technology readiness level, scored 1 to 9 per packet. CI is continuous integration: the project’s automated test runs. The pin is the exact commit the assessment froze on; every claim is evaluated at the pin, not at HEAD. The rider is the license clause withholding all rights, including benchmarking and analysis, from OpenAI, Anthropic, their affiliates, and anyone acting for them. Bus factor is how many people can leave before the project stalls; it is 1 for every repo here.

01 · What it is

What OCR is, and where the official stack cannot go

OCR (optical character recognition) turns images and PDFs into text. It is a commodity capability: cloud APIs sell it by the page, and open-source tools do it for free. In 2026 the frontier moved. Baidu released Unlimited-OCR in June: an open-weights, MIT-licensed, 3-billion-parameter vision-language model that parses long documents end to end, published on Hugging Face as baidu/Unlimited-OCR. The official way to run it is the standard ML stack: Python, PyTorch, Hugging Face Transformers, a CUDA GPU.

FrankenOCR exists for the hosts that route can't reach: CI (continuous integration: automated checks that run on every change) runners, agent hosts, edge boxes. Machines with no usable GPU, no Python, or no CUDA. It is a pure-Rust, CPU-only reimplementation of the Unlimited-OCR inference stack: the full forward pass (image preprocessing, vision encoders, a 12-layer mixture-of-experts decoder) with no ML framework, no Python at inference, no CUDA. The generic local-inference tools optimize for model breadth; the official stack assumes a GPU. The packet's inference [Inference, Medium] is that nobody else owns the certified fixed-model CPU lane.

02 · Why build it

Why rebuild it this way

The maintainer, Jeffrey Emanuel, treats scope discipline as strategy: "a few models, not any model" is a deliberate non-goal. Rather than a general inference runtime, the project hand-ports a fixed set of models and certifies each one: a truth pack pinning the exact model source commit and fixture hashes, an L0–L5 parity ladder running from preprocessing through the final token, artifact-graph ledgers for performance and failures, and a three-pillar release-certification gauntlet. The operator surface is built for agents: versioned NDJSON robot mode, a selftest that proves kernels bit-identical on your own CPU, a doctor with reversible repairs, a resident warm-model daemon. The case underneath: where the incumbent cannot run at all, certified CPU inference is not a compromise. It is the only option.

The counter-argument is the physics and the market. For anyone with a GPU, the official Baidu stack is faster per page, zero-porting-risk, and maintained by the model publisher. The generic lane is occupied: llama.cpp owns local inference broadly, ONNX Runtime owns portable CPU. The project's own documentation says a 3B vision-language model on CPU is minutes-per-page territory on ordinary hardware, not seconds, so the addressable market is real but bounded. And the fixed-model bet is also the ceiling: five hand-ported models can never cover the long tail, and each new port is a multi-month effort for one human who accepts no outside contributions by explicit policy.

03 · What was built

What the project actually built

The volume is real: 105,330 lines of Rust in one library crate, plus a five-model zoo with real runtime arms (Unlimited-OCR at 4.16 GB, GOT-OCR2, SmolVLM2, OneChart, and a music-notation model at 61 to 86 MB), a custom quantized artifact format (.focrq) with the source checkpoint hash stamped into the header, and a conservative int8 recipe. source Exactly 2,148 feed-forward and expert tensors quantized; 48 attention projections plus the output layer kept in high precision. The recipe is enforced by a code assertion, not a docstring.

The measurement culture carries the evidence: The parity ladder reports per-stage cosines of 0.9999+ against the reference with an exact first-token match. The performance ledger publishes losing rows alongside wins: the 20-page corpus came in at aggregate character error rate 0.193 against a 0.25 budget, with the worst page's 0.616 published as a limitation, not hidden. The headline speedups: 2.8 to 3.4x end-to-end versus torch bf16 on the maintainer's hardware, and 3.37x / 2.58x / 1.67x decode-per-token against Hugging Face CPU for three zoo models. One honest wrinkle is disclosed: the end-to-end comparison includes model load time on FrankenOCR's side, and the notes do not say whether it was included on the torch side. An unstated constant flattering the headline. And the engineering doctrine generalizes a measured surprise: hand-written SDOT and SMMLA int8 intrinsics sit in the tree but are deliberately not used by default, because interleaved real-decode measurements showed the compiler-autovectorized scalar loop winning. The runtime dispatches to the autovec path and keeps the intrinsics for parity sweeps.

Distribution maturity is unusual for a solo project: tagged releases with six-platform binaries and SHA256 sidecars, a verifying installer, a Homebrew tap, a crates.io publication, and a committed browser/WASM playground.

Evidence · CI status

What the project’s own CI said at the pin

  • The CI workflows that the release certification depends on were deleted from the tree at HEAD, and the last runs (three weeks before the pin (the commit the assessment was pinned to)) failed.

The uncomfortable findings

Uncomfortable finding

The documentation still describes CI as the release gate. README-vs-code drift is measurable: badges say v0.8.0 while v0.9.0 is the release; "13–17 MB" binaries measure 20.6–28.5 MB; #![forbid(unsafe_code)] is claimed while #![deny] is what shipped. A fresh source clone cannot build without three sibling repositories beside it (path dependencies on frankentorch, frankensqlite, and asupersync), so the "portable" story is binary-only. No third party has benchmarked, reviewed, or deployed it: independent validation is zero. And the license is MIT plus a rider barring OpenAI, Anthropic, their affiliates, and anyone acting for them from even benchmarking or analyzing the code. That sits in direct tension with the product's "agent-first" positioning, and it is a plausible explanation for why independent validation is zero.

04 · Where it stands

Where it stands

In our program's terms: TRL 6, NODUS ring Pilot — one of only three projects in the program to clear the ring. In plain English, real release artifacts exist (v0.9.0, six platforms, hash-pinned model manifests), and the bounded workload is genuine: offline CPU document OCR on hosts where the incumbent cannot run, with trace download uptake.

Technology readiness

TRL 6 on a 1-to-9 scale.

NODUS ring

MonitorExplorePilotInvest

The program’s adoption ring for this project.

Verdict key

NODUS ring
Pilot: A release artifact plus a bounded, real-workload fit.
TRL
Technology Readiness Level, a 1-to-9 scale of how proven a technology is. This brief rates the project at TRL 6.
CI
Continuous integration: the project’s automated checks, run on every change.
The pin
The exact commit the assessment was pinned to. “At the pin” means as of that commit.

Evidence tiers

  1. Tier 1 · Verified — Confirmed by direct inspection of a fresh clone, an API response, or a live page read by the analyst.
  2. Tier 2 · CI-observed — Observed executing on live CI pages. Attests the suite runs, not that it is green, unless pass/fail is legible.
  3. Tier 3 · Maintainer claim — Asserted in README or docs by the maintainer; not independently executed or reproduced.
  4. Tier 4 · External — Independent sources: APIs, papers, press, third-party benchmarks. Absence of coverage is reported as a finding.
  5. Tier 5 · Inference — The analyst’s judgment. Always labeled; never presented as fact.

What this verdict rests on. Tier labels are the assessment packet’s own annotations.

  • Tier 1 · Verified: 105,330 lines of first-party Rust confirmed from a fresh clone; tagged binary releases for six platforms with SHA256 sidecars, verified via the releases API; the CI workflows were deleted from the tree.
  • Tier 3 · Maintainer claim: No test was run, no benchmark reproduced, no weights downloaded.
  • Tier 4 · External: Zero independent validation of any kind.
  • Tier 5 · Inference: The Pilot ring at TRL 6: tagged releases plus measured parity receipts.

Should you use it?

Maybe — for exactly that bounded workload, with eyes open.

The caveats are heavy: zero independent validation of any kind, the CI the certification depends on is gone, one human who accepts no contributions is the entire bus factor (the number of key contributors who could disappear before the project stalls), and a source build needs the three-sibling constellation.

Should you learn from it?

Emphatically yes.

The certification gauntlet (truth pack, parity ladder, artifact-graph ledgers, fail-closed finalizer) is a highly transferable methodology, and it outlives the engine whether or not the engine survives.

What would change the verdict, in either direction

  1. CI restored to the tree with green runs (the revisit trigger that rings it back down to Explore)
  2. an independent benchmark reproducing the ledger rows
  3. the int4 quantization graduated or killed in the ledger
  4. any change to the rider.

The trajectory bifurcates on whether the certification story gets its producer back.

05 · What it teaches

What this teaches about building with agents

The lesson is the fail-closed finalizer.

FrankenOCR's release process has a step whose job is to refuse. The strict three-party OpenPGP certificate (which the process cannot produce) is not claimed. The finalizer exits 1 until fresh CI artifacts and three independently controlled signers exist, which they currently don't. The README states the non-claim twice. source The finalizer refuses to certify what it cannot prove, and the refusal is committed in a scorecard.

The generalized form for agent-built software: write the release gate you cannot yet pass, and ship the refusal as part of the release. Publish the losing rows (the 0.616 page), publish the disavowed certificate, keep the browser lane labeled a demo until it earns otherwise. The teams that do this will be slower to claim victory and faster to actually earn it. And their ledgers, unlike their binaries, will be worth reading after the project ends.

Evidence

This page cites selected evidence. The full claim-by-claim audit is in the assessment packet.

Open a panel to see what each source evidences. Full claim-by-claim audit.

Full claim-by-claim audit with evidence tiers lives in the program's assessment packet.

The repositorygithub.com/Dicklesworthstone/franken_ocr
baidu/Unlimited-OCRthis writeup

Unlimited-OCR (Baidu, June 2026, MIT open weights, baidu/Unlimited-OCR) per this writeup and the vLLM docs.