<?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: Denis Zontak</title>
    <description>The latest articles on DEV Community by Denis Zontak (@dzontak).</description>
    <link>https://dev.to/dzontak</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4198554%2F4a6985cf-9879-426d-94f4-c3872ced87ec.jpg</url>
      <title>DEV Community: Denis Zontak</title>
      <link>https://dev.to/dzontak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dzontak"/>
    <language>en</language>
    <item>
      <title>What it costs to start an open source project (my real numbers)</title>
      <dc:creator>Denis Zontak</dc:creator>
      <pubDate>Wed, 21 Oct 2026 15:48:45 +0000</pubDate>
      <link>https://dev.to/dzontak/what-it-costs-to-start-an-open-source-project-my-real-numbers-33cn</link>
      <guid>https://dev.to/dzontak/what-it-costs-to-start-an-open-source-project-my-real-numbers-33cn</guid>
      <description>&lt;p&gt;When I started working on UseHourly, I was just going to be the only user. But then somehow I decided it should be an open source project for other people to use. So in reality, since I'm hosting it, this project is no longer totally free for me. It's actually going to cost me money if people do start using it.&lt;/p&gt;

&lt;p&gt;Here is what it actually costs me, line by line.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I pay every month
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Cost a month&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare (hosting and database)&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;The minimum paid plan. It runs the app and stores the data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resend (email)&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;I upgraded to the Pro plan so I don't run into the email limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain (usehourly.app)&lt;/td&gt;
&lt;td&gt;$1 for the first year, about $12 a year after that (about $1 a month)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous integration (CircleCI)&lt;/td&gt;
&lt;td&gt;$0 (free plan)&lt;/td&gt;
&lt;td&gt;Runs the checks and deploys when I merge.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI coding assistant (Claude)&lt;/td&gt;
&lt;td&gt;$20 on the Pro plan, which should be enough for most people. I pay $100 for Max because I work on about five projects at the same time, so UseHourly is only part of that.&lt;/td&gt;
&lt;td&gt;It wrote most of the code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Running it (hosting, email, domain)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;about $26 a month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Running it plus the assistant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;about $46 a month on the $20 plan&lt;/strong&gt; (about $126 with the $100 plan I use for all my projects)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What was free
&lt;/h2&gt;

&lt;p&gt;Things I use that cost me nothing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub for the code, in a public repository.&lt;/li&gt;
&lt;li&gt;CircleCI, on its free plan, for running the checks and deploying.&lt;/li&gt;
&lt;li&gt;Automatic checks on every pull request (GitHub Actions), a security scan (CodeQL) and dependency updates (Dependabot).&lt;/li&gt;
&lt;li&gt;A bot-protection widget for sign-up (Cloudflare Turnstile), ready but switched off.&lt;/li&gt;
&lt;li&gt;npm, dev.to and Medium for sharing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing that surprised me: running UseHourly costs about $26 a month. The most expensive part is not the servers. It's the AI assistant I used to build it: $20 a month for most people. I pay $100 for the bigger plan, but I use it for about five projects at the same time, not just this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think it will cost with more users
&lt;/h2&gt;

&lt;p&gt;I wanted to know what happens if people really do start using it, so I looked up the prices and made an estimate. These are estimates, not measurements. I assumed every user is active, about 20 days a month, with a small number of requests per day.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Today&lt;/th&gt;
&lt;th&gt;1,000 users&lt;/th&gt;
&lt;th&gt;10,000 users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare (hosting and database)&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;about $5&lt;/td&gt;
&lt;td&gt;about $5 to $6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email (Resend Pro)&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rough total a month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;about $25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;about $25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;about $25 to $30&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I was surprised by this. I thought the $5 plan would only handle about 100 users. By my estimate it covers thousands of active users, because the free amounts that come with the plan are large. The email plan is the cost that is already real. The prices are from Cloudflare's and Resend's own pricing pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worries me
&lt;/h2&gt;

&lt;p&gt;What worries me when many people sign up is that I'm going to end up with a bill of more than $100 for this thing. I guess I can afford it, but I'd rather not. I'd rather this be sponsored, really.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'll do if it gets expensive
&lt;/h2&gt;

&lt;p&gt;If it got very expensive, I'll probably have to hold some kind of fundraiser. Like if it's over $100. I already have sponsorship links on my site. Hopefully I would just start by posting a message to all users, asking if they can donate a little bit to cover the monthly cost, if it's too large.&lt;/p&gt;

&lt;p&gt;I built a small notice for exactly this. It's off right now. If I switch it on, people see a short note on the Today page saying what hosting costs, with a link to my sponsors page. It only shows inside the app. I don't send marketing email, and I don't want to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So that's what it costs to start an open source project, in my case. It's free to use, and it's not free for me. Right now it's about $26 a month to run, counting hosting, email and the domain, and my estimate says it stays about that even with thousands of users. If I'm wrong and it ever gets past $100, I'll say so openly, and I'll ask for help.&lt;/p&gt;

&lt;p&gt;If you use it and it helps you, you can sponsor it on GitHub: &lt;a href="https://github.com/sponsors/Zontak-LLC" rel="noopener noreferrer"&gt;https://github.com/sponsors/Zontak-LLC&lt;/a&gt;. And if you've paid for a free project of your own, I'd like to hear what it cost you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was dictated by me. Claude, an AI assistant, helped put it in order, looked up the prices, made the cost estimate and drafted a few sentences, which I edited. The numbers about what I pay are mine.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>cloudflare</category>
      <category>sideprojects</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Guardrails so AI-written code doesn't turn into spaghetti</title>
      <dc:creator>Denis Zontak</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:05:14 +0000</pubDate>
      <link>https://dev.to/dzontak/guardrails-so-ai-written-code-doesnt-turn-into-spaghetti-3a21</link>
      <guid>https://dev.to/dzontak/guardrails-so-ai-written-code-doesnt-turn-into-spaghetti-3a21</guid>
      <description>&lt;p&gt;I like open source. I've been using open source projects for many years, and there are some very, very good ones. I wanted to try building one myself, just to see how to set it all up.&lt;/p&gt;

&lt;p&gt;At the time I was doing some freelance work for a friend at a company called MagSmith (magsmith.com), and I needed to manage my timesheets. I looked at some of the open source time trackers, the top three alternatives: solidtime, Kimai and TimeTagger, and they're okay. But I don't like it when a product says it's free but has a bunch of paid stuff on top. You want to use a feature and it ends up requiring an upgrade. I hate that.&lt;/p&gt;

&lt;p&gt;So I wrote my own, the way I like it. It's called UseHourly, and I use it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first AI coding experience
&lt;/h2&gt;

&lt;p&gt;My first AI coding experience came at work. We started using AI about a year ago. I started with an AI coding assistant in the IDE, and at that time AI was still not there. It couldn't produce code sophisticated enough for what we needed, and it made way too many mistakes. But it was helpful.&lt;/p&gt;

&lt;p&gt;About six months ago, around the time when the Claude Opus model came out, it became good enough. It could implement the code completely from a Jira ticket, and then implement a list of tests by itself, like Cucumber tests for the integration tests. All by itself.&lt;/p&gt;

&lt;p&gt;That was my first experience, and I love it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I added guardrails
&lt;/h2&gt;

&lt;p&gt;When I started UseHourly, I was kind of vibe coding it. Nothing was really going bad yet. It wasn't spaghetti code yet, because it's a reasonably small project. But I know that in a larger project it becomes a problem. I know this from experience.&lt;/p&gt;

&lt;p&gt;So instead of letting it keep running code until it becomes spaghetti, I added some guardrails to let it know what not to do and what to do. Check for code smells, write good code, maintain good coding practices, enforcement, and stuff like that. Basically, how to keep a clean, tidy code base with well-written code and good test coverage. That's the goal.&lt;/p&gt;

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

&lt;p&gt;First, I wrote the rules down in a file called CLAUDE.md, in the project. The assistant reads it every time it starts. It says how the project is built, how money and dates are stored, and what "done" means.&lt;/p&gt;

&lt;p&gt;Second, I made one command that runs all the checks. It's the only definition of "the checks". I run it, the CI runs it, and the git hooks run it, so nobody can say "it passed on my side". If it fails, the work isn't done.&lt;/p&gt;

&lt;p&gt;Third, I turned the rules into checks that fail the build. No &lt;code&gt;any&lt;/code&gt; types, no ignoring the type checker, no TODO without an issue number, no copy-pasted code, no unused files, and a minimum test coverage that can only go up, never down. The AI can't talk its way past them. If it takes a shortcut, the build says no and it fixes it.&lt;/p&gt;

&lt;p&gt;Fourth, I write the tests the way a person uses the app. At one point the AI rewrote a screen and a button did nothing. The tests passed, because none of them ever clicked it. So I added a test that clicks every button on every page, and a rule that every bug fix comes with a test that fails without the fix.&lt;/p&gt;

&lt;p&gt;And now I review the code before I commit it, not after. A fresh reviewer reads the change cold, because the assistant that wrote the code is the worst reader of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So that's my story. I love open source, and I love working with AI coding assistants. But you can't just let the AI keep going. On a bigger project it turns into spaghetti, and I know that from experience.&lt;/p&gt;

&lt;p&gt;So I put guardrails in place. Rules that tell it what to do and what not to do, and checks that make sure it does. The goal is a clean, tidy code base with well-written code and good test coverage.&lt;/p&gt;

&lt;p&gt;I've turned these checks into a small tool, so anyone can add them to their own project. It's open source: &lt;a href="https://github.com/Zontak-LLC/railing" rel="noopener noreferrer"&gt;https://github.com/Zontak-LLC/railing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I dictated this article and had Claude help me put it in order and check the facts against my code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>opensource</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
