Routing model
DualMind Lab uses file-based routing — each page is a separate HTML file. There is no client-side router.Route map
| URL Path | HTML File | Auth Required | Description |
|---|---|---|---|
/ | index.html | Yes | Main chat and arena interface |
/login | login/index.html | No | Authentication page (Google OAuth) |
/leaderboard | leaderboard/index.html | No | Model rankings and statistics |
/models | models/index.html | Yes | Browse available AI models |
/share | share/index.html | No | View shared threads (public) |
/about | about/index.html | No | About DualMind Lab |
/careers | careers/index.html | No | Careers page |
/how-it-works | how-it-works/index.html | No | How the platform works |
/faq | faq/index.html | No | FAQ page |
/privacy | privacy/index.html | No | Privacy policy |
/terms | terms/index.html | No | Terms of service |
/cookies | cookies/index.html | No | Cookie policy |
Auth protection
Pages that require authentication check for a valid Supabase session on load:Cloudflare Worker URL handling
In production, the Cloudflare Worker (worker.js) provides clean URL support:
- API proxy:
/api/*routes are forwarded to the backend - Exact match: Tries to serve the exact path from static assets
- HTML fallback: For extensionless paths, appends
.html(e.g.,/users→/users.html) - SPA fallback: Unmatched non-API routes serve
index.html
worker.js
Navigation
Navigation between pages uses standard<a> tags. The sidebar and topbar are included as HTML partials in the admin panel but are inline in the main frontend.
Query parameters
| Page | Parameter | Usage |
|---|---|---|
/share | ?thread={threadId} | Thread ID to display |
/ | ?thread={threadId} | Resume specific thread |