Repository map¶
Find the right repository in one look: what each of the seven is for, which part of the document record it is allowed to write, and where its documentation lives.
The seven at a glance¶
| Repository | Role | Default branch | Authorised to write, in the record | Landing page | Docs here |
|---|---|---|---|---|---|
atrium-page-classification |
Structural perception — eleven page categories that inform how each page is processed | vit |
page_categories · pages[] category, category_confidence |
ufal.github.io/atrium-page-classification | page-classification |
atrium-ocr-postprocess |
Deserialisation of ALTO and every other OCR or text-bearing input, and OCR quality control — the fan-out point of the whole pipeline | master |
pages · content · lines · tables (originator, OCR documents) · quality_summary |
ufal.github.io/atrium-ocr-postprocess | ocr-postprocess workflow |
atrium-translator |
Protected translation — a terminal branch: its output is recorded, not consumed | master |
translations · entities[] translation_en |
ufal.github.io/atrium-translator | translator |
atrium-nlp-enrich |
Morphosyntax and named entities — produces the TEITOK corpus format | master |
entities · parts of lines[] and pages[] · derived_from.teitok |
ufal.github.io/atrium-nlp-enrich | nlp-enrich workflow |
atrium-keyword-extract |
Both kinds of keywords: statistical (KeyBERT, YAKE, KER) and from the AMČR and TEATER vocabularies, through a language model | master |
enrichment · keywords · forms · entities[] pid |
ufal.github.io/atrium-keyword-extract | keyword-extract workflow |
atrium-digital-convert |
Born-digital PDF, DOCX, ODT, ODS, XLSX, RTF, DOC and XLS read into the record without OCR, with pages that need OCR flagged; POST /reformat and POST /describe |
main |
pages · content · lines · tables (originator, born-digital documents) · regenerable.markdown |
ufal.github.io/atrium-digital-convert | digital-convert workflow |
atrium-project |
The hub — shared code, reusable CI, the end-to-end tests and this site | main |
nothing | ufal.github.io/atrium-project | you are here |
Where a repository has no tool section in Docs here, its own README.md is the reference;
its workflow page gives the stable core of what it does, and its landing page links to both.
Of the two documented tools, both are MIT-licensed code. page-classification runs its models locally — on CPU, or faster on a CUDA GPU; the translator calls remote LINDAT services by default and needs no GPU unless a self-hosted CTranslate2 model is chosen.
The order is accretion order, not a chain of file handoffs
The rows are in the order a document record travels — page-classification writes first,
keyword-extract last. That is not the order files move in. Only three real file handoffs
exist (PAGE_ALTO/, DOC_LINE_CATEG/, TEITOK/), the translator's output is an end
product rather than an input to a later stage, and page_categories informs a routing
decision rather than feeding a program. Pipelines
draws both layers.
Who may write which block¶
Every block of the atrium_document record has exactly one authorised writer, declared once in
the hub-canonical BLOCK_OWNERS and vendored byte-identically into every tool:
| Block | Authorised writer |
|---|---|
page_categories |
page-classification |
pages, content, lines, tables |
ocr-postprocess or digital-convert — one of the two, fixed per document |
translations |
translator |
entities |
nlp-enrich |
enrichment, forms |
keyword-extract (llm-enrich in records written before 1 October 2026) |
keywords |
keyword-extract — the statistical kind, beside enrichment, never in one list |
quality_summary |
ocr-postprocess — on every origin, as the quality model's owner |
Shared blocks are split by field rather than by block: page-classification may write only
category and category_confidence inside pages[], and the translator only translation_en
inside entities[] — a field the schema reserves for it; entities themselves are created later, by nlp-enrich.
The positional plane has two possible originators¶
pages, content, lines and tables — the positional plane — can be written by either of
two programs, and which one is decided per document by source.origin, through
ORIGIN_ORIGINATORS:
source.origin starts with |
Originator |
|---|---|
digital-born · docx · pdf |
digital-convert |
ABBYY-ALTO · ocr: · vlm: |
ocr-postprocess |
Matching is a case-insensitive prefix match, first match wins. An origin that matches nothing does not raise — the check simply abstains, so a new origin string can land before the table learns about it.
ocr-postprocess records a truthful origin per input format: ABBYY-ALTO for ALTO, ocr:<format>
for the other OCR formats (PAGE XML, hOCR, ABBYY FineReader XML, DjVuXML, Tesseract TSV, a PDF's
OCR layer), ocr:generic for text whose making the file does not record, and
digital-born-<kind> for the born-digital documents it reads. For a born-digital document it
writes source only and leaves the plane to digital-convert — which reads PDF, DOCX, ODT, ODS,
XLSX, RTF, DOC and XLS (since its v1.1.0-beta), so a born-digital slide deck, ODP, EPUB, HTML page or
e-mail gets no positional plane yet. The per-format list is in ocr-postprocess's
input formats reference.
Program ids and repositories
The program id in a record names the role, not the repository, and a repository move does
not rewrite it. Two ids have a successor since 1 October 2026: alto-postprocess continues as
ocr-postprocess, and llm-enrich was split — its keyword stage continues as keyword-extract,
while its born-digital converter keeps the role id digital-convert and has its own repository. The hub's PROGRAM_SUCCESSORS map adds each successor beside its predecessor as an
allowed writer: a record written before the move keeps its stamps, loads, merges and passes the
origin check, and nothing already written is re-attributed. The old repositories are superseded and, since 2026-10-19, archived (read-only);
their releases and images stay where they were, and the RO-Crate tool ids of old records keep
pointing at them.
This table authorises writes; the record says who wrote
To find out who wrote a block in a given record, read
assembled.blocks[<block>].program — and for a field-split block,
provenance.contributors[], since the stamp names only the most recent writer. See
The document contract.
Branches¶
A default branch is where a clone lands. Both documented tools stage changes on a test
branch before they reach it, and both keep the Agent Skill on a branch of its own.
| Branch | What it is |
|---|---|
vit |
the default branch and the code |
test |
staging, and the base for pull requests |
master |
an index of the model families, from the repository's earlier layout; not developed on |
clip |
a parallel model family (CLIP-based), with its own Hugging Face repository |
agent-skill |
the Agent Skill packaging — see Agent skills |
gh-pages |
the landing card |
vit and clip name model families, not development stages.
| Branch | What it is |
|---|---|
master |
the default branch and the code |
test |
staging, and the base for pull requests |
main |
the repository's initial commit; not developed on |
agent-skill |
the Agent Skill packaging — see Agent skills |
gh-pages |
the landing card |
The hub itself has main, test and gh-pages (the built site), plus a v1 tag — the
channel every tool repository's CI pins the hub's reusable workflows to. See
Architecture.
Sources¶
This table records provenance: what this page was written from, not a build instruction.
| Source | What was taken from it |
|---|---|
atrium-project/_generators/repos.py:14-110 |
each repository's role, stage and default branch |
git ls-remote --symref on the repositories, 2026-09-23; the three new ones, 2026-10-01 |
default branches and branch heads |
atrium-project/docs/templates/shared/atrium_document.py:108-163, 217, 275 |
BLOCK_OWNERS, ORIGIN_ORIGINATORS, the field splits |
atrium-project/docs/document_schema.md:104-143, 254-261 |
the ownership tables and the digital-convert rename |
atrium-translator/utils.py (process_metadata_xml) |
translation_en reserved but not filled |
atrium-project/docs/templates/shared/atrium_rocrate.py (REPO_URLS) |
program → repository, including the predecessors |
atrium-ocr-postprocess @ v1.12.1-beta — text_formats.py (READERS), docs/text_inputs.md §6 |
the origins ocr-postprocess records per input format |