Pinacle provides secure, lightweight virtual machines pre-configured with Claude Code, Vibe Kanban, and VS Code for AI-powered development. Spin up development environments that run 24/7, accessible from anywhere.
- Pre-configured AI Tools: Claude Code, Vibe Kanban, and VS Code ready to use
- Scalable Resources: From 1GB to 16GB RAM configurations
- Team Collaboration: Invite team members and share development environments
- Secure Sandboxing: gVisor isolation for maximum security
- 24/7 Uptime: Keep your AI agents working while you sleep
- Mobile Access: Monitor and control from your phone
- Frontend: Next.js 15, React 19, TypeScript, Tailwind CSS
- UI Components: shadcn/ui with Radix UI primitives
- Backend: tRPC v11 for type-safe APIs
- Database: PostgreSQL with Drizzle ORM
- Authentication: NextAuth.js with GitHub and credentials
- Containerization: gVisor for secure VM isolation
- Deployment: Vercel (frontend), Docker (backend services)
- Node.js 18+ and pnpm
- PostgreSQL database
- Docker (for gVisor/container management)
- GitHub OAuth app (optional, for GitHub sign-in)
- For macOS Development: Lima VM for gVisor support
git clone <repository-url>
cd pinacle
pnpm install
Copy the example environment file and configure your variables:
cp env.example .env.local
Edit .env.local
with your configuration:
# Database
DATABASE_URL="postgresql://username:password@localhost:5432/pinacle"
# NextAuth
NEXTAUTH_SECRET="your-secret-key-here"
NEXTAUTH_URL="http://localhost:3000"
# GitHub OAuth (Optional)
GITHUB_CLIENT_ID="your-github-client-id"
GITHUB_CLIENT_SECRET="your-github-client-secret"
Create and migrate your database:
# Generate migration files
pnpm db:generate
# Run migrations
pnpm db:migrate
# Seed with initial data
pnpm db:seed
For pod orchestration development on macOS, you need Lima with gVisor support:
# Install Lima
brew install lima
# Start the gVisor-enabled Lima VM
limactl start gvisor-alpine.yaml
# Verify Lima VM is running
limactl list
# Test gVisor runtime
limactl shell gvisor-alpine sudo docker run --rm --runtime=runsc hello-world
Start the development server:
pnpm dev
Open http://localhost:3000 in your browser.
pnpm dev
- Start development serverpnpm build
- Build for productionpnpm start
- Start production serverpnpm lint
- Run lintingpnpm format
- Format codepnpm db:generate
- Generate Drizzle migrationspnpm db:migrate
- Run database migrationspnpm db:push
- Push schema changes to databasepnpm db:studio
- Open Drizzle Studiopnpm db:seed
- Seed database with initial datapnpm test
- Run unit testspnpm test:watch
- Run tests in watch modepnpm test:ui
- Open Vitest UIpnpm test:integration
- Run integration testspnpm test:pod-system
- Test pod orchestration system
src/
βββ app/ # Next.js app directory
β βββ auth/ # Authentication pages
β βββ dashboard/ # Dashboard and management pages
β βββ api/ # API routes
βββ components/ # React components
β βββ ui/ # shadcn/ui components
β βββ landing/ # Landing page components
β βββ dashboard/ # Dashboard components
βββ lib/ # Utility libraries
β βββ db/ # Database configuration and schema
β βββ trpc/ # tRPC configuration and routers
β βββ pod-orchestration/ # Pod management system
β βββ auth.ts # NextAuth configuration
βββ env.ts # Environment validation
The app supports two authentication methods:
- GitHub OAuth: Sign in with your GitHub account
- Credentials: Email and password registration
Key entities:
- Users: User accounts and profiles
- Teams: Collaborative workspaces
- Pods: Virtual machine instances
- Pod Templates: Pre-configured environments
- Pod Usage: Billing and usage tracking
The pod orchestration system manages secure development VMs using gVisor containers.
The system uses Lima VM for gVisor support on macOS:
# Install Lima
brew install lima
# Start gVisor-enabled Lima VM
limactl start gvisor-alpine.yaml
# Test the pod system
pnpm test:pod-system
Each pod runs an internal Nginx proxy that routes requests based on the hostname:
- Pattern:
localhost-{PORT}.pod-{SLUG}.localhost:{EXPOSED_PORT}
- Only one port (80) needs to be exposed per pod
- Services can be added dynamically without restarting the pod
- Uses
.localhost
TLD which browsers treat as localhost (no DNS/hosts setup needed)
Example:
# Access different services in the same pod (assuming exposed on port 30000)
curl http://localhost-3000.pod-test-pod.localhost:30000 # App on port 3000
curl http://localhost-8726.pod-test-pod.localhost:30000 # Code server on port 8726
curl http://localhost-5262.pod-test-pod.localhost:30000 # Vibe Kanban on port 5262
In production, the system runs directly on Linux with gVisor:
# Install gVisor on Linux
curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | sudo tee /etc/apt/sources.list.d/gvisor.list > /dev/null
sudo apt-get update && sudo apt-get install -y runsc
# Configure Docker with gVisor
sudo tee /etc/docker/daemon.json << EOF
{
"runtimes": {
"runsc": {
"path": "/usr/bin/runsc"
}
}
}
EOF
sudo systemctl restart docker
The system automatically detects the environment:
- Development: Uses Lima VM when
NODE_ENV=development
andplatform=darwin
- Production: Uses direct Docker commands on Linux
- Connect your GitHub repository to Vercel
- Set environment variables in Vercel dashboard
- Deploy automatically on push to main
Use a managed PostgreSQL service like:
- Neon
- PlanetScale
- Supabase
- Railway
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the MIT License.
For support, please:
- Check the documentation
- Search existing issues
- Create a new issue with detailed information
Built with β€οΈ for the AI development community.