<?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>Forem: José</title>
    <description>The latest articles on Forem by José (@josem12).</description>
    <link>https://forem.com/josem12</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%2F3686703%2F377bd6be-e6de-4ef9-87c4-3316117995f9.png</url>
      <title>Forem: José</title>
      <link>https://forem.com/josem12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/josem12"/>
    <language>en</language>
    <item>
      <title>Building a SaaS with Claude Code: Why Experience and Framework Choice Matter</title>
      <dc:creator>José</dc:creator>
      <pubDate>Thu, 08 Jan 2026 11:37:20 +0000</pubDate>
      <link>https://forem.com/josem12/building-a-saas-with-claude-code-why-experience-and-framework-choice-matter-3h02</link>
      <guid>https://forem.com/josem12/building-a-saas-with-claude-code-why-experience-and-framework-choice-matter-3h02</guid>
      <description>&lt;p&gt;There's a lot of hype around AI coding assistants. "Just describe what you want and ship it!" The reality is more nuanced.&lt;/p&gt;

&lt;p&gt;I recently built &lt;a href="https://matgoat.com" rel="noopener noreferrer"&gt;MatGoat&lt;/a&gt;, a management platform for martial art academies as a side project, using Claude Code as my primary development partner. It worked really well. But I want to be honest about &lt;em&gt;why&lt;/em&gt; it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Factors That Made This Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Software Engineering Experience
&lt;/h3&gt;

&lt;p&gt;I've been writing code professionally for over 15 years. This matters more than people admit when discussing AI-assisted development.&lt;/p&gt;

&lt;p&gt;When Claude suggests a solution, I can immediately evaluate it. Is this the right pattern? Will this scale? Are there edge cases it's missing? Does this follow the conventions of the codebase?&lt;/p&gt;

&lt;p&gt;AI assistants are excellent at generating code. They're less reliable at knowing when that code is appropriate for your specific context. That judgment comes from experience.&lt;/p&gt;

&lt;p&gt;I wasn't "vibe coding" in the sense of blindly accepting suggestions. I was having a technical conversation with a very knowledgeable collaborator, one where I understood enough to guide the direction and catch mistakes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Choosing Rails
&lt;/h3&gt;

&lt;p&gt;This might be the most underrated factor. Rails has been around since 2004. There are twenty years of blog posts, documentation, Stack Overflow answers, and open-source code in the training data of every major LLM.&lt;/p&gt;

&lt;p&gt;When I ask Claude to implement something in Rails, it draws from this massive corpus of well-established patterns. The suggestions are almost always idiomatic. The generated code follows conventions that experienced Rails developers would recognize and approve.&lt;/p&gt;

&lt;p&gt;Compare this to asking an AI to help with a newer framework or a custom architecture. The AI has less to draw from, and the suggestions become more generic or less reliable.&lt;/p&gt;

&lt;p&gt;Rails gave Claude the context it needed to be genuinely helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Development Actually Worked
&lt;/h2&gt;

&lt;p&gt;My workflow wasn't "describe feature, accept code, ship." It was more like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture discussions.&lt;/strong&gt; I'd describe a problem and ask Claude to outline approaches. We'd discuss tradeoffs. I'd make the final call based on my understanding of the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaffolding acceleration.&lt;/strong&gt; Once I decided on an approach, Claude could generate the boilerplate quickly. Models, migrations, controllers, views, tests. This saved hours of typing while I stayed focused on the design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code review in reverse.&lt;/strong&gt; I'd review what Claude wrote the same way I'd review a junior developer's PR. Most of it was solid. Some needed adjustment. Occasionally I'd rewrite a section myself because I had specific requirements Claude couldn't infer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging collaboration.&lt;/strong&gt; When something broke, I'd share the error and context. Claude would suggest causes. I'd evaluate which made sense given my knowledge of the system.&lt;/p&gt;

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

&lt;p&gt;Claude helped me settle on a straightforward architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rails 8.1&lt;/strong&gt; with Hotwire for the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid Queue&lt;/strong&gt; for background jobs (no Redis dependency).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kamal&lt;/strong&gt; for deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing exotic. Battle-tested tools with extensive documentation. This predictability made Claude's suggestions more reliable throughout the project.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://matgoat.com" rel="noopener noreferrer"&gt;MatGoat&lt;/a&gt; now runs in production, handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-tenant academy management.&lt;/li&gt;
&lt;li&gt;Class scheduling with real-time availability.&lt;/li&gt;
&lt;li&gt;Student progression tracking (belts and grades).&lt;/li&gt;
&lt;li&gt;Video content delivery.&lt;/li&gt;
&lt;li&gt;Attendance history and semester rankings.&lt;/li&gt;
&lt;li&gt;Payment processing with Stripe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployments are one command. Monthly hosting costs less than a Netflix subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it went
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where Claude worked well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating idiomatic Rails code quickly.&lt;/li&gt;
&lt;li&gt;Remembering context across a long coding session.&lt;/li&gt;
&lt;li&gt;Explaining unfamiliar APIs or patterns when I asked.&lt;/li&gt;
&lt;li&gt;Writing tests that matched the style of existing specs.&lt;/li&gt;
&lt;li&gt;Kamal and deployment configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where I still needed to lead and change things:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business logic that required domain knowledge.&lt;/li&gt;
&lt;li&gt;Performance-critical sections that needed careful thought.&lt;/li&gt;
&lt;li&gt;Security considerations and edge cases.&lt;/li&gt;
&lt;li&gt;Architectural decisions with long-term implications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;AI-assisted development isn't magic. It's leverage.&lt;/p&gt;

&lt;p&gt;If you have the experience to evaluate suggestions and guide the process, tools like Claude Code can significantly accelerate your work. If you're newer to development, treat it as a learning partner rather than an oracle.&lt;/p&gt;

&lt;p&gt;Also, if you're choosing a stack for an AI-assisted project, consider framework maturity. The AI is only as good as the patterns it learned from.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How I Built a Full-Featured SaaS with Rails 8 and Deploy It with One Command</title>
      <dc:creator>José</dc:creator>
      <pubDate>Thu, 08 Jan 2026 09:34:18 +0000</pubDate>
      <link>https://forem.com/josem12/how-i-built-a-full-featured-saas-with-rails-8-and-deploy-it-with-one-command-1jnc</link>
      <guid>https://forem.com/josem12/how-i-built-a-full-featured-saas-with-rails-8-and-deploy-it-with-one-command-1jnc</guid>
      <description>&lt;p&gt;When I set out to build &lt;a href="https://matgoat.com" rel="noopener noreferrer"&gt;MatGoat&lt;/a&gt;, a management platform for martial arts academies, I had one goal: &lt;strong&gt;keep it simple&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No Kubernetes. No microservices. No complex CI/CD pipelines. Just a Rails monolith that I could deploy with a single command.&lt;/p&gt;

&lt;p&gt;Here's how I did it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rails 8.1&lt;/strong&gt; with Hotwire (Turbo + Stimulus)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for the database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kamal 2&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner Cloud&lt;/strong&gt; for hosting (~€20/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid Queue&lt;/strong&gt; for background jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No webpack. No Node.js build step. No Redis cluster. No separate job server infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rails 8 Changes Everything
&lt;/h2&gt;

&lt;p&gt;Rails 8 introduced what I call the "Solid trifecta":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solid Queue&lt;/strong&gt; - Database-backed job processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid Cache&lt;/strong&gt; - Database-backed caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid Cable&lt;/strong&gt; - Database-backed Action Cable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means I don't need Redis for most use cases. My background jobs, caching, and real-time updates all run on the same PostgreSQL database that handles my application data.&lt;/p&gt;

&lt;p&gt;One less service to manage. One less thing to break.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment in One Command
&lt;/h2&gt;

&lt;p&gt;Here's the entire deployment process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kamal deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. That's the actual command. Kamal handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building the Docker image&lt;/li&gt;
&lt;li&gt;Pushing it to the registry&lt;/li&gt;
&lt;li&gt;Rolling out the new version with zero downtime&lt;/li&gt;
&lt;li&gt;Running database migrations&lt;/li&gt;
&lt;li&gt;Managing SSL certificates via Let's Encrypt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My deploy.yml is about 100 lines. It defines my web server, job worker, PostgreSQL database, Redis (for Action Cable in production), and automated database backups to S3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture That Scales Down
&lt;/h2&gt;

&lt;p&gt;Most architecture articles focus on scaling up. But for indie developers and small teams, scaling down is more valuable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://matgoat.com" rel="noopener noreferrer"&gt;https://matgoat.com&lt;/a&gt; runs on Hetzner. The entire infrastructure costs less than a Netflix subscription each month. Yet it handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-tenant academy management.&lt;/li&gt;
&lt;li&gt;Real-time class registrations via WebSockets.&lt;/li&gt;
&lt;li&gt;Video content delivery.&lt;/li&gt;
&lt;li&gt;Student progress tracking.&lt;/li&gt;
&lt;li&gt;Automated class scheduling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When (if) I need to scale, I add another server to the servers array in my Kamal config. That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Don't Have
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No container orchestration platform.&lt;/li&gt;
&lt;li&gt;No managed database service.&lt;/li&gt;
&lt;li&gt;No separate CDN configuration.&lt;/li&gt;
&lt;li&gt;No infrastructure-as-code beyond the Kamal config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I don't miss any of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Maintenance Story
&lt;/h2&gt;

&lt;p&gt;Every day, I run:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kamal deploy&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;If something goes wrong:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kamal rollback&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Need to check logs?&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kamal logs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Need a Rails console?&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kamal console&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;The mental overhead is minimal. I spend my time building features, not fighting infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;You don't need a complex architecture to build a real product. Rails 8 with Kamal gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplicity: One language, one framework, one deployment tool&lt;/li&gt;
&lt;li&gt;Speed: Deploy in minutes, not hours&lt;/li&gt;
&lt;li&gt;Cost efficiency: Run everything on a single VPS&lt;/li&gt;
&lt;li&gt;Maintainability: Less moving parts means fewer things that break&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're an indie developer or a small team, consider whether you really need that Kubernetes cluster. Sometimes the boring solution is the right one.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>rails</category>
      <category>kamal</category>
    </item>
  </channel>
</rss>
