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 launch a social app with Next.js and Supabase

Ship a full-stack social platform with posts, comments, feeds, notifications, and user profiles — without building everything from scratch.
Updated 19d ago
How to ship a landing page and dashboard with authentication in Next.js

Why building a social app is harder than it looks

The idea seems simple: users create profiles, post content, follow each other, and interact through comments and likes. But the moment you start building, the scope explodes. You need a feed algorithm. Rate limiting to prevent abuse. Notification delivery. Multiple post formats. Comment threading. Follow relationships. Profile pages. Image handling. And every one of these features needs to work together without race conditions, performance issues, or security holes. Most developers who attempt a social app from scratch either abandon it halfway through or ship something so fragile that it breaks under any real usage. The problem is not skill — it is the sheer number of interconnected systems that need to work simultaneously.

What a social platform actually requires

Before writing any code, it helps to map out the systems you are committing to:
  • Authentication — Email sign-up, login, session management. The foundation everything else depends on.
  • User profiles — Avatars, bios, follow counts. The public identity layer.
  • Post creation — Multiple formats (text, images, links). Content moderation considerations.
  • Feed generation — Showing relevant content from followed users, ordered by recency or relevance.
  • Social graph — Follow and unfollow relationships. Mutual follows. Blocking.
  • Comments and reactions — Threaded replies, likes, and engagement signals.
  • Notifications — New followers, replies, likes. Real-time or batched.
  • Rate limiting — Preventing spam, abuse, and automated posting.
  • Database design — Relational data with complex queries. This is where most projects get stuck.
Building each of these from scratch is educational but extremely time-consuming. For a product you actually want to ship, the question is which pieces you build yourself and which you start from.

The database challenge

The hardest part of a social app is not the frontend — it is the database schema and the queries that power the feed. A naive approach (querying all posts from all followed users on every page load) falls apart quickly. You need efficient indexes, pagination strategies, and careful query design. With Supabase and PostgreSQL, you get the relational power to handle this, but designing the schema correctly upfront saves enormous pain later. The key tables for a social platform:
  • profiles — Extends the auth users table with public information
  • posts — Content with type, metadata, and author reference
  • comments — Linked to posts with optional parent for threading
  • follows — Directed relationship between users
  • notifications — Polymorphic events triggered by user actions
  • rate_limits — Per-user action throttling
Getting these relationships right — with proper foreign keys, indexes, and security policies — is the difference between an app that works in development and one that works in production.

Starting with Supa Social

Supa Social is a Once UI Pro template that provides a fully functional social app built with Once UI, Next.js, and Supabase. It is not a tutorial project — it is a production-grade starting point.
Supa Social features showcase
The template includes:
  • Complete authentication with email verification
  • User profiles with avatars and bios
  • Multiple post formats (text, images, link, video)
  • Various feeds with infinite scroll
  • Comment system with threading
  • Follow and unfollow with social graph
  • Real-time notifications
  • Rate limiting on all write operations
  • SQL migration file for complete database setup
The database setup is a single SQL file that you run in the Supabase SQL editor. It creates all tables, relationships, indexes, and row-level security policies in one step.

Setting up the database

After creating a Supabase project, the setup is intentionally minimal:
  • Open the SQL editor in your Supabase dashboard
  • Run the provided SQL migration file
  • Copy your Supabase URL and anon key into your environment variables
The SQL file handles everything: table creation, relationships, indexes, functions, triggers, and security policies. This is the part that would normally take weeks of iteration to get right.
Security is handled through Next.js API routes and server actions. Users can only edit their own posts, see content from public profiles, and receive their own notifications. These policies run at the database level, so they cannot be bypassed from the frontend.

How the feed works

The feed is the core of any social app, and it is the query most likely to become a performance bottleneck.
Supa Social uses a pull-based feed model: when a user loads their feed, the app queries posts based on a simple configuration with cursor-based pagination. This approach is simple, predictable, and scales well for apps with up to tens of thousands of users.
For larger scale, you would eventually move to a push-based model (fan-out on write), but that is an optimization problem — not a starting point problem. The pull model gets you to launch and lets you validate the product before over-engineering the infrastructure.

Rate limiting and abuse prevention

Any app with user-generated content needs rate limiting from day one. Without it, a single user (or bot) can flood the platform and degrade the experience for everyone.
The template includes rate limiting on:
  • Post creation
  • Comment submission
  • Follow actions
  • Profile updates
Limits are enforced through Redis, not just on the frontend. This means they work even if someone bypasses the UI and hits the API directly.

Customizing the experience

The visual layer is fully customizable through once-ui.config.js. For social apps, a few specific choices shape the user experience:
  • theme: "system" — Respect the user's OS preference. Social apps are used at all hours.
  • border: "playful" — Softer corners feel more approachable for community-oriented products.
  • brand — Pick a color that works well at small sizes (notification badges, action buttons) and at large sizes (profile headers).
The component structure is modular. Post cards, comment threads, profile headers, and notification items are all separate components that you can modify independently.

From template to product

The template gives you a working social platform. Your job is to make it yours:
  • Define your niche — A social app for everyone is a social app for no one. The most successful community platforms serve a specific audience.
  • Customize post formats — Add or remove post types based on your use case. A photography community needs different formats than a developer community.
  • Adjust the feed — Consider adding categories, tags, or topic-based feeds alongside the default chronological feed.
  • Add your own features — The template handles the social infrastructure. Your unique value comes from what you build on top of it.

Deploying to production

Deploy the Next.js frontend to Vercel and keep Supabase as your backend. Both services have generous free tiers that can handle early-stage traffic.
Set your Supabase environment variables in the Vercel dashboard, and the app is live. The database is already configured with security policies, so you are not shipping an unprotected backend.

Key takeaways

Building a social app from scratch is one of the most underestimated projects in web development. The number of interconnected systems — auth, profiles, feeds, notifications, moderation — makes it a multi-month effort even for experienced teams.
Supa Social compresses that timeline by providing a production-grade foundation with the hard problems already solved: database schema, security policies, rate limiting, and a complete frontend. You focus on what makes your community unique instead of rebuilding infrastructure that has been built a thousand times before.
Supabase Starter promo
If you are earlier in your journey and want to start with authentication basics, the Supabase Starter template provides a simpler starting point with email login and user profiles.
NEXT_PUBLIC_SUPABASE_URL=your-project-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
git add .
git commit -m "Initial social app"
git push origin main