Skip to main content

Agience Origin

PyPI Python License CI Sponsor

Identity and authority — the OIDC issuer.

Origin is the trust anchor peers verify against, and the service everything else asks who is this, and may they? It mints and verifies tokens, publishes the JWKS that peers check signatures against, and owns the passkey, OTP and account-setup flows.

Running it

An ordinary Python package — no container, and installing it pulls its own pinned dependencies.

pip install agience-origin
KEYS_DIR=/path/to/keys python -m uvicorn origin.main:app --host 127.0.0.1 --port 8080

It applies its own migrations at startup, so the first boot creates the database. Requires Python 3.11 or newer.

Bind loopback and put a reverse proxy in front of anything public — a service on the public interface answers past whatever header and path rules the proxy applies.

KEYS_DIR must already contain origin.private.pem, origin.public.pem, encryption.key and inbound_nonce.secret. Every key loader raises rather than inventing a key it did not write, which is correct for an authority and makes an empty directory a hard stop. Key material comes from a platform installer, a KMS, or a one-shot key-init step; .env.example documents the full set.

Letting a peer verify Origin

Agience peers read their trust inline, from trust_anchors in the authority.manifest.json of their own keyset. Publishing /.well-known/jwks.json is therefore not what makes a peer able to verify an Origin-signed token: until Origin's public JWK is physically present under trust_anchors.origin, two healthy and mutually reachable services answer 401 for every user token, with nothing to log — from the peer's side there is no mismatch, there is simply no such issuer.

A peer's own key init writes only its own anchor, since asserting a public key for a service whose private key is elsewhere is a trust statement rather than a convenience. Origin emits its half:

origin-emit-anchor                                    # the mergeable fragment
origin-emit-anchor --format anchor --uri https://origin.example.com
origin-emit-anchor --format jwks --keys-dir /path/to/keys
python -m origin.scripts.emit_trust_anchor            # straight from a checkout

--format chooses fragment (a mergeable {"trust_anchors": {"origin": …}}, the default), anchor (the value alone, for placing at trust_anchors.origin), or jwks. --keys-dir defaults to $KEYS_DIR and --uri to config.AUTHORITY_ISSUER.

It reads KEYS_DIR/origin.public.pem and produces the JWK through the same get_jwk_public() that serves /.well-known/jwks.json, so what you place is byte-identical to what Origin publishes, kid included. It writes nothing: placement is the operator's decision, and a command that installed trust in itself on a peer would send a trust anchor the one direction it must never travel.

To place it, merge into the peer's manifest:

origin-emit-anchor --format anchor > /tmp/origin-anchor.json
python - <<'EOF'
import json, pathlib
m = pathlib.Path("/path/to/peer/keys/authority.manifest.json")
doc = json.loads(m.read_text())
doc.setdefault("trust_anchors", {})["origin"] = json.load(open("/tmp/origin-anchor.json"))
m.write_text(json.dumps(doc, indent=2) + "\n")
EOF

Then restart the peer. A wrong kid or a re-encoded modulus fails as the same silent 401, which is why the JWK is emitted rather than transcribed.

Configuration

.env.example is the template — copy it to .env. It states the in-code default for every value and marks where an unset variable is itself a decision: KEYS_DIR unset means the process does not boot, and ORIGIN_ALLOWED_ORIGINS unset derives the CORS allow-list from the issuer, ORIGIN_URI and the facet bases.

Layout

path what it is
src/origin/main.py the FastAPI app, and the startup that runs its own migrations
src/origin/routers/ auth · otp · passkey · setup · oracle · server_credentials · system
src/origin/services/ auth_service and auth_verifier, key custody through shamir and key_oracle, passkey_service, otp_service, person_service, oidc_providers, platform_settings_service, guess_budget
src/origin/models/ · src/origin/db/ · src/origin/api/ the entities, the store and the request/response models
src/origin/alembic/ the migrations, applied at boot
src/origin/scripts/ the operator commands — emit_trust_anchor
src/origin/web/ the static auth UI served at /, /login, /account, /reset-password and /verify-email, with its assets mounted at /web
src/origin/tests/ the suite, including the check that the package ships what it serves

web/ lives inside the package, beside the module that serves it: main.py resolves it as Path(__file__).resolve().parent / "web", which gives one answer in both places the code runs — a checkout and an installed distribution. A path that climbs out of the package resolves against the repository layout, which only a checkout has.

Star history

Star History Chart

Security issues: email connect@agience.ai rather than opening a public issue.

Dual-licensed — see LICENSE, COMMERCIAL_LICENSE.md, NOTICE and CLA.md.

Declaration of generative AI use

The author used Anthropic's Claude Opus (versions 4.8, 5, and 5.5) in the preparation of this work. Its contribution was to write code, and to generate and validate content. The ideas, the construction and the claims are the author's. No other generative AI tool was used. The author reviewed and edited all output and takes full responsibility for the content of this publication.

Metadata

Release files for agience-origin 0.2.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agience-origin 0.2.9
File Size Uploaded Provenance
agience_origin-0.2.9.tar.gz 722.5 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for agience-origin 0.2.9
File Interpreter ABI Platform
agience_origin-0.2.9-py3-none-any.whl Python 3 none any Details

Total release size: 1.5 MB

Release files / agience_origin-0.2.9.tar.gz

Download URL agience_origin-0.2.9.tar.gz
Size 722.5 kB
Tags Source
SHA-256 checksum
How to use checksums
484dcf6febfe851e8f0ce3519893f7579f80290c915fe48d12541dca29c92f54
BLAKE2b-256 checksum
How to use checksums
a288da95e004ccbb66a1b376de8c2dbdc88a37615a43951167e4b7060b26b1f1
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 22, 2026.

Transparency log

Release files / agience_origin-0.2.9-py3-none-any.whl

Download URL agience_origin-0.2.9-py3-none-any.whl
Size 782.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8238eb94992c44714022ccb78418bd571f9b7978cf6f2a73d8e8240223a945e5
BLAKE2b-256 checksum
How to use checksums
02b80d3720024321d2acff5cda0f1125c1a2bf8a1aba857559094964ef1add6e
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 22, 2026.

Transparency log

Security for agience-origin 0.2.9

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for agience_origin-0.2.9.tar.gz

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 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page