Fonctionnalités
Tout ce que Seed fournit, et ce qu’il ne fournit pas encore
Seed est un starter SaaS gratuit sous licence MIT, avec connexion par e-mail, Google et GitHub, clés d’accès, liens magiques, comptes invités, 2FA, groupes avec rôles, facturation Stripe par membre, mises à jour en temps réel, application hors ligne, espace d’administration, supervision et sauvegardes quotidiennes chiffrées en option. Chaque section ci-dessous renvoie à son code.
Par Anton ShubinMis à jour le
Seed est utilisable dès aujourd’hui, développé en public. Ce qui manque est marqué « Pas encore développé » à côté de la fonctionnalité concernée, avec un lien vers son issue quand elle est ouverte.
Déjà réglé pour vous
Un starter SaaS avec groupes et facturation déjà branchés
Comptes, groupes et argent : ce dont chaque produit a besoin avant sa première fonctionnalité, et ce qu’il est le plus facile de rater.
Fonctionne aujourd’huiTesté en CI. La connexion avec Google et GitHub et Stripe demandent vos propres clés : ils sont donc désactivés dans la démo.
Comptes
La connexion, c’est réglé
Les utilisateurs créent un compte avec une adresse e-mail et un mot de passe, puis confirment l’adresse avec un code. Ils peuvent réinitialiser un mot de passe oublié, continuer avec Google ou GitHub, se connecter avec une clé d’accès, ou recevoir par e-mail un lien de connexion qui crée aussi le compte. Ils peuvent aussi essayer d’abord l’application dans un compte invité et ajouter une méthode de connexion plus tard. Une application d’authentification ajoute la double authentification (2FA). Chacun voit tous les appareils sur lesquels il est connecté et peut déconnecter les autres. Changer de méthode de connexion demande une preuve et envoie un e-mail.
- Mots de passe hachés avec PBKDF2-SHA-256 via Web Crypto, 600 000 itérations par défaut
- Cookies de session signés, et une piste d’audit de chaque événement de connexion
- Jetons d’API personnels, stockés uniquement sous forme de hachages à clé
- Clés d’accès : seule la clé publique est stockée, et chaque défi de connexion ne fonctionne qu’une fois
- Liens magiques : un même lien connecte ou crée le compte, ne fonctionne qu’une fois, pendant 15 minutes, et n’est stocké que sous forme de hachage
- Comptes invités (connexion anonyme) : un visiteur démarre en un clic sans méthode de connexion, puis ajoute une adresse e-mail et un mot de passe, Google, GitHub ou une clé d’accès au même compte
- Mots de passe erronés comptés par identifiant, toutes adresses réseau confondues, puis un court verrouillage

Groupes
Des groupes avec rôles, dès la première minute
Chaque compte reçoit un groupe personnel à l’inscription. Les utilisateurs créent des groupes partagés, invitent d’autres personnes, leur attribuent un rôle de lecteur à propriétaire et transfèrent la propriété en une étape. Un groupe supprimé peut être restauré pendant 30 jours, et chaque groupe tient un journal d’activité.
- Le groupe est l’unique frontière entre locataires : données personnelles et partagées passent la même vérification
- L’application, son code et ce site l’appellent tous « groupe »
- Pas de second modèle de permissions à garder synchronisé avec le premier
- Invitations, changements de rôle et transfert de propriété, chacun avec ses propres tests

Vue d’ensemble
Une vue d’ensemble pour chaque groupe
Des chiffres clés et un graphique pour n’importe quelle période. Chacun peut masquer et réordonner les widgets, et sa disposition le suit sur ses autres appareils.
- Chaque chiffre comparé à la période précédente, sans verdict rouge ou vert
- Des décomptes uniquement : aucun texte de note et aucun classement des personnes
- Chaque widget se charge, échoue et réessaie indépendamment
- Un nouvel agrégat ajoute ses propres widgets, et l’espace d’administration les affiche aussi
Argent
Facturation par membre, via Stripe
Les utilisateurs voient une grille tarifaire, un forfait Gratuit avec des limites et un essai de 14 jours du forfait payant. Le propriétaire voit ce que coûte un membre de plus avant de l’inviter, et un avis clair, avec une date, quand une carte est refusée.
- Stripe Checkout et le portail client ; le webhook est la seule source du forfait
- Des quantités qui suivent le nombre de membres
- Un délai de grâce après un paiement échoué, 7 jours par défaut
- Les limites des forfaits vérifiées sur le serveur, pas seulement dans l’application
- Les forfaits tiennent dans un seul fichier de catalogue ; la page des tarifs le lit
- D’autres prestataires de paiement que Stripe

Confidentialité
Des comptes que l’on peut quitter
Les utilisateurs téléchargent une copie de leurs données et suppriment leur compte depuis leur profil, avec 7 jours pour changer d’avis. Les notifications lues sont supprimées au bout de 90 jours.
- Télécharger mes données : un ZIP de fichiers JSON et CSV, préparé en arrière-plan, conservé 7 jours
- La suppression attend 7 jours ; se reconnecter l’annule
- Nettoyage nocturne des notifications lues, des invitations expirées et des anciens événements d’audit
Export
Vos données partent avec vous
Exportez n’importe quel groupe dans un fichier JSON ouvert, et importez-le plus tard comme nouveau groupe. Le groupe d’origine n’est jamais écrasé.
- Le propriétaire exporte ; toute personne pouvant créer un groupe peut importer
- Le fichier entier est vérifié avant toute écriture, puis importé en une seule étape
- Chaque note et chaque étiquette reçoit un nouvel identifiant : un import n’entre jamais en collision avec l’existant
- Chaque agrégat déclare sa propre partie du fichier
Langues
En neuf langues dès le départ
L’application, l’espace d’administration et ce site web parlent anglais, russe, espagnol, allemand, portugais brésilien, arabe, français, japonais et chinois simplifié. Chacun choisit sa langue dans l’application, et elle est enregistrée avec son compte. Chaque page de ce site a sa propre adresse dans chaque langue.
- Un catalogue TypeScript par langue, vérifié par un test qui nomme chaque message manquant ou obsolète
- Pluriels, nombres et dates via l’Intl natif de la plateforme, sans bibliothèque i18n
- Des liens hreflang sur chaque page du site, et un sitemap qui liste chaque langue
- Les pages en arabe se lisent de droite à gauche
- Les e-mails arrivent dans la langue du destinataire
Prêt quand vous en avez besoin
Temps réel, hors ligne et tâches en arrière-plan
Ce que la plupart des starters laissent de côté, parce que c’est difficile : des mises à jour en direct, une application qui fonctionne sans réseau, et des tâches qui ne doivent pas se perdre.
Fonctionne aujourd’huiL’écriture hors ligne couvre les notes et les étiquettes ; toutes les autres listes s’ouvrent hors ligne avec ce qu’elles affichaient en dernier.
Temps réel
Les modifications apparaissent sans recharger
La modification d’un membre apparaît dans chaque onglet ouvert du groupe, et un ordinateur portable qui sort de veille rattrape ce qu’il a manqué.
- Un WebSocket standard, avec un numéro de séquence sur chaque modification
- Un onglet qui sort de veille se reconnecte et récupère ce qu’il a manqué
- Le temps réel peut être désactivé : l’application interroge alors le serveur à intervalles réguliers et fonctionne de la même façon


Hors ligne
Une application qui s’ouvre sans réseau
L’application s’installe comme une application native, s’ouvre sans réseau et envoie les modifications en attente au retour du réseau. Une modification dépassée apparaît comme un conflit à régler, jamais comme un écrasement silencieux.
- Une copie IndexedDB de chaque liste et une file d’écriture avec des clés d’idempotence
- « Garder ma version » ou « Prendre l’autre version » pour chaque conflit
- Désactivez-la avec un seul paramètre, ou retirez-la : supprimez un dossier et suivez une checklist écrite

Clavier
Des raccourcis clavier dans l’application et l’espace d’administration
Appuyez sur ? pour voir tous les raccourcis. N ajoute une note depuis n’importe quelle page sans la quitter, et G suivi d’une lettre ouvre une section. Les raccourcis se font oublier pendant que vous tapez dans un champ.
- Ctrl K (⌘K sur Mac) ou / ouvre la recherche
- Une seule liste par application associe les touches et remplit la fenêtre d’aide ouverte par ?, qui n’affiche donc jamais une touche sans effet
- Les raccourcis à une touche peuvent être désactivés sur un appareil ; Ctrl K et Esc continuent de fonctionner
- Dans l’espace d’administration, G suivi d’une lettre ouvre chaque module
Notifications
Des notifications dans l’application, sur le téléphone, l’ordinateur et Telegram
Les utilisateurs sont notifiés quand ils sont invités, reçoivent un nouveau rôle ou se voient confier un groupe : dans l’application, par notification push web sur leur téléphone ou leur ordinateur, et dans Telegram une fois le compte associé.
- Notifications push web avec vos propres clés, créées par une seule tâche : deno task vapid-key:create
- Un compteur de non-lus dans l’application, et « Tout marquer comme lu »
- L’abonnement push de chaque appareil listé dans le profil
- Un bot Telegram, désactivé tant que vous n’avez pas défini son jeton : associé avec un code à usage unique, et les commandes de votre produit ajoutées dans un seul fichier

Tâches en arrière-plan
Des tâches qui survivent à un plantage
Les e-mails et les notifications partent même si le serveur redémarre en plein milieu, car le travail est enregistré avant d’être fait. Vos propres tâches s’exécutent maintenant, plus tard ou selon un calendrier.
- Chaque commande écrit son événement dans la même transaction de base de données que la modification
- Un worker vide cette outbox et envoie les e-mails, les notifications push et les mises à jour en direct
- Une tâche, c’est une seule définition : un nom, un gestionnaire et, si elle se répète, son calendrier
- Une tentative échouée est relancée avec des délais croissants ; les opérateurs voient chaque exécution dans l’espace d’administration
Votre produit
Ajoutez une fonctionnalité en en copiant une
Les notes sont une fonctionnalité complète à chaque niveau : base de données, API, écran, hors ligne et tests. Une nouvelle fonctionnalité la copie, fichier par fichier, à partir d’une liste qui nomme chaque fichier dans l’ordre.
- Une seule structure pour chaque fonctionnalité : le code reste facile à trouver
- Chaque niveau a ses propres tests, à copier avec lui
- Chaque identifiant est un UUID ordonné dans le temps (version 7)
Exploitation
Le faire tourner, le surveiller, accompagner ses utilisateurs
Un serveur que vous louez, les outils pour voir ce qu’il fait, et un espace où vos opérateurs aident les personnes qui utilisent votre produit.
Fonctionne aujourd’huiChaque module ci-dessous est disponible aujourd’hui. Ce qui n’est pas encore développé est indiqué en dessous.
Support
Un espace d’administration pour vos opérateurs
Vos opérateurs retrouvent une personne par son nom ou son adresse et voient ses méthodes de connexion, ses sessions, ses groupes et son historique. Au même endroit, ils gèrent les groupes, remboursent un paiement, s’occupent des abonnés de la newsletter, voient chaque tâche en arrière-plan, relancent celle qui a échoué et vérifient l’état du système. Le découvrir en 59 secondes.
- Une application distincte sur son propre hôte, avec son propre cookie de session
- 13 modules, du tableau de bord aux jetons d’API
- Les actions risquées demandent confirmation, et chaque action est écrite dans le journal d’audit
- Se connecter à la place d’une personne pour voir ce qu’elle voit
Déploiement
Un serveur, une commande
Seed tourne sur n’importe quel serveur Linux que vous louez, avec Docker Compose en développement comme en production. Plusieurs produits peuvent partager un même serveur.
- Traefik en frontal, avec des certificats automatiques
- Postgres et Valkey à côté des applications
- Garage, un stockage de fichiers S3, pour les images et PDF des notes et pour les photos de profil. Les imports passent par des liens signés et sont vérifiés d’après leur contenu. Les photos, HEIC compris, deviennent de petites versions AVIF et WebP, sans localisation ni autres métadonnées
- VictoriaMetrics, VictoriaLogs et Grafana, avec des alertes
- Une sauvegarde restic quotidienne et chiffrée de la base de données, à activer, et une procédure de restauration écrite
- Des images de version publiées depuis la CI quand vous poussez un tag de version
- Traefik
- Postgres
- Valkey
- VictoriaMetrics
- VictoriaLogs
- Grafana
- Alertmanager
- Garage file store
- restic backups
Site web
Un site web public à adapter
Ce site : rapide, rendu côté serveur et utilisable sans JavaScript, avec tarifs, pages légales, blog et newsletter.
- Fresh côté serveur ; chaque action est un vrai lien ou un vrai formulaire
- Des tarifs lus depuis le catalogue de forfaits de l’application
- Une newsletter à double confirmation, désabonnement en un clic et e-mails dans la langue du lecteur
- Un blog rédigé dans le panneau d’administration, avec des articles dans chaque langue et leurs traductions, des thèmes, un flux RSS et des données structurées d’article
- Des liens de contact définis dans le panneau d’administration, affichés dans le pied de page et les données structurées
- Un catalogue facultatif pour une boutique, géré dans le panneau d’administration : des articles avec photos, couleurs, tailles, guide des tailles et tailles épuisées, dans chaque langue où vous vendez, avec un lien de suivi court par article et par endroit où vous le partagez
- sitemap.xml, robots.txt, liens canoniques et images Open Graph
- Des statistiques facultatives sans cookies dans votre propre Umami, avec un événement à chaque appel à l’action et une page Statistiques dans le panneau d’administration : visites et clics de commande par source et par article
- Chaque page en neuf langues, chacune à sa propre adresse avec des liens hreflang ; les pages légales restent en anglais
Qualité
Testé là où ça compte
Décompte du 16 oct. 2026 : 34 suites de tests navigateur pour l’application, plus des tests unitaires et d’écran, tous exécutés en CI. Chaque modification passe par une pull request et une revue avant d’être fusionnée.
- Des tests navigateur avec Playwright, sur la vraie API et la vraie base de données
- Des tests unitaires et d’écran à côté du code qu’ils testent
- Des tests d’intégration sur Postgres
Questions
Seed sait-il faire ça ?
Seed peut-il tourner sur Vercel ou en fonctions serverless ?
Non. Seed tourne sous forme de conteneurs persistants avec Docker Compose sur un serveur Linux que vous louez, car l’API garde des connexions WebSocket ouvertes et un worker vide une file d’attente.
Seed peut-il tourner sur Node.js ou Bun ?
Pas aujourd’hui. Les serveurs de Seed tournent sur Deno 2 dans Docker, et ses tâches et ses tests utilisent Deno. Le code repose sur des standards du web comme fetch, Request et Web Crypto.
Seed peut-il utiliser une autre base de données que Postgres ?
Non. Seed est construit sur Postgres : ses migrations, ses requêtes et ses tests d’intégration le supposent.
Seed peut-il être livré comme application mobile ou de bureau ?
Pas encore sous forme d’application dans les stores. Aujourd’hui, l’application web s’installe depuis le navigateur sur téléphone et ordinateur et s’ouvre sans réseau ; des applications Android et de bureau sont prévues.
Voyez-le fonctionner en une minute
La démo, c’est l’application que vous obtenez dès le premier jour. Ouvrez-la sans inscription : votre compte invité démarre avec des données d’exemple.

