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

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

Ü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
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
- Zahlungsanbieter außer Stripe

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
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
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
- E-Mails in der Sprache des Lesers (Issue #277)
- Layouts von rechts nach links auf jedem Bildschirm fertig (Issue #215)
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


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

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

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
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)
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
- Sich als eine Person anmelden, um zu sehen, was sie sieht
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
- 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
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
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.

