A modern, AI-built website template for steel manufacturers, metal roofing suppliers, and metal building dealers. Ship a fast Next.js front end with a full product catalog, panel and trim profile pages, 3D building visualizers, and an AI sales assistant that answers customer questions and captures quote requests, all without a CMS.
π Demo: ascot.gallop.software
βοΈ Cloudflare Demo: ascot-cloudflare.gallop.software
π¨ Template: gallop.software/templates
π¦ Repository: github.com/gallop-software/ascot
π·οΈ Category: Steel Manufacturer & Metal Building Template
Steel and metal building sites live or die on the catalog: panel profiles, gauges, coatings, trim, color charts, and building packages. This template keeps all of that in two plain TypeScript files, so you can rebrand the entire site by editing company details and catalog data instead of hunting through dozens of components. Just chat with AI inside our Gallop AI Editor, describe the panel, product page, or layout you want, and AI writes the code. Add smooth animations, configure your SEO and AI discoverability instantly, expand endlessly, and get prompting tips from our Gallop community. Go live in minutes.
src/config.ts and src/catalog.ts, not scattered componentsllms.txt summary for AI crawlersNew to this? No problem. You'll have AI guiding you the entire way.
The Gallop AI Editor is a desktop app built specifically for AI-powered web development for Next.js. It includes everything you need β code editor, AI assistant, Git, terminal, media manager, font manager, SEO & structured data scanner, and a gallery of open-source templates β all in one window with nothing to configure.
It was purpose-built for this workflow, whether you're a complete beginner or an advanced Next.js developer who wants AI-assisted development:
| What you get | |
|---|---|
| Best for | Non-programmers, junior programmers, advanced programmers |
| AI built in | Claude ready to go β use Gallop AI with no setup, your Claude Max or Pro plan, or your own API key |
| Template gallery | Built in, and every template is free and open source |
| Media manager | Built-in Studio with CDN sync |
| Font manager | Built-in Studio with WOFF2 font generation |
| SEO Audit | Analyze SEO & Structured Data |
| Git | Git UI with modal diff viewer |
| Node.js | Built-in installer and version manager |
| Deployment | Connect Vercel or Cloudflare, then let AI deploy for you |
Available for Mac and Windows.
Open the New Project modal. It has three tabs β Gallop Templates, Git Repositories, and Local β and you want the first one.
The editor then does everything else in one pass:
Because the repository is created here, your GitHub repo already exists by the time you reach Put Your Site Online β there's nothing to set up on GitHub when it's time to deploy.
Why this is one click: you're already signed in to GitHub inside the editor, so it can create the repository on your behalf without asking you for anything.
Click the play icon in the left rail (or press Cmd+1) to open the Start Website view. It's a terminal with a toolbar across the top β two clicks and your site is live locally.
Here's the full toolbar, and the command each button saves you from typing:
| Button | What it does | Equivalent command |
|---|---|---|
| Install / Reinstall | Downloads the project's dependencies. Reads Reinstall once they're already installed. | npm install |
| Start Website | Starts the development server with hot reload β save a file and the browser updates itself. | npm run dev |
| Stop | Shuts the server down and frees up the port. Replaces Start Website while the site is running. | Ctrl+C |
| Refresh Cache | Clears Next.js's build cache and restarts the server. Only appears while running. | delete .next, restart |
| Clear | Wipes the terminal output. Doesn't touch the server. | clear |
The play icon in the left rail turns green with a dot while your site is running, so you can tell at a glance from any view.
Leave the server running while you work. You only need Start Website once per session β the site refreshes on its own every time you or the AI saves a file.
If something looks stuck β a change won't appear, or the site won't load β try Refresh Cache first, and Stop then Start Website if that doesn't do it.
Copy .env.local.sample to .env.local and fill in the keys you need. The AI can do this for you β just ask β and every variable is documented inline in the sample file.
Two of them matter more than the rest:
OPENAI_API_KEY and OPENAI_VECTOR_STORE_ID power the AI sales assistant. The vector store must hold your own product documentation β pointing it at another company's store makes the assistant answer confidently about products you don't sell.NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY and CLOUDFLARE_TURNSTILE_SECRET_KEY are required, not optional. The quote form runs with Turnstile enabled, so without a site key the widget can't issue a token and submissions fail verification.Mailgun handles form delivery, and the analytics variables are optional. Never commit .env.local or .env.production β both are gitignored, and both hold real secrets.
Press Cmd+J to show the AI panel on the right. Click the + in its header and you'll get a picker with three cards:
| Card | What it is |
|---|---|
| AI Chat | Gallop's own chat interface β message bubbles, plan mode, and the target for screenshots you insert. Start here. |
| Claude Code | Claude Code itself, running as a terminal inside the panel. |
| Terminal | A plain shell, for when you want to run something yourself. |
Both AI options are Claude Code. Gallop's AI Chat runs Claude Code under the hood and puts a friendlier interface on top of it; the Claude Code card gives you the same engine as its normal terminal interface. Same capabilities, same access to your project β pick whichever you find easier to read.
You can run both at once in separate tabs β they're independent sessions.
Pick AI Chat, then just ask:
I'm new to this. Help me rebrand this site for my metal building company.
The AI assistant can read and edit your project files, run commands, and explain anything you're confused about. Just describe what you want in plain English:
Replace the company name, phone, address, and service area in src/config.ts
Add a 26 gauge standing seam panel profile to the catalog
Make the accent color a deep galvanized blue
Add a new page for post frame building packages
Tip: Press Cmd+Shift+S to take a screenshot of your running site and attach it to the chat. The AI can see exactly what you see and suggest changes visually.
Everything below is how you actually build your site day to day. The left rail switches between views; each has a keyboard shortcut.
| Icon | View | Shortcut | What it's for |
|---|---|---|---|
| βΆ | Start Website | Cmd+1 | Run your site locally. Install, Start, Stop, Refresh Cache β see Step 3. Turns green while running. |
| β | Source Control | Cmd+2 | Commit, branch, and merge visually. The badge shows how many files changed. |
<> | Editor | Cmd+3 | The code editor, with autocomplete and go-to-definition. Cmd+B toggles the file explorer. |
| πΌ | Studio | Cmd+4 | Your images and fonts β see below. |
| π | SEO | Cmd+5 | Scan any page for SEO and structured-data problems. |
| π | Publish | Cmd+6 | Connect Cloudflare, Vercel, and Mailgun so AI can deploy for you. |
Cmd+K cycles forward through views if you'd rather not remember numbers.
The AI panel lives on the right and is where most of your work happens.
Cmd+J shows and hides it. Hiding does not stop what's running β a long AI task keeps going while the panel is closed.Cmd+I expands it to fill the window, for when you're reading a long answer.Cmd+T opens a new tab; Cmd+Shift+[ and Cmd+Shift+] cycle between them. You can drag tabs to reorder them.Γ. Close the last one and you're back at the AI Chat / Claude Code / Terminal picker.Agent mode vs Plan mode β on an AI Chat tab, press Cmd+. to switch between them. (Claude Code tabs have their own mode controls, so Cmd+. doesn't apply there.)
| Mode | Behavior | Use it when |
|---|---|---|
| Agent | AI edits your files directly. | You trust the change β most of the time. |
| Plan | AI describes what it intends to do and waits for your approval. | The change is large or you want to learn what it's doing. |
Two AI Chat slash commands are worth knowing: /new starts a fresh conversation, and /compact summarizes a long one so you can keep going without losing the thread.
How you pay for AI is set in the panel's settings gear. There are three options, and none of them require you to have an API key:
| Option | What it uses | Good for |
|---|---|---|
| Gallop AI | Our proxy, billed from a prepaid balance | Getting started β nothing to sign up for or configure |
| Subscription | Your existing Claude Max or Pro plan | You already pay Anthropic monthly and want to use that |
| Your API Key | Your own Anthropic API key | You'd rather be billed by Anthropic per request |
Sessions pick up this setting when they start, so change it before opening a chat tab.
This is separate from the OPENAI_API_KEY in your .env.local. That one powers the sales assistant on your live site, which answers your customers' questions β it has nothing to do with how you're billed for building the site.
Describing a visual bug is hard. Show it instead.
Cmd+Shift+S β drag a box around any part of your running site. The capture opens in an annotator where you can draw arrows and boxes, then Insert it straight into a chat tab.Cmd+Shift+G β opens the code file behind whatever page your browser is showing. No hunting through folders to find which file draws a page.Cmd+Shift+L β drops the file you're editing into the chat as a reference, so you can say "fix the spacing here" without explaining where "here" is.Cmd+4 opens Studio, which manages everything in your public/ folder.
Studio keeps its records in _data/_studio.json. That file is generated β let Studio manage it.
Cmd+5 opens the SEO view. You run a report yourself β the AI can't trigger one for you:
http://localhost:3000)| Report | What it tells you |
|---|---|
| Analyze On-Page SEO | Titles and descriptions, each rated from "Missing" through "Too long" so you can see what to tighten |
| HTML vs DOM | What search engines receive versus what loads in the browser β catches content that only appears after JavaScript runs |
| Analyze Structured Data | Whether the JSON-LD that search engines and AI assistants read is valid |
Each report opens in its own tab, so you can check several pages side by side. Ascot emits LocalBusiness and Organization schema site-wide, plus Product and BreadcrumbList schema on every panel profile page, so the structured-data report is worth running on /panels/pro-rib as well as your homepage.
Once you have the results, hand them to AI: screenshot the report with Cmd+Shift+S and insert it into a chat, or paste the details in. Then ask for what you want:
Here's the SEO report for my homepage. Fix everything it flags.
Cmd+2 gives you Git without the command line β stage individual lines, review diffs side by side, and browse history. If you'd rather not think about Git at all, don't: ask AI to "commit my changes and push them."
| Shortcut | Action |
|---|---|
Cmd+1βCmd+6 | Switch views |
Cmd+K | Cycle views forward |
Cmd+J | Show/hide the AI panel |
Cmd+I | Expand/collapse the AI panel |
Cmd+. | Toggle agent β plan mode |
Cmd+T | New tab |
Cmd+W | Close tab |
Cmd+Shift+[ / ] | Cycle tabs |
Cmd+B | Toggle file explorer |
Cmd+P | Quick Open β jump to any file by name |
Cmd+F | Find |
Cmd+Shift+F | Find in all files |
Cmd+S | Save |
Cmd+Shift+S | Screenshot |
Cmd+Shift+G | Open the route file for your browser's page |
Cmd+Shift+L | Send the current file to chat |
Cmd+Shift+N | New window |
On Windows, use Ctrl wherever this says Cmd.
Connect with other Gallop users on Discord or Slack. Share your progress, swap AI prompting tips, and see how non-programmers are launching sites that once required a full development team.
"Frontier Metals" is fictional demo content. Company identity is centralized, so rebranding means editing a handful of files instead of dozens of components.
| What | Where |
|---|---|
| Company name, tagline, contact, address, hours, service area, stats, values, timeline, social, CTA labels, SEO defaults | src/config.ts |
| Panels, products, colors, building systems, industries, testimonials, resources, process steps | src/catalog.ts |
| Brand colors (semantic tokens) | src/styles/tailwind.css @theme |
| Fonts | src/fonts/*.ts |
| Logo (inline SVG) | src/components/logo.tsx |
| Navigation + utility bar | src/components/navbar/config.ts |
| Footer columns | src/components/footer/config.tsx |
| Site-wide JSON-LD | src/app/metadata.tsx |
| AI assistant system prompt | src/app/api/assistant/route.ts |
| AI crawler summary | public/llms.txt (hand-maintained) |
Important: Certifications, warranties, engineering approvals, code compliance, and test results are configurable placeholders. Never present them as fact until your own documentation backs them up.
Your code is already on GitHub β you're signed in inside the editor, and your repository was created when you started the project. All that's left is a hosting account: either Vercel or Cloudflare. Check their current plans before you pick β pricing and what each tier allows change over time.
Press Cmd+6 (the rocket icon) to open the Publish view. It has a tab for each service you might need:
| Tab | What it's for |
|---|---|
| Cloudflare | Deploy to Cloudflare Workers |
| Vercel | Deploy to Vercel |
| Mailgun | Sends the email from your quote and contact forms |
Each tab links straight to the page where you generate the token, with the right permissions preselected β you paste it in, click Connect to verify it, then Save.
From then on the editor injects those credentials into your terminal and AI chat automatically, so the assistant can deploy on your behalf and you never paste a token into a project file.
Important: credentials are handed to a session when it starts. After saving a new token, open a new chat or terminal tab β an existing one won't see it.
Then just ask:
Push my latest changes to GitHub and deploy this site
The AI will walk you through every step. When you're done, your site will be live with a URL you can share.
Already know which host you want? Use the ready-made prompt for Vercel or Cloudflare.
Connect your Vercel account in the Gallop AI Editor, then paste this into the AI chat:
Deploy this site to Vercel. My Vercel account is already connected.Please:1. Push my latest changes to GitHub2. Link this project to Vercel and deploy it to production3. Ask me for my production URL, OpenAI, Turnstile, and Mailgun values,then add them as environment variables(see .env.production.sample for the full list)4. Tell me the live URL when it's doneNever commit .env.production β it holds real secrets.
Vercel redeploys automatically every time you push, so from here on your changes go live by asking the AI to push them.
Environment variables, without the busywork. The Vercel tab in the Publish view can push and pull your .env files against your Vercel project directly. Change a value locally, push it up; pull production values down to check them. It shows you a full diff before anything is written, and backs up your local file before a pull.
Congratulations! Your site is now live to the world. Share your new URL and start bringing in quote requests. Ready for a custom domain? See Vercel's domain setup guide.
Prefer Cloudflare? Ascot also runs on Cloudflare Workers via the OpenNext adapter.
Step 1 β Connect Cloudflare in the Publish view (Cmd+6). Once saved, the editor puts your Cloudflare credentials (CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID) into the terminal environment and makes them available to the AI chat. Wrangler reads those variables automatically, which means nobody has to run npx wrangler login, and no token is ever pasted into a file.
Step 2 β Paste this prompt into the AI chat:
Deploy this site to Cloudflare Workers. My Cloudflare account is alreadyconnected, so CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID are in theterminal environment β do not run `wrangler login`.Please:1. Run `npm run cf:setup` to create .env.production from the sample2. Ask me for my production URL, OpenAI, Turnstile, and Mailgun values,then fill in .env.production3. Run `npm run cf:deploy` to build and create the Worker4. Run `npm run cf:secrets` to upload the secrets5. Tell me the live URL when it's doneNever commit .env.production β it holds real secrets.
The AI will pause at step 2 to collect your values. Everything else runs unattended. First deploy takes a few minutes.
Step 3 β Follow-up prompts for anything after the first deploy:
Deploy my latest changes to Cloudflare
I changed my Mailgun API key in .env.production β push the updated secrets to Cloudflare
Rename my Cloudflare Worker to my-business-site and redeploy
My quote form isn't sending email on Cloudflare β check my secrets are set correctly
If a prompt fails, paste the error back into the chat. The most common causes are a Cloudflare account that isn't connected yet (so wrangler has no credentials) and running cf:secrets before the Worker exists β the AI can diagnose both from the error text.
Everything below is reference material for your AI assistant β what files Cloudflare needs, which ones get created, and what has to change when you rename things. You don't need to read or run any of it yourself; the prompts above cover the whole process. It's here so the AI has accurate ground truth, and so you have something to point at if a deploy goes wrong.
Ascot ships Cloudflare-ready. If you forked or generated this repo, every config file already exists β you do not create any of them. The only file you add by hand is .env.production.
1. Config files β already in the repo, keep them
| File | What it does for Cloudflare |
|---|---|
wrangler.jsonc | The Worker manifest. Names the Worker, points at the build output, declares bindings and the nodejs_compat flag. Wrangler reads this on every command. |
open-next.config.ts | Tells the OpenNext adapter how to convert the Next.js build into a Worker. Ships minimal β ISR/R2 caching is commented out and off. |
next.config.mjs | Its last line calls initOpenNextCloudflareForDev(), which makes Cloudflare bindings available during npm run dev. It is a no-op in production builds, so this does not break Vercel. |
public/_headers | Tells Cloudflare to cache /_next/static/* immutably for a year. |
package.json | Holds the cf:* scripts plus @opennextjs/cloudflare and wrangler as devDependencies. |
.env.production.sample | Placeholder copy of the secrets you'll need. Safe to commit β it contains no real values. |
2. Files you create β never committed
| File | How to create it | Why |
|---|---|---|
.env.production | npm run cf:setup (copies the sample) | Real secret values. npm run cf:secrets reads this file and uploads its contents to Cloudflare's secret store. |
.dev.vars | Created automatically by npm run cf:preview | Local-preview copy of your secrets, the format the Workers runtime expects. |
Both are covered by the .env* and .dev.vars* rules in .gitignore, so they stay out of Git automatically. Never commit either one.
3. Build output β generated, never commit
| Path | Created by |
|---|---|
.open-next/ | npm run cf:build β contains worker.js and the static assets/ that wrangler.jsonc points at |
.wrangler/ | Wrangler's local state and cache |
cloudflare-env.d.ts | npm run cf:typegen β TypeScript types for your bindings |
All three are already gitignored. .open-next/ does not exist until you build, which is why cf:deploy and cf:preview always run the build first.
This is what the AI runs on your behalf, in this order:
npm run cf:setup # scaffolds .env.production# fill in .env.production with your valuesnpm run cf:deploy # build + deploy β creates the Worker on first runnpm run cf:secrets # push .env.production to the Worker's secret store (after the Worker exists)
No wrangler login step is needed: connecting Cloudflare in the editor already put CLOUDFLARE_API_TOKEN in the environment, and wrangler picks it up automatically.
Order matters: cf:secrets cannot create a Worker, so deploy once first. After that, secrets and code are independent β you only re-run cf:secrets when a value changes, and every later deploy reuses them.
How cf:secrets finds the right Worker: it runs wrangler secret bulk .env.production, which targets your authenticated Cloudflare account plus the Worker named in wrangler.jsonc β no URL involved. It uploads every key in the file, NEXT_PUBLIC_PRODUCTION_URL and NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY included; those are harmless as secrets but have no effect, because NEXT_PUBLIC_* values are inlined at build time rather than read at runtime.
CLOUDFLARE_API_TOKEN in your environment (what the Gallop AI Editor does for you when you connect Cloudflare) or run npx wrangler login for OAuth, cached in ~/.wrangler. If your account can't be inferred from the token, also set CLOUDFLARE_ACCOUNT_ID. Wrangler ships as a dev dependency, so npx runs the local copy β no global install needed. Without auth, cf:secrets and cf:deploy can't reach Cloudflare.name in wrangler.jsonc must equal the Worker's actual name in your dashboard. If a Git-connected deploy created it under a different name, update wrangler.jsonc to match β otherwise cf:secrets pushes to a nonexistent Worker.wrangler.jsonc ships with the Worker named ascot. If you rename it, two values must change together:
{"name": "your-site-name", // β 1. the Worker name"services": [{"binding": "WORKER_SELF_REFERENCE","service": "your-site-name" // β 2. must be identical to "name"}]}
WORKER_SELF_REFERENCE is how the Worker calls itself, which OpenNext relies on. If the two strings drift apart, the deploy succeeds and the site fails at runtime β a confusing failure worth avoiding.
If you connect the repo in the Cloudflare dashboard instead of deploying from your machine:
npm run cf:buildnpx opennextjs-cloudflare deploy (the same command npm run cf:deploy uses)NEXT_PUBLIC_PRODUCTION_URL and NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY here. Anything prefixed NEXT_PUBLIC_ is inlined into the JavaScript at build time, so it must exist as a build variable β a runtime secret is too late.MAILGUN_*, OPENAI_*, and CLOUDFLARE_TURNSTILE_SECRET_KEY values are read at runtime, so npm run cf:secrets (or the dashboard's secret UI) covers them. They do not belong in build variables.Custom domains live under the Worker's Settings β Domains & Routes.
Workers is not Node.js, and two limits shape how you write code for it:
fs.readFileSync(process.cwd() + '/_data/...') does not throw on Workers β it silently returns empty, so your content vanishes with no error. Always import generated JSON through the @/data/* alias so it is bundled at build time. This is an enforced Canon rule; see CLAUDE.md.nodejs_compat is required. The flag in wrangler.jsonc provides the Node APIs Next.js expects. Removing it breaks the build.| Command | What it does |
|---|---|
npm run cf:setup | Scaffold .env.production from the sample |
npm run cf:build | Regenerate blog data, then build the Worker into .open-next/ |
npm run cf:preview | Build and run the real Workers runtime locally |
npm run cf:deploy | Build and deploy to Cloudflare |
npm run cf:upload | Build and upload a new Worker version without making it live (staged rollouts) |
npm run cf:secrets | Push .env.production to the Worker's secret store |
npm run cf:typegen | Regenerate cloudflare-env.d.ts from your bindings |
Ascot is part of the Gallop template ecosystem. Gallop templates are designed to be built with AI β just describe what you want in plain English and watch your site come to life.
The Gallop AI Editor is a desktop code editor built specifically for AI-powered web development. It combines a full code editor, Claude AI assistant, visual Git interface, integrated terminal, media manager, and template gallery into one app. Everything is preconfigured to work with Gallop templates out of the box β no extensions, no plugins, no setup.
Key highlights:
Cmd+Shift+S to screenshot your running site and share it with AI for visual feedbackEvery Gallop template includes @gallop.software/canon, a system of ESLint rules and AI instructions that keep your AI assistant on track. Canon ensures:
Canon rules cover server-first blocks, layout hierarchy, typography and list components, semantic color tokens, Iconify icons, alias imports, and cross-zone import boundaries. CLAUDE.md in the project root is the canonical AI reference for this template.
Think of Canon as training wheels that never come off. AI stays within proven patterns, so you get reliable results every time.
Canon Commands:
npm run check - Run ESLint and TypeScript checks togethernpm run audit - Audit the codebase for Canon compliancenpm run unused - Detect unused files and exports with KnipThe site ships with a streaming chat widget backed by an API route at src/app/api/assistant/route.ts. Its system prompt is generated from src/config.ts and src/catalog.ts, so the assistant answers questions about your panel profiles, gauges, colors, trim, and service area using your real data β and it stays accurate automatically when you rebrand. Add your API key to .env.local to enable it, or remove the widget entirely if you'd rather not run it.
This template was crafted from the ground up to get your business ranked #1 on Google and recommended by AI assistants like ChatGPT and Google's Gemini. The software architecture, semantic HTML structure, metadata system, and structured data are optimized for both search engine crawlers and AI models that recommend suppliers to buyers.
AI mentions are becoming more important than traditional SEO. When a contractor asks an AI assistant where to buy standing seam panels, you want your company in that answer. Gallop templates ship with LocalBusiness and Product structured data, plus a hand-maintained public/llms.txt summary that gives AI crawlers a clean, factual overview of your company and catalog.
The team behind Gallop has decades of combined experience building websites, apps, and web applications for top global brands. We've helped businesses achieve #1 Google rankings in competitive markets and understand what it takes to build world class manufacturer websites. That expertise is baked into every template, every component, and every line of code.
ascot/βββ src/β βββ app/ # Next.js App Routerβ β βββ (hero)/ # Hero layout route groupβ β β βββ layout.tsxβ β β βββ page.tsx # Home pageβ β β βββ _blocks/ # Home page blocksβ β β β βββ hero.tsxβ β β β βββ trust-bar.tsxβ β β β βββ panels.tsxβ β β β βββ products.tsxβ β β β βββ buildings.tsxβ β β β βββ process.tsxβ β β β βββ testimonials.tsxβ β β β βββ quote-form.tsxβ β β β βββ cta.tsxβ β β βββ panels/ # Panel indexβ β β β βββ page.tsxβ β β β βββ _blocks/β β β β βββ [profile]/ # Per-profile detail pagesβ β β βββ projects/ # Project case studiesβ β β β βββ page.tsx # Project archiveβ β β β βββ <slug>/ # One folder per projectβ β β β β βββ page.tsx # Route + metadata + JSON-LDβ β β β β βββ content.tsx # TITLE, Content, BlogContentβ β β β βββ category/[slug]/ # Category archiveβ β β βββ products/ # Product catalogβ β β βββ trims/ # Trim and accessoriesβ β β βββ buildings/ # Steel building systemsβ β β βββ about/β β β βββ contact/β β βββ (default)/ # Default layout route groupβ β βββ api/ # API routesβ β β βββ assistant/ # Streaming AI sales assistantβ β β βββ submit-form/ # Quote and contact submissionsβ β β βββ flow-trace/β β βββ global-error.tsx # Error boundaryβ β βββ global-not-found.tsx # 404 pageβ β βββ layout.tsx # Root layoutβ β βββ metadata.tsx # Site metadata and JSON-LDβ β βββ robots.ts # Robots.txt configβ β βββ sitemap.ts # Sitemap configβ β βββ *.png, *.ico # App icons and faviconβ βββ components/ # React componentsβ β βββ navbar/ # Navigation + utility bar configβ β βββ footer/ # Footer config and componentsβ β βββ form/ # Form componentsβ β βββ search/ # Search componentsβ β βββ ai-chat/ # AI assistant widgetβ β βββ building-viewer/ # 3D building visualizerβ β βββ panel-viewer/ # 3D panel profile viewerβ β βββ trim-viewer/ # 3D trim profile viewerβ β βββ page-wrapper.tsx # Page wrapper with structured dataβ β βββ color-swatches.tsxβ β βββ panel-profile-card.tsxβ β βββ product-category-card.tsxβ β βββ specification-list.tsxβ β βββ statistics-strip.tsxβ β βββ process-steps.tsxβ β βββ testimonial-card.tsxβ β βββ heading.tsxβ β βββ section.tsxβ β βββ image.tsxβ β βββ ...β βββ fonts/ # Font configuration filesβ βββ hooks/ # Custom React hooksβ βββ styles/ # Global stylesβ β βββ tailwind.css # Tailwind entry + @theme color tokensβ βββ tools/ # Utility toolsβ βββ utils/ # Helper functionsβ βββ config.ts # Company identity (edit this to rebrand)β βββ catalog.ts # Panels, products, colors, buildings, contentβ βββ state.ts # Global state managementβββ public/β βββ favicon.png # Faviconβ βββ logo.png # Logo used for OpenGraph imagesβ βββ images/ # Processed responsive images (managed by Studio)β βββ image-*.jpg # Catalog and block photographyβ βββ llms.txt # Hand-maintained AI crawler summaryβ βββ search-index.json # FlexSearch index (generated)β βββ _headers # Cloudflare header rulesβββ _fonts/ # Font source files (managed by Studio)β βββ barlow/ # 13 families included β barlow,β βββ montserrat/ # montserrat, poppins, raleway,β βββ oswald/ # oswald, rubik, urbanist, and moreβ βββ .../βββ _data/ # Generated metadata β never edit by handβ βββ _blog.json # Blog metadata (npm run blog)β βββ _studio.json # Studio media metadataβββ _scripts/ # Build scripts (Node-only, not imported at runtime)β βββ generate-blog-metadata.mjsβ βββ generate-search.mjsβ βββ generate-search.shβ βββ *.md # Docs for each scriptβββ CLAUDE.md # Canonical AI reference for this templateβββ next.config.mjs # Next.js configurationβββ open-next.config.ts # Cloudflare Workers adapter configβββ wrangler.jsonc # Cloudflare Worker manifestβββ tsconfig.json # TypeScript configβββ postcss.config.js # PostCSS configβββ package.json # Dependencies & scriptsβββ knip.config.js # Unused file detection configβββ eslint.config.mjs # ESLint configβββ .env.local.sample # Local env templateβββ .env.production.sample # Production env templateβββ .prettierrc # Prettier config
npm run dev - Start development server at http://localhost:3000npm run build - Build for production (runs blog metadata first)npm run start - Start production servernpm run lint - Run ESLint on all source filesnpm run lint:file - Run ESLint on a specific filenpm run lint:gallop - Run the Gallop Canon rules on blocks as warningsnpm run lint:next - Run ESLint with the three strictest Canon rules disablednpm run ts - TypeScript type checking without emittingnpm run prettier - Format all files with Prettiernpm run check - Run lint and TypeScript togethernpm run audit - Audit codebase with Gallop Canonnpm run audit:strict - Strict audit modenpm run audit:json - Output audit results as JSONnpm run blog - Generate blog post metadata to _data/_blog.json β docsnpm run search - Build FlexSearch index for site search β docsYour AI assistant runs these for you β see Deploy to Cloudflare Workers.
npm run cf:setup - Create .env.production from the samplenpm run cf:build - Build the Worker into .open-next/npm run cf:preview - Build and run the Workers runtime locallynpm run cf:deploy - Build and deploy to Cloudflarenpm run cf:upload - Build and upload a version without making it livenpm run cf:secrets - Push .env.production to the Worker's secret storenpm run cf:typegen - Regenerate cloudflare-env.d.ts from your bindingsnpm run update:check - Check for package updatesnpm run update:patch - Update to latest patch versionsnpm run update:minor - Update to latest minor versionsnpm run update:major - Update to latest major versionsnpm run update:interactive - Interactively choose updatesnpm run update:doctor - Update and test changes incrementallynpm run unused - Find unused files and exports with Knipnpm run refresh - Remove node_modules and .next, then reinstallnpm run clean - Remove node_modules, .next, and package-lock.json, then reinstallEvery dependency is battle-tested in production and chosen for stability, performance, and long-term maintainability.
16.2 - React framework with App Router19 - UI library4.3 - Utility-first CSS framework2.2.10 - Unstyled accessible components0.180.0 - 3D rendering for the building, panel, and trim viewers9.6.1 + Drei 10.7.7 - React renderer and helpers for Three.js6.44.0 - Streaming AI sales assistant API route2.3.2 - State management12.1.4 - Sliders and testimonial carousels3.32.0 - Image galleries0.8.212 - Full-text site search1.19.8 - Search autocomplete12.39.0 - Animation library3.7.2 - DateTime library10.0.3 - Scroll-based animations and lazy loading0.21.0 - Search result highlighting18.0.5 - Markdown rendering for assistant replies1.5.3 - Cloudflare Turnstile form protection2.1.1 - Conditional className utility1.6.1 - Analytics integration16.2.6 - Third-party script optimization1.20.2 - Adapter for deploying to Cloudflare WorkersTools for building and developing the site:
5 - Type safety and IntelliSense9 - Code linting16.2.6 - Next.js lint rules3.8.3 - Code formatting4.3.0 - Auto-organize imports0.8.0 - Sort Tailwind classes8.5.15 - CSS transformations5.88.1 - Unused file and export detection4.113.0 - Cloudflare CLI, used by the cf:* scripts2.34.0 - ESLint rules and architecture audit CLIBuild-time tools for content and asset generation:
27.4.0 - DOM parsing for search index generation3.0.0 - URL-friendly slugs for search indexingMIT License - see LICENSE for details
Contributors:
Built with β€οΈ by the team at Gallop