Skip to content

Ospobox

OSPO in a Box. Know what is happening across the open source you depend on, ship on, and answer for.

Ospobox collects activity from the forges your projects live on, scores what it finds, applies rules to the scores, and pushes the result somewhere that can act on it. That loop (collect → score → decide → act) runs today, on a schedule, with signed delivery at the far end.

Who it is for

Open Source Program Offices answering "what did we ship, where, and who wrote it". Engineering leaders who need the health of a dependency tree to be a number they can defend. Due-diligence and procurement teams deciding whether a project is safe to adopt. Platform and security teams who want a machine-readable signal that arrives on its own.

What it does

Collects

Four forges (GitHub, GitLab, Codeberg and SourceHut) through one normalized adapter interface, on a six-hourly schedule or on demand. Commits, pull requests, issues, releases, and the metadata around them.

Beyond forges, anything a plugin can produce: a CycloneDX SBOM becomes components keyed by package URL, an advisory feed becomes advisories against those packages. Evidence is append-only and content-addressed, so collecting the same fact twice adds nothing, and a changed fact keeps its history.

Scores

Repositories get a health score with its reasoning attached: every component of every score carries a one-line explanation, rendered as written. Two scorers ship, a five-factor activity composite and dependency exposure over a repository's declared components.

Decides

Rules turn scores and activity into alerts: inactivity, low health, a sharp health drop, a week-over-week activity collapse, PR and issue backlogs. They evaluate after every sync, deduplicate against what is still open, and never file the same finding twice.

Acts

Alerts leave the system as HMAC-signed webhooks, with retries and a delivery log, so a subscriber can hold a deployment, open a ticket, or refuse to resolve a package. Reports go out as Markdown, HTML or PDF, on a cadence, by email. Everything is available over a REST API.

What makes it unusual

Everything domain-shaped is a plugin. Evidence sources, scorers and alert rules are interfaces, loadable from a third-party package's entry points. The in-tree implementations load through the same registry, as worked examples with no privileges of their own. Read Extension points and check the claim.

Scores explain themselves. A number between 0 and 100 is not an answer. Every component states what it counted and in what units, so a score can be argued with, which is how one comes to be trusted.

Evidence is kept. Facts are stored with a content hash and a collection time, so the basis of a decision remains inspectable after the decision.

Reading these docs

Everything described in plain prose runs today. Anything not yet built is marked:

Planned

Designed and specified, awaiting implementation. The roadmap says where it sits.

Research

Part of the Software Health Control Plane proposal: funded work with partners, which this repository has not committed to. See Architecture.

Quick start

git clone git@git.sr.ht:~sfermigier/ospobox
cd ospobox

make install          # dependencies, via uv
cp .env.example .env  # then edit it

make migrate          # the app does not create tables
make run              # web + worker

Then open http://localhost:8000.

Development mode

With DEBUG=true you can log in as admin@admin / admin. The backdoor is disabled whenever debug is off.

To see the whole loop run end to end (collect, score, alert, signed delivery, actuation) the demo/ directory has a runbook, a receiver that verifies signatures, and a supply-chain script.

Where to go next

If you want to Read
Run it Installation, then Configuration
Use it Getting started
Understand it Architecture
Extend it Extension points
Know what is coming Roadmap
Integrate with it API reference

Stack

Component Technology
Web framework Litestar
Database PostgreSQL (prod), SQLite (dev and tests)
ORM SQLAlchemy 2.x, async
Background jobs SAQ
Plugins Pluggy, over two surfaces: forges and chassis extensions
Frontend HTMX + Alpine.js + Tailwind CSS
Optional Any OpenAI-compatible API for summaries, Sentry, WeasyPrint

License

Open source. See the LICENSE file.