Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Ctrl k
Search...
Sign up
Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Once UIDocumentationBlog
© Once UI. All rights reserved.
Built with Aveiro

How to ship a landing page and dashboard with authentication in Next.js

Build a production-ready landing page with sign-up, login, and a dashboard — without stitching together five different libraries.
Updated 19d ago
How to build a documentation site with MDX and Next.js
How to launch a social app with Next.js and Supabase

The gap between landing page and product

Building a landing page is straightforward. Adding authentication is where most solo developers and small teams hit a wall. The landing page itself takes a day. Then you need a sign-up flow. Then a login page. Then session management. Then a dashboard shell. Then protected routes. Then password reset emails. By the time you have stitched together NextAuth, a form library, an email provider, and your own middleware, two weeks have passed and you still do not have a real product behind the login screen. The problem is not any single piece — it is the integration between them. Most boilerplates give you either a pretty frontend or a functional backend, rarely both.

What a launch-ready frontend actually requires

If you are building a SaaS, a waitlist, or any product that needs user accounts, your frontend needs more than a hero section:
  • Landing page — Clear value proposition, social proof, and a call to action. This is the page that converts visitors.
  • Authentication flows — Sign up, login, password reset. They need to work reliably and look polished.
  • Dashboard layout — A protected area with navigation, user context, and space for your actual product.
  • Responsive design — Every screen, including auth forms and the dashboard, needs to work on mobile.
  • Route protection — Unauthenticated users get redirected. Authenticated users skip the login page.
Building each of these from scratch is possible but slow. The real cost is not the code — it is the decisions. Which layout for the dashboard? How should the auth pages look? Where does the navigation go on mobile?

The auth landscape in 2026

There are several approaches to authentication in Next.js:
  • NextAuth (Auth.js) — Flexible, provider-based. Good for social logins but requires configuration for email/password flows.
  • Clerk — Hosted auth with drop-in components. Fast to set up, but you depend on their infrastructure and pricing.
  • Supabase Auth — Built into Supabase's backend. Email, OAuth, and magic links with a generous free tier.
  • Firebase Auth — Google's solution. Mature but can feel heavy if you are not using the rest of Firebase.
  • — Full control, full responsibility. Only recommended if you have specific security requirements.
Custom JWT
The tradeoff is always between control and speed. For most projects in the early stages, a managed solution like Supabase or Clerk gets you to launch faster. You can always migrate later if your needs change.

Starting with a structured frontend

Magic Convert is a Once UI Pro template that includes a complete landing page, authentication screens, and a dashboard layout — all built with Once UI and Next.js.
Magic Convert authentication page
It is not a backend solution. It is the frontend layer that you connect to your auth provider of choice. The template provides:
  • A conversion-optimized landing page with hero, features, pricing, and testimonials
  • Sign-up and login pages with form validation
  • A dashboard shell with sidebar navigation and user context
  • Fully responsive layouts across all screens
The value is in the structure. Every component follows a consistent design system, so the login page feels like it belongs to the same product as the landing page and the dashboard.

Connecting authentication

The template is designed to work with any auth provider. The auth pages handle form state and validation on the frontend — you wire them to your backend.
For a Supabase setup, the integration points are minimal:
If you want a more complete backend integration out of the box, the Supabase Starter template includes the full auth flow with email verification and user profile management pre-configured. You can integrate it with Magic Convert in minutes.

Customizing the landing page

The landing page structure is modular. Each section — hero, features, pricing, testimonials, CTA — is a separate component that you can reorder, remove, or duplicate.
Magic Convert dynamic mega menu navigation
Pricing cards, feature grids, and testimonial layouts are the sections that matter most for conversion. The template provides sensible defaults for each, but you will want to customize the copy and structure to match your product.
The visual identity is controlled through once-ui.config.js, just like all Once UI templates. For landing pages, the brand color and solid style have the biggest impact on how the call-to-action buttons feel.

From landing page to product

The dashboard layout is where your actual product lives. It includes:
  • A collapsible sidebar with navigation groups
  • A top bar with user avatar and actions
  • A content area with proper max-width constraints
  • Mobile-responsive layout with slide-out navigation
This shell is intentionally minimal. It gives you the structure without making assumptions about what your product does. You fill in the content area with your own pages and components.

Deploying and iterating

Push to GitHub and deploy on Vercel. The first version does not need to be feature-complete. Ship the landing page first, collect sign-ups, and build the product behind the auth wall while you have early users waiting.
This approach — shipping the frontend first and iterating on the product — works particularly well when you are validating an idea. A polished landing page with a working sign-up flow signals credibility, even before the core product is fully built.

Key takeaways

The gap between "landing page" and "product with authentication" is mostly a frontend integration problem. You need auth screens that match your brand, a dashboard that feels cohesive, and route protection that works reliably.
Magic Convert solves the frontend side of this equation. Pair it with a backend like Supabase or Clerk, and you have a launch-ready product shell in a day instead of a month.
Supabase Starter promo
If you are looking for a deeper backend integration, check out the Supabase Starter which includes the full auth flow and database setup.
// Sign up handler
const { data, error } = await supabase.auth.signUp({
    email: formData.email,
    password: formData.password,
});

// Login handler
const { data, error } = await supabase.auth.signInWithPassword({
    email: formData.email,
    password: formData.password,
});
git add .
git commit -m "Landing page with auth"
git push origin main