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
- 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
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
- 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
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
- Auth/profile flow + mobile ui. #1
- Implement webhook handling and action processing.