Agency Studio
Quick Start
Requirements: Node.js 18+. The template uses npm (not pnpm) since it lives outside any workspace. No external services or environment variables required.
Download and unzip
Install dependencies
npm install
Start the dev server
npm run devOpen
http://localhost:3000 to see the homepage. All pages are available:localhost:3000/work— portfolio with filter tabslocalhost:3000/about— team and valueslocalhost:3000/services— services, process, FAQlocalhost:3000/contact— contact form
Build for production
npm run build npm startAll 6 pages are pre-rendered at build time — no environment variables or external services required.
Folder Structure
Next.js App Router with static generation. All pages share the same Navbar and Footer. Content lives in component files and a central data file:
src/
├── app/
│ ├── layout.tsx # Root layout - Fraunces + Plus Jakarta Sans, dark mode script
│ ├── globals.css # Design tokens (@theme) + semantic CSS classes
│ ├── page.tsx # Homepage - composes all section components
│ ├── work/
│ │ └── page.tsx # Filterable portfolio grid (client component)
│ ├── about/
│ │ └── page.tsx # Team grid + values + stats
│ ├── services/
│ │ └── page.tsx # 4 service sections + process + FAQ
│ ├── contact/
│ │ └── page.tsx # Contact form + info
│ └── not-found.tsx # 404 page
├── components/
│ ├── Navbar.tsx # Sticky nav with scroll-aware border + theme toggle
│ ├── Footer.tsx # Footer with links and newsletter
│ ├── Hero.tsx # Full-height hero with ghost watermark + project strip
│ ├── Work.tsx # Featured projects grid (homepage)
│ ├── Services.tsx # Service rows with hover (homepage)
│ ├── Process.tsx # 4-step process grid
│ ├── About.tsx # Stats section (homepage)
│ ├── Testimonials.tsx # 6-card testimonials grid
│ ├── Marquee.tsx # Horizontal scrolling text strip
│ ├── CTA.tsx # Call-to-action section
│ └── ThemeProvider.tsx # Dark/light mode context + toggle
└── lib/
└── projects-data.ts # All 8 projects - slug, images, categories, metadata
public/
├── projects/ # Project portfolio images (.avif)
│ ├── arcane-rebrand.avif
│ ├── meridian-web.avif
│ ├── volt-brand.avif
│ ├── canvas-dashboard.avif
│ ├── haus-identity.avif
│ ├── haus-interior.avif
│ ├── nexus-motion.avif
│ ├── silo-platform.avif
│ └── flora-ecommerce.avif
└── team/ # Team portrait photos (.avif)
├── alex-rivera.avif
├── noa-kim.avif
├── theo.avif
└── mia-chen.avifThe work/page.tsx is the only client component - it needs "use client" for the filter tab state. All other pages are server components.
Customization
Agency name and branding
The template uses "Forma Studio" as the agency name. Do a global find-and-replace for Forma and Forma Studio across all files in src/. The logo is the letter F in a red rounded square - update it in Navbar.tsx and Footer.tsx.
Portfolio projects
All project data is defined in src/lib/projects-data.ts as a typed array. Each project has: slug, title, client, category, year, description, longDescription, tags, featured, image (optional), gradient, accentColor, services, and outcome.
The imagefield is optional - if omitted the card shows an animated CSS gradient using the project's gradient and accentColor values instead. Set featured: true on up to 4 projects to show them in the homepage hero strip and the Work section.
Replacing project images
Drop your own images into public/projects/ and update the image path in projects-data.ts. Any format works (.avif, .webp, .jpg, .png). Images are referenced as plain <img> tags so no next.config.ts changes are needed.
Team members
Team data is defined in the team array at the top of src/app/about/page.tsx. Each member has name, role, bio, initials, color (accent), and image (optional path in public/team/). If no image is provided, the card shows a colored square with initials.
Colors and theme tokens
All colors are CSS custom properties in src/app/globals.css, set directly in the @theme block (Tailwind v4 style). Override for dark mode in the .dark selector:
/* Light mode — edit in @theme block */
--color-background: #F7F4EE; /* warm cream page background */
--color-foreground: #0D0B09; /* near-black text */
--color-primary: #C83B2A; /* terracotta red — change to your brand */
--color-muted: #EEEAE0; /* slightly darker cream for muted sections */
/* Dark mode — edit in .dark selector */
.dark {
--color-background: #0D0B09;
--color-foreground: #F7F4EE;
--color-primary: #E04830;
--color-muted: #1E1A15;
}Fonts
Two fonts are loaded in app/layout.tsx via next/font/google:
Fraunces- display/headings (--font-display, variable serif with optical sizing)Plus Jakarta Sans- body text (--font-body, geometric sans)
Fraunces is loaded as a variable font with weight: "variable" and both normal and italic styles - this is required for the optical axes to work.
Services and pricing
Service details, deliverables, timelines, and pricing are defined in the services array at the top of src/app/services/page.tsx. FAQ entries are in the faqs array in the same file. The process steps are in src/components/Process.tsx.
Testimonials
Testimonial data is defined in the testimonials array at the top of src/components/Testimonials.tsx. Each entry has quote, name, title, initials, and color (accent).
Deployment
Deploy to Vercel (recommended)
Push to GitHub, then import at vercel.com/new. All 6 pages are pre-rendered at build time - no environment variables required.
Static export (Netlify, Cloudflare Pages, GitHub Pages)
Since the template has no server-side logic or API routes, it supports full static export. Add the following to next.config.ts:
const nextConfig: NextConfig = {
output: "export",
};Run npm run build and deploy the out/ folder to any static host.
Deploy to Railway / Render
Build command: npm run build Start command: npm start Node version: 18+
Adding a contact form backend
The contact form in src/app/contact/page.tsx is a static HTML form. To wire it up, create a src/app/api/contact/route.ts Next.js route handler and point the form action there. Popular options for sending email: Resend, SendGrid, or Formspree (no backend needed).
Environment variables
No environment variables are required out of the box. When you add a contact form backend or CMS, create a .env.localfile locally and add the same keys in your hosting provider's environment settings.
Still stuck?
Email us at support@thekitbase.app with your order number and we'll help you get set up.