Source beta — 2026-09-24, revision 10
This is a local-first Linux application source release with a static HF landing page. It is not a model release or an online OCR service.
Revision 10: resource admission and Quick mode
- GPU admission rechecks free VRAM before OCR and after OCR exits in sequential local review. Two consecutive samples must meet the existing budget, with a bounded 30-second wait. Query errors stop admission; memory exhaustion uses the existing fallback path. This cannot reserve VRAM against unrelated processes, and external API server allocations are not controlled.
- Fast review shows pending differences alongside source images, including deferred and failed reviews. Byte-identical valid pages need no decision and retain original OCR; they are not labeled human-approved. Approve/keep-original buttons advance the pending queue. Native keyboard navigation uses Tab and Enter/Space; there are no global Enter/Escape handlers.
- Optional bulk adoption accepts valid undecided model candidates without manual verification, preserving original OCR and prior page decisions. Decision records identify
bulk_model_adoptionandhuman_verified: false. Failed or stale reviews are excluded. Deferred proposals excluded from a candidate remain excluded. A downstream LLM is not guaranteed to fix missing text, numbers or negations. This package has not been uploaded by the builder. Whole-book throughput and low-VRAM hardware stress testing have not been repeated.
Quick mode groups optional model-candidate adoption with complete-context ZIP preparation. The ZIP includes every selected screen, original OCR, candidates (including invalid/unapproved ones, labeled accordingly), available source images, review records and missing/failure markers. Process logs and endpoint configuration are excluded. Nothing is uploaded automatically. ZIP support and context limits depend on the receiving model interface.
- Dual mode also checks Gemma GPU memory immediately before server startup. A sufficient final sample gets one additional stability sample instead of a contradictory out-of-memory error.
- Bulk-adoption provenance is retained in reviewed MD, report.json and reading-format introductions. Partial bulk-write failures still regenerate exports. Decided includes bulk-adopted unchanged candidates with deferred proposals; deferred proposals remain in the handoff.
- Dedicated Ollama logs now live under private backups/runtime-logs.
Revision 9: community ports note
- README ends with a short "Community ports welcome" section: forks and ports to other platforms are welcome under AGPL-3.0-only, third-party terms still apply, and no support or maintenance for other platforms is promised. Documentation only; no license change.
Revision 8: image layout
- Review feedback: the three-column thumbnails were too small to read. The review and Markdown images are now shown full width, the start screen smaller, with a "click to enlarge" hint; the review caption is a one-line summary with the specific deferred-suggestion example beneath it.
- Documentation only; no other file changed.
Revision 7: screenshots and README order
- Three interface images (start screen, page review, exported Markdown used
with a local model) now open the README and the landing page, under
docs/images/. They show the interface on a public-domain 1890 book scan and a short synthetic text; they are not an accuracy claim. - README sections reordered so the workflow and output formats come before the license and dependency terms. The terms themselves are unchanged.
scripts/verify_public.pystill rejects binary payloads everywhere exceptdocs/images/*.png|*.jpg, which must be well-formed, at most 1 MiB, and free of PNG text/EXIF chunks and JPEG EXIF/XMP/comment segments, so images cannot carry hidden text. Public tests cover the rejected cases.- No application code, model default, supported-model scope or license change.
Revision 6: wording only
- The short description, README opening line and landing-page lead now name Kindle books first, since capturing your own Kindle books is the workflow this application adds beyond ordinary PDF/image OCR. No new compatibility claim: Kindle layouts are still not universally validated.
- No code, model default, supported-model scope or license change.
Revision 5: updated model-comparison evidence
- Public benchmark and release-note pages now include the larger same-day 100-case measurement of the current review pipeline. It does not establish a general quality advantage for 26B; 12B+C1 remains the default.
- Documentation only: application behavior, model defaults and supported-model scope are unchanged. Historical measurements remain labeled separately.
Revision 4: process cleanup and connector response handling
- Dedicated OCR and local model processes now run under an owned-process supervisor. Normal exit, termination and loss of the caller's private pipe trigger cleanup of the owned process group. This also covers a caller killed with SIGKILL; it does not stop unrelated servers or external API endpoints.
- Four real subprocess tests cover normal exit, termination, a killed caller and failed executable startup. Stubborn descendants are cleaned up while an unrelated process remains alive. A real local 12B loading test on the development GPU returned from 7,929 MiB to its 7 MiB baseline after both a deliberate exception and SIGKILL of the caller. This is one host, not a universal driver or crash-recovery guarantee; killing the supervisor itself is outside this test.
- The optional connector exposes a server-dependent reasoning-effort setting. Its default omits that parameter. A probe that exhausts the output budget reports that explicitly instead of treating it as a generic JSON failure.
- A single Markdown fence around an otherwise valid JSON value is accepted; JSON is never extracted from surrounding commentary. Existing schema and source-preservation checks still apply. Probe characters are rendered directly at a readable size, instead of enlarging a tiny font bitmap.
- Twenty-two public tests pass. These changes do not add any other model to a supported/guaranteed-model list.
Revision 3: optional vision API connector
- Gemma 4 remains the recommended default; other models are an opt-in option. A vision-capable LLM is required for checking source images. An OpenAI-compatible API alone does not guarantee image/JSON support, correction quality or successful completion. This is not a universal model support claim; the historical Gemma comparison does not apply to other models.
- Added non-streaming Chat Completions with configurable base URL, model, API key, JSON response mode and output token parameter. A synthetic image test and explicit destination consent gate new jobs. No book is sent by the connection test. No cloud fallback is enabled automatically.
- Default processing remains local. When this option is enabled, images and OCR text go to the selected endpoint, which may be remote and charge fees. Private plaintext credential profiles are excluded from job exports and release payloads. See CONNECTORS.md.
- PDF, images and both Kindle capture routes share the provider setting. External review runs after local OCR; the app does not manage that server's GPU or VRAM. Existing C1 validation and original-preservation logic remain.
- HTTP contract tests cover successful C1 review through the real worker, partial results on provider failure, JSON modes, consent, vision-test failure, redirects, error redaction and capture option propagation. They use a local synthetic server, not a claim of compatibility with every provider.
Revision 3 validation scope
- Seventeen public tests passed in the existing isolated Python environment. Added UI checks verify that changing endpoint settings disables starting until a new test succeeds; missing profiles fail without another provider.
- Synthetic HTTP tests run the C1 correction and worker export path, including a provider-failure case with retained original OCR and partial output.
- No external paid service, real API key, new model download or hosted HF test is part of this validation. Contract tests are not a supported-model list.
- The earlier independent-environment dependency check remains applicable; the connector uses the already pinned requests and Pillow dependencies.
Standard model and revised distribution pages
- Standard installation now prepares Gemma 12B automatically using a preinstalled Ollama executable. C1 OCR instructions and source-preserving review logic are included in the application; no fine-tuned weights are claimed.
- Weights are downloaded to a private local store, not included in the ZIP. Setup records the store and digest; GPU workers use that same store.
- 26B is an optional additional setup command and does not change the UI default.
--skip-modelpermits dependency-only installation; failed model downloads can be retried without reinstalling Python dependencies. - Visitor-facing installation, release notes, benchmark and license links now open static HTML. Markdown originals remain available as explicit downloads. The owner publishing guide is no longer linked from the landing-page footer.
- README explains its HF metadata. ZIP and folder still contain identical bytes.
- Unexpected binary payloads now fail with an explicit text-only policy error; they are not silently omitted from privacy scanning.
Optional 26B: historical observations, not a guarantee
A newer same-day test of the shipped c1_ocr_v3 pipeline used 100 bilingual
synthetic cases x three seeds: exact corrections were 165/300 (55.0%) for
12B versus 74/300 (24.7%) for 26B. Thus the older six-image observations
below do not establish a general quality advantage for 26B. This supports
keeping 12B+C1 as the default. Repeated short synthetic cases are not a
real-book accuracy guarantee; see BENCHMARKS.md for errors,
timings, limitations and the separately labeled unshipped-prompt follow-up.
The standard remains 12B+C1. For users with more available VRAM, 26B+C1 is optional. An earlier six-image comparison recorded 52.291 seconds for 12B and 40.022 seconds for 26B across 18 review requests. Exact-match corrections were 51/54 versus 45/54; allowing colon/adjacent-space differences gave 51/54 versus 54/54. Neither arm changed an originally correct field in that test.
These are repeated fields on six synthetic images with an earlier C1 prompt, not a current c1ocrv3 end-to-end speed or quality evaluation. More VRAM use can force sequential execution, making full jobs slower. See BENCHMARKS.md and its numeric data for scope and tradeoffs.
Packaging changes
- Explicit allowlist builder; source hashes and archive consistency checks.
- No book samples, processing records, profiles, keys, virtual environments, model weights, machine logs or private evidence archives.
- Isolated Python installer and pinned direct dependency lists; optional YomiToku remains separately installed and explicitly selected.
- Default dedicated Chrome profile moved to captures/chrome-profile; old profiles are not moved. Fresh profile login is required.
- Removed legacy capture-process termination. Other tools are not stopped.
- Chrome bridge requires the Enable button or BOOKOCRENABLE_BRIDGE=1.
- Synthetic, redistributable export/UI tests replace private book fixtures.
Revision 2 validation
- Nine public tests passed in the isolated Python environment prepared for revision 1. Added tests cover download invocation, reuse, failed download, missing post-download model, invalid configuration and store precedence.
- A real, owned Ollama server successfully reused the existing 12B artifact, recorded its digest and stopped. That probe deliberately prohibited downloads and did not run inference or alter the main application model settings.
- First-time multi-GB transfer remains untested in this revision. Download and failure control flow were tested with mocks; no inference-quality retest is claimed.
- Python dependency installation was executed for revision 1. Revision 2 adds markdown2 as a direct dependency; its same pinned version was already in the tested environment and constraints. There was no second full dependency install.
- Static documentation omits optional syntax highlighting so clean and development environments produce identical HTML.
- HF-hosted rendering remains untested; HTML freshness, relative destinations and release-byte integrity are checked locally.
Revision 1 validation scope
- Built an isolated environment from this source package on the development Linux x86-64 host, CPython 3.10.14, with system-site-packages disabled.
- Installer completed, pip check passed, and all listed runtime import probes passed, including Marker, Torch, Transformers and Playwright. CUDA was detected. No new model download or inference was performed.
- Three public tests passed in that fresh environment: private capture-profile placement/URL rejection, bridge opt-in UI behavior, and offline synthetic MD/HTML/PDF/EPUB export with unchanged source bytes and valid EPUB XML.
- Existing one-click UI and licensing regression checks passed in the development environment. Shell syntax, Python syntax and extension JS syntax checks passed. Existing-environment installer refusal was verified.
- Package checker passed a clean fixture and rejected an extra private file, altered source, a symlink, and an altered archive. The builder also checks payload bytes against the development bridge key without printing it.
- Optional YomiToku dependencies resolved in a pip dry run; its fresh isolated installation and inference were not executed in this packaging task.
- Python 3.10 resolved versions are retained in constraints-linux-py310.txt. Python 3.11 is allowed by the installer but remains untested here.
Limitations
Full end-to-end installation, model download and GPU inference on a second clean physical machine are not established by source packaging. Browser layouts, driver versions and GPUs vary. Tests with generated pages do not prove OCR or correction accuracy. No universal multilingual accuracy claim is made. The scheduler is not proven optimal; 26B is optional.
Version pins and the Python 3.10 constraints are not artifact-hash locks or a complete license SBOM. Exact weight licenses and intended commercial eligibility need separate review. Neither HF publication nor legal clearance is performed by the builder.