UN MONOREPO, NO UN SERVICIO

Empieza tu aplicación directamente por la primera funcionalidad.

Bones es un monorepo de TypeScript con todo lo que rodea a tu producto ya construido, probado y conectado: inicio de sesión, organizaciones, permisos, una consola de administración, registros, correo, un blog, documentación y cuatro idiomas, en una aplicación web, una aplicación de escritorio y tres sitios públicos. Clónalo, y lo primero que escribes es la parte que de verdad es tu producto.

bones/admin/permissions
Permisos34 FUNCIONALIDADES · 3 ROLES
FUNCIONALIDADowneradministratorstandard
page.admin.viewconcedidoconcedidono concedido
admin.users.viewconcedidoconcedidono concedido
admin.roles.createconcedidono concedidono concedido
admin.terms.updateconcedidono concedidono concedido
application.organizations.createconcedidoconcedidoconcedido
chatbotconcedidoconcedidoconcedido
WORKSPACES
9
COMPONENTES COMPARTIDOS
36
ROUTERS DE TRPC
18
CLIENTES
5
Qué incluye

Seis meses de fontanería, ya escritos.

Quince piezas que toda aplicación necesita, cada una construida, probada y documentada. Cada tarjeta enlaza a una página sobre el problema que resuelve y cómo se compara.

01 · AUTENTICACIÓN

Un inicio de sesión que ya funciona

Correo y contraseña o Google, con better-auth. Correos de verificación y de restablecimiento, gestión de sesiones, tokens bearer para la versión de escritorio y un interruptor en la consola de administración que desactiva un método de acceso sin desplegar.

02 · PERMISOS

Dos niveles de control de acceso

Funcionalidades concedidas a los roles de la plataforma y, encima, una tabla aparte por organización. Ambas se aplican en el middleware de tRPC y se resuelven en la sesión, así que la pantalla y el servidor leen la misma respuesta.

03 · ORGANIZACIONES

Organizaciones con miembros de verdad

Miembros, avatares y un perfil por organización. Los roles son propios de cada organización, el último administrador no se puede quitar y la membresía se desactiva en lugar de borrarse.

04 · ADMINISTRACIÓN

Una consola de administración incluida

Usuarios, organizaciones, roles, permisos, indicadores de funcionalidad, métodos de acceso, configuración del sitio y términos versionados con aceptación por usuario — construidos, no esbozados.

05 · OPERACIONES

Registros que puedes pasarle a un auditor

Cada escritura en la base de datos y cada solicitud, estructuradas y anonimizadas, rotadas en disco y archivadas en S3 de forma programada. Comprobaciones de estado y una cuenta de propietario creada desde la primera migración.

06 · BLOG

Un blog que se publica como archivos estáticos

Redacta, edita y publica desde la consola de administración. Los metadatos en Postgres, el cuerpo de las publicaciones y los archivos en S3, y una compilación estática aparte que convierte cada publicación en un archivo HTML de verdad — indexable sin ejecutar una sola línea de JavaScript.

07 · DOCS

Documentación que cambia con el código

El porqué, el qué y el cómo de cada funcionalidad, en MDX dentro del repositorio, editados en el mismo pull request que el código. Un sitio estático con búsqueda integrada, y cada página disponible en Markdown para herramientas de IA.

08 · CORREO

Correos a la altura del producto

Plantillas escritas en React y convertidas a las tablas y los estilos en línea que exigen los clientes de correo reales, con tokens generados desde el sistema de diseño. Mailpit recoge cada mensaje en desarrollo, y SES los envía en producción.

09 · CHATBOT

Un chatbot ya conectado a un modelo

Claude en Bedrock en producción y un modelo local de Ollama en desarrollo, detrás de una sola interfaz de proveedor. Las respuestas llegan token a token, las conversaciones se guardan por organización y el acceso pasa por la misma tabla de permisos que todo lo demás.

10 · CLIENTES

Un backend, cinco clientes

Una aplicación web, una aplicación de escritorio con sus propias rutas, este sitio, el blog y la documentación, todos llamando a un solo backend. Las aplicaciones lo llaman con tRPC y tipos completos, así que un campo renombrado rompe la compilación, no la producción.

11 · DISEÑO

Coherente hasta el final

Un solo archivo de tokens detrás de la aplicación web, la aplicación de escritorio, este sitio, el blog, la documentación y cada correo. Los componentes compartidos están especificados en COMPONENTS.md y dibujados en Storybook, y un control escrito dos veces se unifica en lugar de copiarse.

12 · IDIOMAS

Cuatro idiomas, de derecha a izquierda incluido

Inglés, francés, español y hebreo en cada superficie, desde las aplicaciones hasta los correos y los mensajes de error. El hebreo refleja cada diseño, y la CI falla si un texto de la interfaz se salta la traducción.

13 · ACCESIBILIDAD

Comprobado según WCAG 2.2 AA

El sitio de marketing, el blog, la documentación y cada historia de Storybook, en claro y en oscuro, en cada pull request. axe aplica sus reglas, y una segunda comprobación confirma los puntos de referencia, los encabezados y las etiquetas de los que depende un lector de pantalla.

14 · SEGURIDAD

Protecciones en el código, analizadas en cada cambio

Entradas acotadas, consultas parametrizadas, límites de frecuencia, subidas verificadas y una CSP en cada página. Semgrep, OWASP ZAP, una comprobación de la CSP y otra de secretos se ejecutan en cada pull request.

15 · CI/CD

Pruebas contra el sistema real

Pruebas de backend contra un Postgres real en un contenedor desechable, cada historia de Storybook en un Chromium real y una compilación de cada sitio. Cada pull request ejecuta solo los jobs que toca su cambio.

Cómo funciona

Tres pasos, y ninguno es «esperar a que compile».

01

En marcha en poco tiempo

Un entorno de desarrollo coherente significa que bastan unos pocos comandos para ponerse a trabajar. Uno de ellos arranca a la vez el backend, la aplicación web, el sitio de marketing, el blog y la documentación.

02

Conviértelo en tu SaaS

Construyas lo que construyas, ya estás mucho más cerca. El inicio de sesión, las organizaciones, los permisos, la consola de administración, el correo y cuatro idiomas están hechos, y cada router y cada página que añadas los tiene.

03

Despliégalo

Llévalo a producción y empieza a conseguir usuarios. Todo está en AWS, con niveles fáciles de cambiar a medida que crece tu aplicación: Starter, Growth y High availability, cada uno con una sola línea.

El código

Un repositorio que un desarrollador heredaría con gusto. Un repositorio que una IA puede retomar.

En Bones, cada permiso es una fila en una tabla y una llamada de middleware en un procedimiento. Nada se aplica solo en la interfaz, y nada se esconde detrás de un servicio que no puedes leer.

Lo mismo vale para lo que un modelo tiene que leer. Las reglas, las especificaciones y los motivos están en el repositorio, así que un agente trabaja a partir de lo que hace el código en lugar de deducirlo.

Para un desarrollador
  • Frameworks estándar — Fastify, tRPC, Drizzle, React. Ningún runtime propietario al que llamar.
  • Permisos aplicados en el middleware del servidor, no escondidos en la interfaz.
  • Migraciones que ejecutas tú mismo, contra tu propio Postgres.
  • Pruebas contra una base de datos real en un contenedor desechable, no contra un mock.
Para una IA
  • Convenciones escritas en lugar de deducidas: nueve reglas estrictas en CLAUDE.md y treinta y cuatro especificaciones de componentes en COMPONENTS.md.
  • Los comentarios explican por qué se tomó una decisión, nunca qué hace la línea siguiente.
  • El trabajo terminado, registrado en NOTES.md; el pendiente, numerado en TODOS.md — el contexto está en disco, no en la cabeza de alguien.
  • Cada componente y cada página en Storybook, para que un cambio se compruebe en lugar de adivinarse.
  • Cada página de la documentación en Markdown, y todo el sitio en /llms.txt, para que un agente lea por qué se construyó una parte antes de cambiarla.
backend/src/trpc/routers/roles.ts
export const rolesRouter = router({
  list: protectedProcedure.query(() =>
    db.select().from(roles)
  ),

  create: requirePermission("admin.roles.create")
    .input(z.object({ name: z.string().min(1) }))
    .mutation(async ({ input }) => {
      const [created] = await db
        .insert(roles)
        .values({ name: input.name })
        .returning();

      return created;
    }),
});
El stack

Herramientas populares y bien documentadas. Quien contrates, y cualquier IA que uses, ya las conoce.

  • TypeScript
  • Fastify
  • tRPC
  • Zod
  • Drizzle
  • Postgres
  • Better Auth
  • Pino
  • React
  • Vite
  • Mantine
  • Tauri
  • Next.js
  • Fumadocs
  • React Email
  • i18next
  • Storybook
  • Vitest
  • Testcontainers
  • Playwright
  • oxlint
  • Docker
  • GitHub Actions
  • AWS

Los cimientos están hechos. Construye el resto.

Inicia sesión y empieza con un stack que ya funciona — y quédate con cada uno de sus archivos.

Suscríbete a las novedades

Nuevas versiones y publicaciones, por correo. Date de baja desde cualquier mensaje.