<?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: Hayden</title>
    <description>The latest articles on DEV Community by Hayden (@selfhostcalc).</description>
    <link>https://dev.to/selfhostcalc</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%2F4201534%2Fdc1a30e7-e1c3-4e07-ba30-a719175dfe0f.png</url>
      <title>DEV Community: Hayden</title>
      <link>https://dev.to/selfhostcalc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/selfhostcalc"/>
    <language>en</language>
    <item>
      <title>A pre-launch security checklist for apps built with Lovable, Bolt and Cursor</title>
      <dc:creator>Hayden</dc:creator>
      <pubDate>Sun, 25 Oct 2026 12:26:39 +0000</pubDate>
      <link>https://dev.to/selfhostcalc/a-pre-launch-security-checklist-for-apps-built-with-lovable-bolt-and-cursor-29c4</link>
      <guid>https://dev.to/selfhostcalc/a-pre-launch-security-checklist-for-apps-built-with-lovable-bolt-and-cursor-29c4</guid>
      <description>&lt;p&gt;You built an app over a weekend with Lovable, Bolt, Replit or Cursor. It works, the demo looks great, and you are about to share the link. Before you do, spend an hour on the boring stuff. AI tools are good at making things work. They are much less good at making things safe, because "safe" never shows up in a demo.&lt;/p&gt;

&lt;p&gt;This is the checklist I run before any AI-built app gets real users. It is ordered by how often the problem bites, and none of it needs a security background.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Look for secrets in your front end
&lt;/h2&gt;

&lt;p&gt;Anything your browser downloads is public. In Vite projects, every variable starting with &lt;code&gt;VITE_&lt;/code&gt; ends up in the JavaScript bundle. In Next.js it is &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;. If a Stripe secret key, an OpenAI key or a Supabase &lt;code&gt;service_role&lt;/code&gt; key sits behind one of those prefixes, anyone can copy it.&lt;/p&gt;

&lt;p&gt;Open your deployed site, view the source, and search the JavaScript files for &lt;code&gt;sk_&lt;/code&gt;, &lt;code&gt;service_role&lt;/code&gt; and &lt;code&gt;api_key&lt;/code&gt;. If you find a real secret, rotate it first and then move the call to a server function.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Check your database from the outside
&lt;/h2&gt;

&lt;p&gt;If you use Supabase, the &lt;code&gt;anon&lt;/code&gt; key is meant to be public. That is fine only when Row Level Security (RLS) is switched on for every table in the &lt;code&gt;public&lt;/code&gt; schema and the policies are strict. Run this in the SQL editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;tablename&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_tables&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;schemaname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="n"&gt;rowsecurity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every table it returns can be read by anyone holding your public key. Turn RLS on, then write policies such as &lt;code&gt;using (auth.uid() = user_id)&lt;/code&gt;. Policies that say &lt;code&gt;using (true)&lt;/code&gt; are RLS in name only.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Test as a second user
&lt;/h2&gt;

&lt;p&gt;Create two accounts. Log in as user A, copy the id of one of A's rows, then log in as user B and try to fetch it. If B can read it, your policies only check "is logged in" and not "is the owner". This is the single most common leak in AI-generated apps, and the anon test above will not catch it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Don't leave files lying around
&lt;/h2&gt;

&lt;p&gt;Visit &lt;code&gt;/.env&lt;/code&gt;, &lt;code&gt;/.git/config&lt;/code&gt;, and any backup file names your project might have produced. Each should return 404 or be blocked. Also check that the build output does not ship source maps you did not intend to publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Payments: trust the webhook, not the redirect
&lt;/h2&gt;

&lt;p&gt;If you take payments, do not mark an order as paid because the user landed on a "thank you" page. Anyone can type that URL. Confirm payment from the provider's webhook, verify the signature on every event, and make the handler idempotent so a retry does not grant access twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Auth settings
&lt;/h2&gt;

&lt;p&gt;Set the Site URL and allowed redirect URLs in your auth provider to your real domain, not a wildcard. Make sure password reset and email confirmation actually work in production, with a real inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Add limits
&lt;/h2&gt;

&lt;p&gt;Signup, login, password reset and any endpoint that sends email or calls a paid API need rate limits. Without them, one script can burn your monthly API budget in an afternoon. Set a spending cap or alert on every paid service.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Headers and HTTPS
&lt;/h2&gt;

&lt;p&gt;Force HTTPS and add the basic security headers: &lt;code&gt;Strict-Transport-Security&lt;/code&gt;, &lt;code&gt;Content-Security-Policy&lt;/code&gt; (even a loose one), &lt;code&gt;X-Content-Type-Options&lt;/code&gt; and a frame policy. Hosts like Vercel and Netlify let you set these in a config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Click through your own app
&lt;/h2&gt;

&lt;p&gt;Sign up, log in, reset a password, pay, delete your account, and open every page. Broken links and 500 errors are not security holes, but they are the first thing a stranger sees.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Have a way back
&lt;/h2&gt;

&lt;p&gt;Turn on backups for your database and test one restore. Keep your code in Git and commit before each big AI change, so a bad edit is a one-command undo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a checklist cannot do
&lt;/h2&gt;

&lt;p&gt;None of this is a penetration test, and I would not call any automated check one. A checker looking at your site from the outside cannot see behind your login, and it cannot judge your business logic. Steps 3, 5 and 6 above need you to try things by hand.&lt;/p&gt;

&lt;p&gt;Full disclosure: I built &lt;a href="https://deployvet.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=firstcustomer" rel="noopener noreferrer"&gt;DeployVet&lt;/a&gt;, a free check that does steps 1, 2, 4, 8 and 9 for you from the outside, because those steps are easy to skip. Use it, use another tool, or just use this list. The point is to look before your users do.&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What self-hosting n8n actually costs in 2026: VPS vs n8n Cloud</title>
      <dc:creator>Hayden</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:47:26 +0000</pubDate>
      <link>https://dev.to/selfhostcalc/what-self-hosting-n8n-actually-costs-in-2026-vps-vs-n8n-cloud-om6</link>
      <guid>https://dev.to/selfhostcalc/what-self-hosting-n8n-actually-costs-in-2026-vps-vs-n8n-cloud-om6</guid>
      <description>&lt;p&gt;Self-hosting n8n looks cheap until you read the fine print. A $5 VPS headline usually means a 24-month prepay, and the renewal price is what you actually pay long term. Here is what I found when I checked providers' public pricing pages on 2026-10-22.&lt;/p&gt;

&lt;h2&gt;
  
  
  What n8n needs
&lt;/h2&gt;

&lt;p&gt;n8n plus Postgres in Docker idles at roughly 0.5-1 GB of RAM and spikes with large payloads or many concurrent runs. My rule of thumb: 2 GB for light use, 4 GB as a comfortable minimum, 8 GB for heavy workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheapest workable VPS plans (USD/month)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Specs&lt;/th&gt;
&lt;th&gt;Intro&lt;/th&gt;
&lt;th&gt;Renewal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contabo Cloud VPS 10&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 100 GB&lt;/td&gt;
&lt;td&gt;$5.28&lt;/td&gt;
&lt;td&gt;$6.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger KVM 1&lt;/td&gt;
&lt;td&gt;1 vCPU, 4 GB, 50 GB&lt;/td&gt;
&lt;td&gt;$6.49&lt;/td&gt;
&lt;td&gt;$11.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVHcloud VPS-1&lt;/td&gt;
&lt;td&gt;2 vCPU, 4 GB, 40 GB&lt;/td&gt;
&lt;td&gt;$4.54&lt;/td&gt;
&lt;td&gt;not verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean Basic 4 GB&lt;/td&gt;
&lt;td&gt;2 vCPU, 4 GB, 80 GB&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;td&gt;$24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr 4 GB&lt;/td&gt;
&lt;td&gt;2 vCPU, 4 GB, 80 GB&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contabo and Hostinger need a 24-month term for the intro price. DigitalOcean and Vultr bill hourly with no lock-in, which is worth something if you are not sure yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  n8n Cloud vs self-hosting
&lt;/h2&gt;

&lt;p&gt;n8n Cloud Starter is $24/mo ($20 billed annually) for 2,500 executions; Pro is $60/mo ($50 annually) for 10,000. If you run a few workflows and don't want to maintain a server, Cloud is reasonable. If you run many scheduled workflows, the execution cap is the thing to watch, and a VPS has no cap beyond its hardware. Details: &lt;a href="https://selfhostcalc.com/compare/n8n-cloud-vs-self-hosted.html" rel="noopener noreferrer"&gt;n8n Cloud vs self-hosted&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Costs people forget
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backups&lt;/strong&gt;: snapshots usually add 10-20%, or run a nightly pg_dump to object storage. Back up your N8N_ENCRYPTION_KEY too, without it your credentials are gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: about $10-15/year. TLS via Let's Encrypt is free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your time&lt;/strong&gt;: a couple of hours to set up, then about an hour a month for updates and checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The tools
&lt;/h2&gt;

&lt;p&gt;I built StackCost to put these numbers side by side, with renewal prices shown first and unverified numbers left blank:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://selfhostcalc.com" rel="noopener noreferrer"&gt;selfhostcalc.com&lt;/a&gt; - price tracker&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://selfhostcalc.com/calculator.html" rel="noopener noreferrer"&gt;Calculator&lt;/a&gt; - estimate your monthly cost&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selfhostcalc.com/compare/cheapest-vps-for-n8n.html" rel="noopener noreferrer"&gt;Cheapest VPS for n8n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://selfhostcalc.com/data/hosts.json" rel="noopener noreferrer"&gt;Raw data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disclosure: I run the site. Some "View deal" links may become affiliate links in the future; see the &lt;a href="https://selfhostcalc.com/affiliate-disclosure.html" rel="noopener noreferrer"&gt;affiliate disclosure&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>selfhosted</category>
      <category>automation</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
