- Never
git pushwithout explicit user confirmation. Always stage and commit as requested, then stop and ask before pushing.
A hands-on guide for new users of Docker Sandboxes (sbx), using DevBoard — a full-stack Next.js + FastAPI issue tracker — as the exercise app. The guide lives in README.md.
Official Docker Sandboxes docs: https://docs.docker.com/ai/sandboxes/
Key sub-pages:
- Get started / usage
- Agents (claude-code, codex, copilot, gemini, docker-agent, kiro, opencode, custom-environments)
- Architecture, security, credentials
- Troubleshooting / FAQ
sbx createrequires explicit workspace path:sbx create --name=foo claude .sbx runinfers current dir:sbx run claudeor reconnect withsbx run <sandbox-name>- Worktrees stored at
.sbx/<sandbox-name>-worktrees/<branch>/ - Multiple workspaces: first path = primary (rw), extras append
:rofor read-only sbx policy deny— confirmed valid (allow, deny, log, ls, reset, rm, set-default all confirmed viasbx policy --help)- Global secrets inject at creation time; sandbox-scoped secrets inject immediately
- Services must bind to
0.0.0.0(not127.0.0.1) for port forwarding to work host.docker.internalto reach host services from inside sandboxSBX_NO_TELEMETRY=1to disable telemetry
A developer issue and project tracker — demo application for the Docker Sandboxes guide.
- Backend: FastAPI + SQLAlchemy + PostgreSQL
- Frontend: Next.js 14 (App Router) + Tailwind CSS
- Infrastructure: Docker Compose
# Start everything
docker compose up --build
# API docs
open http://localhost:8000/docs
# Frontend
open http://localhost:3000cd backend
pip install -r requirements.txt
pytest tests/ -vThis codebase contains a few intentional bugs and unfinished features — they're the basis for exercises in the Docker Sandboxes guide:
- Pagination bug —
list_issuesuses the wrongskipvalue (page * page_sizeinstead of(page - 1) * page_size), so page 1 always skips items. updated_atnever updates — the SQLAlchemyupdated_atcolumns are missingonupdate=datetime.utcnow, so they stay frozen at creation time.- Missing authorization on issue update — any project member can edit any issue, regardless of whether they're the reporter or assignee.
- Search not implemented —
GET /projects/{id}/issues/searchreturns501. - Email notifications are stubs —
services/notifications.pylogs but doesn't send.
See the Docker Sandboxes guide for step-by-step exercises that use Claude to find and fix each of these.
devboard/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app, CORS, router registration
│ │ ├── models.py # SQLAlchemy models (User, Project, Issue, Comment)
│ │ ├── schemas.py # Pydantic request/response schemas
│ │ ├── auth.py # JWT helpers, password hashing
│ │ ├── config.py # Settings (pydantic-settings)
│ │ ├── database.py # Engine, session, Base
│ │ ├── routers/
│ │ │ ├── auth.py # /auth/register, /auth/login, /auth/me
│ │ │ ├── projects.py # /projects CRUD
│ │ │ ├── issues.py # /projects/{id}/issues CRUD + search
│ │ │ └── comments.py # /projects/{id}/issues/{id}/comments CRUD
│ │ └── services/
│ │ └── notifications.py # Stub email service (TODO)
│ └── tests/
│ ├── conftest.py # SQLite test DB, fixtures
│ ├── test_auth.py
│ └── test_issues.py # Tests that expose the known bugs
├── frontend/
│ └── src/
│ ├── app/ # Next.js App Router pages
│ ├── components/ # Shared UI components
│ └── lib/api.ts # Axios API client
└── docker-compose.yml