Skip to main content

just-dna-registry

A catalog / publish / download REST API for just-dna-lite annotation modules. Authors publish module specs; the server validates, recompiles, stores, and indexes them; consumers browse, search, download, and integrity-verify. There is no frontend here — the webui and Dagster pipelines are consumers of this API.

Live: https://module-registry.just-dna.life · health GET /health · API under /api/v1 · interactive docs at /docs.

Two instances, one image (0.12). Production is the catalog above. The polygon (https://module-polygon.just-dna.life, REGISTRY_MODE=test) is where you rehearse a publish: it accepts test-prefixed data and lets you delete it again, which production deliberately does not.

See docs/SPEC.md for the full design and docs/ROADMAP.md for build status.

Install

Two shapes from one package:

pip install just-dna-registry            # client only (lightweight): httpx + just-dna-format
pip install just-dna-registry[server]    # + FastAPI app, server-side recompile, storage, admin

The default install is the reference client — import it instead of re-implementing the REST calls + integrity verification:

from just_dna_registry import RegistryClient

with RegistryClient("https://module-registry.just-dna.life", token="mk_live_…") as mkt:
    print(mkt.list_modules())
    mkt.import_module("just-dna-seq", "coronary", "1.0.0", "coronary_v1.zip")   # publish a zip
    mkt.download("just-dna-seq", "coronary", "1.0.0", "./coronary")             # fetch + verify
    mkt.lookup_by_digest("sha256:…")                                            # already published?

Or the registry-client CLI (ships with the client install):

export REGISTRY_URL=https://module-registry.just-dna.life REGISTRY_TOKEN=mk_live_…
registry-client list
registry-client download just-dna-seq coronary 1.0.0 ./coronary

Run the server (needs [server])

uv sync                      # dev env (includes the server extra + tests)
uv run pytest -q
uv run registry issue-key <account> -n <namespace>   # mint an API key
uv run registry serve --host 0.0.0.0                 # port 8000 (prod) / 8100 (test), /docs for the API

Modes: production vs the polygon

REGISTRY_MODE is prod (the default) or test. It is a server setting — the client never branches on it. An unrecognised value refuses to boot rather than guessing, because a typo resolving to test would arm a delete endpoint on production data.

REGISTRY_MODE=test uv run registry serve     # how a deployment sets it (unit file / compose env)
uv run registry serve --mode test            # same thing for a local polygon; exports the variable

--mode sets REGISTRY_MODE rather than passing a value inward, because uvicorn imports the app in the worker (a separate process under --reload) where it builds its own settings from the environment.

production polygon (REGISTRY_MODE=test)
default port 8000 8100
test-prefixed namespace / test_prefixed module 422 test_data_on_prod accepted
409 duplicate_content any account scoped to the publishing account
DELETE a module or version 405 — not mounted served (bearer + namespace)

Why the polygon needs a delete verb. A published version is immutable and its authored data is claimed by a name-independent content_hash that yank does not release. So on one instance every rehearsal permanently burns a version number and the right to publish that data under any other name — which is why a "test subtree" inside production does not work, and why the polygon exists.

Give it its own DB and artifact storage. Never point it at production's.

Ops: snapshots and cleanup

uv run registry backup --reason before-migration   # rolling index, never overwrites
uv run registry list-backups
uv run registry purge-test-data                    # dry run: prints exactly what would go
uv run registry purge-test-data --apply            # server stopped, please

Every destructive command (reset-db, remove-*, purge-test-data) snapshots the DB first. Snapshots count up (registry-00001-…) and are never overwritten or rotated out, so they accumulate — prune them deliberately. A snapshot is the index, not the artifacts.

What works today

  • Read/catalog API — list + search (?q, ?gene, ?category, ?genome_build, ?owner, ?license, ?sort), module detail, versions, manifest (SPEC §8.1–§8.4).
  • Publish — multipart spec upload or zip/tar.gz archive import (incl. legacy parquet-only via reverse-engineering), server-side recompiled so compile_success/digest are trusted.
  • Download + integrity — per-file + streamable tar.gz, verify-then-install via just_dna_format.verify_manifest (SPEC §5).
  • Pre-flightPOST .../validate (offline) and POST .../check (the network tier), both taking a compressed spec archive; would_publish is the field CI branches on.
  • Logs over the API; digest lookup; auth (static API keys) + namespace ownership; yank / un-yank; ops-only hard removal (registry remove-namespace/-module).
  • Modes + ops safety (0.12) — production refuses test data, the polygon can delete it; rolling pre-flight DB snapshots and a dry-run-by-default purge-test-data.

Architecture

The manifest.json of each version is the source of truth; the SQLite catalog is a rebuildable projection of it. The manifest contract and integrity primitives live in the shared, dependency-light just-dna-format package so this service and the compiler never drift.

src/just_dna_registry/
  config.py            # Pydantic settings (incl. REGISTRY_MODE)
  testdata.py          # what counts as test data, and what each mode does about it
  backup.py            # rolling DB snapshots taken before anything destructive
  db/                  # SQLite schema + repository (the projection)
  storage/             # StorageBackend interface + LocalStorage (HfStorage pending)
  models/api.py        # card / detail / version / page response models
  services/            # catalog (reads), ingest (manifest -> projection), enrich, purge
  api/                 # FastAPI app, deps (auth/pagination), routers
  cli.py               # `registry` admin CLI

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

just_dna_registry-0.14.0.tar.gz (182.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

just_dna_registry-0.14.0-py3-none-any.whl (208.8 kB view details)

Uploaded Python 3

File details

Details for the file just_dna_registry-0.14.0.tar.gz.

File metadata

  • Download URL: just_dna_registry-0.14.0.tar.gz
  • Upload date:
  • Size: 182.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for just_dna_registry-0.14.0.tar.gz
Algorithm Hash digest
SHA256 b030f5e44c20ef59c58781145d33ac8c0ac84b995efa34394763a77c4a0163c2
MD5 83828c8e999040edb8f850b8b5d31f29
BLAKE2b-256 4f9824432311cd534e8007e81b63f69a0a9b3f2df3e4bec1640d29805b968cae

See more details on using hashes here.

File details

Details for the file just_dna_registry-0.14.0-py3-none-any.whl.

File metadata

  • Download URL: just_dna_registry-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 208.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for just_dna_registry-0.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a1904163256cf90355cfbd9dfe4b6656e6984bc44d386cf628815e91ee92c274
MD5 7c57737683f48a58244996539a567c8f
BLAKE2b-256 5eff9e5a81cc294196f7497c20dc8d71b5bdc20dafb3d2cb0a365ff3b9069c72

See more details on using hashes here.

Release history Release notifications | RSS feed

0.18.2

2 files

0.18.1

2 files

0.18.0

2 files

0.17.1

2 files

0.17.0

2 files

0.16.2

2 files

This release

0.14.0 This release

2 files

0.13.0

2 files

0.12.0

2 files

0.9.1

2 files

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