Canonical metadata backend for Collectarr with provider ingest, image delivery, search, and admin tooling.
Python
0
406 commits
updated Oct 18, 2026
Shared metadata engine for Collectarr: canonical catalog, typed catalog APIs, image delivery, admin tooling, and search infrastructure.
Collectarr Core owns the shared catalog and source-neutral metadata contracts.
The target product has no provider adapters or provider importers. App users
search and edit canonical Catalog Items through Core. Personal library state
such as owned copies, grades, notes, wishlists, and local tags stays in
collectarr-app and can optionally sync through collectarr-sync.
Coordinated all-kind Catalog Item v1 cutover in progress: Core's active API, ORM models, and contracts now use Catalog Item v1 for all nine kinds. The App's active library pages use Catalog Item and Owned Copy v1 flows, but legacy App persistence and provider-dependent code are still being removed. Do not deploy this cross-repository working state or reset databases yet. The completed release will require stopping App and Core together, preserving old backups only for archival recovery, creating empty Core and App databases, running
python -m app.scripts.bootstrap_schema, and rebuilding the search index. The old database and backup formats will not be supported by the final v1 baseline;create_all()will not reshape them.
/docs for API exploration and schema-backed integration workThe generated schema docs stay in sync with SQLAlchemy metadata and include columns, enums, indexes, defaults, unique constraints, and cross-domain references.
python -m scripts.export_schema_site or keep it live with python -m scripts.export_schema_site --watch.The server database is created directly from the typed SQLAlchemy models. When
the schema changes, recreate the development database and run
python -m app.scripts.bootstrap_schema.
Copy-Item .env.example .env
docker compose up --build -d
docker compose exec api python -m app.scripts.bootstrap_schema
python -m pip install -e .[dev]
python -m ruff check .
python -m pytest
.\tools\dev.ps1 start # Start Docker stack
.\tools\dev.ps1 start -WithSync # Start Core + collectarr-sync dev stack
.\tools\dev.ps1 schema # Create the schema from SQLAlchemy models
.\tools\dev.ps1 test # Run test suite
.\tools\dev.ps1 check # Lint + type check
.\tools\dev.ps1 reset-stack # Clean reset of containers and volumes
Core is the canonical source of cross-library metadata. The target app has no external metadata-provider search, credentials, provider mapping, import history, or source identifiers. It sends Core a complete Catalog Item that is ready to validate and persist.
Core and App do not retain provider-native payloads, provenance, provider IDs, snapshots, or provider import jobs.
| Service | URL |
|---|---|
| API | http://localhost:8010 |
| API docs (Swagger) | http://localhost:8010/docs |
| Sync service | http://localhost:8020 |
| Meilisearch | http://localhost:7700 |
| MinIO console | http://localhost:9001 |
Release publishing is manual-only. The Release GitHub Actions workflow uses
workflow_dispatch; pushing to main runs CI only and never auto-publishes.
Current beta release: v0.2.0
Current backend image tags:
ghcr.io/collectarr/collectarr-core:v0.2.0ghcr.io/collectarr/collectarr-core:latestRelease docs and container tags are kept in sync with the GitHub release state before publishing.
When a releasable version is detected, the workflow publishes a GitHub Release
and pushes the backend container image to ghcr.io/collectarr/collectarr-core
with both the semantic version tag and latest.
The first published GHCR package defaults to private. After the first real
release, open the package page in the collectarr organization and switch
collectarr-core to public before expecting anonymous docker pull
operations to work:
https://github.com/orgs/collectarr/packages/container/package/collectarr-coreFor personal LAN deployment on unRAID with Docker Compose, see docs/unraid.md.
The repo includes snapshot badges for total catalog items and per-kind item
counts. .github/workflows/catalog-badges.yml refreshes them on a daily
schedule or manual dispatch.
To switch from placeholder badges to live counts, configure:
COLLECTARR_BADGES_BASE_URL for the public Core base URL (e.g., COLLECTARR_BADGES_BASE_URL=http://localhost:8010)COLLECTARR_BADGES_TOKEN for bearer-token access to /api/v1/admin/catalog/summaryOr, instead of a static token:
COLLECTARR_BADGES_EMAILCOLLECTARR_BADGES_PASSWORDThe workflow logs in through /api/v1/auth/login when a bearer token is not provided.
| Repo | Purpose |
|---|---|
collectarr-app | Flutter client for local-first collection browsing, editing, and admin-facing UX |
collectarr-sync | Optional personal sync service for multi-device shelf state |
See docs/library-parity-contract.md for the cross-repository Catalog Item and Owned Copy boundaries.
See docs/implementation-plan.md for the full roadmap.
Current active tracks:
If Collectarr is useful to you, you can support ongoing development on Ko-fi:
Canonical metadata backend for Collectarr with provider ingest, image delivery, search, and admin tooling.
Python
0
406 commits
updated Oct 18, 2026
Shared metadata engine for Collectarr: canonical catalog, typed catalog APIs, image delivery, admin tooling, and search infrastructure.
Collectarr Core owns the shared catalog and source-neutral metadata contracts.
The target product has no provider adapters or provider importers. App users
search and edit canonical Catalog Items through Core. Personal library state
such as owned copies, grades, notes, wishlists, and local tags stays in
collectarr-app and can optionally sync through collectarr-sync.
Coordinated all-kind Catalog Item v1 cutover in progress: Core's active API, ORM models, and contracts now use Catalog Item v1 for all nine kinds. The App's active library pages use Catalog Item and Owned Copy v1 flows, but legacy App persistence and provider-dependent code are still being removed. Do not deploy this cross-repository working state or reset databases yet. The completed release will require stopping App and Core together, preserving old backups only for archival recovery, creating empty Core and App databases, running
python -m app.scripts.bootstrap_schema, and rebuilding the search index. The old database and backup formats will not be supported by the final v1 baseline;create_all()will not reshape them.
/docs for API exploration and schema-backed integration workThe generated schema docs stay in sync with SQLAlchemy metadata and include columns, enums, indexes, defaults, unique constraints, and cross-domain references.
python -m scripts.export_schema_site or keep it live with python -m scripts.export_schema_site --watch.The server database is created directly from the typed SQLAlchemy models. When
the schema changes, recreate the development database and run
python -m app.scripts.bootstrap_schema.
Copy-Item .env.example .env
docker compose up --build -d
docker compose exec api python -m app.scripts.bootstrap_schema
python -m pip install -e .[dev]
python -m ruff check .
python -m pytest
.\tools\dev.ps1 start # Start Docker stack
.\tools\dev.ps1 start -WithSync # Start Core + collectarr-sync dev stack
.\tools\dev.ps1 schema # Create the schema from SQLAlchemy models
.\tools\dev.ps1 test # Run test suite
.\tools\dev.ps1 check # Lint + type check
.\tools\dev.ps1 reset-stack # Clean reset of containers and volumes
Core is the canonical source of cross-library metadata. The target app has no external metadata-provider search, credentials, provider mapping, import history, or source identifiers. It sends Core a complete Catalog Item that is ready to validate and persist.
Core and App do not retain provider-native payloads, provenance, provider IDs, snapshots, or provider import jobs.
| Service | URL |
|---|---|
| API | http://localhost:8010 |
| API docs (Swagger) | http://localhost:8010/docs |
| Sync service | http://localhost:8020 |
| Meilisearch | http://localhost:7700 |
| MinIO console | http://localhost:9001 |
Release publishing is manual-only. The Release GitHub Actions workflow uses
workflow_dispatch; pushing to main runs CI only and never auto-publishes.
Current beta release: v0.2.0
Current backend image tags:
ghcr.io/collectarr/collectarr-core:v0.2.0ghcr.io/collectarr/collectarr-core:latestRelease docs and container tags are kept in sync with the GitHub release state before publishing.
When a releasable version is detected, the workflow publishes a GitHub Release
and pushes the backend container image to ghcr.io/collectarr/collectarr-core
with both the semantic version tag and latest.
The first published GHCR package defaults to private. After the first real
release, open the package page in the collectarr organization and switch
collectarr-core to public before expecting anonymous docker pull
operations to work:
https://github.com/orgs/collectarr/packages/container/package/collectarr-coreFor personal LAN deployment on unRAID with Docker Compose, see docs/unraid.md.
The repo includes snapshot badges for total catalog items and per-kind item
counts. .github/workflows/catalog-badges.yml refreshes them on a daily
schedule or manual dispatch.
To switch from placeholder badges to live counts, configure:
COLLECTARR_BADGES_BASE_URL for the public Core base URL (e.g., COLLECTARR_BADGES_BASE_URL=http://localhost:8010)COLLECTARR_BADGES_TOKEN for bearer-token access to /api/v1/admin/catalog/summaryOr, instead of a static token:
COLLECTARR_BADGES_EMAILCOLLECTARR_BADGES_PASSWORDThe workflow logs in through /api/v1/auth/login when a bearer token is not provided.
| Repo | Purpose |
|---|---|
collectarr-app | Flutter client for local-first collection browsing, editing, and admin-facing UX |
collectarr-sync | Optional personal sync service for multi-device shelf state |
See docs/library-parity-contract.md for the cross-repository Catalog Item and Owned Copy boundaries.
See docs/implementation-plan.md for the full roadmap.
Current active tracks:
If Collectarr is useful to you, you can support ongoing development on Ko-fi: