⚡ VBWD
A sales platform for the digital world — SaaS subscriptions, CMS, shop, booking and a token economy on one self-hosted backend, two Vue front-ends and one plugin contract.

Clean clone to live in under five minutes
One image pipeline, one CI workflow, one deploy command. Adding a client is a config diff, not a release. The whole stack — backend + fe-admin + fe-user — boots on a laptop from a single recipe.
./recipes/dev-install-ce.shClones all three front-end repos in the correct submodule order + backend, builds vbwd-fe-core first, brings the stack up.
./recipes/dev-install-tarot.shFull CE setup plus the Tarot plugin database — a worked example of bootstrapping a plugin from cold.
./deploy.sh <instance>One deploy command per instance; multi-tenant routing means a new client is a config diff, not a fork.
Boring, reproducible infrastructure
- Docker + Docker Compose; Gunicorn behind Nginx with path-based routing (
/admin→ fe-admin,/→ fe-user). - PostgreSQL 16 + Redis 7; Alembic migrations tied to the plugin lifecycle — applied on enable, rolled back on uninstall.
- Per-instance config (env + compose) — never hand-edited prod files; local and prod compose stay separate.
- Uploads + plugin state on host bind-mounts; the backend is the only writer to
${VAR_DIR}/plugins/.
Tests are the merge gate
Every new model / service / route lands with unit tests in the
same PR. make test is the gate; CI re-runs on every
push. 1,851+ passing tests across pytest,
Vitest and Playwright. No tests, no merge.
It's all on GitHub. Read the code →