Files
summercms/.planning/notes/v1-target-plytarium.md
Jakub Zych 8ce164bb0c Initial commit: SummerCMS Go planning docs and research
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.
2026-09-16 02:07:04 +02:00

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 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.