9.0 KiB
ZFG
Official meaning: Zero Friction Growth
Unofficial meaning: Zero Fucks Given
Z — Zero Friction
Architecture should make growth easy.
Adding new modules, services, tenants, integrations, or developers should not require rewriting half of the system.
Principles
- Modular architecture
- Low coupling
- Clear interfaces
- Easy onboarding
- Predictable project structure
- Minimal friction when adding new functionality
F — Flexible Foundations
The core infrastructure should stay generic, reusable, and extensible.
Business-specific logic should sit on top of the foundation instead of contaminating it.
Core building blocks
- Authentication
- Authorization
- Roles & permissions
- Organizations
- Events
- Workflows
- Storage
- Notifications
- API layer
- Integrations
- Configuration
Principles
- Reusable core
- Configuration-driven behavior
- Extensible modules
- Replaceable infrastructure
- Clear separation between core and business logic
G — Growth-Ready
The system should be designed to scale in multiple dimensions.
Not only more traffic, but also more customers, data, modules, developers, integrations, and services.
Principles
- Horizontal scaling
- Multi-tenancy
- Async processing
- Observability
- Independent modules
- Independent deployment paths where needed
- Efficient data growth
- Clear service boundaries
Philosophy
ZFG
│
├── Z — Zero Friction
│ ├── modular architecture
│ ├── low coupling
│ ├── clear interfaces
│ └── easy onboarding
│
├── F — Flexible Foundations
│ ├── reusable core
│ ├── configuration-driven behavior
│ ├── extensible modules
│ └── replaceable infrastructure
│
└── G — Growth-Ready
├── horizontal scaling
├── multi-tenancy
├── async processing
├── observability
└── independent deployment paths
Motto
Build with Zero Friction. Stay Flexible. Be Growth-Ready.
Or, internally:
Zero Fucks Given.
About
| App | Source | Dev port | What it is |
|---|---|---|---|
| Backend API | apps/backend/ |
3333 | AdonisJS — data, auth, permissions, public content API |
| Admin panel | apps/admin/ |
5173 | React + Vite — the internal UI |
| Public website | apps/web/ |
3000 | Next.js — the site visitors see |
| Shared packages | packages/ |
— | UI, hooks, services, types, utils |
Full documentation lives in docs/.
Tech Stack
Backend
- AdonisJS
- TypeScript
- Lucid ORM
- PostgreSQL / MySQL (configurable)
- Redis, S3 / MinIO storage
Admin panel
- React
- TypeScript
- Vite
- React Query / MobX / Axios
- Radix UI + Tailwind component system
- React Hook Form + Zod
Public website
- Next.js (App Router, React Server Components)
- TypeScript
- next-intl
- Tailwind CSS
Getting Started
Prerequisites
- Node.js
24.18.0(see.nvmrc; the package manifest requires>=24.0.0) - npm
>=11.6.2(the repo pinsnpm@11.15.0) - PostgreSQL
Installation
git clone https://git.kossmc.com/coach.one1994/zero-fucks-given.git
cd zero-fucks-given && npm install --force
--forceis required.typescript-eslintdoes not yet declare support for the TypeScript version this repo uses, so a plainnpm installfails withERESOLVE. Never substitute--legacy-peer-deps— it strips nested peer dependencies and breaks the backend at runtime. Usenpm ci --forcefor a reproducible install, andnpm install <package> --forcewhen adding one. See troubleshooting.md.
Configuration
Each workspace defines its own environment variables. Copy the workspace's .env.example to .env and fill in the values:
| Env file | Covers |
|---|---|
apps/backend/.env |
Server (PORT, APP_KEY), database (DB_*), storage (AWS_*, S3_*), and the public site link (WEB_APP_URL, WEB_REVALIDATE_SECRET) used to purge its cache |
apps/admin/.env |
VITE_API_URL (backend), VITE_WEB_URL (public site, used for page previews), VITE_TINYMCE_API_KEY |
apps/web/.env |
BACKEND_API_URL (backend base URL for server rendering), REVALIDATE_SECRET (must match the backend's WEB_REVALIDATE_SECRET), SITE_URL (canonical origin) |
docker-compose.yml loads each service's env from the same per-app files. Inside Docker, service
URLs must use compose service names (http://backend:3333), not localhost.
Running
Locally
| Command | Description |
|---|---|
npm run dev:backend |
Start the AdonisJS backend in development mode |
npm run dev:admin-app |
Start the React admin application |
npm run dev:web |
Start the Next.js web application |
npm run dev:all |
Start backend, admin, and web apps concurrently |
With Docker
docker compose up -d
Brings up everything: backend (3333), admin (5173), web (3000), PostgreSQL (5432), Redis (6379), MinIO (9000 / console 9001) and pgAdmin (5050).
Two quirks worth knowing when a change appears not to take effect:
- The web container keeps
.nexton an anonymous volume that survives rebuilds. Clear it withdocker compose up -d --force-recreate --renew-anon-volumes web. - Backend HMR does not always pick up edits on macOS (bind-mount file events); restart
crux_backend_adonisto load them.
Scripts
Build
| Command | Description |
|---|---|
npm run build:backend |
Build the backend application |
npm run build:admin |
Type-check and build the admin application |
npm run build:web |
Type-check and build the Next.js web app |
Test
| Command | Description |
|---|---|
npm run test:backend |
Backend functional tests (requires a database) |
npm run test:admin |
Admin unit tests (Vitest) |
npm run test:web |
Web app unit tests (Vitest) |
Lint and format
| Command | Description |
|---|---|
npm run lint |
ESLint across the monorepo |
npm run lint:fix |
ESLint with autofix |
npm run format |
Prettier write |
npm run format:check |
Prettier check, no writes |
Versions
| Command | Description |
|---|---|
npm run version:patch |
Update patch version of all packages |
npm run version:minor |
Update minor version of all packages |
npm run version:major |
Update major version of all packages |
Versions are updated without creating git tags.
Features
Module Generator
Create full CRUD modules by selecting:
- Database table
- Fields and types
- Validation rules
- List view configuration
Generated output — Backend: controllers, validators, routes. Frontend: pages, forms, tables, API.
Authentication & Authorization
- JWT / session-based authentication
- Role & permission system
- Policy-based access control
Content Management
Web Manager is the built-in CMS: editors build localized pages from prebuilt blocks in the admin panel, preview them privately, and publish to the Next.js site, which purges only the cache entries the change affects. See Web Manager.
Documentation
| Topic | Where |
|---|---|
| Documentation home | docs/Readme.md |
| Public website | apps/web/Readme.md |
| Architecture | docs/architecture/ |
| Core modules | docs/core/ |
| Shared packages | docs/packages/Readme.md |
| Install and setup issues | troubleshooting.md |