Opus — the Work, and every way it is expressed
A Rust framework for authored Works: a book, a workshop, an educational programme are spaces of one coherent whole, and print, digital, web and interactive are its expressions, never its definition.
A Work is one coherent whole. Print, digital, web and interactive are how it is expressed, never what it is.
Your Work's vocabulary stays yours, its language's rules come checked against cited sources, and a copy reaches a third party only as a recorded dispatch.
Implement ContentLoader for your Work and the framework serves it: MCP, retrieval and processing behind stable public traits, with no consumer logic inside.
Text extraction, correction, ODT and typst composition, local semantic search and file watching — each an expression of the Work, none of them its definition.
One source, one vocabulary, every format: the expressions of a Work cannot contradict each other without something failing first.
The Work first, then its spaces, then their expressions.
What a Work gains when it is the unit
Three things that hold because the domain is the Work, not the book, the site or the course it happens to be published as.
Spaces that coexist
A book, a logbook, a workshop and educational material are spaces of one Work, each with its own sources, structure and editorial state. Every format is projected from a space, downstream of it, and never redefines it.
Rules with a source and a check
A language's orthotypography is a catalogue: each rule states the norm, gives a good and a bad example, cites its source by chapter and section, and names the checker that holds it. A Work composes the catalogue and may harden a rule, never relax a mandatory one.
The line between a language and a Work
Title, chapter term, captions and callouts belong to the Work and live only in its configuration. Orthography, punctuation and cleanup belong to the language and live in the framework, applied only to a Work that declares that language.
Build on Opus
Three steps from a Work to its expressions.
Declare the Work
Your Work's vocabulary and presentation go in its own configuration (project, chapters, presentation), typed in Nickel, with English defaults in the framework.
Implement the traits
ContentLoader hands the framework each section as SectionContent; PedagogyEngine, EmbeddingProvider and VectorStore are the other stable seams. Mocks for all of them ship with the framework.
Express it
opus-processor composes ODT and typst output, opus-rag indexes the Work for local semantic search, and opus-mcp serves it to agents through McpServer<T>.
Build on the Work, not on its format
Opus is consumed by Work-specific implementations through path dependencies. The framework carries no consumer logic, so the second Work does not inherit the first one's decisions.