CLAUDE.md@.claude/apps/Cloud-Computer-Control-Panel · git:20260912.5d7037e · 2026-09-12 · sha256 b74b4214a2f3438f

CLAUDE.md@.claude/apps/Cloud-Computer-Control-Panel git:20260912.5d7037eA

Immutable. This exact content is served forever at /api/v1/blob/b74b4214a2f3438f.

# CLAUDE.md — `apps/Cloud-Computer-Control-Panel`

Private. Open-source cloud infrastructure management: provisions AWS EC2
instances, installs **Dokploy** for container orchestration, and manages
containers, services and encrypted credentials from one Next.js dashboard.

## This app holds other people's cloud credentials

That is the defining constraint:

- **AWS credentials are stored encrypted.** Never log them, never round-trip
  them through a client component, never put a real-looking key in a fixture.
  Anything that reaches the browser is disclosed.
- **Provisioning actions cost money and are not undoable.** Creating an EC2
  instance, resizing one, or deleting a volume needs an explicit confirmation
  path. Do not add a destructive action to a list row without one.
- Treat every response from AWS or Dokploy as untrusted input before it reaches
  a shell command or a template.

## Shape

`app/` (routes + `/api`) · `components/` (shadcn, see `components.json`) ·
`lib/` · `hooks/` · `data/` · `drizzle.config.ts` · `env.ts` ·
`openapi.json` (the spec the extension and any generated client build on)

```bash
cd apps/Cloud-Computer-Control-Panel
bun run dev
bun run db:generate   # after editing the schema
bun run db:push
bun run lint
```

## Downstream: `apps/cccp-vscode-ext`

The VS Code extension **imports this app's React components unchanged**.
Renaming a component, changing its props, or moving a file under `components/`
breaks the extension — and nothing in this app's own checks will tell you.
Build the extension after changing shared components.