Content Editing
All marketing copy, brand identity, pricing tables, and in-product docs in SaaSForge Core live in plain TypeScript or Markdown files. No CMS to install: edit, save, redeploy.
This guide is the map: every config file, what page/section it controls, and how to edit it safely.
The 3 layers of editable content
| Layer | Where | Changes touch... |
|---|---|---|
| Brand/identity | src/config/brand.ts, src/config/app.ts, src/config/seo.ts | Product name, emails, OG metadata |
| Marketing copy | src/config/ui/*.ts (27 files) | Section text, pricing, FAQ entries, footer links |
| Long-form content | content/docs/*.mdx, content/blog/*.mdx, src/app/(marketing)/(legal)/* | Documentation, blog posts, terms/privacy |
Edit any file, save, the dev server hot-reloads. For more, see Customization.
Brand & identity
src/config/brand.ts
Product name, company name, support/legal/privacy emails, social links, footer copyright.
src/config/app.ts
App-level metadata: title, description, default locale, build version.
src/config/seo.ts
Default SEO title, description, OG image. Per-page overrides live in each page's generateMetadata().
src/config/pricing.ts
The single source of truth for plan tiers, price points, feature lists. Stripe Price IDs come from env vars (NEXT_PUBLIC_STRIPE_*_PRICE_ID).
src/config/routes.ts
Route constants used across the app. Edit if you rename URL paths.
src/config/docs.ts
The list of in-product docs (slug, title, description, category). Add a new entry here whenever you add a .mdx file under content/docs/ so it shows up in the docs sidebar.
Marketing copy (src/config/ui/)
Each marketing section reads from a matching config file. Edit the file, the section updates.
| Config file | Renders in |
|---|---|
branding.ts | Logo paths (light, dark, mobile) and theme defaults |
header.ts | Top-nav links, login button copy |
footer.ts, footer2.ts | Footer link groups, social, copyright (two layouts available) |
hero.ts, hero2.ts | Landing page hero (two variants) |
features.ts | Features grid (title, subtitle, items, footer note) |
pricing2.ts | Pricing table (tiers, prices, feature lists) |
faq.ts, faq2.ts | FAQ sections (two layouts) |
testimonials.ts | Testimonials carousel/grid |
cta.ts | Call-to-action band |
integrations.ts, integrations2.ts | Integrations grid |
process.ts | "How it works" steps |
services.ts, comprehensive-services.ts | Service offering cards |
readiness.ts | Production-readiness checklist section |
stats.ts | Numeric stats strip |
chat-demo.ts | Demo chat thread on landing page |
highlight-product.ts | Featured product callout |
most-popular-products.ts, product-list.ts | Product showcase |
blog.ts | Blog listing metadata |
login.ts | Sign-in page copy |
help-center.ts | Help center landing |
index.ts | Re-exports: leave alone unless adding a new section |
types.ts | TypeScript types: leave alone |
Editing example: change pricing tiers
// src/config/ui/pricing2.ts
export const pricing2Config: Pricing2Config = {
badge: "Pricing",
title: "Choose the right plan",
subtitle: "Start free, upgrade when you need more.",
plans: [
{
name: "Pro",
price: { monthly: 29, yearly: 290 },
features: [
{ label: "Unlimited workspaces", included: true },
{ label: "Priority support", included: true },
],
cta: { label: "Start Pro", href: "/sign-up?plan=pro" },
},
// ...
],
};
Save. The pricing page (and any other place that reads pricing2Config) updates immediately.
Editing example: add an FAQ entry
// src/config/ui/faq.ts
export const faqConfig: FAQConfig = {
badge: "FAQ",
title: "Frequently asked questions",
items: [
{ question: "How do I export my data?", answer: "Settings → Data → Export." },
// add new entries here
],
};
Long-form content
In-product documentation (content/docs/)
This page is one of them. Each .mdx file is rendered inside the /docs/[slug] route. To add a new doc:
- Create
content/docs/my-new-page.mdxwith a top-level# Titleheading. - Add an entry to
DOCS_CONFIGinsrc/config/docs.ts:{ slug: "my-new-page", title: "My New Page", description: "Short description for the sidebar.", category: "core", // "getting-started" | "core" | "integrations" | "deployment" } - Save. The page is live at
/docs/my-new-page.
Blog posts (content/blog/)
Each post is an .mdx file with frontmatter. The blog listing reads from this directory automatically.
Legal pages (src/app/(marketing)/(legal)/)
Terms of Service, Privacy Policy, and DPA live as React components, not MDX (so they can interpolate brand values from src/config/brand.ts). Edit the JSX directly. Run a legal review before going live.
Email templates (src/lib/email/templates/)
Workspace invites, password resets, and notifications are React Email components. Edit the template, the rendered HTML is sent via Resend.
Where to find a piece of copy
If you spot a string in the UI you want to change and don't know where it lives:
- Quote-search the project for the exact string (
"Choose the right plan"). - Hits in
src/config/ui/*.ts→ edit the config file. - Hits in
src/components/→ edit the component (rare; usually wrap it in a config). - Hits in
src/app/(marketing)/(legal)/→ edit the legal page JSX. - Hits in
src/lib/email/templates/→ edit the email template.
After editing
- Local dev: changes hot-reload.
- Production: redeploy (Vercel auto-deploys on push to
main). - For per-page metadata (titles, OG images), each page exports
generateMetadata(): edit that for SEO control beyond defaults insrc/config/seo.ts.