{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreigkswgoky2b23sttaaizaxv7zw56m3jf7dy4egqqob7qnfrvs4hoi",
    "uri": "at://did:plc:25rdn5elo5izoxrmtis34zuk/app.bsky.feed.post/3mousm6s6i222"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreiaqt7j5vxhjb3dn5s4kwoqqsv4dat5vtvgdtdjr6mee6ton22rqva"
    },
    "mimeType": "image/webp",
    "size": 85548
  },
  "path": "/cekuu35/what-production-ready-actually-means-for-a-nextjs-template-a-single-source-of-truth-963",
  "publishedAt": "2026-06-22T11:35:53.000Z",
  "site": "https://dev.to",
  "tags": [
    "nextjs",
    "tailwindcss",
    "webdev",
    "showdev",
    "https://01-modern-saas.vercel.app",
    "https://12-photography-portfolio.vercel.app",
    "cenkkurtoglu.com"
  ],
  "textContent": "I bought a \"production-ready\" template once. It was a single page. Beautiful hero, three feature cards, a footer with `href=\"#\"` links, and a contact form whose submit button did absolutely nothing. That's not a product — it's a screenshot with extra steps.\n\nSo when I built a set of 20 Next.js + Tailwind templates, I wrote down what \"production-ready\" has to mean _before_ writing a line of UI. Here's the architecture, and the five rules that separate a real template from a glorified landing page.\n\n###  Rule 1 — It's a site, not a page (≥5 real routes)\n\nA real business site has a home, an about, a services/features page, a pricing or menu page, and a contact page — minimum. Every template ships as an actual multi-page App Router app:\n\n\n\n    src/app/\n      layout.tsx        # shared nav + footer, wraps every route\n      page.tsx          # home\n      about/page.tsx\n      services/page.tsx\n      pricing/page.tsx\n      contact/page.tsx\n\n\nIf a \"template\" is one `page.tsx`, you're buying a hero section, not a website.\n\n###  Rule 2 — One source of truth for content (this is the whole game)\n\nThe difference between \"a template\" and \"_your_ template\" should be **one file**. Every site reads its text, links, nav, and brand from a single typed config. The buyer edits that file and the whole site — nav, footer, SEO tags, OG image — updates.\n\n\n\n    // src/lib/data.ts — edit this, and the site is yours\n    export const site = {\n      name: \"Nexus\",\n      tagline: \"Ship faster with the all-in-one platform\",\n      nav: [\n        { label: \"Features\", href: \"/features\" },\n        { label: \"Pricing\",  href: \"/pricing\" },\n        { label: \"Contact\",  href: \"/contact\" },\n      ],\n      contactEmail: \"hello@example.com\",\n    } as const;\n\n\nNo find-and-replace across 30 files. No hardcoded \"Acme Inc\" hiding in a footer you'll find in production. One typed object, white-label by design.\n\n###  Rule 3 — No dead buttons. Forms actually submit.\n\nThe fastest way to spot a fake template is to click the contact button. In a real one, the form validates on the client _and_ posts to a working API route:\n\n\n\n    // src/app/api/contact/route.ts — a real endpoint, honestly labeled\n    export async function POST(req: Request) {\n      const { email, message } = await req.json();\n      if (!email || !message) {\n        return Response.json({ error: \"Missing fields\" }, { status: 400 });\n      }\n      // Demo handler — wire this to Resend / your inbox in one place.\n      return Response.json({ ok: true });\n    }\n\n\nDemo behavior is fine. **Dishonest** demo behavior — a button that pretends to work — is not.\n\n###  Rule 4 — SEO and metadata come from the same config\n\nBecause content lives in one object, the SEO layer writes itself. Title templates, canonical URLs, and OG tags all read from `site`, so the buyer never edits meta tags by hand.\n\n###  Rule 5 — It compiles clean, or it doesn't ship\n\nEvery template passes `tsc --noEmit` with zero errors and `next build` with zero errors before it's considered done. A template that throws type errors on `npm install` isn't a starting point — it's homework.\n\n###  Why the architecture matters more than the pixels\n\nAnyone can design a nice hero. The value of a template is **how fast someone else can make it theirs** — and that's an architecture decision, not a visual one. Single source of truth, real routes, working forms, generated SEO, clean build. Get those right and the template is worth paying for; skip them and you've sold a screenshot.\n\nI applied these five rules to 20 templates across different niches (SaaS, agency, restaurant, real estate, e-commerce, and more). Live demos:\n\n  * **SaaS** → https://01-modern-saas.vercel.app\n  * **Photography portfolio** → https://12-photography-portfolio.vercel.app\n\n\n\nIf you want the whole set as a starting point instead of building the boilerplate yourself, they're bundled here: **→ cenkkurtoglu.com** (use code `LAUNCH20` for the early-buyer discount).\n\nBut the five rules are the real takeaway — apply them to your own templates and you'll never ship a dead button again.",
  "title": "What 'production-ready' actually means for a Next.js template — a single-source-of-truth architecture"
}