Landing Page Setup
A progressive guide to launching and customizing your NEXTDEVKIT landing page, from minimal setup to full configuration.
This guide walks you through launching NEXTDEVKIT with minimal configuration and progressively customizing your landing page. You'll see changes in real-time as you configure each component.
Quick Start: Launch in 5 Minutes
Let's get your NEXTDEVKIT running with the absolute minimum configuration needed.
Step 1: Minimal Environment Variables
Create a .env.local
file in your project root with these essential variables:
# Database (Required)
DATABASE_URL="postgresql://user:password@localhost:5432/nextdevkit"
# Better Auth (Required)
BETTER_AUTH_SECRET="your-random-secret-key-min-32-chars"
BETTER_AUTH_URL="http://localhost:3000"
# Public URL (Required)
NEXT_PUBLIC_APP_URL="http://localhost:3000"
Generate a secure secret key:
openssl rand -base64 32
Step 2: Start Development Server
# Install dependencies
pnpm install
# Start development server
pnpm dev
Your app should now be running at http://localhost:3000
🎉
You'll see a basic landing page with default content. Now let's customize it step by step!
Progressive Configuration Journey
Let's customize your landing page following the same progressive approach as the project architecture. Each step builds on the previous one, and you can see changes immediately.
Level 1: Brand Identity
Goal: Replace default branding with your own.
What You'll Configure:
- Application name and metadata
- Logo images
- Color theme
Files to Edit:
Update Basic Metadata
Edit src/config/index.ts
:
export const appConfig = {
metadata: {
name: "Your App Name", // Change this
description: "Your app description", // Change this
url: "https://yourapp.com", // Change this
images: {
logoLight: "/logo-light.svg", // Upload your light theme logo
logoDark: "/logo-dark.svg", // Upload your dark theme logo
ogImage: "/og-image.png", // Social sharing image
},
},
// ... rest of config
}
See the change: Refresh the page - your app name now appears in the header!
Customize Color Theme
NEXTDEVKIT is fully compatible with Tailwind CSS themes. Use TweakCN to quickly customize:
- Visit TweakCN Theme Editor
- Select and adjust your favorite color scheme
- Copy the generated code
- Paste into
src/app/globals.css
, replacing:root
,.dark
, and@theme inline
blocks
Or use the shadcn command:
pnpm dlx shadcn@latest add https://tweakcn.com/r/themes/claude.json
See the change: Your entire site now uses your custom color scheme!
Configure Dark Mode
Choose whether to enable theme switching:
ui: {
theme: {
enabled: true, // Enable theme toggle
defaultMode: "system", // "system" | "light" | "dark"
},
}
See the change: Theme toggle appears in the header. Try switching between light and dark modes!
Level 2: Hero Section
Goal: Customize your landing page hero section.
What You'll Configure:
- Hero headline and description
- Call-to-action buttons
- Badge/announcement text
Edit Hero Content
Update translations in messages/en.json
:
{
"hero": {
"badge": "New Feature",
"badgeText": "Introducing AI Model Support",
"heading": "Build Your SaaS Product Faster",
"subHeading": "Production-ready Next.js template with authentication, payments, and more",
"buttons": {
"getStarted": "Get Started",
"seeDemo": "See Demo"
}
}
}
For Chinese version, edit messages/zh.json
:
{
"hero": {
"badge": "新功能",
"badgeText": "介绍全新的 AI 模型支持",
"heading": "快速构建您的 SaaS 产品",
"subHeading": "生产就绪的 Next.js 模板,包含认证、支付等功能",
"buttons": {
"getStarted": "开始使用",
"seeDemo": "查看演示"
}
}
}
See the change: Hero section now shows your custom headline and description!
Configure Button Links
Edit src/config/marketing/hero-section.ts
:
export function getHeroSectionConfig() {
return {
links: {
badge: "/blog", // Badge click destination
getStarted: "/#pricing", // Primary CTA
seeDemo: "/app/dashboard", // Secondary CTA
},
};
}
See the change: Click your hero buttons - they now navigate to your specified pages!
Level 3: Feature Showcase
Goal: Highlight your product's key features.
What You'll Configure:
- Feature tabs or steps
- Feature descriptions
- Feature images
NEXTDEVKIT provides two built-in feature display types:
Configure Feature Tabs
Best for showcasing different feature characteristics with interactive tabs.
Update messages/en.json
:
{
"featureSection": {
"tabs": {
"heading": "Powerful Feature Collection",
"description": "Build perfect solutions",
"items": {
"tab-1": {
"label": "Custom Themes",
"content": {
"badge": "Beautiful & Modern",
"title": "Easily Customize Themes",
"description": "Beautiful and modern styling with just a few lines of code to change colors, fonts, and layouts",
"buttonText": "View Themes"
}
},
"tab-2": {
"label": "Authentication",
"content": {
"badge": "Secure & Flexible",
"title": "Complete Auth System",
"description": "Built-in authentication with social login, magic links, and email verification",
"buttonText": "Learn More"
}
}
}
}
}
}
Configure icons and links in src/config/marketing/feature-tabs.ts
:
import { Zap, Shield } from "lucide-react";
const featureTabs: FeatureTabItem[] = [
{
value: "tab-1",
label: t("items.tab-1.label"),
icon: Zap, // Lucide icon
content: {
// ... other content
imageSrc: "/marketing/feature-themes.png",
link: "/docs/themes",
},
},
{
value: "tab-2",
label: t("items.tab-2.label"),
icon: Shield,
content: {
imageSrc: "/marketing/feature-auth.png",
link: "/docs/authentication",
},
},
];
See the change: Scroll to the features section - your custom tabs appear with interactive switching!
Configure Feature Steps
Best for showcasing usage flow and getting started guides.
Update messages/en.json
:
{
"featureSection": {
"steps": {
"title": "Quick Start",
"items": {
"step-1": {
"step": "Step 1",
"title": "Clone Template",
"content": "Clone the Next.js starter template from GitHub"
},
"step-2": {
"step": "Step 2",
"title": "Configure Project",
"content": "Set up environment variables and customize the template"
},
"step-3": {
"step": "Step 3",
"title": "Deploy",
"content": "Deploy to Vercel, Cloudflare, or AWS in one click"
}
}
}
}
}
See the change: Your step-by-step guide now shows users how to get started!
Level 4: Social Proof
Goal: Build trust with testimonials and FAQ.
What You'll Configure:
- Customer testimonials
- Frequently asked questions
- Support information
Add Customer Testimonials
Edit messages/en.json
:
{
"testimonials": {
"title": "Trusted by Users Worldwide",
"description": "Join thousands of satisfied users",
"items": {
"testimonial-1": {
"author": {
"name": "John Smith",
"handle": "@johnsmith",
"avatar": "https://example.com/avatar1.jpg"
},
"text": "This platform has completely transformed how we handle data. The speed and accuracy are impressive.",
"href": "https://twitter.com/johnsmith"
},
"testimonial-2": {
"author": {
"name": "Sarah Chen",
"handle": "@sarahchen",
"avatar": "https://example.com/avatar2.jpg"
},
"text": "Best development experience I've had. Everything just works out of the box.",
"href": "https://twitter.com/sarahchen"
}
}
}
}
See the change: Testimonials section now displays your customer reviews!
Configure FAQ Section
Edit messages/en.json
:
{
"faq": {
"heading": "Frequently Asked Questions",
"description": "Everything you need to know about our product",
"items": {
"faq-1": {
"id": "faq-1",
"question": "Do you offer a free trial?",
"answer": "Yes, we offer a 14-day free trial. You can cancel anytime during the trial period without being charged."
},
"faq-2": {
"id": "faq-2",
"question": "How do I cancel my subscription?",
"answer": "You can cancel your subscription anytime in your account settings."
},
"faq-3": {
"id": "faq-3",
"question": "What payment methods do you accept?",
"answer": "We accept all major credit cards and PayPal payments."
}
},
"supportHeading": "Still have questions?",
"supportDescription": "Can't find the answer you're looking for? Our support team is here to help.",
"supportButtonText": "Contact Support"
}
}
See the change: FAQ section now answers your customers' common questions!
Level 5: Pricing Configuration
Goal: Display your pricing plans and enable payments.
What You'll Need:
- Payment provider setup (Stripe or Creem)
- Pricing plan configuration
- Plan descriptions
Set Up Payment Provider
Add payment credentials to .env.local
:
# For Stripe
STRIPE_SECRET_KEY="sk_test_your_key"
STRIPE_WEBHOOK_SECRET="whsec_your_secret"
# Price IDs
NEXT_PUBLIC_PRICE_ID_PRO_MONTHLY="price_xxx"
NEXT_PUBLIC_PRICE_ID_PRO_YEARLY="price_xxx"
NEXT_PUBLIC_PRICE_ID_LIFETIME="price_xxx"
Configure Payment Plans
Edit src/config/index.ts
:
payment: {
provider: "stripe", // or "creem"
currency: "USD",
yearlyDiscount: 20, // 20% discount for yearly plans
redirectAfterCheckout: "/app/dashboard",
plans: {
free: {
id: "free",
isFree: true,
},
pro: {
id: "pro",
prices: [
{
type: PaymentType.SUBSCRIPTION,
priceId: process.env.NEXT_PUBLIC_PRICE_ID_PRO_MONTHLY as string,
amount: 9.9,
interval: PlanInterval.MONTH,
trialPeriodDays: 7,
},
{
type: PaymentType.SUBSCRIPTION,
priceId: process.env.NEXT_PUBLIC_PRICE_ID_PRO_YEARLY as string,
amount: 99,
interval: PlanInterval.YEAR,
trialPeriodDays: 30,
},
],
popular: true,
},
lifetime: {
id: "lifetime",
prices: [
{
type: PaymentType.ONE_TIME,
priceId: process.env.NEXT_PUBLIC_PRICE_ID_LIFETIME as string,
amount: 399,
},
],
isLifetime: true,
},
},
}
Add Plan Descriptions
Configure plan information in messages/en.json
:
{
"pricing": {
"title": "Simple, Transparent Pricing",
"subtitle": "Choose the plan that's right for you",
"frequencies": {
"monthly": "Monthly",
"yearly": "Yearly"
},
"products": {
"free": {
"title": "Free",
"description": "Perfect for trying out",
"features": {
"feature1": "Basic features",
"feature2": "Up to 10 projects",
"feature3": "Community support"
}
},
"pro": {
"title": "Pro",
"description": "Best for professionals",
"features": {
"feature1": "All Free features",
"feature2": "Unlimited projects",
"feature3": "Priority support",
"feature4": "Advanced analytics"
}
},
"lifetime": {
"title": "Lifetime",
"description": "Pay once, use forever",
"features": {
"feature1": "All Pro features",
"feature2": "Lifetime updates",
"feature3": "No recurring fees"
}
}
}
}
}
See the change: Visit /pricing
to see your beautiful pricing table!
Level 6: Navigation & Footer
Goal: Complete your site structure with navigation and footer.
Configure Navigation Menu
Edit messages/en.json
:
{
"navigation": {
"products": {
"label": "Products"
},
"blog": {
"label": "Blog"
},
"docs": {
"label": "Documentation"
},
"pricing": {
"label": "Pricing"
}
}
}
Customize navigation structure in src/config/navigation.ts
:
export function getNavItems(): NavItem[] {
const t = useTranslations("navigation");
return [
{
id: 1,
label: t("blog.label"),
link: "/blog",
},
{
id: 2,
label: t("docs.label"),
link: "/docs",
},
{
id: 3,
label: t("pricing.label"),
link: "/pricing",
},
];
}
See the change: Your custom navigation menu appears in the header!
Configure Footer
Edit src/config/footer.ts
:
export function getFooterData(): FooterData {
const t = useTranslations("footer");
return {
newsletter: {
title: t("newsletter.title"),
description: t("newsletter.description"),
inputPlaceholder: t("newsletter.inputPlaceholder"),
submitAriaLabel: t("newsletter.submitAriaLabel"),
},
quickLinks: {
title: t("quickLinks.title"),
links: [
{ label: t("quickLinks.home"), href: "/#hero" },
{ label: t("quickLinks.features"), href: "/#feature-tabs" },
{ label: t("quickLinks.pricing"), href: "/pricing" },
],
},
resources: {
title: t("resources.title"),
links: [
{ label: t("resources.docs"), href: "/docs" },
{ label: t("resources.blog"), href: "/blog" },
{ label: t("resources.contact"), href: "/contact" },
],
},
};
}
Add footer translations in messages/en.json
:
{
"footer": {
"newsletter": {
"title": "Subscribe to our newsletter",
"description": "Get the latest updates and exclusive offers",
"inputPlaceholder": "Enter your email",
"submitAriaLabel": "Subscribe"
},
"quickLinks": {
"title": "Quick Links",
"home": "Home",
"features": "Features",
"pricing": "Pricing"
},
"resources": {
"title": "Resources",
"docs": "Documentation",
"blog": "Blog",
"contact": "Contact"
},
"copyright": "© 2025 Your Company. All rights reserved."
}
}
See the change: Scroll to the bottom - your complete footer with newsletter signup!
Add Social Media Links
Configure in src/config/social-media.tsx
:
import { SocialMediaIcons as Icons } from "@/components/icons/social-media";
import GitHub from "@/components/icons/social-media/github";
export function getSocialMediaData() {
const t = useTranslations("footer");
return {
title: t("social.title"),
media: [
{
name: "GitHub",
href: "https://github.com/yourusername",
icon: <GitHub className="h-4 w-4" />,
},
{
name: "X",
href: "https://x.com/yourusername",
icon: <Icons.X className="h-4 w-4" />,
},
{
name: "LinkedIn",
href: "https://linkedin.com/company/yourcompany",
icon: <Icons.LinkedIn className="h-4 w-4" />,
},
],
};
}
See the change: Social media icons appear in your footer!
Configuration Checklist
Use this checklist to ensure your landing page is fully configured:
Essential Configuration
- ✅ Environment variables set up
- ✅ App name and metadata updated
- ✅ Logos uploaded (light & dark)
- ✅ Color theme customized
- ✅ Hero section content updated
Content Configuration
- ✅ Feature tabs/steps configured
- ✅ Testimonials added
- ✅ FAQ section updated
- ✅ Navigation menu customized
- ✅ Footer configured
Optional Configuration
- Payment provider set up
- Pricing plans configured
- Social media links added
- Contact form configured
- Blog posts created
- Documentation written
Configuration File Reference
Quick reference for all configuration files:
Configuration | File Path | Purpose |
---|---|---|
Main Config | src/config/index.ts | Core app settings, metadata, payment, email |
Translations | messages/en.json | English content for all components |
Chinese Translations | messages/zh.json | Chinese content for all components |
Navigation | src/config/navigation.ts | Main navigation menu structure |
Footer | src/config/footer.ts | Footer links and newsletter |
Social Media | src/config/social-media.tsx | Social media links |
Hero Section | src/config/marketing/hero-section.ts | Hero button links |
Feature Tabs | src/config/marketing/feature-tabs.ts | Feature tabs configuration |
Pricing | src/config/marketing/pricing.ts | Pricing table details |
Next Steps
Now that your landing page is configured:
- Test thoroughly - Check all pages and interactions
- Add content - Write blog posts and documentation
- Set up database - Configure your database for production
- Configure authentication - Set up OAuth providers
- Deploy - Launch to Vercel, Cloudflare, or AWS
Common Configuration Patterns
Changing URLs Throughout the Site
If you need to change URLs site-wide:
- Update navigation links in
src/config/navigation.ts
- Update footer links in
src/config/footer.ts
- Update hero button links in
src/config/marketing/hero-section.ts
- Update feature links in
src/config/marketing/feature-tabs.ts
Adding a New Language
- Create
messages/[locale].json
(e.g.,messages/fr.json
) - Copy content from
messages/en.json
and translate - Add locale to
src/config/index.ts
:
i18n: {
locales: ["en", "zh", "fr"], // Add your locale
defaultLocale: "en",
}
- Test with
http://localhost:3000/fr
Customizing for Different Brands
For white-labeling or multi-brand:
- Create brand-specific config files
- Use environment variables for brand selection
- Load appropriate config based on domain or environment
Troubleshooting
Changes Not Appearing?
- Hard refresh - Press
Cmd+Shift+R
(Mac) orCtrl+Shift+R
(Windows) - Clear Next.js cache - Delete
.next
folder and restart dev server - Check file path - Ensure you're editing the correct file
- Check syntax - Validate JSON/TypeScript syntax
Translations Not Working?
- Check locale - Verify correct locale in URL (
/en
or/zh
) - Check translation key - Ensure key exists in
messages/[locale].json
- Restart server - Translation changes may require restart
Styles Not Applying?
- Check Tailwind classes - Ensure classes are valid
- Check theme variables - Verify CSS variables in
globals.css
- Clear cache - Delete
.next
folder
Congratulations! 🎉 You've successfully configured your NEXTDEVKIT landing page. Your site is now ready to attract and convert customers!