Papyrus
You are focused on a topic. For us, it is AI/ML information systems. For you, it might be golf club technology, oil markets, local politics, or any other beat worth watching closely.
Papyrus turns that focus into a fully automated newsroom. Research agents monitor the beat while you sleep, update a publication-specific knowledge base, and surface surprising developments. Editor agents turn those signals into assignments. Reporter agents prepare private reporting packets: the verified facts, source trail, open questions, risks, angle, and copywriter brief an editor needs before commissioning reader-facing copy. Copywriter agents turn selected packets into draft Items for review. The next morning, you can open your newsroom and see what it found, what it recommends, what needs copywriting, and what is ready for review.
You steer it like an executive editor, as much or as little as you want: choosing the canonical categories for topic coverage, configuring editorial sections for the issue, setting editorial policy, selecting the strongest packets for copywriting, commenting on drafts, and culling assignments before publication. When you step back, Papyrus keeps operating from the momentum you already gave it: accepted categories, current policy, section doctrine, open assignments, prior decisions, and rejected proposal memory.
The beat is configuration, not code. The current AI/ML corpus is pilot content, not an application assumption. A Papyrus publication changes subject by changing publication configuration, corpus set, category/graph steering state, edition plans, and worker instructions.
To start a new publication from a pile of files, follow
docs/new-publication-from-corpus.md.
That workflow defines the corpus accession shape, reference-prospect intake,
accepted-only analysis manifests, authoritative labels, topic granularity
profiles, and analysis.reindex assignment path used to bootstrap a knowledge
base from scratch.
What is in the box
- A newsroom.
/newsroomis the operations workspace: topics, sections, doctrine, references, assignments, editions. Agents research and report in private; editors steer and decide. See Newsroom operations and How Papyrus works. - A knowledge base. Accepted categories, references and a semantic graph give agents context beyond vector search. Search it with
knowledge-query(internal knowledge research). - A reader. Either a newspaper-style Next.js reader laid out by a Pretext solver (layout system) or a static Markus site served from S3 and CloudFront (site hosting).
- A CLI.
papyrussigns every request with your AWS credentials (SigV4); there is no token to manage (operator CLI, recipes).
How a Papyrus Publication Fits Together
Text version of the picture:
- One CMS app per site. Editors sign in with Google to the newsroom UI. Every change goes through the GraphQL API (AppSync), which stores items and published items in DynamoDB. Uploaded images go to the media bucket.
- Save is live. For a Markus site (publication kind
s3-projection, the default for new sites), thecontent-actionsLambda behind the Save, Publish and Unpublish mutations saves the item and then renders only the pages that depend on it (the item page, the listings, tags, home, sitemap) into a versioned S3 site bucket. There is no build job and no Republish button; a change is visible within seconds. Writes happen in an order that never leaves a link to a missing page. - Images are made at upload. An S3 event on the media bucket starts the
renditionsLambda, which writes the responsive image files and a small size file into the site bucket. Page renders read the size file and never decode an image. - CloudFront serves the bucket. The site's own CloudFront stack (with its own certificate) reads the private bucket and runs small edge functions for redirects and for
/x/to/x/index.html. After each projection the Lambda invalidates exactly the changed paths, never a wildcard. - Pretext is the alternative kind. A Pretext site is a Next.js server on Amplify that renders pages on request from the published models. A publish tells it to revalidate, and a page lives about a minute at most.
- Guests are read-only. The public (guest) GraphQL surface can read the published models and
media/*, nothing else, and no model or mutation allows a guest to write. - Where Git fits. Git holds code, theme and the site's projector, not articles. Content lives in DynamoDB; the site can always be re-projected from it with
papyrus ops content project --all.
Details: How a publish flows (for editors) and Site hosting (for operators).
Quick start
Requirements: Node and npm, Python 3.12 or 3.13, Poetry, and an AWS profile for anything that touches the cloud.
npm install
poetry install
cp .env.example .env # app-level settings only; never credentials
npm run dev:127 # http://127.0.0.1:3001 (prefer 127.0.0.1 over localhost)
Settings you need for the features named:
| Variable | Used for |
|---|---|
PAPYRUS_GRAPHQL_ENDPOINT |
CLI and agents talking to a deployed AppSync API |
PAPYRUS_INBOUND_EMAIL_DOMAIN |
Addresses for inbound email submissions and replies |
PAPYRUS_PUBLIC_SITE_BASE_URL |
Absolute links in submission feedback (or publicSite.baseUrl in the Papyrus config) |
The shell environment wins over .env. See .env.example for the full list and docs/inbound-email-submissions.md for the email flow.
For a cloud sandbox:
AWS_PROFILE=<profile> npm run sandbox # provisions an Amplify sandbox
AWS_PROFILE=<profile> npm run seed:amplify # users, sections, doctrine, procedures
poetry run papyrus ops content seed-edition # fixture edition, articles and media
Production deploys run from main through the DevOps pipeline. Do not run ampx pipeline-deploy locally.
Commands
Commands
npm run dev
npm run dev:127
npm run lint
npm run typecheck
npm run build
poetry install
poetry run papyrus --help
poetry run papyrus procedures execute-tactus 'return api_list{}'
poetry run python procedures/newsroom/tests/test_newsroom_tools.py
npm run sandbox
npm run seed:amplify
poetry run papyrus ops content inspect
poetry run papyrus ops categories import-config --config corpora/papyrus-steering.yml
poetry run papyrus sections import --config corpora/papyrus-newsroom-sections.yml
poetry run papyrus ops categories import-steering --config corpora/papyrus-steering.yml --corpus-key <key>
poetry run papyrus ops categories import-steering --bundle <steering-export.json>
poetry run papyrus knowledge topics export-category-set --category-set <id> --output <accepted-category-set.json>
poetry run papyrus ops categories import-projection --config corpora/papyrus-steering.yml --target-corpus-key <key> --authority-corpus-key <key> --bundle <projection.json>
poetry run papyrus knowledge concepts import-types --config corpora/papyrus-semantic-relation-types.yml
poetry run papyrus knowledge concepts backfill --config corpora/papyrus-semantic-relation-types.yml
npm run test:bdd
npm run test:bdd:backend
npm run test:bdd:agent-live
Test suites and verification: docs/verification.md, docs/python-cli-and-testing.md, docs/layout-scenario-tests.md.
Where to read next
- docs/README.md: index of every documentation page.
- AGENTS.md: the hard rules for agents, each with its enforcement.
- CONTRIBUTING_AGENT.md: Kanbus workflow for the PPY board.
- docs/new-publication-from-corpus.md: start a new publication from a pile of files.
- docs/code-map.md: where the main files live.
Built by Anthus AI Solutions. We run this class of system in production.
If you need this operated, not just cloned, talk to us.
Metadata
Release files for papyrus-newsroom 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| papyrus_newsroom-1.2.0.tar.gz | 756.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| papyrus_newsroom-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / papyrus_newsroom-1.2.0.tar.gz
| Download URL | papyrus_newsroom-1.2.0.tar.gz |
|---|---|
| Size | 756.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1d95ea759b9a2295304189feecd56eb1672317cbdcb8b339becc91c4e6e8e771
|
|
BLAKE2b-256 checksum How to use checksums |
ef82b1f05187fd41d71f7890674048d517ea5930ab1cc207b5097922feb1c7c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.
Transparency logRelease files / papyrus_newsroom-1.2.0-py3-none-any.whl
| Download URL | papyrus_newsroom-1.2.0-py3-none-any.whl |
|---|---|
| Size | 862.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b4d0fe7776c25acb4d72cfc3b0f0a7f50e064ecfb99ec5fca422dcb93c496df9
|
|
BLAKE2b-256 checksum How to use checksums |
a22c814320b47dcf077eab0d899ba10bfe50cdecacd57d723ceab0cbe71973bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.
Transparency log