✓
Brief
✓
Scaffold
3
Deploy
✓
Live
Project Header
Handle the most important workflow for this project
Current focus
What matters most right now
Public host needs attention
Internal runtime may be OK, but the public entry is not stable yet.
Primary action
The primary action to take now
Check Runtime
Target host
Public URL to validate
Latest workflow jobs
Recent brief / deploy / rebuild / restart / codex jobs
Overview
Test App
test-app
demo
Suggested next: Fix public entry
Public host probe looks unhealthy. Check the Runtime public-host validation, then decide whether to redeploy / sync routes.
Host preview
Use this URL for real smoke testing
Path preview
Compatibility fallback
Wizard status
Brief → Deploy → Runtime
Brief
Clarify intent first, then deploy
Codex not connected
Go to Settings and confirm /root/.codex is mounted correctly.
Project Brief
Current spec summary
Why high demand
A Dockerized, Traefik-proxied template app on a single VPS is a common baseline for validating providers, demoing deployments, and spinning up new projects quickly with predictable ops.
Why high demand
Core features
MVP scope
Step-by-step plan
Possible risks
Tech stack
Infra notes
Questions
MVP scope
- One responsive web UI with a single protected admin route
- REST API with CRUD for one model + pagination
- PostgreSQL persistence with migrations
- Session-based auth for admin user (single role)
- Basic logs and metrics endpoint; simple error reporting
Core features
- Public landing page for Test App (demo)
- Health/status endpoints and basic uptime page
- Simple CRUD demo entity (e.g., Notes) with validation
- Admin login + protected admin page
- Deployment-ready Docker Compose stack behind Traefik
Possible risks
- Under-provisioned VPS leading to OOM/restarts during builds or peak traffic
- Misconfigured Traefik routing/TLS causing downtime or redirect loops
- Database backups not tested or not automated
- Secrets leakage via env files, logs, or Git history
- Single-server blast radius: no HA; upgrades can cause outages
Suggested tech stack
| Part | Choice |
|---|---|
| frontend | React + Vite (served by Nginx container) or simple server-side templates if preferred |
| backend | Node.js (Express) with TypeScript |
| db | PostgreSQL 16 |
| auth | Cookie-based sessions (express-session) + bcrypt; single admin user in DB |
| storage | Local volume for uploads (optional) with clear size limits; consider S3-compatible later |
| queue | None for MVP; use in-process cron for simple jobs (backups handled outside app) |
| observability | Docker logs (json-file) + Traefik access logs + optional Prometheus node exporter |
Infra notes
- Single VPS with Docker Engine + Docker Compose; pin image versions and use restart: unless-stopped
- Traefik as edge router with ACME TLS; only expose 80/443; keep DB internal network-only
- Use .env for secrets on server only; never commit; rotate admin password and session secret
- Persistent volumes: postgres data, app uploads (if any), Traefik acme.json; set correct permissions
- Backups: schedule via host cron or lightweight backup container; verify restores monthly
- Resource limits: set memory limits per container to prevent host OOM; enable swap only if necessary
- Security: automatic OS updates, firewall (ufw), disable password SSH, fail2ban optional
Step-by-step plan
- Define domains/subdomains and DNS records (app, api, traefik/dashboard if needed)
- Create repo structure: /frontend /backend /infra with docker-compose.yml and Traefik dynamic config
- Implement backend service: CRUD, migrations, health endpoints, admin auth
- Implement frontend: landing + admin login + CRUD UI (minimal styling)
- Wire Traefik routes/middlewares: HTTPS via ACME, gzip, security headers, rate limit (basic)
- Add observability: structured logs, basic metrics, error capture; confirm container log rotation
- Add backup job: nightly pg_dump to local + optional offsite (S3-compatible) and restore test
- CI/CD: build and deploy via SSH (or GitHub Actions) pulling repo and running compose up -d
- Load test lightly (wrk/k6) and tune: DB connections, request limits, container resources
- Document runbook: deploy, rollback, backups, restore, renew certs, rotate secrets
Questions
- Do you need a custom domain and HTTPS, or is provider IP access sufficient for the demo?
- Should this be a pure API + static frontend, or server-rendered pages to reduce complexity?
- Is persistence required for the demo, or can the CRUD be ephemeral/in-memory?
- Do you need multi-user auth or only a single admin account?
- Any requirement to support file uploads or background jobs in the MVP?
Deploy
Create a real deploy job (not just a static preview)
This creates a job: Scaffold → docker build → docker run → health check → validate → sync routes, then attaches the app to https://test-app.beast-builder.marklo.de/.
Runtime
Check health first, then decide restart / rebuild
Container
Current runtime instance
bb-app-test-app
Status
Current project status
running
Last validate
check
template=static-nginx
2026-03-07T15:35:51+00:00
Last public host validate
ok
status=200
attempts=1
2026-03-07T15:35:51+00:00
Current public host probe
check
status=502
2026-06-16T18:56:21+00:00
https://test-app.beast-builder.marklo.de/: status=502
Current internal probe
check
2026-06-16T18:56:20+00:00
ConnectError: [Errno -3] Temporary failure in name resolution
Validate probes (1)
| OK | Status | ms | URL | Error |
|---|---|---|---|---|
| check | None | 15 | http://bb-app-test-app:80/ | ConnectError: [Errno 111] Connection refused |
Public host probes (1)
| OK | Status | ms | URL | Error |
|---|---|---|---|---|
| ok | 200 | 32 | https://test-app.beast-builder.marklo.de/ |
Advanced
Heavy tools and low-frequency actions
Controls
Import ZIP (workspace upload)
Upload a .zip from your local machine (e.g. Windows), extract it into
/projects/test-app, and continue with Deploy / Codex without using scp.
The importer also writes .breast-builder/manifest.json so the Deploy scaffold step can safely “skip” without overwriting your files.
Latest zip import job:
#11
done
[2026-03-11T04:09:15+00:00] ZIP uploaded for project=test-app bytes=623 saved_path=/data/zip-imports/test-app/20260311_040915_c4fd910835.zip [2026-03-11T04:09:15+00:00] Step 1/2: import_zip (started_at=2026-03-11T04:09:15+00:00) [2026-03-11T04:09:15+00:00] Workspace cleared: moved_entries=1 backup_dir=/projects/test-app/.codex/import-backups/20260311_040915_job11 [2026-03-11T04:09:15+00:00] Extracting zip into workspace: zip=/data/zip-imports/test-app/20260311_040915_c4fd910835.zip dest=/projects/test-app template=static-nginx replace=True [2026-03-11T04:09:15+00:00] ZIP extracted: files=3 bytes=338 skipped=0 stripped_prefix=myapp/ manifest=/projects/test-app/.breast-builder/manifest.json [2026-03-11T04:09:15+00:00] Deleted uploaded zip: /data/zip-imports/test-app/20260311_040915_c4fd910835.zip [2026-03-11T04:09:15+00:00] Step 2/2: git_init (started_at=2026-03-11T04:09:15+00:00) [2026-03-11T04:09:15+00:00] Command: cd /projects/test-app && set -euo pipefail; if [ -d .git ]; then echo 'git repo already exists'; exit 0; fi; git init; git add -A; git -c user.name='Beast Builder' -c user.email='builder@local' commit -m 'init' || echo 'nothing to commit'; git status --porcelain || true [2026-03-11T04:09:15+00:00] STDOUT: Initialized empty Git repository in /projects/test-app/.git/ [master (root-commit) 8e8b1c6] init 5 files changed, 46 insertions(+) create mode 100644 .breast-builder/manifest.json create mode 100644 .codex/import-backups/20260311_040915_job11/public/index.html create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 public/index.html [2026-03-11T04:09:15+00:00] STDERR: hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> [2026-03-11T04:09:15+00:00] Job done
Suggested next steps after import
1) Go to Deploy and create a deploy job (docker build/run).
2) Use Codex Console to fix bugs / add features.
3) Validate on https://test-app.beast-builder.marklo.de/.
2) Use Codex Console to fix bugs / add features.
3) Validate on https://test-app.beast-builder.marklo.de/.
Spec JSON (editable)
This spec is used in job approvals as the “Brief” summary. Generate it with the LLM first, then refine it here.
Codex Console
Runs codex exec inside the breast-builder-codex container.
Workspace: /projects/test-app.
CLI commands (optional)
docker exec -it breast-builder-codex bash
cd /projects/test-app
git status --porcelain
codex exec --cd /projects/test-app --skip-git-repo-check --color never --dangerously-bypass-approvals-and-sandbox \"...\"
Latest codex job:
#2
awaiting_approval
[2026-03-05T08:53:48+00:00] Codex job created for project=test-app [2026-03-06T08:22:17+00:00] Edited step 1/2 action=codex_exec fields=user_prompt,include_logs
Recent Jobs
| ID | Kind | Status | Created | |
|---|---|---|---|---|
| 11 | zip-import | done | 2026-03-11T04:09:15+00:00 | View → |
| 9 | restart | done | 2026-03-07T15:35:36+00:00 | View → |
| 8 | restart | done | 2026-03-07T15:34:46+00:00 | View → |
| 7 | deploy-template | awaiting_approval | 2026-03-06T08:24:36+00:00 | View → |
| 6 | generate-brief | done | 2026-03-05T10:35:11+00:00 | View → |
| 5 | generate-brief | done | 2026-03-05T10:08:52+00:00 | View → |
| 4 | generate-brief | done | 2026-03-05T10:04:21+00:00 | View → |
| 3 | generate-brief | done | 2026-03-05T09:49:48+00:00 | View → |
| 2 | codex-exec | awaiting_approval | 2026-03-05T08:53:48+00:00 | View → |
| 1 | build-static-preview | done | 2026-03-05T08:09:32+00:00 | View → |
Container Logs
(No logs available yet — container may not be running or may not exist.)