Saltar al contenido

Funciones

Todo lo que trae Seed, y lo que aún no

Seed es un starter SaaS gratuito con licencia MIT, con inicio de sesión por correo, Google y GitHub, passkeys, enlaces mágicos, cuentas de invitado, 2FA, grupos con roles, cobro por miembro con Stripe, actualizaciones en tiempo real, una app sin conexión, un área de administración, monitorización y copias de seguridad diarias cifradas opcionales. Cada sección enlaza a su código.

Por Anton ShubinActualizado

Seed está en desarrollo y se construye en público. Lo que aún no está hecho se marca como «Aún no está hecho» junto a la afirmación que limita, con su issue cuando hay uno abierto.

Resuelto por ti

Un starter SaaS con grupos y cobro ya conectados

Cuentas, grupos y dinero: las partes que todo producto necesita antes de su primera función, y las más fáciles de hacer mal.

Funciona hoyProbado en CI. El inicio de sesión con Google y GitHub y Stripe necesitan tus propias claves, así que están desactivados en la demo.

Cuentas

Inicio de sesión resuelto

Las personas se registran con un correo y una contraseña, confirman el correo con un código que reciben por email, restablecen una contraseña olvidada, siguen con Google o GitHub, reciben por correo un enlace de acceso que también las registra, entran con una passkey, o prueban primero la app en una cuenta de invitado y añaden después un método de inicio de sesión. Una app de autenticación añade la autenticación en dos pasos (2FA). Ven cada dispositivo con sesión iniciada y pueden cerrar la sesión en los demás. Cambiar un método de inicio de sesión pide una prueba y envía un correo.

  • Contraseñas con hash PBKDF2-SHA-256 mediante Web Crypto, 600.000 rondas por defecto
  • Cookies de sesión firmadas y un registro de auditoría de cada evento de inicio de sesión
  • Tokens de API personales, guardados solo como hashes con clave
  • Passkeys: solo se guarda la clave pública, y cada desafío de inicio de sesión funciona una vez
  • Enlaces mágicos: un enlace inicia sesión o registra, funciona una vez, durante 15 minutos, y se guarda solo como hash
  • Cuentas de invitado (inicio de sesión anónimo): un visitante empieza con un clic y sin método de inicio de sesión, y luego añade a la misma cuenta un correo y contraseña, Google, GitHub o una passkey
  • Las contraseñas incorrectas se cuentan por nombre de inicio de sesión, con un bloqueo breve, desde cualquier dirección de red
Lee el código del inicio de sesión
La página de seguridad de un perfil: los métodos de inicio de sesión, la autenticación en dos pasos (2FA) y las sesiones abiertas.

Grupos

Grupos con roles, desde el primer minuto

Cada cuenta recibe un grupo personal al registrarse. Las personas crean grupos compartidos, invitan a otras, les dan roles de lector a propietario y traspasan la propiedad en un paso. Un grupo eliminado se puede recuperar durante 30 días, y cada grupo guarda un registro de actividad.

  • El grupo es el único límite entre inquilinos: los datos personales y compartidos pasan la misma comprobación
  • La app, su código y este sitio lo llaman grupo
  • Sin un segundo modelo de permisos que mantener sincronizado con el primero
  • Invitaciones, cambios de rol y traspaso de propiedad, cada uno con sus propias pruebas
Lee el dominio de grupos
El registro de actividad de un grupo: quién añadió qué nota o etiqueta y cuándo, con un enlace para abrir cada nota.

Resumen

Un resumen para cada grupo

Cifras clave y un gráfico para cualquier rango de fechas. Cada persona oculta y reordena los widgets, y la disposición la sigue a sus otros dispositivos.

  • Cada cifra se compara con el periodo anterior, sin un veredicto por colores
  • Solo recuentos: ni el texto de las notas ni rankings de personas
  • Cada widget carga, falla y reintenta por su cuenta
  • Un agregado nuevo añade sus propios widgets, y el área de administración también los muestra
Lee los widgets del resumen

Dinero

Cobro por miembro, con Stripe

Las personas ven una tabla de precios, un plan gratuito con límites y una prueba de 14 días del plan de pago. El propietario ve lo que cuesta un miembro más antes de invitarlo, y un aviso claro con fecha cuando falla una tarjeta.

  • Stripe Checkout y el portal del cliente; el webhook es la única fuente del plan
  • Cantidades que siguen al número de miembros
  • Un periodo de gracia tras un pago fallido, 7 días por defecto
  • Límites del plan comprobados en el servidor, no solo en la app
  • Los planes viven en un archivo de catálogo; la página de precios lo lee
Aún no está hecho
  • Proveedores de pago distintos de Stripe
Lee docs/billing.md
La pestaña de plan y cobro de un grupo de ejemplo, con los precios de ejemplo de la demo: plan Pro con su fecha de renovación, 36,00 € al mes, para 4 miembros a 9,00 € cada uno, el propietario incluido, con botones para cambiar la tarjeta, ver las facturas y cancelar el plan.

Privacidad

Cuentas que se pueden dejar

Las personas descargan una copia de sus datos y eliminan su cuenta desde el perfil, con 7 días para cambiar de idea. Las notificaciones leídas se eliminan a los 90 días.

  • Descargar mis datos: un ZIP de archivos JSON y CSV, preparado en segundo plano y guardado 7 días
  • La eliminación espera 7 días; volver a iniciar sesión la cancela
  • Limpieza nocturna de notificaciones leídas, invitaciones caducadas y eventos de auditoría antiguos
Lee el código de eliminación de cuentas

Exportar

Tus datos se van contigo

Exporta cualquier grupo a un archivo JSON abierto e impórtalo después como un grupo nuevo. El grupo original nunca se sobrescribe.

  • El propietario exporta; importa cualquiera que pueda crear un grupo
  • Se comprueba todo el archivo antes de escribir nada, y luego se importa en un solo paso
  • Cada nota y etiqueta recibe un id nuevo, así que una importación nunca choca con lo que ya existe
  • Cada agregado registra su propia parte del archivo
Lee el código de exportación

Idiomas

En seis idiomas desde el principio

La app, el área de administración y este sitio hablan inglés, ruso, español, alemán, portugués de Brasil y árabe. Cada persona elige su idioma en la app, y se guarda con su cuenta. Cada página de este sitio tiene su propia dirección en cada idioma.

  • Un catálogo JSON por idioma, comprobado por una prueba que nombra cada mensaje que falta o está desactualizado
  • Plurales, números y fechas con el propio Intl de la plataforma, sin biblioteca de i18n
  • Enlaces hreflang en cada página del sitio, y un sitemap que lista cada idioma
  • Las páginas en árabe se leen de derecha a izquierda
Aún no está hecho
  • Correos en el idioma del lector (issue #277)
  • Diseños de derecha a izquierda terminados en cada pantalla (issue #215)
Lee la guía de traducción

Listo cuando lo necesites

Tiempo real, sin conexión y trabajo en segundo plano

Las partes que la mayoría de los starters dejan fuera porque son difíciles: actualizaciones en vivo, una app que funciona sin red y trabajo que no se puede perder.

Funciona hoyLa escritura sin conexión cubre notas y etiquetas; cualquier otra lista se abre sin conexión con lo último que mostró.

Tiempo real

Los cambios aparecen sin recargar

El cambio de un miembro aparece en cada pestaña abierta del grupo, y un portátil que despierta de la suspensión se pone al día con lo que se perdió.

  • Un WebSocket estándar, con una secuencia en cada cambio
  • Una pestaña que vuelve a mostrarse tras la suspensión se reconecta y trae lo que se perdió
  • El tiempo real se puede desactivar: la app consulta entonces cada cierto tiempo y funciona igual
Lee el diseño del tiempo real
Primera ventana: el editor de notas, con el título cambiado a «Hoja de ruta del T4: incorporación, cobro y facturas».
Segunda ventana, con otra sesión: justo después de Guardar, su lista de notas muestra el título nuevo arriba, sin recargar.

Sin conexión

Una app que abre sin red

La app se instala como una nativa, abre sin red y envía los cambios en cola cuando vuelve la conexión. Un cambio desfasado aparece como un conflicto que resolver, nunca como una sobrescritura silenciosa.

  • Una copia en IndexedDB de cada lista y una cola de escritura con claves de idempotencia
  • «Mantener el mío» o «Usar el del servidor» para cada conflicto
  • Se desactiva con un ajuste, o se elimina borrando una carpeta y siguiendo una lista escrita
Lee docs/offline.md
Un cambio hecho sin conexión se encuentra con otro más reciente en el servidor: «1 cambio necesita tu elección» muestra las dos versiones de la nota lado a lado, con «Mantener el mío» y «Usar el del servidor».

Teclado

Atajos de teclado en la app y en el área de administración

Pulsa ? para ver todos los atajos. N añade una nota desde cualquier página sin salir de ella, y G seguida de una letra abre una sección. Los atajos no estorban mientras escribes en un campo.

  • Ctrl K (⌘K en un Mac) o / abre la búsqueda
  • Una lista por app asigna las teclas y llena el diálogo ?, así nunca muestra una tecla que no hace nada
  • Los atajos de una sola tecla se pueden desactivar en un dispositivo; Ctrl K y Escape siguen funcionando
  • En el área de administración, G seguida de una letra abre cada módulo
Lee el código de los atajos

Notificaciones

Notificaciones en la app, en el móvil, en el escritorio y en Telegram

Las personas reciben un aviso cuando las invitan, les dan un rol nuevo o les traspasan un grupo: en la app, como web push en el móvil o el escritorio, y en Telegram cuando lo vinculan.

  • Web push con tus propias claves, creadas con una tarea: deno task vapid-key:create
  • Un contador de no leídas en la app, y «Marcar todo como leído»
  • La suscripción push de cada dispositivo aparece en el perfil
  • Un bot de Telegram, desactivado hasta que pones su token: se vincula con un código de un solo uso, y los comandos propios de tu producto se añaden en un archivo
Lee el servicio de web push
La página de notificaciones: tres avisos sin leer sobre un nuevo propietario de grupo, un cambio de rol y una invitación; cada fila abre aquello de lo que trata.

Segundo plano

Trabajo que sobrevive a un fallo

Los correos y las notificaciones salen aunque el servidor se reinicie a mitad, porque el trabajo se guarda antes de hacerse. Tus propias tareas se ejecutan ahora, más tarde o según un calendario.

  • Cada comando escribe su evento en la misma transacción de base de datos que el cambio
  • Un worker vacía ese outbox y envía correos, push y actualizaciones en vivo
  • Una tarea es una definición: un nombre, un handler y, si se repite, su calendario
  • Un intento fallido se reintenta con esperas cada vez más largas; los operadores ven cada ejecución en la administración
Lee docs/jobs.md
Una transacción: se guardan los dos, o ningunoEl cambiouna nota, un miembroSu eventouna fila del outboxWorkervacía el outboxCorreocódigos, avisosPushmóvil, escritorioEn vivootras pestañas

Tu producto

Añade una función copiando otra

Las notas son una función completa en cada capa: base de datos, API, pantalla, modo sin conexión y pruebas. Una función nueva las copia archivo por archivo, siguiendo una lista que nombra cada archivo en orden.

  • Una misma forma para cada función, así el código sigue siendo fácil de encontrar
  • Cada capa tiene sus propias pruebas para copiar con ella
  • Cada id es un UUID ordenado por tiempo (versión 7)
Lee docs/aggregates.md
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

Operación

Ejecútalo, vigílalo y da soporte a quienes lo usan

Un servidor que alquilas, las herramientas para ver lo que hace y un área donde tus operadores ayudan a las personas que usan tu producto.

Funciona hoyCada módulo de abajo está disponible hoy. Lo que aún no está hecho aparece bajo cada uno.

Soporte

Un área de administración para tus operadores

Tus operadores buscan a una persona por nombre o dirección y ven sus métodos de inicio de sesión, sesiones, grupos e historial. Desde el mismo sitio gestionan grupos, reembolsan un pago, cuidan de los suscriptores del boletín, ven cada tarea en segundo plano, vuelven a ejecutar una fallida y revisan la salud del sistema. Míralo en 59 segundos.

  • Una app aparte en su propio host, con su propia cookie de sesión
  • Nueve módulos, del panel principal a los tokens de API
  • Las acciones arriesgadas piden confirmación, y cada acción se escribe en el registro de auditoría
Aún no está hecho
  • Iniciar sesión como una persona para ver lo que ve
Lee la app de administración

Despliegue

Un servidor, un comando

Seed funciona en cualquier servidor Linux que alquiles, con Docker Compose tanto para desarrollo como para producción. Varios productos pueden compartir un servidor.

  • Traefik delante, con certificados automáticos
  • Postgres y Valkey junto a las apps
  • Garage, un almacén de archivos S3: las notas guardan ahí imágenes y PDF, y las personas sus fotos de perfil, subidas con enlaces firmados y comprobadas por sus bytes. Una foto, HEIC incluido, se convierte en tamaños pequeños AVIF y WebP sin la ubicación ni otros metadatos
  • VictoriaMetrics, VictoriaLogs y Grafana, con alertas
  • Una copia de seguridad diaria y cifrada de la base de datos con restic, opcional, y una restauración por escrito
  • Imágenes de versión publicadas desde CI cuando subes una etiqueta de versión
Lee los archivos de Compose
$ 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.
Abreviado: se omite la salida de rsync y Compose entre los pasos.
  • Traefik
  • Postgres
  • Valkey
  • VictoriaMetrics
  • VictoriaLogs
  • Grafana
  • Alertmanager
  • Garage file store
  • restic backups

Sitio web

Un sitio web público para adaptar

Este sitio: rápido, renderizado en el servidor y usable con JavaScript desactivado, con precios, páginas legales, un blog y un boletín.

  • Fresh en el servidor; cada acción es un enlace o un formulario de verdad
  • Precios leídos del catálogo de planes de la app
  • Un boletín con doble confirmación y baja con un clic
  • Un blog escrito en el panel de administración, con temas, un feed RSS y datos estructurados de artículo
  • Enlaces de contacto definidos en el panel de administración, mostrados en el pie y en los datos estructurados
  • Un catálogo opcional para una tienda, editado en el panel de administración: artículos con fotos, colores, tallas, una guía de tallas y tallas agotadas, en cada idioma en el que vendes, con un enlace corto de seguimiento por artículo y lugar donde lo compartes
  • sitemap.xml, robots.txt, enlaces canónicos e imágenes Open Graph
  • Analítica opcional sin cookies en tu propio Umami, con un evento en cada llamada a la acción
  • Cada página en seis idiomas, cada una en su propia dirección con enlaces hreflang; las páginas legales siguen en inglés
Lee el código del sitio web

Calidad

Probado donde importa

Contado el 16 de octubre de 2026: 34 suites de pruebas de navegador para la app, más pruebas unitarias y de pantalla, todas en CI. Cada cambio pasa por un pull request y una revisión antes de fusionarse.

  • Pruebas de navegador con Playwright, contra la API y la base de datos reales
  • Pruebas unitarias y de pantalla junto al código que prueban
  • Pruebas de integración contra Postgres
Lee las pruebas de navegador
Cómo se compara Seed

Preguntas

¿Seed puede hacer eso?

¿Seed puede funcionar en Vercel o en funciones serverless?

No. Seed funciona como contenedores de larga duración con Docker Compose en un servidor Linux que alquilas, porque la API mantiene abiertas conexiones WebSocket y un worker vacía una cola.

¿Seed puede funcionar en Node.js o Bun?

Hoy no. Los servidores de Seed funcionan con Deno 2 en Docker, y sus tareas y pruebas usan Deno. El código se basa en estándares web como fetch, Request y Web Crypto.

¿Seed puede usar una base de datos que no sea Postgres?

No. Seed está construido sobre Postgres: sus migraciones, consultas y pruebas de integración lo dan por hecho.

¿Seed puede publicarse como app móvil o de escritorio?

Todavía no como app de tienda. Hoy la app web se instala desde el navegador en móviles y ordenadores y abre sin red; hay apps para Android y escritorio planeadas.

Míralo funcionar en un minuto

La demo es la app que tienes desde el primer día. Ábrela sin registrarte y empieza en grupos llenos de notas de ejemplo.