Drizby is an open-source BI app built around drizzle-cube. It lets you connect a database, define or import Drizzle schemas, build cube definitions, and explore the results through dashboards, notebooks, and a visual analysis builder.
Status: active work in progress. The README below reflects what is in the repo today.
- Runs as a self-hosted web app with an onboarding flow and demo seed data
- Manages database connections and compiles a semantic layer per connection
- Lets admins author Drizzle schema files and cube definitions in the browser
- Can run
drizzle-kit pullfrom the app to bootstrap schema files from an existing database - Includes AI-assisted cube planning/generation when an AI provider is configured
- Provides dashboards, notebook-style analysis, and a no-code analysis builder
- Supports role-based app access (
admin,member,user/pending approval)
- Single-tenant today: the codebase stores
organisationIdon records, but the app currently runs with that value hardcoded to1. Treat the current product as a single workspace deployment, not full multi-tenant SaaS. - Schema pull has limits: Drizby shells out to
drizzle-kit pull, then cleans up the generated file for use in the editor. For PostgreSQL-style dialects it currently targets thepublicschema, and complex generated extras such as indexes/constraints may need manual cleanup after import. - AI features are optional: notebooks still exist without AI configured. AI-assisted cube generation uses the provider configured in Settings, while notebook chat can also use a per-user API key entered in the notebook UI.
Create a persistent volume, generate two random secrets, then run the published image with the required production env vars:
docker volume create drizby-data
openssl rand -hex 32 # use one value for OAUTH_JWT_SECRET
openssl rand -hex 32 # use another value for ENCRYPTION_SECRET
docker run --rm \
-p 3461:3461 \
-e APP_URL=http://localhost:3461 \
-e OAUTH_JWT_SECRET=replace-with-generated-hex-value \
-e ENCRYPTION_SECRET=replace-with-generated-hex-value \
-v drizby-data:/app/data \
ghcr.io/cliftonc/drizby:mainThen open http://localhost:3461.
On first run you will create the initial admin account in the setup wizard, then Drizby seeds a demo SQLite connection with sample data/content so you can explore the product immediately.
- External app port:
3461 - Internal Node port inside the container:
3462(used behind Caddy; you do not need to publish it) - Persistent app data path:
/app/data - The named volume stores the internal app database and local file-based data used by the container.
- If you publish a different host port, set
APP_URLto the public URL users will actually open.- Example:
-p 8080:3461=>APP_URL=http://localhost:8080
- Example:
- To reset a local Docker install completely:
docker rm -f $(docker ps -aq --filter ancestor=ghcr.io/cliftonc/drizby:main) 2>/dev/null || true
docker volume rm drizby-dataThese are not required for a basic local run, but are supported by the app:
ADMIN_EMAIL,RESEND_API_KEY,RESEND_FROM_EMAILto auto-create the admin account and send a setup/reset emailAPP_NAMEto customize instance branding
git clone https://github.com/cliftonc/drizby.git
cd drizby
docker build -t drizby .
openssl rand -hex 32 # use one value for OAUTH_JWT_SECRET
openssl rand -hex 32 # use another value for ENCRYPTION_SECRET
docker run --rm \
-p 3461:3461 \
-e APP_URL=http://localhost:3461 \
-e OAUTH_JWT_SECRET=replace-with-generated-hex-value \
-e ENCRYPTION_SECRET=replace-with-generated-hex-value \
-v drizby-data:/app/data \
drizby- Node.js 24+ recommended (matches the Dockerfile/runtime used in this repo)
- npm
git clone https://github.com/cliftonc/drizby.git
cd drizby
CI=true npm ci --legacy-peer-deps --no-audit --no-fund
npm run setupnpm run setup generates migrations, applies them, and seeds the local demo content.
npm run devThat starts:
- Vite client: http://localhost:3460
- Backend/API: http://localhost:3461
- Vite proxies
/api,/cubejs-api,/oauth,/.well-known,/mcp, and/healthto the backend
In normal source development, open http://localhost:3460.
npm run build
npm startThe standalone server listens on PORT (default 3461). In Docker, Caddy listens on PORT and proxies to Node on NODE_PORT (default 3462).
- Browser-based schema editor with Monaco
- Browser-based cube definition editor with compilation/validation
- Per-connection semantic layer compilation
- Schema import via
drizzle-kit pull - AI-assisted cube planning, generation, and join application
- Dashboards with draggable/resizable grid widgets
- Notebook-style analysis documents with mixed content blocks
- No-code analysis builder for measures, dimensions, and filters
- Chart/table rendering for saved and exploratory analysis
The connection registry in the app currently includes presets for:
- PostgreSQL variants:
postgres.js,pg, Neon, Supabase, PGlite, AWS Data API, Aurora DSQL - MySQL variants:
mysql2, PlanetScale, TiDB - SingleStore
- SQLite variants:
better-sqlite3, LibSQL/Turso - Databend
- Snowflake
- DuckDB
Each saved connection gets its own schema files, cube definitions, and semantic-layer instance inside Drizby.
- Email/password auth
- Role-based permissions (
admin,member, pendinguser) - Admin approval flow
- Settings UI for AI providers and auth providers
- OAuth/SSO-related routes and settings for Google, GitHub, GitLab, Microsoft, Slack, magic links, and SAML/SCIM configuration
- Start Drizby and create the admin account
- Add a database connection
- Pull or write Drizzle schema files
- Create cube definitions manually or with AI assistance
- Explore data in the analysis builder or notebooks
- Save/publish results to dashboards
The repo includes these main checks:
npm test
npm run typecheck
npm run lint| Layer | Technology |
|---|---|
| Semantic layer | drizzle-cube |
| Backend | Hono, TypeScript, Drizzle ORM |
| Frontend | React 18, TanStack Query, Recharts, Tailwind CSS |
| Editor | Monaco |
| Internal app DB | SQLite (better-sqlite3) |
| Build tooling | Vite, esbuild/tsx |
MIT
This repository is maintained with the assistance of Last Light, an automated GitHub maintenance bot that handles issue triage, pull request reviews, and routine repository upkeep.
