AI-powered cloud IDE.
Production: https://zenoide.com Production Workspace: https://app.zenoide.com
- Frontend: Next.js 16.6.1, React 19, TypeScript, Tailwind v4, CodeMirror 6
- Backend: PostgreSQL 16, Redis (BullMQ), Next.js API routes
- Agent: LangGraph + PostgresSaver, Anthropic Claude API (claude-sonnet-4-6)
- Terminal: node-pty (real PTY)
- Auth: Auth.js v5 JWT + GitHub OAuth
- Deploy: Fly.io (app=zenoide-app, region=lhr)
- Node.js 20+
- Docker & Docker Compose
- Git
- Clone repository:
git clone https://github.com/yourusername/zenoide.git
cd zenoide- Copy environment file:
cp .env.local.example .env.local-
Update
.env.local:AUTH_SECRET— session signing key (AUTH_SECRET=dev-secret-zenoide-local-onlyfor local dev)GITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET— GitHub OAuth App credentialsANTHROPIC_API_KEY— Anthropic API key for AI featuresREDIS_URL— Redis connection (redis://localhost:6379for local dev)DATABASE_URL— Postgres connection (postgres://postgres:postgres@localhost:5433/zenoide)STRIPE_SECRET_KEY— Stripe secret key (sk_test_...in dev)STRIPE_WEBHOOK_SECRET— Stripe webhook secret (whsec_...)
-
Start Docker stack:
# Windows
.\scripts\docker-dev.ps1 start
# macOS/Linux
./scripts/docker-dev.sh start- Install dependencies:
npm install- Run development server:
npm run dev.\scripts\docker-dev.ps1 start # Start Postgres + Redis
.\scripts\docker-dev.ps1 start-full # Start + pgAdmin
.\scripts\docker-dev.ps1 stop # Stop all
.\scripts\docker-dev.ps1 logs # View logs
.\scripts\docker-dev.ps1 shell # PostgreSQL shell
.\scripts\docker-dev.ps1 backup # Backup database
.\scripts\docker-dev.ps1 reset # Reset database (DANGER!)| Service | URL |
|---|---|
| App | http://localhost:3000 |
| pgAdmin | http://localhost:5051 |
| PostgreSQL | localhost:5433 |
| Redis | localhost:6379 |
pgAdmin credentials: dev@zenoide.local / admin
npm run lint # ESLint
npm run build # Next.js build
npx tsc --noEmit # TypeScript check
npm run test # Vitest (478 unit tests)
$env:E2E_TEST_MODE = "true"; npm run test:e2e # Playwright deterministic E2E (excludes @real-agent)
# Optional LLM-on-disk agent checks (requires ANTHROPIC_API_KEY): npm run test:e2e:real-agentRun in order:
\i database/init.sql
\i database/seed.sql
\i database/add_subscription_unique.sql
\i database/add_agent_steps.sql
\i database/add_chat_tables.sql
\i database/add_embeddings.sql
\i database/add_workspace_unique.sql
\i database/alter_timeline_events.sql
\i database/add_agent_memories.sql
\i database/add_pending_patch_bundle.sql
\i database/add_teams.sql
\i database/add_user_mcp_servers.sql
\i database/add_agent_events_log.sqlLangGraph checkpoint tables are created automatically on first startup.
# Deploy
fly deploy -a zenoide-app
# Logs
fly logs -a zenoide-app
# Health check
curl https://zenoide-app.fly.dev/api/health
# Scale
fly scale count 2 --region lhr -a zenoide-appRequired secrets on Fly.io:
AUTH_SECRET,AUTH_TRUST_HOSTNEXTAUTH_URL,NEXT_PUBLIC_APP_URLANTHROPIC_API_KEYDATABASE_URL,REDIS_URLGITHUB_CLIENT_ID,GITHUB_CLIENT_SECRETCLOUD_API_URL,CLOUD_API_KEYSTRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRETENABLE_AGENT_WORKER
CI/CD: push to main → GitHub Actions → lint + test + fly deploy
planner → executor → autoVerify → verifier → (replanner | executor | END)
read_file, search_code, create_file, propose_patch, run_command,
run_tests, list_dir, browser_navigate, read_url, get_diagnostics
- Editor: CodeMirror 6, LSP (TS/JS/PHP/Python/C#/Go/Rust), ghost text, Cmd+K, split view, DiffView
- Chat: Streaming SSE, @file/@folder/@codebase mentions, chat-to-agent handoff
- Agent: Multi-step planning, autoVerify (lint+test after each write), patch review UI
- Patches: Hunk-level apply/reject, multi-file bundles, rollback
- Terminal: Real PTY via node-pty
- Auth: GitHub OAuth + credentials, JWT sessions
- Billing: Stripe checkout + portal, quota system (Free/Pro/Team)