a6f1da28b2f7ed9bde0281586c6a5e38fde30f63
Multi-Tenant Nova/Salesforce-like Platform
A multi-tenant application platform where tenants can define custom objects, fields, applications, and pages.
Architecture
- Backend: NestJS + Fastify + Prisma + Redis + BullMQ
- Frontend: Nuxt 3 + Vue 3 + Tailwind CSS + shadcn-vue
- Database: Percona (MySQL-compatible)
- Cache/Queue: Redis + BullMQ
Project Structure
neo/
backend/ # NestJS + Prisma + BullMQ
src/
prisma/
package.json
tsconfig.json
Dockerfile
frontend/ # Nuxt 3 + Vue 3 + Tailwind + shadcn-vue
app/
package.json
nuxt.config.ts
Dockerfile
infra/
docker-compose.yml
.env.api
.env.web
README.md
Getting Started
Prerequisites
- Docker & Docker Compose
- Node.js 22+ (for local development)
Development Setup
- Clone the repository
- Start all services:
cd infra
docker-compose up --build
This will start:
- API server on http://localhost:3000
- Web UI on http://localhost:3001
- Percona MySQL on localhost:3306
- Redis on localhost:6379
Running Migrations
# From the infra directory
docker-compose exec api npx prisma migrate dev
Features
Multi-Tenancy
- Single database with
tenantIdon all tenant-specific rows - Tenant context via
x-tenant-idheader
Object & Field Management
- Define custom objects and fields via
/api/setup/objects - Runtime CRUD operations via
/api/runtime/objects/:objectApiName/records
Application Builder
- Create applications with multiple pages
- Access apps via
/app/:appSlug/:pageSlug - Configure apps via
/setup/apps
Security
- JWT-based authentication
- Role-based access control (RBAC) with Spatie-like permissions
- Field-level security (FLS)
- Record ownership and sharing rules
API Endpoints
Runtime APIs
GET /api/runtime/apps- List apps for current userGET /api/runtime/apps/:appSlug- Get app with pagesGET /api/runtime/apps/:appSlug/pages/:pageSlug- Get page metadataGET /api/runtime/objects/:objectApiName/records- List recordsGET /api/runtime/objects/:objectApiName/records/:id- Get recordPOST /api/runtime/objects/:objectApiName/records- Create recordPUT /api/runtime/objects/:objectApiName/records/:id- Update recordDELETE /api/runtime/objects/:objectApiName/records/:id- Delete record
Setup APIs
GET /api/setup/objects- List object definitionsPOST /api/setup/objects- Create custom objectPOST /api/setup/objects/:objectApiName/fields- Add fieldGET /api/setup/apps- List appsPOST /api/setup/apps- Create appPOST /api/setup/apps/:appSlug/pages- Add page
Frontend Routes
/app/:appSlug- App home (redirects to first page)/app/:appSlug/:pageSlug- Page view (list/board/dashboard)/app/:appSlug/:pageSlug/:recordId- Record detail view/setup/apps- App builder UI/setup/objects- Object/field builder UI
License
MIT
Description
Languages
Vue
61.1%
TypeScript
33.9%
CSS
1.7%
JavaScript
1.5%
Shell
1.1%
Other
0.7%