Description
bknd est un backend TypeScript moderne, léger et typé de bout en bout, pensé comme une alternative simple à Supabase pour les développeurs qui veulent garder le contrôle de leur stack. Le projet mise sur une philosophie radicale : un seul runtime, zéro dépendance cachée, configuration en code.
L'idée directrice est de proposer un BaaS (Backend-as-a-Service) minimaliste qui se déploie en quelques lignes : API REST auto-générée, ORM intégré avec support SQLite/PostgreSQL/MySQL, authentification par sessions ou JWT, validation Zod, et un Data UI intégré pour administrer les données. Tout est typé : les schémas se déclarent en TypeScript, l'API héritée automatiquement du typage, et le client SDK est généré pour vos frontends React/Next.js/Svelte.
Contrairement à Supabase (qui embarque PostgREST, GoTrue, Realtime, Storage…), bknd fait le pari de la simplicité : un seul binaire, une seule config, et des performances excellentes. Le code reste 100% lisible et modifiable, le projet étant jeune (2024) et écrit en TypeScript strict.
Public cible : développeurs TypeScript, makers, startups, projets personnels qui veulent un backend solide sans la complexité d'un Firebase/Supabase, et qui apprécient un stack 100% type-safe.
Fonctionnalités principales
- ✅ API REST auto-générée depuis le schéma TypeScript
- ✅ ORM intégré : SQLite, PostgreSQL, MySQL, libSQL/Turso
- ✅ Authentification : sessions, JWT, OAuth, magic links
- ✅ Validation Zod des payloads
- ✅ Data UI : interface d'administration des données
- ✅ Realtime via WebSocket (subscriptions)
- ✅ CLI : scaffolding, migrations, déploiement
- ✅ SDK frontend : React, Next.js, Svelte, Vue, Solid
- ✅ Storage : fichiers locaux ou S3-compatible
- ✅ Permissions granulaires par rôle
- ✅ Hooks : logique custom avant/après requêtes
Installation
Via npm (recommandé pour intégrations)
# Créer un nouveau projet npx create-bknd@latest mon-backend cd mon-backend npm install npm run dev
Via Docker (auto-hébergé)
# docker-compose.yml
version: '3.8'
services:
bknd:
image: ghcr.io/bknd-io/bknd:latest
container_name: bknd
restart: unless-stopped
ports:
- "3000:3000"
environment:
BKNd_CONFIG: "/app/config.ts"
DATABASE_URL: "postgresql://bknd:password@db:5432/bknd"
JWT_SECRET: "changez-moi-en-production-50-chars-min"
volumes:
- ./config:/app/config
depends_on:
- db
labels:
- "traefik.enable=true"
- "traefik.http.routers.bknd.rule=Host(`api.example.com`)"
- "traefik.http.routers.bknd.entrypoints=websecure"
- "traefik.http.routers.bknd.tls.certresolver=letsencrypt"
db:
image: postgres:16-alpine
container_name: bknd-db
restart: unless-stopped
environment:
POSTGRES_USER: bknd
POSTGRES_PASSWORD: changez-moi
POSTGRES_DB: bknd
volumes:
- bknd_db:/var/lib/postgresql/data
volumes:
bknd_db:
Installation manuelle
git clone https://github.com/bknd-io/bknd.git cd bknd pnpm install pnpm build pnpm start
Configuration
- Définir le schéma dans
config.ts: tables, champs, relations, auth, permissions - Choisir la base de données : SQLite par défaut (zéro-setup), PostgreSQL en prod
- Configurer l'authentification : providers OAuth (Google, GitHub), sessions cookies
- Définir les permissions : règles par rôle (admin, user, anon)
- Hooks custom : TypeScript functions avant/après chaque opération
- CLI :
npx bknd migratepour les migrations versionnées
Alternatives
- Supabase — BaaS complet (PostgreSQL + Auth + Realtime + Storage), plus lourd, plus de features
- Appwrite — Alternative open source BaaS, PHP backend, écosystème mature
- PocketBase — BaaS Go/SQLite ultra-léger, fichier unique, idéal pour petits projets
- Directus — Headless CMS sur base SQL existante, orienté contenu
- Firebase — Propriétaire Google, lock-in fort
- Nhost — Alternative Supabase (GraphQL + Hasura + Auth)
Sécurité
- 🔐 JWT_SECRET robuste obligatoire en production :
openssl rand -hex 64 - 🛡️ HTTPS obligatoire via [[app-traefik]] : tous les payloads d'auth transitent chiffrés
- 🔒 Rate limiting : configurer un reverse proxy (Traefik, Caddy) ou middleware
- 🛡️ Validation Zod systématique des inputs (anti-injection)
- 🛡️ CORS : whitelister les origines frontend autorisées
- 🛡️ Permissions par rôle : ne jamais exposer
/adminàanon
