Guides
Self-hosting
Publish Cynario as static files or one app container, keep the source repository private if you choose, and add optional services only for a specific need.
On this page
Cynario’s Builder and Player are a static browser application. There is no required application backend, account database, or result service.
The default deployment
- Static host or CDN: zero runtime containers. Run the production build and publish only
dist/. Your provider must apply Cynario’s security headers and route behavior. - Dockerfile platform or your own server: one app container. The repository’s Dockerfile serves the
same static build through nginx on container port
80;/healthis the health endpoint. - Additional services are optional. Add an SSO proxy only when access must require sign-in. Add a room relay, signaling tracker, or TURN server only for a collaboration/network requirement you can name.
A public website does not require a public source repository. A deployment platform can read a private repository through scoped provider access and expose only the built site or container. Changing repository visibility is a separate disclosure decision that requires current-tree and full Git-history review.
Build or run it locally
# Use an authenticated checkout when the repository remains private.
git clone https://github.com/cybersader/cynario.git
cd cynario
bun install --frozen-lockfile
bun run dev # local development server
bun run build # production build → dist/
bun run preview # preview the production build
Or run the default app container:
docker compose up -d --build
The Compose default exposes the app at http://localhost:8080. For a public deployment, attach a
trusted TLS domain through your hosting platform or reverse proxy; do not expose a second unmanaged
application port.
Production platform settings
For a Dockerfile platform such as Dokploy, use the same provider-neutral shape:
Build type: Dockerfile
Build context: .
Dockerfile: Dockerfile
Container port: 80
Health path: /health
Environment variables: none
Config mount: none for the default app
Keep provider credentials, application identifiers, hostnames, certificate paths, and private route topology in the deployment platform—not in Git or public documentation.
Configuration and optional services
A missing /config.json is normal. If you mount one, the browser can read it, so it is not a
server-side secret store. Use it for organization defaults, pinned content sources, public publisher
keys, and collaboration endpoints; never place private signing keys or protected-source passwords in
it.
Public Marketplace sources and protected packages are static files, not application services. They can share the app origin or live on another correctly configured static origin. Portable result review remains file-based; there is no central result-ingestion container.
Verify the real deployment
Do not stop at a green hosting dashboard. Against the final trusted HTTPS origin, verify:
/,/builder/, and/marketplace/return successfully; for the nginx container,/healthalso returns successfully;- the CSP, HSTS, framing, referrer, permissions, and opener headers are present;
/config.jsonreturns the intended public config or a real404when none is mounted;- the browser console is clean and no page has horizontal overflow at desktop or
375px; - the deployed revision matches the reviewed commit;
- no configuration, password, private key, or unrelated service was exposed.
See Security & trust for the runtime boundary and Architecture for the static-app model. The repository’s Starlight operator guides contain the full production, Docker, deployment-map, content-distribution, relay, TURN, and SSO recipes; automatic public Pages publication is currently paused.