DEV Community

Dev Maya
Dev Maya

Posted on

Building a mobile app landing page template with Next.js 14 — design decisions and lessons learned

Building a mobile app landing page template with Next.js 14

Most mobile app landing pages I see fall into two categories: generic Bootstrap sites or over-engineered Webflow builds. Neither feels right for an indie developer launching something they care about.

So I built a template that sits in the middle — handcrafted, warm, and fast to customize.

Design direction

I deliberately went the opposite direction from my previous SaaS template (dark mode, purple gradients). This one is:

  • Light mode with warm cream tones (#faf7f2)
  • Serif typography — Playfair Display for headings, Epilogue for body
  • Orange accent (#f97316) instead of the typical blue or purple
  • Editorial feel — closer to a premium lifestyle brand than a typical dev tool

The goal was to make it feel like something a well-funded startup would ship, not a side project from a weekend.

The animated phone mockup

The hero needed something visual. For a mobile app template, the obvious choice is a phone mockup.

Instead of using a static PNG, I built the entire phone in pure HTML/CSS:

.phone {
  width: 280px;
  height: 560px;
  background: var(--ink);
  border-radius: 42px;
  border: 6px solid #2a2010;
  box-shadow: 0 40px 80px rgba(26,18,8,0.25);
}
Enter fullscreen mode Exit fullscreen mode

The floating badges ("47 day streak", "5/6 done") are absolutely positioned divs with a staggered fadeUp animation. The entire phone floats up and down with a CSS keyframe:

@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50%       { transform: translateY(-10px); }
}
Enter fullscreen mode Exit fullscreen mode

No JavaScript, no library. Just CSS.

Single config file pattern

Same approach as my previous template — everything the buyer needs to change lives in src/lib/config.ts:

export const siteConfig = {
  name: 'YourApp',
  appStore: { label: 'App Store', href: '#', icon: '🍎' },
  playStore: { label: 'Google Play', href: '#', icon: '' },
  stats: [
    { value: '2.4M', label: 'Active users' },
    // ...
  ],
  features: [...],
  pricing: [...],
}
Enter fullscreen mode Exit fullscreen mode

Brand name, store links, stats, features, pricing — all in one place.

Sections included

  • Sticky navbar with scroll blur
  • Hero with floating animated phone mockup + badges
  • Features grid (dark background section)
  • Screenshots (3 phone screens with staggered offset)
  • Pricing table (Free + Pro)
  • Testimonials
  • CTA banner
  • Footer

CSS Modules over Tailwind — again

For templates I keep choosing CSS Modules. The buyer doesn't need to configure anything. Styles are scoped and explicit. And honestly, it forces cleaner component boundaries.

The result

npm install && npm run dev — that's all the buyer needs.

→ Live demo: https://bloom-app-template.vercel.app/
→ Available on Gumroad: devmaya.gumroad.com/l/qvqbcb

Happy to answer questions about any implementation detail in the comments.

Top comments (0)