Marketing site, account shell, and legal pages for solved.gg (iResolved, LLC).
Product documentation is hosted on Mintlify at docs.solved.gg. This repo does not ship an on-site docs app.
Stack: Nuxt 4, Vue 3, @nuxt/ui, Clerk, Cloudflare Workers (Nitro cloudflare_module), Bun.
This repository is licensed under the MIT License.
Product toolchains (rusty, scripty, and the rest of the suite) may ship under separate product licenses. Site legal pages live under /legal.
- Bun 1.3+
- Cloudflare account + Wrangler for deploy
- Clerk application (publishable + secret keys)
- Optional: Marble API key for blog posts
bun install
cp .env.example .env
# fill Clerk keys (and optional Marble key)
bun run devDev server defaults to http://0.0.0.0:6543.
| Command | Purpose |
|---|---|
bun run dev |
Local Nuxt dev server |
bun run build |
Nitro/Workers build |
bun run test |
Vitest unit tests |
bun run typecheck |
nuxt typecheck |
bun run deploy |
Build and wrangler deploy |
bun run cf:dev |
Build and wrangler dev |
Vanilla names only. @solvedgg/env (packages/env) maps them to Nuxt (NUXT_PUBLIC_* / NUXT_*) and reads Cloudflare bindings first, then process.env.
Copy .env.example. Never commit real keys.
| Vanilla key | CF type | Notes |
|---|---|---|
CLERK_PUBLISHABLE_KEY |
var | pk_… — public, required for Clerk SSR |
CLERK_SECRET_KEY |
secret | sk_… — wrangler secret put CLERK_SECRET_KEY |
CLERK_SIGN_IN_URL |
var | default /sign-in |
CLERK_SIGN_UP_URL |
var | default /sign-up |
MARBLE_API_KEY |
secret | Blog CMS |
SITE_URL |
var | Canonical origin |
FLAGSHIP_APP_ID |
var / wrangler [[flagship]].app_id |
Cloudflare Flagship app id for binding FLAGS |
FLAGSHIP_ACCOUNT_ID |
secret (optional) | Local HTTP evaluate fallback only |
FLAGSHIP_AUTH_TOKEN |
secret (optional) | Local HTTP evaluate fallback only — never public |
Legacy NUXT_* / NUXT_PUBLIC_* names still work as aliases (read-only fallbacks). Prefer vanilla.
import { applyEnvAliases, getAppEnv, getCloudflareBindings } from "@solvedgg/env";
applyEnvAliases(); // nuxt.config — maps CLERK_* → NUXT_PUBLIC_CLERK_* etc.
const env = getAppEnv(getCloudflareBindings(event)); // server handlers- Worker var:
CLERK_PUBLISHABLE_KEY - Worker secret:
CLERK_SECRET_KEY(never under[vars]) - Same public keys on the build env if using CF builds
- Middleware:
server/middleware/clerk.ts
Server-side evaluation only (Worker binding FLAGS). Client UI reads /api/flags and /api/account/flags — no Flagship API tokens in the browser.
- Cloudflare Dashboard → Compute → Flagship → create app (e.g.
solvedgg). - Create boolean flags matching
app/utils/feature-flags.tskeys (dashboard-beta-panels,promo-banner, …). - Set
FLAGSHIP_APP_IDand fill[[flagship]] app_idinwrangler.toml(or rely on Nitro-generated wrangler with the same id at build). - Account dashboard:
/account/feature-flagsfor opt-in betas (userOptIncatalog keys).
Docs: Flagship.
- Set Worker name / routes in
wrangler.toml. - Bind Flagship
FLAGSwith your app id ([[flagship]]). - Set vanilla Clerk/Marble vars + secrets (table above).
- Clerk Dashboard allowed origins for your domain.
bun run deploy.
/docs and /docs/** 301 to docs.solved.gg (Mintlify).
app/ # Vue pages, components, layouts, client utils
server/ # Nitro API routes and server utils
packages/env/ # Vanilla env → Nuxt/CF mapping (@solvedgg/env)
docs/ # Operator notes for this site (voice, plans)
public/ # Static assets
scripts/ # Bundle size report helpers
tests/ # Unit tests
- Site: solved.gg
- Docs: docs.solved.gg
- Contact: l.solved.gg/contact