Skip to content

Local Development

Local Development

This guide explains how to set up and run applications locally with automatic database setup.

Quick Start

For any project with a backend, use the dev:*:full command:

Terminal window
pnpm dev:chat:full # Start chat with auth + database setup
pnpm dev:zitare:full # Start zitare with auth + database setup
pnpm dev:contacts:full # Start contacts with auth + database setup

These commands automatically:

  1. Create the database if it doesn’t exist
  2. Push the latest schema (Drizzle db:push)
  3. Start the auth service (mana-core-auth)
  4. Start the backend and web app with colored output

Available Full Dev Commands

CommandDatabaseBackend PortWeb Port
pnpm dev:chat:fullchat30025173
pnpm dev:zitare:fullzitare30075177
pnpm dev:contacts:fullcontacts30155184
pnpm dev:calendar:fullcalendar30145179
pnpm dev:clock:fullclock30175187
pnpm dev:todo:fulltodo30185188
pnpm dev:picture:fullpicture30065175

Prerequisites

Before running any dev:*:full command:

  1. Start Docker infrastructure

    This starts PostgreSQL, Redis, and MinIO:

    Terminal window
    pnpm docker:up
  2. Generate environment files

    This runs automatically on pnpm install, but you can run manually:

    Terminal window
    pnpm setup:env

Database Setup Commands

Individual Service Setup

Terminal window
pnpm setup:db:auth # Setup mana-core-auth database + schema
pnpm setup:db:chat # Setup chat database + schema
pnpm setup:db:zitare # Setup zitare database + schema
pnpm setup:db:contacts # Setup contacts database + schema
pnpm setup:db:calendar # Setup calendar database + schema
pnpm setup:db:clock # Setup clock database + schema
pnpm setup:db:todo # Setup todo database + schema
pnpm setup:db:picture # Setup picture database + schema

Setup All Databases

Terminal window
pnpm setup:db # Creates ALL databases and pushes ALL schemas

This is useful when setting up a fresh environment or after pulling new schema changes.

How It Works

Docker Init Script

On first pnpm docker:up, the PostgreSQL container runs docker/init-db/01-create-databases.sql which creates all databases:

  • manacore, chat, zitare, contacts, calendar, clock, todo, manadeck
  • storage, mail, moodlit, finance, inventory, techbase, voxel_lava, figgos

Setup Script

The scripts/setup-databases.sh script:

  1. Creates database if it doesn’t exist (using psql)
  2. Pushes schema using drizzle-kit push --force

The --force flag auto-approves schema changes without interactive prompts.

Apps Without Full Commands

Some apps don’t have backends or don’t use Drizzle:

AppReason
manacoreNo backend (uses other services)
manadeckBackend exists but no db:push

For these, use the regular dev commands:

Terminal window
pnpm dev:manacore:web
pnpm dev:manadeck:app

Troubleshooting

Database doesn’t exist

If you see database "xxx" does not exist:

Terminal window
pnpm setup:db:chat # or whichever service

Schema out of date

If you see errors about missing tables/columns:

Terminal window
# Push the latest schema
pnpm --filter @chat/backend db:push --force

Port already in use

If auth (port 3001) is already running:

Terminal window
# Check what's using the port
lsof -i :3001
# Kill the process if needed
kill <PID>

Fresh Start (Nuclear Option)

To completely reset all databases:

Terminal window
# Stop and remove all containers + volumes
pnpm docker:clean
# Start fresh
pnpm docker:up
# Setup all databases
pnpm setup:db

Adding a New Application

Step 1: Create Project Structure

apps/newproject/
├── apps/
│ ├── backend/ # NestJS API (if needed)
│ ├── mobile/ # Expo React Native app
│ ├── web/ # SvelteKit web app
│ └── landing/ # Astro marketing page
├── packages/ # Project-specific shared code
├── package.json # Workspace root
└── CLAUDE.md # Project documentation

Step 2: Configure Backend Database

If your backend uses Drizzle ORM:

  1. Add database to Docker init (docker/init-db/01-create-databases.sql):

    CREATE DATABASE IF NOT EXISTS newproject;
    GRANT ALL PRIVILEGES ON DATABASE newproject TO manacore;
  2. Add DATABASE_URL to .env.development:

    NEWPROJECT_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/newproject
  3. Update scripts/generate-env.mjs to generate the backend .env file.

Step 3: Add Package.json Scripts

Add to root package.json:

{
"scripts": {
"dev:newproject:full": "./scripts/setup-databases.sh newproject && ./scripts/setup-databases.sh auth && concurrently \"pnpm dev:auth\" \"pnpm dev:newproject:backend\" \"pnpm dev:newproject:web\"",
"setup:db:newproject": "./scripts/setup-databases.sh newproject"
}
}

Step 4: Test

Terminal window
pnpm setup:db:newproject
pnpm dev:newproject:full