9 Commits
Author SHA1 Message Date
pastilhasandClaude Opus 5 2b0b15fb41 release 2026.08.27.01
first dated version. plugins were all sitting on 1.0.0, which said nothing about
when a build was made or which of two copies is newer — the platform already
uses YYYY.MM.DD.NN and this follows it.

the version lives in manifest.ts because a plugin has no package.json; that is
the field the marketplace publishes and the installer compares.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026.08.27.01
2026-08-27 07:36:36 +00:00
pastilhas cb1a83628c AGENTS.md, so both harnesses find the same guidance
opencode discovers AGENTS.md and nothing else; claude code discovers CLAUDE.md.
this repo had neither, so an agent sent to change something here arrived with no
guidance at all under either.

it deliberately does NOT repeat README.md. that file says what the plugin is,
for someone deciding whether to install it. this one answers the other question:
i have to change something in here, what will i break.

the facts in it are read from the repository rather than recalled — the panel
keys from web/panels.ts, the tables from db/schema.ts, the permission keys, the
host binaries and the route claims from manifest.ts. presence is the declaration
everywhere in this system, so the file says what the platform will actually
conclude from these files existing.

CLAUDE.md beside it is a pointer, not a copy: two copies drift and the stale one
is the one somebody reads.
2026-08-27 07:24:17 +00:00
pastilhas 95504b0eb3 say what this plugin is for, in the store's words
tags are how the marketplace is browsed rather than scrolled: a list of them on
the left, the plugins that carry one on the right. a closed vocabulary
(PLUGIN_TAGS in the platform) because free text becomes homelab, home-lab, Home
Lab and selfhosted inside a month, and a filter list of synonyms is worse than
no filter at all.

declared here rather than curated in the catalogue, so a plugin can say what it
is and nobody edits a table when one ships. the marketplace caches it on sync,
exactly as it already does for label and summary.
2026-08-27 06:49:35 +00:00
pastilhasandClaude Opus 5 a9b83228be wrap the connection form in a <form> so enter submits
the url and api key fields sat in a div, so pressing enter did nothing
and the save button was the only way in. same fix as gitea's connection
screen: submit is now onSubmit with preventDefault, and disconnect is
marked type="button" so it can't submit the form.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 10:41:58 +00:00
officer 7f2df667b7 drop the stray root icon.png
Left by the extraction on 2026-08-19: the old 3.5KB public/slskd.png was copied
to the plugin root, which is not a path anything reads. publishAssets copies
`assets/` only, so the icon that has always been served is assets/icon.png —
now 248KB of real artwork rather than the old logo.

Two copies of the same idea, one of them invisible, is how they drift.
2026-08-19 05:54:00 +00:00
Claude 077eb72b87 icon: transparent corners, so the tile is a tile
The app icon is flattened onto black because iOS rejects an alpha channel, and
copying that straight over made every dock tile an opaque black square. The tile
wants the frame's own rounded edge with the corners cut away — which is what the
icon this replaces already had, and what tile: bare means.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 06:28:58 +01:00
Claude 3f73ebdecb art: the redrawn icon, and the splash beside it
New master drawn to the current brief on 2026-08-19 — the Soulseek bird as the
hero with Officer Duck riding it, rather than the duck as the subject.

The splash ships here too. The platform draws no splash of its own; it is
carried because this repository is where the product's artwork lives, and the
phone app that fronts the same product needs somewhere to read it from. The two
are a pair: the icon is a reduction of the splash's world.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 06:27:19 +01:00
Claude 91e98b5f0d icon: the app's own artwork, at 256
The dock tile takes assets/icon.png when the plugin ships one and falls back to
the manifest's lucide glyph when it does not. This is the same icon the phone
shows, resized — one mark per product, wherever it appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 06:04:15 +01:00
officer c11f45c033 soulseek, extracted from the platform as a plugin
Seventh plugin out, and the first that was already dead. Soulseek had been
switched off since 2026-08-13: hono.ts had the router import and its mount
commented out, so createSidecarProxy never ran, registerProxiedPrefix was never
called, the slskd:server announcement fired into a void, and officer-slskd was
not in the ecosystem at all. The permission entry had been reduced to api: [],
which is why assertPermissionTotality was satisfied and the server booted
clean. The UI rendered perfectly and every request 404'd.

So this is a resurrection as well as a move.

The mount is now /api/soulseek, derived via mountPrefix from the appName — all
47 frontend call sites repointed from /slskd/. The credential key in
service_connections stays 'slskd': it names the daemon, not the route. Those
two strings differ on purpose and conflating them reads the wrong row.

The connection stays in core service_connections, as transmission does, so
'slskd' remains in a platform union this plugin cannot extend. Recorded in
PLUGIN.md. Unlike transmission this plugin does own a schema: favourites and
the two halves of the cached browse tree, which slskd has no concept of. Those
three tables had been dropped from the drizzle barrel, so bun db:push would
have deleted them on any server holding data.

313 palette classes converted to the semantic tone set, including a shared
PHASE_TONE the three transfer views previously each copied.
2026-08-19 02:55:02 +00:00