<?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: Alberto Towns</title>
    <description>The latest articles on DEV Community by Alberto Towns (@alberto_towns_b3e46310d1c).</description>
    <link>https://dev.to/alberto_towns_b3e46310d1c</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%2F3804708%2Fbae613a7-cb5b-4eb8-9b0a-2656e9a84bee.jpg</url>
      <title>DEV Community: Alberto Towns</title>
      <link>https://dev.to/alberto_towns_b3e46310d1c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alberto_towns_b3e46310d1c"/>
    <language>en</language>
    <item>
      <title>I built a SaaS in a week with Next.js, Supabase, and Stripe — here's what I learned</title>
      <dc:creator>Alberto Towns</dc:creator>
      <pubDate>Fri, 20 Mar 2026 19:35:51 +0000</pubDate>
      <link>https://dev.to/alberto_towns_b3e46310d1c/i-built-a-saas-in-a-week-with-nextjs-supabase-and-stripe-heres-what-i-learned-jbg</link>
      <guid>https://dev.to/alberto_towns_b3e46310d1c/i-built-a-saas-in-a-week-with-nextjs-supabase-and-stripe-heres-what-i-learned-jbg</guid>
      <description>&lt;p&gt;Last week I went from idea to deployed SaaS in about a week of evening sessions. Here's the product, the stack, and what I learned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The product:&lt;/strong&gt; RentView — a rental property profit tracker for landlords with 1-10 units. It tracks income, expenses, and net cash flow per property per month. No bank integrations, no tenant management, no bloat. Just "is this property making money?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 14 (App Router) for the frontend and API routes&lt;/li&gt;
&lt;li&gt;Supabase for auth, database (Postgres), and row-level security&lt;/li&gt;
&lt;li&gt;Stripe for subscriptions ($9/29/49 per month)&lt;/li&gt;
&lt;li&gt;Vercel for hosting&lt;/li&gt;
&lt;li&gt;Tailwind CSS for styling&lt;/li&gt;
&lt;li&gt;Pure SVG for charts (no recharts or Chart.js)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Supabase RLS means all security is at the database level — users can only query their own data regardless of what the frontend does&lt;/li&gt;
&lt;li&gt;No chart library — SVG bar charts and line charts are ~50 lines of code each and add zero bundle size&lt;/li&gt;
&lt;li&gt;Mortgage auto-calculates as a monthly expense so users don't have to log it every month&lt;/li&gt;
&lt;li&gt;7-day free trial instead of a free tier — free tiers train users not to pay&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choosing what to build took longer than building it. Analysis paralysis is real.&lt;/li&gt;
&lt;li&gt;Supabase's new publishable key format works fine with @supabase/ssr&lt;/li&gt;
&lt;li&gt;TypeScript strict mode catches real bugs in Vercel builds that don't show up in local dev&lt;/li&gt;
&lt;li&gt;The "minimum viable" in MVP really means minimum — ship the ugly version, not the perfect one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it out at &lt;a href="https://dev.tourl"&gt;https://rentview-three.vercel.app&lt;/a&gt;Feedback welcome.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>supabase</category>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I shipped my first SaaS in a day — here's the stack, the costs, and what I learned</title>
      <dc:creator>Alberto Towns</dc:creator>
      <pubDate>Tue, 03 Mar 2026 22:22:50 +0000</pubDate>
      <link>https://dev.to/alberto_towns_b3e46310d1c/i-shipped-my-first-saas-in-a-day-heres-the-stack-the-costs-and-what-i-learned-41ea</link>
      <guid>https://dev.to/alberto_towns_b3e46310d1c/i-shipped-my-first-saas-in-a-day-heres-the-stack-the-costs-and-what-i-learned-41ea</guid>
      <description>&lt;p&gt;I've been in analytics and business strategy for 13 years. I know Python. I understand data. I've made a career out of helping companies make smarter decisions.&lt;/p&gt;

&lt;p&gt;But until last week, I'd never built anything for myself. Every side project got stuck in planning mode — researching, overthinking, waiting for the perfect moment that never came.&lt;/p&gt;

&lt;p&gt;Last week I tried something different. No planning. No Notion docs. Just sit down and build.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;A CSV analyzer. You upload a CSV file and it instantly gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Column-level statistics (mean, median, std dev, unique values)&lt;/li&gt;
&lt;li&gt;Interactive charts (histogram, scatter, bar with percentages)&lt;/li&gt;
&lt;li&gt;AI-powered analysis that explains your data in plain English&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs in the browser. Your data never gets uploaded to a server. The AI analysis sends only summary statistics to the backend, not your raw data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; — frontend and API routes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic API (Claude)&lt;/strong&gt; — powers the AI analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; — payment processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — hosting (free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plotly&lt;/strong&gt; — interactive charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total infrastructure cost: roughly $1/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security considerations
&lt;/h2&gt;

&lt;p&gt;Since users upload files and AI processes data, I had to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection&lt;/strong&gt;: CSV cells could contain "ignore previous instructions" — I sanitize all data before it reaches the AI with regex filters for common injection patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XSS&lt;/strong&gt;: React auto-escapes, but I also strip HTML tags and neutralize URLs in cell values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API key exposure&lt;/strong&gt;: The Anthropic API is called server-side via a Next.js API route. The key never reaches the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File bombs&lt;/strong&gt;: 50MB file size cap, row/column limits per pricing tier, individual cells truncated to 500 characters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt;: In-memory rate limiter on the API route — 10 requests per minute per IP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing model
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt;: 500 rows, 20 columns, stats and charts only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Analysis ($2.99)&lt;/strong&gt;: 50K rows, 50 columns, one AI analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($9/month)&lt;/strong&gt;: 500K rows, 100 columns, unlimited AI analyses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI analysis costs me about $0.01-0.03 per request, so margins are strong even at $2.99.&lt;/p&gt;

&lt;h2&gt;
  
  
  First week results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;127 visitors&lt;/li&gt;
&lt;li&gt;$0 revenue&lt;/li&gt;
&lt;li&gt;2 out of 3 Reddit posts got auto-rejected&lt;/li&gt;
&lt;li&gt;0 comments on Hacker News&lt;/li&gt;
&lt;li&gt;But real people visited and used the tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not glamorous. But it's real.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The biggest obstacle wasn't technical.&lt;/strong&gt; The code was the easy part. The hard part was not closing the laptop. Not switching to something easier. Not telling myself I'd do it tomorrow.&lt;/p&gt;

&lt;p&gt;If you're stuck in planning mode — here's what worked for me: remove the gap between deciding and doing. Don't make a task list. Don't set up project management. Just open your editor and build the worst possible version. Ship it before your brain talks you out of it.&lt;/p&gt;

&lt;p&gt;You can refine later. You can't refine something that doesn't exist.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://csv-analyzer-green.vercel.app" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;csv-analyzer-green.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Building in public from here. Feedback welcome — especially if you try uploading a CSV and something breaks.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>beginners</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
