Records the move from Scala to Go, the compiled-plugin decision, the Płytarium port as the v1 target, and the Go ecosystem research that backs the choice. No code yet.
3.7 KiB
3.7 KiB
title, date, context
| title | date | context |
|---|---|---|
| v1 target — Płytarium port | 2026-09-16 | 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 andINTEGRATING.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, includingSTARTER-LINEAGE.md.