Hosting & Domains
Put your website online on a domain you own, with HTTPS set up for you. Static sites or a full Next.js server (SSR + server components + API routes), custom domain, auto-TLS — no DNS plumbing.
Ship a static frontend (shipped)
Upload your built static site as a JSON map of path → content. index.html is required (the frontend is served SPA-rooted there). The cp writes the files into the Wok's edge bind-mount and installs the edge route in one shot:
curl -X POST https://tellwang.com/v1/woks/$WOK/frontend \
-H "Authorization: Bearer $TELLWANG_KEY" \
-H "Content-Type: application/json" \
-d '{"files":{
"index.html": "<!doctype html>...",
"assets/app.js": "console.log(\"hi\")",
"assets/style.css": "body{margin:0}"
}}'
# → 200 { wok_id, files, bytes, frontend_url }Same-origin Supabase paths — the edge proxies /rest/v1, /auth/v1, /storage/v1, /functions/v1, and /realtime/v1 verbatim to your Wok's services, so a supabase-js client pointed at frontend_url needs no CORS configuration. Edge functions that return text/event-stream are proxied unbuffered for SSE, and WebSocket Upgrade handshakes pass through the same functions route. GET /frontend lists deployed files + sizes; DELETE /frontend tears down the edge route + clears the bundle.
Redirects — include a Netlify-style _redirects file for the common cases: /old /new 301, /docs/* /help/:splat 308, /app/* /index.html 200, or /blog/* /404.html 404. TellWang supports exact paths, one * splat, and statuses 200, 301, 302, 307, 308, and 404. A 404 rule is file-existence-aware: real files and directory indexes still serve normally, and only misses fall back to the target file with HTTP 404. Unsupported or unsafe lines are skipped; the SPA fallback still handles everything else.
Server-side rendering (Next.js)
Static hosting covers SPAs and next export. When the app renders on the server — Next.js App Router server components, app/api route handlers, getServerSideProps, middleware — switch the Wok to SSR mode: a Node process runs your build, and the Wok's URL points at it instead of the file server. The same /rest/v1·/auth/v1·/storage/v1 proxies stay in front, and from server code the Wok's database is one hop away at http://rest:3000 (the container gets SUPABASE_URL + keys in its env).
Build with output: 'standalone' in next.config.js — that makes next build emit a self-contained server.js plus a trimmed node_modules. Pack the .next/standalone directory (copy .next/static and public into it) and POST the tarball:
# after `next build` with output:'standalone'
cp -r .next/static .next/standalone/.next/static
cp -r public .next/standalone/public # if you have one
tar czf - -C .next/standalone . | curl -X POST \
https://tellwang.com/v1/woks/$WOK/appserver/deploy \
-H "Authorization: Bearer $TELLWANG_KEY" \
-H "Content-Type: application/gzip" --data-binary @-
# → 200 { wok_id, mode:"ssr", files, bytes, url, healthy:true }Building inside Wang? Ask it to deploy a Next.js app and it runs the build in its sandbox and ships it for you (the sb_deploy_nextjs step). POST /appserver/static flips a Wok back to static file serving.
Custom domains (shipped)
Two flavours: (1) register through TellWang via Cloudflare Registrar (see Domains API), or (2) bring your own — point the apex/subdomain at the TellWang edge with one CNAME and HTTPS gets issued + renewed automatically via Let's Encrypt.
# 1. On your DNS host (Cloudflare, Namecheap, Route 53, …) add a CNAME:
# www.acme.com → edge.tellwang.com
# 2. Bind that hostname to your Wok (registers it for TLS on-demand)
curl -X PUT https://tellwang.com/v1/woks/$WOK/domains/www.acme.com \
-H "Authorization: Bearer $TELLWANG_KEY"
# → 200 { wok_id, domain, tls:"on-demand", verify_url }
# 3. Verify the binding (HTTPS probe against your-domain/__tellwang/dns-verify)
curl https://tellwang.com/v1/woks/$WOK/domains
# → 200 { domains: [{ domain, dns_status: "verified", attached_at }] }API reference
POST /v1/woks/{id}/frontend— body{files:{path:content}}, requiresindex.html. Body cap 25 MiB total (5 MiB/file, up to 25000 files — a framework export's many small chunks deploy fine; the 25 MiB aggregate is the real bound, so put large media in a storage bucket). Optional_redirectsrules are applied before the SPA fallback.POST /v1/woks/{id}/appserver/deploy— body is a.tar.gzof a Next.jsoutput:'standalone'bundle (server.jsat the root). Switches the Wok to SSR mode and runs it on a Node server. Cap 250 MiB.POST /v1/woks/{id}/appserver/static— revert an SSR Wok to static file serving.GET /v1/woks/{id}/frontend— list files + sizes.DELETE /v1/woks/{id}/frontend— tear down.PUT /v1/woks/{id}/domains/{domain}— attach external domain (CNAME-then-verify path, Caddy on-demand TLS).GET /v1/woks/{id}/domains— list attached external domains + dns_status.DELETE /v1/woks/{id}/domains/{domain}— detach.
Roadmap
- Cloudflare-backed edge — per-host CDN + global DDoS protection, on the roadmap. Today's tier serves custom domains with on-demand TLS.