TellWang
Dashboard

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:

deploy.sh
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:

deploy-ssr.sh
# 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.

attach-existing.sh
# 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 }] }
The TLS cert is issued on the first HTTPS hit to your custom domain — no cert pre-provisioning step. Renewal runs ~30 days before expiry.

API reference

Roadmap