Zum Inhalt springen

Funktionen

Alles, was Seed mitbringt, und was noch nicht

Seed ist ein kostenloser SaaS-Starter unter MIT-Lizenz mit Anmeldung per E-Mail, Google und GitHub, Passkeys, Magic Links, Gastkonten, 2FA, Gruppen mit Rollen, Stripe-Abrechnung pro Mitglied, Echtzeit-Updates, einer Offline-App, einem Admin-Bereich, Monitoring und optionalen täglichen verschlüsselten Backups. Jeder Abschnitt unten verlinkt seinen Code.

Von Anton ShubinAktualisiert

Seed ist in Arbeit und wird öffentlich gebaut. Was noch nicht gebaut ist, steht als „Noch nicht gebaut“ neben der Aussage, die es einschränkt, mit seinem Issue, wenn eines offen ist.

Für dich erledigt

Ein SaaS-Starter mit Gruppen und Abrechnung, schon verdrahtet

Konten, Gruppen und Geld: die Teile, die jedes Produkt vor seiner ersten Funktion braucht, und die, bei denen man am leichtesten Fehler macht.

Funktioniert heuteIn der CI getestet. Anmeldung mit Google und GitHub sowie Stripe brauchen deine eigenen Schlüssel, deshalb sind sie in der Demo aus.

Konten

Anmeldung, die fertig ist

Leute registrieren sich mit E-Mail-Adresse und Passwort, bestätigen die Adresse mit einem Code per E-Mail, setzen ein vergessenes Passwort zurück, machen mit Google oder GitHub weiter, bekommen einen Anmeldelink per E-Mail, der sie auch registriert, melden sich mit einem Passkey an oder probieren die App erst in einem Gastkonto aus und fügen später eine Anmeldemethode hinzu. Eine Authenticator-App ergänzt die Zwei-Faktor-Authentifizierung (2FA). Sie sehen jedes Gerät, auf dem sie angemeldet sind, und können die anderen abmelden. Wer eine Anmeldemethode ändert, muss sich ausweisen und bekommt eine E-Mail.

  • Passwörter mit PBKDF2-SHA-256 über Web Crypto gehasht, standardmäßig 600.000 Runden
  • Signierte Sitzungs-Cookies und ein Audit-Protokoll jedes Anmeldeereignisses
  • Persönliche API-Tokens, nur als Hashes mit Schlüssel gespeichert
  • Passkeys: Nur der öffentliche Schlüssel wird gespeichert, und jede Anmelde-Challenge funktioniert einmal
  • Magic Links: Ein Link meldet an oder registriert, funktioniert einmal, 15 Minuten lang, und wird nur als Hash gespeichert
  • Gastkonten (anonyme Anmeldung): Besucher starten mit einem Klick ohne Anmeldemethode und fügen demselben Konto später E-Mail und Passwort, Google, GitHub oder einen Passkey hinzu
  • Falsche Passwörter werden pro Anmeldename gezählt, mit einer kurzen Sperre, egal von welcher Netzwerkadresse
Code der Anmeldung lesen
Die Sicherheitsseite eines Profils: die Anmeldemethoden, die Zwei-Faktor-Authentifizierung (2FA) und die offenen Sitzungen.

Gruppen

Gruppen mit Rollen, ab der ersten Minute

Jedes Konto bekommt bei der Registrierung eine persönliche Gruppe. Leute erstellen gemeinsame Gruppen, laden andere ein, geben ihnen Rollen vom Betrachter bis zum Eigentümer und übergeben die Eigentümerschaft in einem Schritt. Eine gelöschte Gruppe lässt sich 30 Tage lang zurückholen, und jede Gruppe führt ein Aktivitätsprotokoll.

  • Die Gruppe ist die einzige Mandantengrenze: Persönliche und gemeinsame Daten durchlaufen dieselbe Prüfung
  • Die App, ihr Code und diese Website nennen sie alle „Gruppe“
  • Kein zweites Berechtigungsmodell, das mit dem ersten synchron bleiben muss
  • Einladungen, Rollenwechsel und Übergabe der Eigentümerschaft, jeweils mit eigenen Tests
Gruppen-Domain lesen
Das Aktivitätsprotokoll einer Gruppe: wer welche Notiz oder welches Tag wann hinzugefügt hat, mit einem Link, der jede Notiz öffnet.

Übersicht

Eine Übersicht für jede Gruppe

Wichtige Zahlen und ein Diagramm für jeden Zeitraum. Jede Person blendet Widgets aus und ordnet sie neu, und das Layout folgt ihr auf ihre anderen Geräte.

  • Jede Zahl wird mit dem Zeitraum davor verglichen, ohne farbliches Urteil
  • Nur Zählungen: kein Notiztext und keine Rangliste von Personen
  • Jedes Widget lädt, scheitert und versucht es erneut für sich allein
  • Ein neues Aggregat bringt seine eigenen Widgets mit, und der Admin-Bereich zeigt sie ebenfalls
Übersichts-Widgets lesen

Geld

Abrechnung pro Mitglied, über Stripe

Leute sehen eine Preistabelle, einen kostenlosen Tarif mit Grenzen und eine 14-tägige Testphase des bezahlten Tarifs. Der Eigentümer sieht vor einer Einladung, was ein weiteres Mitglied kostet, und bekommt einen klaren Hinweis mit Datum, wenn eine Karte scheitert.

  • Stripe Checkout und das Kundenportal; der Webhook ist die einzige Quelle des Tarifs
  • Mengen, die der Mitgliederzahl folgen
  • Eine Schonfrist nach einer fehlgeschlagenen Zahlung, standardmäßig 7 Tage
  • Tarifgrenzen werden auf dem Server geprüft, nicht nur in der App
  • Tarife stehen in einer Katalogdatei; die Preisseite liest sie
Noch nicht gebaut
  • Zahlungsanbieter außer Stripe
docs/billing.md lesen
Der Tab mit Tarif und Abrechnung einer Beispielgruppe, zu den Beispielpreisen der Demo: Pro-Tarif mit Verlängerungsdatum, 36,00 € im Monat, für 4 Mitglieder zu je 9,00 €, der Eigentümer eingeschlossen, mit Buttons zum Ändern der Karte, zum Ansehen der Rechnungen und zum Kündigen des Tarifs.

Datenschutz

Konten, die man verlassen kann

Leute laden eine Kopie ihrer Daten herunter und löschen ihr Konto im Profil, mit 7 Tagen Bedenkzeit. Gelesene Benachrichtigungen werden nach 90 Tagen gelöscht.

  • Meine Daten herunterladen: ein ZIP mit JSON- und CSV-Dateien, im Hintergrund vorbereitet, 7 Tage aufbewahrt
  • Die Löschung wartet 7 Tage; erneutes Anmelden bricht sie ab
  • Nächtliches Aufräumen von gelesenen Benachrichtigungen, abgelaufenen Einladungen und alten Audit-Ereignissen
Code der Kontolöschung lesen

Export

Deine Daten gehen mit dir

Exportiere jede Gruppe in eine offene JSON-Datei und importiere sie später als neue Gruppe. Die ursprüngliche Gruppe wird nie überschrieben.

  • Der Eigentümer exportiert; importieren darf jeder, der eine Gruppe erstellen darf
  • Die ganze Datei wird geprüft, bevor etwas geschrieben wird, und dann in einem Schritt importiert
  • Jede Notiz und jedes Tag bekommt eine neue ID, damit ein Import nie mit Vorhandenem kollidiert
  • Jedes Aggregat registriert seinen eigenen Teil der Datei
Export-Code lesen

Sprachen

Von Anfang an in sechs Sprachen

Die App, der Admin-Bereich und diese Website sprechen Englisch, Russisch, Spanisch, Deutsch, Portugiesisch (Brasilien) und Arabisch. Leute wählen ihre Sprache in der App, und sie wird mit ihrem Konto gespeichert. Jede Seite dieser Website hat in jeder Sprache ihre eigene Adresse.

  • Ein JSON-Katalog pro Sprache, geprüft von einem Test, der jede fehlende oder veraltete Nachricht nennt
  • Pluralformen, Zahlen und Datumsangaben über das plattformeigene Intl, ohne i18n-Bibliothek
  • hreflang-Links auf jeder Seite der Website und eine Sitemap, die jede Sprache auflistet
  • Arabische Seiten laufen von rechts nach links
Noch nicht gebaut
  • E-Mails in der Sprache des Lesers (Issue #277)
  • Layouts von rechts nach links auf jedem Bildschirm fertig (Issue #215)
Übersetzungsleitfaden lesen

Bereit, wenn du es brauchst

Echtzeit, offline und Hintergrundarbeit

Die Teile, die die meisten Starter weglassen, weil sie schwer sind: Live-Updates, eine App, die ohne Netz funktioniert, und Arbeit, die nicht verloren gehen darf.

Funktioniert heuteOffline schreiben geht für Notizen und Tags; jede andere Liste öffnet offline mit dem, was sie zuletzt gezeigt hat.

Echtzeit

Änderungen erscheinen ohne Neuladen

Die Änderung eines Mitglieds erscheint in jedem offenen Tab der Gruppe, und ein Laptop, der aus dem Ruhezustand aufwacht, holt nach, was er verpasst hat.

  • Ein Standard-WebSocket, mit einer Sequenznummer an jeder Änderung
  • Ein Tab, der nach dem Ruhezustand wieder sichtbar wird, verbindet sich neu und holt das Verpasste
  • Echtzeit lässt sich ausschalten: Die App fragt dann in Abständen nach und funktioniert genauso
Echtzeit-Design lesen
Erstes Fenster: der Notizeditor, der Titel geändert in „Q4-Roadmap: Onboarding, Abrechnung und Rechnungen“.
Zweites Fenster, eine eigene Anmeldung: Direkt nach dem Speichern zeigt seine Notizliste oben den neuen Titel, ohne Neuladen.

Offline

Eine App, die ohne Netz öffnet

Die App lässt sich wie eine native installieren, öffnet ohne Netz und sendet eingereihte Änderungen, sobald das Netz zurück ist. Eine veraltete Änderung erscheint als Konflikt zum Klären, nie als stilles Überschreiben.

  • Eine IndexedDB-Kopie jeder Liste und eine Schreibwarteschlange mit Idempotenzschlüsseln
  • „Meine behalten“ oder „Die vom Server nehmen“ für jeden Konflikt
  • Mit einer Einstellung abgeschaltet oder entfernt, indem man einen Ordner löscht und einer geschriebenen Liste folgt
docs/offline.md lesen
Eine offline gemachte Änderung trifft auf eine neuere auf dem Server: „1 Änderung braucht deine Entscheidung“ zeigt beide Fassungen der Notiz nebeneinander, mit „Meine behalten“ und „Die vom Server nehmen“.

Tastatur

Tastenkürzel in der App und im Admin-Bereich

Drück ?, um jedes Kürzel zu sehen. N fügt auf jeder Seite eine Notiz hinzu, ohne sie zu verlassen, und G gefolgt von einem Buchstaben öffnet einen Bereich. Kürzel stören nicht, während du in einem Feld tippst.

  • Ctrl K (⌘K auf dem Mac) oder / öffnet die Suche
  • Eine Liste pro App belegt die Tasten und füllt den ?-Dialog, damit er nie eine Taste zeigt, die nichts tut
  • Einzeltasten-Kürzel lassen sich pro Gerät ausschalten; Ctrl K und Escape funktionieren weiter
  • Im Admin-Bereich öffnet G gefolgt von einem Buchstaben jedes Modul
Code der Tastenkürzel lesen

Benachrichtigungen

Benachrichtigungen in der App, auf dem Handy, dem Desktop und in Telegram

Leute bekommen einen Hinweis, wenn sie eingeladen werden, eine neue Rolle bekommen oder ihnen eine Gruppe übergeben wird: in der App, als Web-Push auf Handy oder Desktop und in Telegram, sobald sie es verknüpfen.

  • Web-Push mit deinen eigenen Schlüsseln, erzeugt von einer Task: deno task vapid-key:create
  • Ein Ungelesen-Zähler in der App und „Alle als gelesen markieren“
  • Das Push-Abo jedes Geräts im Profil aufgelistet
  • Ein Telegram-Bot, aus, bis du sein Token setzt: verknüpft mit einem Einmalcode, und die eigenen Befehle deines Produkts in einer Datei ergänzt
Web-Push-Dienst lesen
Die Benachrichtigungsseite: drei ungelesene Hinweise zu einem neuen Gruppeneigentümer, einer Rollenänderung und einer Einladung; jede Zeile öffnet, worum es geht.

Hintergrundarbeit

Arbeit, die einen Absturz übersteht

E-Mails und Benachrichtigungen gehen raus, auch wenn der Server mittendrin neu startet, weil die Arbeit gespeichert wird, bevor sie erledigt ist. Deine eigenen Jobs laufen sofort, später oder nach Zeitplan.

  • Jeder Befehl schreibt sein Event in derselben Datenbanktransaktion wie die Änderung
  • Ein Worker leert diese Outbox und verschickt E-Mails, Push und Live-Updates
  • Ein Job ist eine Definition: ein Name, ein Handler und, falls er sich wiederholt, sein Zeitplan
  • Ein fehlgeschlagener Versuch wird mit wachsenden Pausen wiederholt; Operatoren sehen jeden Lauf im Admin
docs/jobs.md lesen
Eine Transaktion: beides wird gespeichert oder keinsDie Änderungeine Notiz, ein MitgliedIhr Eventeine Outbox-ZeileWorkerleert die OutboxE-MailCodes, HinweisePushHandy, DesktopLiveandere Tabs

Dein Produkt

Eine Funktion hinzufügen, indem du eine kopierst

Notizen sind eine vollständige Funktion in jeder Schicht: Datenbank, API, Bildschirm, offline und Tests. Eine neue Funktion kopiert sie Datei für Datei, nach einer Liste, die jede Datei der Reihe nach nennt.

  • Eine Form für jede Funktion, damit der Code leicht zu finden bleibt
  • Jede Schicht hat ihre eigenen Tests, die du mitkopierst
  • Jede ID ist eine zeitlich geordnete UUID (Version 7)
docs/aggregates.md lesen
1 libs/domain/notes/+lib.ts 2 libs/server/db/migrations/…_notes.sql 3 libs/server/notes/ 4 apps/api/features/notes/handlers.ts 5 apps/api/features/notes/operations.ts 6 libs/ui/notes-screen.tsx 7 apps/spa/src/state/notes.ts 8 e2e/notes.e2e.ts

Betrieb

Betreiben, beobachten, die Leute darauf unterstützen

Ein gemieteter Server, die Werkzeuge, um zu sehen, was er tut, und ein Bereich, in dem deine Operatoren den Leuten helfen, die dein Produkt nutzen.

Funktioniert heuteJedes Modul unten ist heute verfügbar. Was noch nicht gebaut ist, steht jeweils darunter.

Support

Ein Admin-Bereich für deine Operatoren

Deine Operatoren finden eine Person über Name oder Adresse und sehen ihre Anmeldemethoden, Sitzungen, Gruppen und ihren Verlauf. Am selben Ort verwalten sie Gruppen, erstatten eine Zahlung, kümmern sich um die Abonnenten des Newsletters, sehen jeden Hintergrundjob, starten einen fehlgeschlagenen neu und prüfen den Zustand des Systems. In 59 Sekunden ansehen.

  • Eine eigene App auf einem eigenen Host, mit eigenem Sitzungs-Cookie
  • Neun Module, vom Dashboard bis zu den API-Tokens
  • Riskante Aktionen fragen erst nach, und jede Aktion wird ins Audit-Log geschrieben
Noch nicht gebaut
  • Sich als eine Person anmelden, um zu sehen, was sie sieht
Admin-App lesen

Deployment

Ein Server, ein Befehl

Seed läuft auf jedem gemieteten Linux-Server, mit Docker Compose für Entwicklung und Produktion gleichermaßen. Mehrere Produkte können sich einen Server teilen.

  • Traefik davor, mit automatischen Zertifikaten
  • Postgres und Valkey neben den Apps
  • Garage, ein S3-Dateispeicher: Notizen legen darin Bilder und PDFs ab und Leute ihre Profilbilder, hochgeladen über signierte Links und anhand ihrer Bytes geprüft. Ein Foto, auch HEIC, wird zu kleinen AVIF- und WebP-Größen, ohne Standort und andere Metadaten
  • VictoriaMetrics, VictoriaLogs und Grafana, mit Alarmen
  • Ein optionales tägliches, verschlüsseltes restic-Backup der Datenbank und eine schriftliche Anleitung zur Wiederherstellung
  • Release-Images, die die CI veröffentlicht, wenn du ein Versions-Tag pushst
Compose-Dateien lesen
$ deno task deploy Copying files... Copying infra/envs/.env.prod to infra/envs/.env... Creating web push keys if missing... Starting the app... Deploy completed.
Gekürzt: Die Ausgabe von rsync und Compose zwischen den Schritten ist weggelassen.
  • Traefik
  • Postgres
  • Valkey
  • VictoriaMetrics
  • VictoriaLogs
  • Grafana
  • Alertmanager
  • Garage file store
  • restic backups

Website

Eine öffentliche Website zum Anpassen

Diese Website: schnell, auf dem Server gerendert und auch ohne JavaScript nutzbar, mit Preisen, Rechtsseiten, einem Blog und einem Newsletter.

  • Fresh auf dem Server; jede Aktion ist ein echter Link oder ein echtes Formular
  • Preise aus dem Tarifkatalog der App gelesen
  • Ein Newsletter mit Double-Opt-in und Abmeldung mit einem Klick
  • Ein Blog, im Admin-Bereich geschrieben, mit Themen, einem RSS-Feed und strukturierten Daten für Artikel
  • Kontaktlinks, im Admin-Bereich festgelegt, im Footer und in den strukturierten Daten angezeigt
  • Ein optionaler Katalog für einen Shop, im Admin-Bereich bearbeitet: Artikel mit Fotos, Farben, Größen, einer Größentabelle und ausverkauften Größen, in jeder Sprache, in der du verkaufst, mit einem kurzen Tracking-Link pro Artikel und Ort, an dem du ihn teilst
  • sitemap.xml, robots.txt, kanonische Links und Open-Graph-Bilder
  • Optionale Analyse ohne Cookies in deinem eigenen Umami, mit einem Event bei jedem Call-to-Action
  • Jede Seite in sechs Sprachen, jede unter ihrer eigenen Adresse mit hreflang-Links; die Rechtsseiten bleiben auf Englisch
Code der Website lesen

Qualität

Getestet, wo es zählt

Gezählt am 16. Oktober 2026: 34 Browser-Testsuites für die App, dazu Unit- und Bildschirmtests, alle in der CI. Jede Änderung geht durch einen Pull-Request und ein Review, bevor sie gemergt wird.

  • Browser-Tests mit Playwright, gegen die echte API und Datenbank
  • Unit- und Bildschirmtests direkt neben dem Code, den sie testen
  • Integrationstests gegen Postgres
Browser-Tests lesen
So schneidet Seed im Vergleich ab

Fragen

Kann Seed das?

Läuft Seed auf Vercel oder als Serverless-Funktionen?

Nein. Seed läuft als langlebige Container mit Docker Compose auf einem gemieteten Linux-Server, weil die API WebSocket-Verbindungen offen hält und ein Worker eine Warteschlange abarbeitet.

Läuft Seed auf Node.js oder Bun?

Heute nicht. Die Server von Seed laufen auf Deno 2 in Docker, und seine Tasks und Tests nutzen Deno. Der Code baut auf Webstandards wie fetch, Request und Web Crypto auf.

Kann Seed eine andere Datenbank als Postgres nutzen?

Nein. Seed ist auf Postgres gebaut: Seine Migrationen, Abfragen und Integrationstests setzen es voraus.

Gibt es Seed als Mobil- oder Desktop-App?

Noch nicht als App im Store. Heute lässt sich die Web-App auf Handys und Desktops aus dem Browser installieren und öffnet ohne Netz; Apps für Android und den Desktop sind geplant.

In einer Minute in Aktion sehen

Die Demo ist die App, die du am ersten Tag bekommst. Öffne sie ohne Registrierung und starte in Gruppen voller Beispielnotizen.