Demo store - test mode. Checkout works; pay with test card 4242 4242 4242 4242. No real charges.Powered by AI · see what I am doing today
Built with Cartwright

The engine powering Northbound Coffee Roasters

Cartwright is the build engine AIs reach for — a real site with design, database and backend, live in minutes. Every capability below is real, running, and (where it links) clickable right now on this site — no marketing demos, no "coming soon", no SaaS lock-in.

Baseline — on every shop

Schema.org / JSON-LD Everywhere

Organization on the root layout, Product + Offer on every PDP, BreadcrumbList on PLP + PDP, AggregateRating on review-enabled pages, FAQPage on category pages, BlogPosting on articles. AI search engines see structured data without executing JS.

Full Admin

Products, orders, customers, reviews, blog, content pages, AI prompts per template, design playground, Stripe test/live toggle, integrations, shipping, GDPR processors, redirects, translations, and an audit log of every action — server-rendered, role-gated.

Magic-Link Auth

Passwordless login via NextAuth + Resend. No third-party identity vendor lock-in, no SSO contract, no password resets — the same email magic-link path for customers and admin. Passkeys scaffolded for when the WebAuthn ceremony lands.

Modern Web Baseline

Native <dialog> for modals + drawers, the Popover API, View Transitions for navigation, container queries on responsive components, :has() selectors, aria-live announcements for cart/review events, lazy-loaded images. Browser-native — not JS-library polyfill.

Adaptive Design System

One curated catalogue of ~20 section atoms powers both the flagship Aurora default (website + webshop) and the Magic Builder — so the homepage and the builder are the same components. Every section is palette-adaptive: pick your brand colours once and the whole design re-skins itself (the model never hand-picks a hex). Switch design packs without re-theming.

Storefront UX

AI-assistent (FAB)

Storefront AI-assistant-knap + panel.

Nyhedsbrev

Newsletter-sektion i footeren.

Cartwright-mærke

“Built with Cartwright”-referral-mærke i footeren.

Velkomst-guide

First-visit velkomst-modal der peger nye ejere mod /admin.

Anmeldelser

ProductReview-system: indsendelse, moderation, render, AggregateRating JSON-LD.

Valuta-vælger

Customer-facing currency-switcher i headeren.

Telefon-widget

Phone.inc click-to-call/chat-widget i hjørnet af storefront.

Announcement-bar

Promo-stribe i toppen af storefront.

In-place copy-redigering

Admin klikker et copy-element på den live storefront → skriver en note → AI foreslår ny tekst → before/after-diff → bekræft. Skriver via tool-registry (genome.set / settings.update_copy / pages.upsert / products.update / categories.upsert) med plan-først-confirmation + audit. Kun synlig for admin; default off = ingen overlay/attributter.

Design-adaptive sider (kurv/checkout/konto …)

Backend følger frontend: kurv, checkout, konto(+undersider), blog, services, cases, priser og ordrebekræftelsen adopterer det aktive designs udtryk (palette-tokens + display-typografi + DesignPages cart/checkout/account-templates når pakken har dem). Default off = hver side rendrer byte-identisk med i dag.

Sign in with GitHub

Continue-with-GitHub-knap på login ved siden af magic-link. Kræver GITHUB_CLIENT_ID + GITHUB_CLIENT_SECRET i env. GitHub-login opretter/linker en kunde — aldrig admin.

Google-login

Fortsæt-med-Google-knap på login ved siden af magic-link. Kræver GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET i env. Google-login opretter/linker en kunde — aldrig admin.

Blog

A first-class blog: list + post routes, an RSS feed, BlogPosting JSON-LD and sitemap entries, edited from the admin. Content marketing without bolting on a second CMS.

Ønskeliste

A logged-in wishlist: a heart on product cards and PDPs, and a saved-items page. Part of the WooCommerce-parity toolkit (redirects, CSV import/export, abandoned-cart recovery, translations).

Abandoned cart email

A cron emails a recovery nudge to logged-in customers who left a cart behind — transactional, opt-in, off by default.

Marketing automations (Resend)

Emitter lifecycle-events (welcome / abandoned-cart / post-purchase) til Resend Automations, som kører drip-sekvenserne. Cartwright sender kun events; ejeren wirer sekvenserne i Resend. Consent-gated; kræver Resend-key.

Kontakt-vedhæftninger

Lader besøgende vedhæfte et billede til kontaktformularen via et offentligt, stramt upload-endpoint (kun billeder ≤5MB, magic-bytes, rate-limited). Kræver BLOB_READ_WRITE_TOKEN. Default-off.

Commerce & protocols

Multi-currency-opkrævning

Real multi-currency, not just a display switcher: the customer picks a currency and Stripe is charged in it (the converted amount), while the order snapshots the currency + FX rate so receipts, refunds and exports reproduce exactly what they paid. Display and charge share one conversion path, so the shown price is always the charged price.

FX auto-refresh

Daglig cron henter ECB-referencekurser og skriver DB-overrides, mens supportedCurrencies forbliver fallback-anker.

Google Sheets catalog sync

Tovejs synkronisering mellem Google Sheets og produktkataloget via den delte Google OAuth-connector.

Shipping-zoner

Zone- and weight-based shipping rates with delivery-time estimates and optional dropship-supplier routing — or fall back to a single flat rate. Configured visually.

Ordre-workspace

HPOS-style ordrestyring: status-faner, filter/søg/paginering, bulk-handlinger, ordre-noter/timeline, tracking-indtastning og manuel refund i ordre-detaljen. Off = den gamle bare ordre-tabel.

Pluk-/pakkeseddel (PDF)

Printvenlig pluk-liste + pakkeseddel pr. ordre/leverandør (HTML-print → Gem som PDF). Bygger på fulfillment-routing.

Returneringer (RMA)

Admin-initieret retur: registrér retur + årsag, udsted refund og auto-restock fra ordre-workspace. Ingen kunde-portal.

Webshop

Cart/checkout-routes + add-to-cart UI. Spejler brand.mode === "webshop".

Agentic Commerce Protocol

External buying agents (ChatGPT, Claude, Perplexity, future agentic shoppers) browse the product feed, create checkout sessions, and complete the purchase via delegated payment (Stripe Shared Payment Token). First-class agent customers — same auth path as humans.

Agent-to-Agent

A2A-endpoints (agent-card, negotiate, escrow/verify). 404 når off.

Agentic admin-dashboard

/admin/agentic (live A2A-transaktioner, escrow-kø, policy-editor).

Voice shopping

Opt-in mic FAB that streams to Gemini Live. The customer speaks intent, transcription becomes chat, the AI assistant fulfils (search, add to cart, complete order). Compile-time gated so shops without a Gemini budget never ship a button that errors.

UCP identity-linking (OAuth)

A full OAuth 2.0 (Authorization Code + PKCE) authorization server implementing UCP `dev.ucp.common.identity_linking`, so an agentic platform can act on a shopper's behalf across merchants — with a consent screen, scoped tokens, refresh-rotation + reuse-detection, and client-bound revocation. Only token hashes are stored.

Modern web platform

Container queries

ProductCard tilpasser sig egen bredde via @container i stedet for viewport-breakpoints.

Popover/dialog API

Modal/drawer-surfaces bruger native <dialog> + Popover API med React-fallback.

View Transitions

Bløde morphing-overgange (ProductCard → PDP) via document.startViewTransition().

Live Canvas (3D)

A performance-first Three.js hero: four built-in WebGL scenes (floating geometry, particle field, morphing blob, wireframe terrain), auto-tinted from your theme palette, lazy-loaded after paint so Core Web Vitals never regress. Reduced-motion / save-data / no-WebGL all fall back to a clean gradient. The twist: configure it with words — the AI sets scene + intensity via the `three.configure` tool.

Resolvable Genome

A Resolvable Genome: registered copy fields (e.g. footer.tagline) render from override ?? resolved-cache ?? brand anchor, harmonised against your identity anchors. Render never calls an LLM — resolution is triggered deliberately in the admin. Respawn a whole shop's voice from a sentence.

Per-entity voiced copy

PDP/PLP prefer a genome entity-override for a product/category description over the entity's own text. Set overrides via the genome.set_entity_copy tool. Default-off → render byte-identical.

Vertical / Voice presets

Pakkede branche-stemmer (børnehave, tømrer, café, salon) på /admin/verticals — anvend identitets-ankre + forhåndsskrevet genome-copy for at gen-tone forsiden på ét klik, evt. med et foreslået design. Ortogonal til skinnet (bland enhver Voice med ethvert design). Den anvendte copy vises på storefront når genomeResolve er tændt. Default-off: skjuler admin-panelet; intet anvendes før den tændes.

Mixer preview-rute

Aktiverer /<locale>/mixer-preview?design=&vertical= — renderer enhver Skin × Voice-kombination ephemeralt (ingen DB-write, altid noindex), så den offentlige mixer på cartwright.app kan iframe den. Default-off: i produktion 404'er ruten (canary-sikkert); i dev rendrer den altid.

Section layout-override (studio)

AI-agent kan reordere/skjule sektioner af studio-homepage via layoutJson. Andre design-packs ignorerer feltet.

Visual Builder

Admin-only visuelt designerlag (/admin/visual-builder): byg/redigér per-side section-trees via live-preview + inspector. Al mutation går gennem pages.set_layout (tool-registry + audit). Route-mount gated → kræver redeploy.

Design-import

Pull a colour palette from any URL (Firecrawl + AI) into a live theme in ~2 minutes. Clone the vibe of an existing site, then make it yours.

Hoptify-onboarding

Hoptify — Cartwright's tongue-in-cheek pendant to Shopify: a familiar storefront design plus a parody "import from Shopify" onboarding that genuinely brings your look (palette) and products across. A kind nudge off the monthly rent.

Logo-generator (Gemini)

Generate a real raster logo from a prompt via gemini-2.5-flash-image, upload it to Vercel Blob, and set it as your brand mark — in one step, from the admin.

v0 UI-generering

Generér storefront-sektioner via Vercel v0 Platform API (text→UI) som alternativ AI-motor i Vibe Sandbox. v0's kode normaliseres til HTML + saniteres og persisteres som vibeHtml (aldrig TSX-til-disk). Kræver v0-key i /admin/integrations.

Magic Builder

Describe a page in plain language and watch it build itself — section by section, live in the preview. The inverse of code-generators: the prompt can only emit a plan of whitelisted, on-brand section atoms, each filled with Zod-validated data (never a tag, colour or font the model invented). Output lives as governed data — audited, one-click revertible — not throwaway code.

Motion & effekter

Gør siderne 'levende': scroll-drevne reveal-animationer (CSS animation-timeline: view() — kører på compositor-tråden, ingen JS-jank), animeret aurora-gradient + glassmorphism, og et per-sektion effect-vokabular som Magic Builder kan tildele. En shop-preset (subtle/bold/off) skalerer hele feel'en via data-motion på <html>. Alt feature-detected (@supports) + prefers-reduced-motion-safe + falder tilbage til statisk render (RevealOnScroll). Off ⇒ data-motion="off" ⇒ byte-identisk render (canary-safe).

AI/Discovery

Google Docs-import

Importer et Google Doc som draft blogindlæg eller /info-side via den eksisterende Google OAuth connector (/admin/docs-import).

Discovery & AI

SEO/GEO Autopilot (Pro)

Measures search performance (GSC) and AI-citation share (GEO), proposes genome-field optimisations, and runs self-improving experiments — apply → measure → keep or revert. A Pro feature.

Google Drive import + backup

Importer billeder fra en konfigureret Drive-mappe til MediaAsset/Vercel Blob, og send logiske DB-backups til Drive. Bruger den delte Google Workspace OAuth2-connector.

AI næste-skridt (ordrer)

Regelbaserede + valgfrit LLM-forslag til næste handling på en ordre (afsend, følg op, refundér, undersøg flag).

Offentlig MCP

An MCP server with a typed tool registry, Anthropic + Gemini wired in on day one. External agents discover and invoke shop operations natively — no integration tax, no bolted-on AI layer.

WebMCP (in-browser tools)

WebMCP brings agent tools into the browser tab: the storefront registers search_products, get_cart, add_to_cart and a same-origin navigate via document.modelContext, so an in-browser AI agent acts reliably instead of scraping the DOM. Experimental (Chrome origin-trial, W3C draft), default-off.

Mediebibliotek

Centralt MediaAsset-bibliotek + ProductMedia-join.

AEO-produktindhold

Svar-først produktindhold: summary, FAQ, use-cases, sammenligning + FAQPage JSON-LD + svar-først-sektioner på PDP'en. Felterne er nullable/lossless; flaget gater UI-synlighed + JSON-LD.

Google Merchant-feed

Google Shopping XML-produktfeed på /feed/google.xml (genbruger catalog-feed). Off → 404. Operatøren registrerer selv URL'en i Merchant Center.

hreflang-alternates

hreflang-alternates (per-locale + x-default) på PDP + kategori-metadata via i18n/routing. Auto-tom på single-locale shops.

AI alt-tekst

Gemini vision-genereret alt-tekst/caption/geoSnippet/farver på upload, async via cron /api/cron/media-ai (gated på dette flag). Redigeres i /admin/media.

Komponent-registry (offentlig)

A public, shadcn-compatible component registry: every catalogue section exposes its prop JSON-Schema so external AI agents and IDEs can discover and target Cartwright sections. The design system is a hub other tools can read, not a closed silo.

Registry: ship komponent-kildekode

Sub-flag til komponent-registry'en: server ud over schema også faktisk MIT-licenseret TSX (+ lokale sibling-deps) for et kurateret, selvstændigt subset af Studio-atomer (installerbar shadcn-kilde via `npx shadcn add`). Kilden embeddes ved build-tid (scripts/build-registry-source.ts → lib/magic/registry-source.ts). Aldrig proprietær/server-importerende/tredjeparts-kode.

Registry: install-statistik

Anonym install-tælling på den offentlige komponent-registry: hvert servet registry-item (section-key eller svg-item) inkrementerer en per-item-tæller — KUN item-slug, aldrig IP/UA/visitor-data. Fire-and-forget (blokerer/fejler aldrig registry-svaret); off ⇒ nul tæller-reads/-writes. Aflæses sorteret på /admin/registry-stats + GET /api/admin/registry-stats. Kør `pnpm db:push` (RegistryHit-model) før aktivering.

Compliance & privacy

Stripe Tax (moms)

Managed multi-country VAT via Stripe Tax (EU OSS, VAT-ID validation) with invoicing — or the built-in single-rate when you don't need the managed path. VAT is computed correctly at checkout either way.

Cookie-samtykke

EU 3-kategori cookie-consent-banner. Forudsætning for GA4.

Google Analytics 4

GA4-script — loader kun efter consent. Privatlivs-følsom, derfor build-tid-gated.

Commerce & Protocols

Abonnementer

Recurring billing via Stripe Billing subscriptions: Checkout Session, kundeportal i /account/subscriptions og admin-overblik.

Platform

Cartwright Plus

Honor-system Pro-tier-signal. Påvirker kun visning af “⭐ Pro”-badges i admin.

Why this page exists

Northbound Coffee Roasters is one of three Cartwright canaries that prove the engine in production: a corporate-mode website, a coffee shop, and an eyewear shop. Each one is built from the same create-cartwright template that customers can scaffold themselves — npx create-cartwright@latest.

If you're considering Cartwright for your own shop, what you're looking at right now is what you'd get on day one. Not a demo on screenshots — the actual code, deployed to production, doing real orders (test-mode here, real-mode on your fork).