Welcome to Topiqu! 👋
Landing page and onboarding flow for Topiqu - Your AI Blog Platform.
Includes:
- Marketing landing page - workspace preview, editorial workflow, comparison, pricing and FAQ
- 6-step onboarding - site setup, design, account, plan, email verification, summary
- Optional company website - saved with the new project and offered for a confirmed knowledge import in the app
- Legal pages - Terms of Service, Privacy Policy
- PWA support, SEO/OG meta, structured data (schema.org)
- i18n - Multi-language localization
The landing shares Nuxt UI primitives and the visual language of the app. See the design system notes for component reuse, CSS conventions and logo synchronization.
Requirements
- 📦 Bun - package manager & runtime
- 🔑 A configured
.env(see.env.example)
Install & run in dev mode
bun install # installs deps + runs nuxt prepare
bun dev # start Nuxt dev serverBuild & preview
bun run build # production server build (Bun preset)
bun generate # static site generation
bun preview # preview production build locallyDocker builds Nuxt with Node 24 and runs the standalone server with Bun 1.4.2. Nuxt Content uses the built-in SQLite driver in both stages.
Check the packaged production server with the same image used for deployment:
docker build --tag topiqu-landing:smoke .
docker run --detach --rm --name topiqu-landing-smoke --publish 127.0.0.1:3000:3000 topiqu-landing:smoke
bun run test:production
docker stop topiqu-landing-smokeThe smoke test checks server rendering of all six onboarding steps in English and Czech,
documentation, changelog and the 404 page. Set PRODUCTION_TEST_URL to test a different local
port. CI runs it against the final Docker image so development dependencies cannot mask missing
runtime dependencies.
Copy .env.example and fill in:
| Variable | Description |
|---|---|
CDN_URL |
CDN base URL for assets |
TURNSTILE_SECRET_KEY |
Cloudflare Turnstile secret (onboarding bot protection) |
TURNSTILE_SITE_KEY |
Cloudflare Turnstile site key |
AUTH_SECRET |
HMAC signing secret shared with the platform |
PLATFORM_API_URL |
Main Topiqu platform URL (receives checkout data) |
SES_REGION |
Amazon SES region (eu-central-1 for Frankfurt) |
SES_ACCESS_KEY_ID |
IAM access key with permission to send through SES |
SES_SECRET_ACCESS_KEY |
IAM secret access key for SES |
EMAIL_FROM |
Sender address for verification emails |
GTAG_ID |
Google Analytics measurement ID (G-XXXXXXXXXX) |
After SES accepts a verification email, the server logs [SES] Verification email accepted
with the SES messageId and sending region. The /api/send-code response includes
delivery: "ses" and messageId; this confirms SES acceptance, not inbox delivery.
In local development without SES credentials, the code is printed to the terminal
as [DEV EMAIL] instead of being sent,
and the response explicitly reports delivery: "development".
ESLint (@nuxt/eslint) + Prettier enforced project-wide.
bun lint # check
bun lint:fix # auto-fix
bun prettier # check formatting
bun prettier:fix # apply formatting
bun fmt # lint:fix + prettier:fix combined
bun typecheck # vue-tsc strict typecheckMade with ❤️ by @bigjohnn1 & @germondai