About this build
This site is a tech-stack mockup of opencolin/nebius-builders rebuilt on Nebius.com's exact stack — Next.js Pages Router, Gravity UI + Page Constructor, Directus CMS, Typesense, Azure Front Door deploy. The goal is to make the Nebius web team comfortable adopting and maintaining the Builders portal without context-switching from how nebius.com works today.
What you're looking at
Brand chassis
Mirrors nebius.com: warm off-white surface, navy text + buttons, Inter type, lime joy color on selection. Same g- and pc- class signatures.
CMS-driven
Five marketing pages (home, builders, office-hours, localhosts, signup) live as Page Constructor JSON in Directus. Edit them in the Directus admin and ISR republishes.
Bespoke pages
Eight data-driven pages (events, leaderboard, library, projects, team and detail routes) read directly from Directus collections via the typed SDK.
The five layers
1. Edge
Azure Front Door — global CDN with route-shape cache rules. /_next/static/* one-year immutable, HTML 60s + 5min SWR, /api/* no-store. Mirrors nebius.com's x-azure-ref topology.
Front Door Standard profile
Custom domain + managed cert
az afd endpoint purge for cache busts
2. Application
Next.js 14.2 Pages Router on Container Apps. Webpack (not Turbopack) + React 18. Standalone output for the prod image; default output for `next start` locally.
Single /[[...slug]] catch-all for CMS pages
Bespoke Pages Router files for data-driven views
ISR via revalidate: 60 in getStaticProps
3. Content
Directus 11.17 self-hosted with Postgres 16 + PostGIS for the events.location field, Redis for the cache. Schema is hand-authored YAML and applied via the SDK.
7 user collections + Directus internals
Page Constructor JSON in pages.blocks
Idempotent seed script via npm run seed
4. Search
Typesense Cloud in prod, Docker container locally. The admin key never leaves the indexer; the browser hits /api/search which talks to Typesense with a search-only key.
Single nebius_builders collection
Indexer pulls library, events, builders
Header search box debounced at 150ms
5. Auth
Directus's built-in JWT auth, three roles. Tokens stored in httpOnly cookies; access token rotates transparently via the refresh token in getServerSession.
Roles: public, builder, admin
/api/auth/login,/logout,/me proxy routes
requireRole helper for getServerSideProps
Repository layout
apps/web/
The Next.js Pages Router app. pages/ for routes, src/components/chrome for the layout primitives (PublicNav, Footer, MockupBanner), src/lib for typed Directus and Typesense clients, src/styles/globals.scss for the Nebius brand layer over Gravity tokens.
apps/directus/
Directus tooling. snapshots/schema.yaml is the versioned schema. scripts/{apply-schema,snapshot,seed}.mjs handle apply, regenerate, and idempotent seeding. seed/ holds JSON fixtures + ported markdown for library articles.
infra/
docker-compose.yml for local dev (Postgres, Redis, Directus, Typesense, mailcatcher). Dockerfile.web is the multi-stage standalone build. azure/ has Bicep skeleton and a README walking through the az deployment commands. typesense/sync.mjs is the indexer.
What's real in this mockup
Live data layer
Directus is fully wired. Schema applied, content seeded, every page reads through the typed SDK.
12 builders, 8 projects, 8 events, 11 library articles
Idempotent seed script (re-run safely)
Schema versioned at apps/directus/snapshots/schema.yaml
Auth
Login flow ends at Directus's /auth/login with HTTP-only cookies and transparent refresh.
/api/auth/{login,logout,me} routes
requireRole('builder' / 'admin') in getServerSideProps
Three roles: public, builder, admin
Search
Typesense client + indexer + /api/search proxy.
Search-only API key never leaves the server
Indexer pulls from Directus collections
Header search box hits the proxy
Local dev
Docker Compose brings up Postgres, Redis, Directus, Typesense, mailcatcher.
One docker compose up command
Schema apply + seed scripts ready
Mailcatcher captures Directus emails
What's still stubbed
Portal & admin pages
One worked example for each (/portal, ready for the requireRole('admin') admin pages). The remaining 14 portal + 8 admin pages from the upstream repo aren't ported yet — the patterns are set, the work is mechanical.
Marketing analytics
GTM bootstrap with consent gating is wired in _app.tsx, but no GTM container ID is set. Drop NEXT_PUBLIC_GTM_ID in env to fire it. HubSpot/Demandbase/Hotjar/Clarity placeholders sit in CSP.
Hero decoration
Nebius.com's hero has a custom lime-and-green wave SVG overlay. We use a clean Page Constructor header-block instead — adding the wave as a custom block is a future polish task.
Azure deploy
Bicep skeleton at infra/azure/main.bicep with inline notes for the resources to define (Container Apps, Postgres Flexible, Redis, Front Door cache rules). Needs a real subscription + region + image registry to deploy.
Where to send feedback
GitHub issues
Open an issue on opencolin/nebius-builders. Tag @opencolin for routing.
DM the maintainer
Open a GitHub issue and @-mention @opencolin for anything time-sensitive or scoped to this build specifically.
Pull requests
Direct edits welcome — the build is opinionated but every choice is documented inline. CONTRIBUTING.md will land alongside the next port.