--- title: v1 target — Płytarium port date: 2026-09-16 context: Chosen during the opening exploration session over the smaller `inventory` project. Defines v1 scope and the acceptance rule. --- # v1 target: Płytarium port **Definition of done for v1:** `vue-fonoteka-app` (Nuxt 4) runs unchanged against the SummerCMS Go backend, and `fonoteka-mcp` talks to it through the same OAuth2 flow it uses today. Płytarium is the `fonoteka` project at `/media/nvme/dev/golem15/fonoteka`. It is a headless WinterCMS backend for a household record collection, forked from `wn-inventory-plugin`, on the Golem15 starter v1.1.8 LTS. ## Why this one - Headless. No theme engine needed in v1. - Actively developed and actually used, so "done" is testable by daily use. - It forces every ecosystem claim at once: OAuth2/OIDC provider, background jobs, realtime, search, file uploads, external APIs, org-scoped permissions. - Roughly three times the size of `inventory`, which was the alternative. Large enough to be real, small enough to finish. ## What must be ported ### Domain plugin `golem15.fonoteka` | Aspect | Count | |---|---| | Models | 25 (Album, Artist, Collection, Genre, Style, AlbumRating, AlbumReservation, ApiToken, CollectionEditor, CollectionInvitation, CsvImport, CsvImportRow, Notification, OAuthAuthCode, OAuthClient, OAuthRefreshToken, OrgAiCredential, OrgDiscogsCredential, PendingInvitationRegistration, Settings, UserAiCredential, UserCollectionContext, UserDiscogsCredential, WishlistDigestQueue, WishlistSubscription) | | Admin controllers | 5 (Albums, Artists, Collections, Genres, Styles) with YAML-driven forms and lists | | API routes | 160 (collections, albums, wishlist, sharing, notifications, realtime channels, CSV export, locale, context) | | Migrations | 27 | | Console commands | 3 (IssueOAuthClient, PruneNotifications, ReindexAlbums) | | Jobs | CSV import, wishlist digest | | Test files | 143 | | PHP lines | ~57k | ### Stack plugins in play | Plugin | Role in Płytarium | |---|---| | user | Accounts, JWT, organizations, the base of the OAuth2 provider | | backend | Admin panel improvements | | apparatus | DI, scenarios, backend tooling | | golem | AI integration (cover recognition via Anthropic / OpenAI) | | translate | pl / en | | websockets | Realtime via Centrifugo | | userfriends | Friends and groups for collection sharing (optional) | | journal | Blog / notes (optional) | | feedback | Feedback submissions | | sitemap | Sitemap | ### Hard parts, and the Go answer from research | Hard part | Go pick | |---|---| | OAuth2 provider used by ChatGPT connector and MCP | `zitadel/oidc` | | JWT for the SPA | `golang-jwt/jwt` | | Queued jobs (CSV import, digests) | `riverqueue/river` (Postgres-backed) | | Realtime notifications | `coder/websocket`, or keep Centrifugo and port only the publisher | | Search (Typesense via Scout today) | Typesense Go client | | File uploads, cover images | `gocloud.dev/blob` | | Discogs, Anthropic, OpenAI HTTP clients | stdlib `net/http`, official Anthropic Go SDK | | Validation of YAML `rules:` | `go-playground/validator` | ## Out of scope for v1 - Server-rendered themes and components. Second target: keios.eu (see `../seeds/keios-port-themes-payments.md`). - Payments (paymentgateway, pgstripe). Same second target. - Chat, forum, video. wavepath.org territory, later. - WASM extension API. See `../seeds/wasm-extension-api.md`. ## Reference material - `wavepath.org/plugins/golem15/oauthserver` (11k lines, has tests and `INTEGRATING.md`) is the fuller OAuth2 implementation in the stack. Use it as the behavioral reference for the user plugin's OIDC port even though Płytarium's own OAuth models are smaller. - `fonoteka/.planning/` holds the GSD history of the PHP project, including `STARTER-LINEAGE.md`.