๐ Welcome to Creator Academy! This is your space to learn, build, and grow as a creator. Here's what you'll find: โข **Programs** โ Structured courses on building & monetizing communities โข **Resources** โ Curated tools, templates, and guides โข **Events** โ Live workshops, AMAs, and co-working sessions โข **Community** โ Connect with fellow builders Drop a comment below and introduce yourself! What are you working on? ๐
Good morning crew! โ๏ธ Starting a new project today โ a community platform for fitness coaches. Using everything I learned in the Ship Your SaaS program. Day 1 plan: - [x] Project setup (Next.js + Supabase) - [x] Auth flow - [ ] Database schema - [ ] Landing page Gonna build in public here. Who wants to follow along? ๐๏ธ
Just released my Tailwind CSS component collection as a free resource in the vault! ๐จ 50+ production-ready components including: โข Hero sections โข Pricing tables โข Feature grids โข Testimonial cards โข Dashboard layouts โข Auth forms All built with shadcn/ui patterns and fully responsive. Check the Resources tab! Drop a โค๏ธ if you find it useful โ motivates me to add more!
Hosting my first live workshop this Friday! ๐ฌ "Build a Dashboard with Next.js" โ we'll go from zero to a deployed analytics dashboard in 90 minutes. What we'll cover: โข Server components for data fetching โข Recharts for beautiful charts โข Real-time updates with Supabase subscriptions โข Deploy to Vercel RSVP on the Events page โ spots are limited! Any specific topics you'd like me to cover? Drop them below ๐
TIL: You can use the `useOptimistic` hook in React 19 for instant UI updates. Instead of waiting for the server to respond before updating the UI, you can show the expected result immediately and roll back if it fails. ```typescript const [optimisticMessages, addOptimistic] = useOptimistic( messages, (state, newMessage) => [...state, newMessage] ); async function sendMessage(formData: FormData) { addOptimistic({ text: formData.get("text"), pending: true }); await saveMessage(formData); } ``` Makes chat interfaces and like buttons feel SO snappy. Game changer for perceived performance.
๐ Milestone: Just hit $2K MRR on my invoice generator SaaS! Quick backstory: Built it as a weekend project 3 months ago after seeing freelancers in this community struggling with invoicing. Launched on Product Hunt, got 47 upvotes, and it's been growing organically since. **What's working:** โข Simple landing page with clear pricing โข 14-day free trial (no credit card) โข Weekly email with invoicing tips โข This community for feedback and beta testers! **What I'd do differently:** โข Start charging sooner (I was free for too long) โข Build in public from day 1 โข Focus on one feature, not five Happy to answer any questions about the journey! ๐
Hot take: You don't need a design system to ship your MVP. I see so many devs spending weeks building custom component libraries before they even validate their idea. Here's what I do instead: 1. Pick a good component library (shadcn/ui, Radix, etc.) 2. Choose a color palette from Tailwind defaults 3. Use consistent spacing (4, 8, 16, 24, 32) 4. Ship it. You can always refine the design later. Your first 100 users care about the product working, not pixel-perfect margins. Disagree? Fight me in the comments ๐
๐ Just finished the "Ship Your SaaS" program here and WOW. The section on database design patterns alone saved me weeks of mistakes. I was about to build my multi-tenant app with separate schemas per tenant (nightmare maintenance), and the program showed me why a shared schema with RLS is the way to go. Highly recommend if you're building anything with Supabase. The Stripe integration walkthrough is also *chef's kiss*. Thanks @Alex for putting this together! ๐
Question for the group: How do you handle environment variables across dev/staging/prod? I've been using .env.local for dev and Vercel environment variables for prod, but managing secrets across environments is getting messy as my team grows. Anyone using Doppler, Infisical, or something similar? Is it worth the overhead for a 2-3 person team?
๐งต Thread: My complete tech stack for building SaaS in 2025 After building 3 products this year, here's what I've settled on: **Frontend:** โข Next.js 15 (App Router) โข Tailwind CSS + shadcn/ui โข React Hook Form + Zod **Backend:** โข Supabase (Postgres + Auth + Storage + Realtime) โข Stripe for payments โข Resend for transactional email **Infra:** โข Vercel for hosting โข Cloudflare for DNS + CDN โข GitHub Actions for CI/CD **Dev Tools:** โข TypeScript (strict mode, always) โข ESLint + Prettier โข Cursor as my IDE Total monthly cost for a SaaS doing $5K MRR? Under $100. Anything I'm missing? What would you swap out?
Weekly wins thread! ๐ Share what you accomplished this week, no matter how small: โข Landed a new client? ๐ โข Fixed that nasty bug? ๐ โข Learned something new? ๐ โข Pushed code to prod? ๐ Every step forward counts. Let's celebrate together!
Pro tip: If you're using Supabase with Next.js, set up Row Level Security (RLS) from day one. I learned this the hard way โ retrofitting RLS policies on an existing app is painful. But starting with it means your data is secure by default, even if your server code has a bug. Here's my go-to starter policy pattern: ```sql CREATE POLICY "Users can read own data" ON profiles FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Users can update own data" ON profiles FOR UPDATE USING (auth.uid() = user_id); ``` Saved my bacon more than once! ๐ฅ What security patterns have you found essential?
Just shipped a new feature using server actions in Next.js 15 and it's ๐ฅ The DX improvement over API routes for simple mutations is massive. No more writing fetch calls, managing loading states manually, or dealing with serialization. Here's a quick before/after: **Before (API Route):** ```typescript // pages/api/update-name.ts export default async function handler(req, res) { const { name } = req.body; await db.user.update({ name }); return res.json({ success: true }); } ``` **After (Server Action):** ```typescript "use server" async function updateName(name: string) { await db.user.update({ name }); revalidatePath("/profile"); } ``` Anyone else making the switch? What patterns are you finding useful?