Overview
This guide walks you through setting up Tesslate Studio locally using Docker Compose. By the end, you will have a fully functional AI-powered app builder running on your machine, complete with a code editor, live preview, AI chat, and project templates. You do not need Node.js or Python installed on your host machine. Everything runs inside Docker containers.Looking for the cloud version? Check out tesslate.com for our hosted offering with zero setup required.
Prerequisites
Docker Desktop
Windows/Mac: Download Docker DesktopLinux:
curl -fsSL https://get.docker.com | shMake sure Docker Compose v2 is included (it ships with Docker Desktop by default).System Requirements
- RAM: 8 GB minimum (16 GB recommended)
- Disk: 10 GB free space (Docker images and volumes)
- OS: Windows (WSL 2 backend), macOS, or Linux
AI Provider Key
You need a LiteLLM endpoint or at least one AI provider API key:
- OpenAI (GPT-4, GPT-3.5)
- Anthropic (Claude 3.5 Sonnet, Claude 3 Opus)
- Or a self-hosted LiteLLM proxy
Git
Download from git-scm.com
Installation
Configure Required Variables
Open Everything else has sensible defaults for local development. See the full Configuration Reference for all available options.
.env in your editor and set these required values:How to generate a secure SECRET_KEY
How to generate a secure SECRET_KEY
Run one of these commands and paste the output into your
.env file:Build and Start All Services
| Service | Image Source | Description |
|---|---|---|
orchestrator | Built from orchestrator/Dockerfile | FastAPI backend (Python 3.11) |
app | Built from app/Dockerfile | React frontend (Vite dev server) |
postgres | postgres:15-alpine (pulled) | PostgreSQL database |
traefik | traefik:v3.1 (pulled) | Reverse proxy for routing |
Build the Devserver Image
The devserver image powers user project containers (the isolated environments that run your app code). It is not part of
docker-compose.yml, so you must build it separately:Verify Everything Is Running
health: starting for up to 30 seconds while it runs database migrations.Access the Application
Open your browser and navigate to:
The database is auto-initialized on first startup (tables created via Alembic migrations).
| URL | Description |
|---|---|
| http://localhost | Frontend via Traefik (recommended) |
| http://localhost:5173 | Vite dev server directly |
| http://localhost:8000/docs | Swagger API documentation |
| http://localhost:8080 | Traefik admin dashboard |
Seed the Database
After the first startup, seed marketplace data (project templates, AI agents, themes):All seed scripts are idempotent, so it is safe to re-run them without duplicating data.
What gets seeded?
What gets seeded?
| Data | Count | Examples |
|---|---|---|
| Project templates | 4 | Next.js 16, Vite+React+FastAPI, Vite+React+Go, Expo |
| Official agents | 5 | Stream Builder, Tesslate Agent, React Component Builder, API Integration, ReAct Agent |
| Open-source agents | 6 | Code Analyzer, Doc Writer, Refactoring Assistant, Test Generator, API Designer, DB Schema Designer |
| Themes | 7 | default-dark, default-light, midnight, ocean, forest, rose, sunset |
Create Your First Project
- Click “Sign Up” to create your account (the first user gets admin privileges)
- Click “New Project” on the dashboard
- Choose a starter template (for example, Vite + React + FastAPI)
- Give your project a name and click “Create”
- Try typing in the chat:
Create a simple todo app with add, delete, and mark complete functionality
Your self-hosted Tesslate Studio is now running. You have a code editor, live preview, AI chat, and file browser all in your browser.
What Gets Created
Docker Resources
| Resource | Name | Purpose |
|---|---|---|
| Image | tesslate-studio-orchestrator | FastAPI backend (~870 MB) |
| Image | tesslate-studio-app | React frontend (~760 MB) |
| Image | tesslate-devserver | User project runtime (~1.2 GB) |
| Volume | tesslate-postgres-dev-data | PostgreSQL data (persists between restarts) |
| Volume | tesslate-base-cache | Pre-installed marketplace templates |
| Volume | tesslate-projects-data | All user project source code |
| Network | tesslate-network | Bridge network connecting all services |
Routing (Traefik)
| Path Pattern | Destination | Priority |
|---|---|---|
/api/* | orchestrator:8000 | 100 |
/ws/* | orchestrator:8000 | 100 |
/* (everything else) | app:5173 | 10 |
*.localhost | User project containers | Auto-discovered |
Development Workflow
Hot Reload
Both backend and frontend support automatic reloading via volume mounts:- Backend: Edit files in
orchestrator/app/. Uvicorn detects changes and reloads automatically. - Frontend: Edit files in
app/src/. Vite HMR updates the browser instantly.
When to Rebuild
Rebuild only when dependencies change (new packages added topyproject.toml or package.json):
Viewing Logs
Shell Access
Database Migrations
Clean Slate Reset
To completely reset everything (database, images, volumes) and start fresh:Troubleshooting
Cannot access localhost or studio.localhost
Cannot access localhost or studio.localhost
Symptoms: The browser shows “connection refused” or “site can’t be reached.”Steps to resolve:
- Verify Docker is running: Open Docker Desktop and confirm it says “Docker is running.”
- Check container status:
All services should show
Up. - Check orchestrator logs for startup errors:
- Try the direct ports: Access
http://localhost:5173(frontend) orhttp://localhost:8000/docs(API docs) to bypass Traefik. - Restart everything:
Port already in use
Port already in use
Symptom: Then restart:
bind: address already in use when starting containers.Solution: Change the conflicting port in your .env file:docker compose up -dOrchestrator fails health check (shows 'unhealthy')
Orchestrator fails health check (shows 'unhealthy')
Common causes:
- Database not ready yet. The orchestrator waits for PostgreSQL. Give it 30 seconds.
- Missing required environment variables. Check that
SECRET_KEYandLITELLM_API_BASEare set in.env. - Port conflict on 8000. Another process may be using that port.
Hot reload not working
Hot reload not working
Backend (Uvicorn):
- Confirm
WATCHFILES_FORCE_POLLING=trueis set (already in docker-compose.yml by default). - Check logs:
docker compose logs -f orchestratorand look for “Reloading…”
- Confirm
CHOKIDAR_USEPOLLING=trueis set (already in docker-compose.yml by default). - Check your browser console for HMR connection errors.
- Try a hard refresh:
Ctrl+Shift+R.
User project container not starting
User project container not starting
Symptom: Creating a project fails with
pull access denied for tesslate-devserver.Cause: You have not built the devserver image.Fix:Database connection errors
Database connection errors
LITELLM_DEFAULT_MODELS warning
LITELLM_DEFAULT_MODELS warning
If you see
The "LITELLM_DEFAULT_MODELS" variable is not set. Defaulting to a blank string., this is harmless. Suppress it by adding to .env:Advanced: Hybrid Development Mode
For faster iteration during development, you can run the backend and frontend natively on your host while keeping infrastructure in Docker:- Full Docker (Recommended for most users)
- Hybrid Mode (Native backend and frontend)
Stopping and Restarting
Next Steps
Configuration Reference
All environment variables, grouped by category, with examples
Production Deployment
Deploy to production with Docker Compose, Kubernetes, or AWS EKS
Architecture Overview
Understand the multi-tier design, data flow, and security model
API Documentation
Explore the REST API with Swagger
Getting Help
GitHub Discussions
Ask questions and share ideas
GitHub Issues
Report bugs and request features
Email Support
Direct support (response within 24h)
Documentation
Browse the full documentation