<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mateusz Szczudłowski</title>
    <description>The latest articles on DEV Community by Mateusz Szczudłowski (@mateusz_szczudowski_3365).</description>
    <link>https://dev.to/mateusz_szczudowski_3365</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3480120%2F6a0cd555-635b-4017-bed0-115a0f6dcfff.jpg</url>
      <title>DEV Community: Mateusz Szczudłowski</title>
      <link>https://dev.to/mateusz_szczudowski_3365</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mateusz_szczudowski_3365"/>
    <language>en</language>
    <item>
      <title>Roast Feast is LIVE: How I shipped a social platform as a solo dev (Nuxt 3 + Supabase)</title>
      <dc:creator>Mateusz Szczudłowski</dc:creator>
      <pubDate>Fri, 09 Jan 2026 19:40:24 +0000</pubDate>
      <link>https://dev.to/mateusz_szczudowski_3365/roast-feast-is-live-how-i-shipped-a-social-platform-as-a-solo-dev-nuxt-3-supabase-ef</link>
      <guid>https://dev.to/mateusz_szczudowski_3365/roast-feast-is-live-how-i-shipped-a-social-platform-as-a-solo-dev-nuxt-3-supabase-ef</guid>
      <description>&lt;p&gt;&lt;strong&gt;We are finally live! 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few months ago, I wrote about &lt;a href="https://dev.to/mateusz_szczudowski_3365/building-roast-feast-a-solo-developers-journey-with-nuxt-3-and-supabase-18a3"&gt;my journey starting "Roast Feast"&lt;/a&gt; – a dedicated platform for comedy roasts. What started as a "learning project" to master Nuxt 3 and Supabase has now evolved into a full-featured production app.&lt;/p&gt;

&lt;p&gt;Today, I want to share the technical challenges I faced getting to v1.0, specifically around &lt;strong&gt;user identity, moderation, and the "final mile" of polish.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Stack (Recap)
&lt;/h2&gt;

&lt;p&gt;For those who missed the first post, the architecture is kept simple but powerful for a solo dev:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Nuxt 3 (Vue 3 + Composition API)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend/DB:&lt;/strong&gt; Supabase (PostgreSQL, Auth, Edge Functions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; Pinia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Vuetify 3 (customized with SCSS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics:&lt;/strong&gt; Umami (privacy-focused)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenge #1: The "Identity" Problem
&lt;/h2&gt;

&lt;p&gt;One of the biggest hurdles I faced last week was: &lt;strong&gt;How do we handle usernames?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ztkchvv7msq76sqw5d7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ztkchvv7msq76sqw5d7.png" alt="Roast-Themed Nickname Generator" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On a roasting platform, people want to be funny, but allowing free-text usernames is a moderation nightmare (offensive names, impersonation, etc.). Plus, many users struggle to come up with a "cool" name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: Forced Creativity&lt;/strong&gt;&lt;br&gt;
I decided to &lt;strong&gt;remove the ability to type a username&lt;/strong&gt;. Instead, I built a "Roast-Themed Nickname Generator".&lt;/p&gt;

&lt;p&gt;When you sign up, you get a randomly generated name like &lt;code&gt;SaltyBrisket&lt;/code&gt;, &lt;code&gt;SpicyJester&lt;/code&gt;, or &lt;code&gt;CrispyTaco&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tech Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Frontend Generation:&lt;/strong&gt; A simple JS utility combines an array of &lt;code&gt;Adjectives&lt;/code&gt; (e.g., &lt;em&gt;Searing, Witty, Charred&lt;/em&gt;) with &lt;code&gt;Nouns&lt;/code&gt; (e.g., &lt;em&gt;Griller, Spark, Rib&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Database Validation:&lt;/strong&gt; To prevent any "clever" users from bypassing the UI and injecting their own names via API calls, I added a PostgreSQL Check Constraint function &lt;code&gt;is_valid_roast_nickname&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Simplified logic of the SQL function&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_valid_roast_nickname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nick&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;boolean&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="c1"&gt;-- It must match our specific Adjective + Noun pattern&lt;/span&gt;
    &lt;span class="c1"&gt;-- (and allow our specific 'RoastFeast' admin handle)&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that &lt;em&gt;every&lt;/em&gt; user on the platform fits the theme. It’s a small detail, but it sets the tone immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge #2: Preventing Abuse (The "Feast!" Sign)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs958ukf4xd8cdk3wwrsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs958ukf4xd8cdk3wwrsh.png" alt="The creator of the portal in the first roast event holds a sign with the word Feast!" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scariest part of building a roast platform is the potential for cyberbullying. How do we ensure the person being roasted &lt;em&gt;actually wants&lt;/em&gt; to be roasted?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; The "Feast!" Verification.&lt;br&gt;
I implemented a regulation (enforced by moderation) that requires every roast event to include a photo of the "roastee" holding a handwritten sign that says &lt;strong&gt;"Feast!"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s a low-tech solution to a high-tech problem, but it works. It proves consent in a way that a checkbox never could.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy First: Private Roasts
&lt;/h3&gt;

&lt;p&gt;Not everyone wants to be roasted by the whole world. I added a &lt;strong&gt;Private Roast&lt;/strong&gt; feature that allows users to create unlisted events. These are shareable only via a direct link, perfect for friend groups or office parties who want to keep the jokes inside the circle. This required careful Row Level Security (RLS) policies in Supabase to ensure "private" truly means private.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge #3: The "Launch" Polish
&lt;/h2&gt;

&lt;p&gt;The last 10% of the work took 50% of the time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cookie Consent:&lt;/strong&gt; I had to add a GDPR-compliant cookie banner (using a custom Vue component that checks &lt;code&gt;localStorage&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Privacy:&lt;/strong&gt; Updated regulations to be transparent about using Umami for analytics and storing &lt;em&gt;only&lt;/em&gt; emails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Optimized &lt;code&gt;v-img&lt;/code&gt; lazy loading and Supabase queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Now that v1.0 is out, the real test begins: &lt;strong&gt;Users.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've connected &lt;strong&gt;Umami&lt;/strong&gt; to track how people actually use the site (vs how I &lt;em&gt;think&lt;/em&gt; they use it). The next features (Stripe integration for tipping) will depend entirely on this initial feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out!
&lt;/h2&gt;

&lt;p&gt;I’d love for you to roast the platform itself. In fact, I'm dogfooding the "Feast!" verification myself – I am the very first person to be roasted on the platform. Come take your best shot!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Live Site:&lt;/strong&gt; &lt;a href="https://roastfeast.com" rel="noopener noreferrer"&gt;https://roastfeast.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know in the comments: &lt;strong&gt;What was the hardest "final mile" feature in your last project?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more updates on building Roast Feast solo!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>supabase</category>
      <category>vue</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building Roast Feast: A Solo Developer's Journey with Nuxt 3 and Supabase</title>
      <dc:creator>Mateusz Szczudłowski</dc:creator>
      <pubDate>Thu, 04 Sep 2025 18:28:31 +0000</pubDate>
      <link>https://dev.to/mateusz_szczudowski_3365/building-roast-feast-a-solo-developers-journey-with-nuxt-3-and-supabase-18a3</link>
      <guid>https://dev.to/mateusz_szczudowski_3365/building-roast-feast-a-solo-developers-journey-with-nuxt-3-and-supabase-18a3</guid>
      <description>&lt;h2&gt;
  
  
  The Idea That Became a Passion Project
&lt;/h2&gt;

&lt;p&gt;As a developer looking to expand my skills with Vue.js and Supabase, I wanted to build something more substantial than the typical TODO app. I craved a project that would challenge me with real-world complexities — user authentication, real-time interactions, content moderation, and community features.&lt;/p&gt;

&lt;p&gt;As someone who loves humor and sarcastic comments, the idea struck: why not create a specialized platform dedicated entirely to comedy roasts?&lt;/p&gt;

&lt;p&gt;While general social platforms exist, there wasn't a purpose-built space that understood the unique dynamics of roast events — structured rounds, fair participation, creative scoring systems, community safety measures, and the ability to create private roasts for friends.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;After evaluating various options, I settled on a modern, scalable architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend : Nuxt.js for reactive, server-side rendered pages&lt;/li&gt;
&lt;li&gt;Backend : Supabase for real-time database, authentication, and edge functions&lt;/li&gt;
&lt;li&gt;Styling : Vuetify 3 with custom SCSS for a polished, responsive design&lt;/li&gt;
&lt;li&gt;Deployment : Vercel for seamless CI/CD and global edge distribution
This stack provides the perfect balance of developer experience, performance, and scalability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Real-time Interactions
&lt;/h3&gt;

&lt;p&gt;Roast events need live updates as participants submit roasts and reactions. I implemented Supabase's real-time subscriptions to ensure instant updates across all connected users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Real-time subscription example
const { data, error } = await supabase
  .from('roasts')
  .select('*')
  .eq('event_id', eventId)
  .order('created_at', { ascending: false })

supabase
  .channel('roast-updates')
  .on('postgres_changes', 
    { event: 'INSERT', schema: 'public', table: 'roasts' },
    (payload) =&amp;gt; {
      // Handle new roast in real-time
    }
  )
  .subscribe()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Content Moderation
&lt;/h3&gt;

&lt;p&gt;Balancing free expression with community safety required building sophisticated moderation tools, including flagging systems and moderator review workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Gamification System
&lt;/h3&gt;

&lt;p&gt;Creating an engaging badge and leaderboard system that encourages participation while maintaining fair competition was a complex algorithmic challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Performance Optimization
&lt;/h3&gt;

&lt;p&gt;With potentially hundreds of users viewing roast events simultaneously, I implemented materialized views, database indexing, and efficient caching strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Roast Events
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create and manage comedy roast events&lt;/li&gt;
&lt;li&gt;Real-time participant interaction&lt;/li&gt;
&lt;li&gt;Voting and ranking systems&lt;/li&gt;
&lt;li&gt;Event scheduling and notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;User profiles and achievements&lt;/li&gt;
&lt;li&gt;Badge system for engagement&lt;/li&gt;
&lt;li&gt;Leaderboards and competitions&lt;/li&gt;
&lt;li&gt;Social interactions and following&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipping System
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Virtual coin economy&lt;/li&gt;
&lt;li&gt;Creator monetization&lt;/li&gt;
&lt;li&gt;Appreciation mechanisms&lt;/li&gt;
&lt;li&gt;Transaction tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b2fpadwku5woaezhqcc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b2fpadwku5woaezhqcc.png" alt="Diagram of platforms architecture" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After evaluating various options, I settled on a modern, scalable architecture:&lt;/p&gt;

&lt;p&gt;Frontend : Nuxt.js 3 for reactive, server-side rendered pages&lt;br&gt;
Backend : Supabase for real-time database, authentication, and edge functions&lt;br&gt;
Styling : Vuetify 3 with custom SCSS for a polished, responsive design&lt;br&gt;
Deployment : Vercel for seamless CI/CD and global edge distribution&lt;br&gt;
This stack provides the perfect balance of developer experience, performance, and scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked Well
&lt;/h2&gt;

&lt;p&gt;Component-Driven Development : Building reusable Vue components accelerated development and ensured consistency across the platform.&lt;/p&gt;

&lt;p&gt;Database-First Design : Starting with a well-structured database schema prevented major refactoring later in the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;When I started building Roast Feast, I never anticipated how complex and expansive the project would become. What began as a simple learning exercise quickly evolved into a full-featured social platform.&lt;/p&gt;

&lt;p&gt;The biggest challenge has been managing scope and complexity as a solo developer, working only evenings after my day job. Features that seemed straightforward on paper — like implementing a real-time notification system or building a comprehensive badge achievement system — turned out to require careful architectural planning and extensive testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Break down complex features into smaller, manageable chunks&lt;/li&gt;
&lt;li&gt;Maintain clean, well-documented code when you're the only developer&lt;/li&gt;
&lt;li&gt;Good project organization is crucial for context switching&lt;/li&gt;
&lt;li&gt;Write descriptive commit messages for future you&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;The next major milestone is implementing a payment system using Stripe to work with the existing tipping system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment Processing : Stripe Connect integration for creator payouts&lt;/li&gt;
&lt;li&gt;Coin Purchase System : Allow users to buy virtual coins&lt;/li&gt;
&lt;li&gt;Creator Economy : Enable content creators to monetize their roasts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building for the Community
&lt;/h2&gt;

&lt;p&gt;One aspect I'm still figuring out is how to foster genuine community engagement. It's a complex challenge that goes beyond just technical implementation — it's about understanding human psychology, balancing participation with preventing toxicity, and designing features that promote positive interactions.&lt;/p&gt;

&lt;p&gt;Roast Feast has taught me that the best learning projects aren't just about the code — they're about understanding user needs and building solutions that people actually want to use.&lt;/p&gt;

&lt;p&gt;Want to experience Roast Feast yourself?&lt;/p&gt;

&lt;p&gt;Visit our &lt;a href="https://www.roastfeast.com/coming-soon" rel="noopener noreferrer"&gt;coming-soon page&lt;/a&gt; to join the early access list and be among the first to start roasting!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your experience building full-stack applications as a solo developer? Share your challenges and wins in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>nuxt</category>
    </item>
  </channel>
</rss>
