Development Roadmap
Forgejo milestones track the main project phases. Repo docs remain the detailed source of design decisions.
Milestones
- M0 Planning and Safety Foundation
- M1 Scanner and Dry-Run Inventory: closed
- M2 Metadata Model and Resolver: closed
- M3 Organization and Downstream Profiles: closed
- M4 Acquisition Integrations: closed for the lab milestone
- M5 Web App Scaffold and Operator UI: authenticated Readarr-style lab console present
- M6 Deployment and Operations: Docker healthcheck and tag policy present
- M7 Documentation and Wiki Completeness: #13 open
Current Issues
- #1 Implement read-only fixture scanner foundation: closed
- #2 Define versioned Docker release packaging: closed by v0.2.8
- #3 Explore final project name and logo direction
- #4 Design scale-aware scanner persistence and database strategy: closed
- #5 Design metadata source lookup and enrichment workflow: closed
- #6 Design organization dry-run plans and downstream profiles: closed
- #7 Add local prototype operator UI: closed
- #8 Add acquisition foundation: closed
- #9 Implement first real download client adapter: closed
- #10 Add Proxmox LXC prototype installer: closed
- #11 Back Add New and Activity with durable APIs: closed by v0.2.x
- #12 Add real indexer and search configuration: closed by v0.2.7
- #13 Publish lab docs and wiki refresh: ongoing with each release
Naming
- Product name: Pagemaster
- Tagline: "Look to the books"
- Name/logo issue: #3
v0.1.0 Lab Release Slice
The v0.1.0 lab slice packages the first operable Pagemaster shell:
- React/Vite operator console embedded in the Go server.
- First-visitor setup for the initial operator account.
- Role foundation for operator/requester/viewer accounts.
- Server-side password hashing and setup/status APIs.
- App configuration summary endpoint.
- SQLite schema additions for users, sessions, settings, secrets, output profiles, automation profiles, and per-root apply behavior.
- Docker packaging as
pagemaster:0.1.0. - Calibre included in the image for self-contained ebook conversion tooling.
- Docker smoke verification for
/api/health,/api/setup/status, and the frontend shell.
Follow-up before a broader real-library lab run:
- Enforce sessions beyond initial setup.
- Build in-app configuration pages for roots, output profiles, secrets, and automation policy.
- Add real acquisition configuration for Prowlarr/Newznab/Torznab and download clients.
- Research and document MyAnonamouse setup accurately before implementing source-specific behavior.
v0.2.8 Docker Healthcheck
The current LXC/mainline prototype reports v0.2.8. It keeps the v0.2.7 acquisition milestone and adds Docker package hardening: the image has a built-in pagemaster healthcheck command, the Dockerfile declares HEALTHCHECK, and the Docker docs define immutable version tags plus reserved moving-tag policy for lab and latest.
Next slices should focus on provider identifiers in matching/ranking, controlled auto-grab and auto-import policy gates, MyAnonamouse/provider-specific behavior after verified setup research, downstream Audiobookshelf/Grimmory apply triggers, and upgrade/operator documentation.
M2 Result
The backend/scanner direction has moved from JavaScript to Go. The current repo keeps the scanner as a Go package under internal/scanner, shared synthetic stress helpers under internal/scannertest, SQLite persistence under internal/store, metadata resolver contracts under internal/metadata, and CLIs under cmd/.
M2 now includes:
db/schema.sql: scale-aware schema with source roots, scan runs, files, candidates, evidence, duplicate signals, import plans, and acquisition/domain tables.internal/store: SQLite schema application, scanner-report persistence, source-root-scoped candidates, re-scan state, import-plan history, and indexed review counters.internal/metadata: backend provider contract for wanted-author lookup and missing-item enrichment.make check-large-scan: synthetic 30,000-file scanner stress check outside the repo.make check-persistence: synthetic 30,000-file SQLite write validation outside the repo.- Go tests for scanner behavior, schema contract checks, scanner-report persistence, missing/moved file re-scans, repeated import-history growth, indexed review counters, and metadata resolver behavior.
Latest synthetic scanner check processed 30,000 files in 404 ms and produced 30,000 candidates, 30,000 evidence records, and 30,000 dry-run import plan actions.
Latest SQLite persistence check scanned 30,000 files in 409 ms and persisted the report in 3209 ms, producing 30,000 scan files, 30,000 candidates, 30,000 candidate-file links, 30,000 metadata evidence rows, one import plan, and 30,000 import plan actions.
SQLite is accepted for the first app scaffold, with the option to revisit after real-library testing.
M3 Progress
The first organization checkpoint is present:
internal/organization: Audiobookshelf dry-run planner.organization_plansandorganization_plan_actions: persisted dry-run organization plans.make check-organization: fixture organization plan smoke command.- Tests for non-destructive copy-shaped operations, narrator folders, disc folders, duplicate review, weak metadata review, and persistence.
Current dry-run behavior:
- Organize ready candidates.
- Review duplicates and weak metadata.
- Hold partial downloads, unsupported files, and sidecar-only candidates.
- Preserve audiobook disc folders as
Disc N. - Keep file operations non-destructive until review/apply behavior is explicitly designed.
The M3 foundation now includes downstream dry-run profiles plus copy-only approve/apply/audit behavior. Follow-up work should refine individual action review UI, retry UI, collision resolution choices, audit retention controls, and optional Audiobookshelf scan handoff.
Prototype Result
The first testable operator prototype is present:
cmd/library-manager serve: local web server.internal/app: Go-hosted dashboard and JSON API./api/health: health check./api/dashboard: persisted scanner/review/organization summary.- Configured-root scan APIs persist reports, build organization plans, and return updated dashboard state.
make prototype: starts the prototype onhttp://127.0.0.1:8090.
The prototype uses SQLite under DATA_DIR and applies the schema idempotently on startup, so it can be restarted against the same development database.
Documentation Practice
Each implementation slice should update:
- Repo planning docs under
docs/. - The Forgejo milestone or issue state.
- Wiki pages that explain setup, configuration, usage, or operator-visible behavior.