Skip to content

What changed in Seed

Every feature and fix merged into Seed, newest first, each linked to its pull request. Seed has no version numbers: what is on main is the current Seed.

Last change · 229 changes in the last 30 days

Seed is built by one developer, Anton Shubin, who uses it for his own products and client work. It is MIT-licensed: your copy is yours, and a product takes later changes as a patch (Building a product on Seed).

Subscribe: RSS feed · Newsletter

November 2026

11 changes

New

  • Simplified Chinese, Japanese and French, and a header language switch. #641
  • Changelog page and docs on the site. #629
  • Screenshot lightbox and a dark phone frame. #633
  • A page per feature. #628
  • Seed's own blog posts load from Markdown files in the demo. #627

Fixed

6 fixes
  • Keep real subscribers through the wipe. #632
  • Offline sign-out rare cases and tests. #617
  • Keep an expired user's unsent edits. #615
  • Offline queue edges at sign-out. #608
  • Renew passkey autofill only with focus. #610
  • E2e, infra and docs parked items. #607

October 2026

249 changes

New

  • A benchmark page measures how one large group performs on the device it runs on. #581
  • Pull only what changed since the device's cursor. #568
  • Right-to-left layouts in the SPA and admin. #532
  • Stats screen. #506
  • A language per post and per subscriber. #528
  • Catalog photos — faster ready state, lightbox, cover mark, named image jobs. #515
  • E-mails in the recipient's language, zone and format. #512
  • The public website in every language, with hreflang. #509
  • Translate API and domain errors. #505
  • Catalog item editor, toasts and leftovers. #504
  • Translate admin screens. #490
  • Translate notes, tags, search and shortcuts screens. #488
  • Translate sign-in and profile screens. #486
  • Tracking links per source, through Umami. #492
  • Translate API tokens, notifications, onboarding, overview and billing screens. #487
  • Translate the group screens. #489
  • The catalog module: domain, server, admin and public API. #481
  • The user's language in both apps. #477
  • SPA=false and operator:create for products without sign-up. #482
  • File names, thumbnails, search and downloads in Files. #479
  • Process uploaded images. #467
  • Contact links, a site setting. #468
  • Profile picture. #435
  • Choose the sort direction. #450
  • Private admin survives nightly reset. #434
  • Attachments with quotas. #426
  • A bot every product extends. #423
  • Download my data. #420
  • Public blog, RSS and SEO. #403
  • Blog module with editor. #402
  • Posts, publishing and newsletter send. #399
  • Sign in and sign up by e-mail link. #393
  • Scheduling API and admin Jobs module. #398
  • Bundled file store, S3 through Garage. #400
  • Notes list with search, filters, authors and dates. #361
  • Any colour for tags and groups, tag note counts. #363
  • Try the app as a guest. #352
  • Group overview built from widgets. #351
  • Split the profile into sections. #364
  • Demo video with captions and music. #357
  • Group page tabs with a Plan and billing tab. #331
  • Deno task init and Traefik started by dev. #341
  • Passkeys. #322
  • Keyboard shortcuts, ? to list them. #319
  • Export and import a group. #320
  • Pool connections with pgbouncer. #317
  • Admin video with music. #303
  • Author and updated line in page hero. #298
  • Llms.txt, dated sitemap, named AI bots. #297
  • Redirect /mvp to antonshubin.com. #299
  • Lively seed data. #292
  • One product entity in structured data. #296
  • Wording for search and AI answers. #295
  • Umami analytics. #291
  • Admin panel page. #288
  • Admin panel video. #281
  • Real addresses, hidden from the operator. #258
  • Shared demo accounts, fake data and a nightly wipe. #251
  • One trial per person, not per group. #245
  • Search notes and groups with Ctrl+K. #481
  • One AppShell frame for the SPA and the admin. #532
  • Ask before signing out with unsent changes. #527
  • One brand across the site, app and admin. #476
  • Preferences synced across devices. #480
  • Sidebar-only shell for the SPA and admin. #483
  • Prove the address before sign-up creates anything. #478
  • Create tokens and invitations on pages, align wording. #479
  • Add the billing module. #471
  • Adopt SavedCopyNotice, bump ts-libs to 1.75.0. #473
  • One editor page to create and edit a group. #468
  • Tag editor page for create and edit. #461
  • Notes and tags in the shared column. #449
  • Profile as one set of setting cards. #447
  • Groups screens in the shared column. #450
  • Notifications and sign-in screens in their columns. #448
  • One layout spine for signed-in screens. #445
  • Audit log and System pages. #443
  • Manage groups from the operator area. #441
  • Role, session, reset link and CSV export for operators. #442
  • Add the features page. #436
  • Add the compare page. #437
  • Add the newsletter module to the operator area. #439
  • Add real prices and the founders page. #438
  • API tokens, devices and notifications in the operator area. #440
  • Redesign the operator area as a module dashboard. #432
  • Seed site frame and home page. #430
  • Screenshots and social images for the website. #431
  • Add the operator area on its own host. #422
  • Carry out the account-deletion decisions of #357. #415
  • Purge unread notifications after a year. #412
  • A scheduled backup and a tested restore. #399
  • Sign in with Google and GitHub. #380
  • First-steps checklist and tour in the SPA. #377
  • Purge tokens 30 days after expiry. #339
  • Add tags. #323
  • Make local data a swappable module. #319
  • Security headers on the API, SPA and MPA. #317
  • Make the transport a swappable module. #315
  • Create the proxy network when missing. #310
  • Offline-first PWA on the shared libraries. #304
  • Starter data on sign-up. #296
  • Runtime configuration from /config.json. #295
  • Personal API tokens. #292
  • Report browser and API errors. #291
  • Record when a user was last seen. #289
  • List sessions and sign out other devices. #285
  • Soft delete, restore and undo. #284
  • In-app inbox. #283
  • Delete my account. #280
  • Move all of a group's data to another group. #281
  • Group activity log. #279
  • Open a note from another of my groups. #277
  • Description, colour and emoji. #278
  • App frame and account screens, redesigned. #269
  • Redesign the group and billing screens. #273
  • Redesign the notes list and note editor. #272
  • Public website for Template. #271
  • Serve the MPA on its own domain. #264
  • Use Notice and per-member label. #263
  • Visitors subscribe to mail. #261
  • Hand billing over on owner transfer. #258
  • Move notes between groups. #259
  • Bill pro per member. #251
  • Transfer group ownership. #249
  • Trials, cancelling, notices. #246
  • Group invitations. #243
  • Recover when the app returns. #241
  • End the plan after a grace period. #240
  • Plan limits and feature gates. #238
  • Subscriptions per group with Stripe. #235
  • Manage members and roles. #234
  • Return to the requested page. #226
  • React to permission changes. #225
  • Verify e-mail with a one-time code. #216
  • Rename, delete, keep at least one. #215
  • Note pages for create and edit. #209
  • Redesign group list and settings pages. #208
  • E-mail address and password reset. #207
  • Notes at /notes with a group picker.
  • Store the selected group per user.
  • Profile and push over the socket. #193
  • Keep auth rate limits in valkey. #186
  • Meet the screen contract on pc 2.0.
  • Read one group; fix list precision. #183
  • Add delayed and repeating jobs. #182
  • Run its e2e in ci and deploy it. #176

Fixed

103 fixes
  • Start the demo checklist with the invite done. #589
  • Site details and picture frames. #587
  • A page for unknown addresses. #588
  • Launch copy, module count and wording. #586
  • Unlinking a method or signing in over a session drops push rows. #577
  • A device signed out from elsewhere stops getting notifications. #571
  • Issue a new session when a guest keeps their account. #569
  • Ask for an address before a first password, and show refusals. #552
  • Budget operations per person and per guest address. #551
  • Newsletter takes the product's own name. #555
  • Stand-in authors may always write. #553
  • Contact links editor wording, hints and footer handles. #556
  • Correct blog editor and jobs wording. #554
  • Rewrite every translation in context. #550
  • Clearer link wording in the bot and the dialog. #518
  • Tell open tabs when an operator removes a picture. #520
  • Phone layout and wording on the person and System pages. #516
  • Page order and small wording on Notes, sign-in link and Account. #517
  • Cancelling a note upload does not always cancel it. #519
  • Pages open during a deploy wait out every refusal. #521
  • Allow Fresh's render nonce in script-src. #503
  • Pass stdin through deno task compose. #502
  • Name the SPA when it is kept off. #497
  • Copy the language catalogs to the server. #491
  • Show each tag in its colour in the picker. #447
  • Seed audit rows in time order on any date. #470
  • Send the API reference to the server. #449
  • Invitation link opens sign-up with context. #437
  • Tab out of preference lists reaches the next control. #424
  • Sign-in link hand-off and provider unlink. #425
  • Confirm uploads into a key the browser never had. #422
  • API build card spreads labels from values. #421
  • Keep a region change made during a save. #404
  • Old zone names without a Debian mirror. #390
  • Tap targets, phone submits, passkey details. #385
  • Database knows the old zone names browsers report. #388
  • Account menu opens the profile, install offer gap, toasts. #360
  • Skip the dry run for a project with no containers. #358
  • Init write keeps modes, one-line Traefik error. #355
  • Init and dev follow-ups. #348
  • /compare and /features layout at 390 px. #323
  • One name per thing, links that say where they go. #316
  • Count the IPv6 sign-up budget per /48. #311
  • Cache static assets, stop no-store on pages. #294
  • Finish the public site redesign. #240
  • Search palette snippets, short-query line and focus after a pick. #242
  • Polish the app shell's first screens. #241
  • Billing dates in the cancel dialog, billing actions in the audit log. #239
  • Sign-out deletes everything the app keeps in the browser. #237
  • A stranger can no longer block an address's sign-up codes. #526
  • An old address opens no account through a provider. #520
  • End push subscriptions at sign-out and password reset. #519
  • A failed read of sign-in methods offers a retry. #518
  • Survive a kill, a new server and a shared repository. #509
  • Proof for two-factor on, one lock for session guesses. #514
  • An account with an unproven address cannot invite. #510
  • Check api and mpa health over HTTP. #511
  • Deploy refuses a dirty tree, CI stops retrying browser tests. #505
  • Show a failed first groups read with Try again. #507
  • Admin screens pass the design audit. #502
  • Server faults, indexes and test gaps. #467
  • Mask the domain in newsletter audits. #475
  • Forget the last person's copies on switch. #470
  • Accept X-Real-IP from the proxy only. #469
  • Owner on phone, search out of URLs. #466
  • Show operators as Support team in log. #465
  • Ignore vapid.json in every folder. #452
  • Keep libs/ui styles in container builds. #435
  • Ask for proof and send a mail when a sign-in method changes. #419
  • Drop unproven sign-in methods on a reset. #405
  • Let an account without a password act on itself. #398
  • Put a socket proxy between Vector and Docker. #401
  • Keep the product up when a deploy step fails. #402
  • Show the groups as loading until the first read. #397
  • Proof before two-factor goes off, and a short lock per sign-in name. #395
  • Name image registries and freeze the lock in builds. #378
  • Refuse text Postgres cannot store with 400. #375
  • Replace newer server files, let two projects share a host. #368
  • Mailed newsletter links open the website. #366
  • Move focus to the page heading when the install offer closes. #374
  • Store a push address of up to 2048 characters. #369
  • Keep the session and the saved data through a deploy. #365
  • Keep the nightly cleanup alive and log failed jobs. #363
  • Send signed-out visits to /tags and /notifications to sign-in. #364
  • Harden personal API tokens. #359
  • Make db:seed create the demo user and hold migration names in order. #362
  • Close the proxy's dashboard and the public consoles. #361
  • Cap tags, audit changes, refuse NUL in names. #358
  • Give the e2e harness a tracked home and make the SPA build finish. #338
  • Keep the saved copy when the proxy answers 502 or 404. #333
  • REST writes name the page's user. #334
  • Dev SPA limits and the sessions e2e address. #307
  • Instant offline undo with focus; move-all notice names group. #290
  • Delete files removed from the repo. #274
  • No grace after a failed trial charge. #254
  • Pull when the socket first opens. #255
  • Keep subscribed groups out of the purge. #237
  • Write auth audit rows in the action's tx. #233
  • Charge address changes to the account. #232
  • Keep long request ids in audit rows. #222
  • Keep env and key files out of images. #211
  • Surface event listener failures. #188
  • Anchor spacing skip patterns below root. #185

September 2026

31 changes

New

  • Work offline with a local store. #124
  • Add rest-only reference client. #121
  • Add a reference aggregate. #118
  • Move group calls to the socket. #109
  • Move auth and profile screens to libs/ui. #106
  • Import the Vite plugins and spacing scale from the library. #56
  • Use Shell from preact-components for the signed-in layout. #52
  • Add age64 env tooling. #10

Fixed

23 fixes
  • Drop loki's healthcheck that cannot pass. #120
  • Apply migrations on deploy. #115
  • Run the worker in compose. #114
  • Require a password for valkey. #104
  • Stop the white flash in dark theme. #99
  • Make the first deploy hands-off. #102
  • Delete owned groups in dev cleanup. #101
  • Let postgres decide the second factor. #100
  • Limit wrong one-time codes per user. #94
  • Pull MinIO from the community fork. #93
  • Serve signed-in requests while Valkey is down. #88
  • Repair env, deploy, seed and backup. #89
  • Send web push to one user only. #87
  • Hide profile until second factor. #83
  • Check Origin on the WebSocket upgrade. #85
  • Docker base configs and cert resolver. #84
  • Keep 2FA state across reloads. #76
  • Give one-time codes their own rate limit. #72
  • Refuse cross-site mutations on every route. #55
  • Adopt ts-libs 1.4.0, fix group creation behind TLS. #49
  • Fail loudly without integration DB. #32
  • Accept TOTP codes with a leading zero. #29
  • Merge prod https routers by name. #30

January 2026

2 changes

New

  • Auth/profile flow + mobile ui. #1
  • Implement webhook handling and action processing.
Earlier changes on GitHub