<?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: Bogdan</title>
    <description>The latest articles on DEV Community by Bogdan (@bpecha14).</description>
    <link>https://dev.to/bpecha14</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%2F4167169%2F11c29fa9-e7ee-41f5-911a-d295ec9406c5.png</url>
      <title>DEV Community: Bogdan</title>
      <link>https://dev.to/bpecha14</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bpecha14"/>
    <language>en</language>
    <item>
      <title>I Have No Coding Skills. My Team Is 3 AI Models. Here’s the 100-Bug Audit That Saved My Second Startup.</title>
      <dc:creator>Bogdan</dc:creator>
      <pubDate>Sun, 25 Oct 2026 19:26:09 +0000</pubDate>
      <link>https://dev.to/bpecha14/i-have-no-coding-skills-my-team-is-3-ai-models-heres-the-100-bug-audit-that-saved-my-second-4k6e</link>
      <guid>https://dev.to/bpecha14/i-have-no-coding-skills-my-team-is-3-ai-models-heres-the-100-bug-audit-that-saved-my-second-4k6e</guid>
      <description>&lt;p&gt;Two weeks ago, I published the honest account of building ThumbRank with a team of three AI models and zero coding skills. The response was great — mainly because it wasn't a story about how AI writes perfect code. It was a story about how AI writes code that looks perfect until you try to charge money for it.&lt;/p&gt;

&lt;p&gt;I didn't stop after ThumbRank. I pointed the same team at a much bigger problem: GrantPro AI.&lt;/p&gt;

&lt;p&gt;It’s a funding intelligence platform. The core philosophy is simple: real numbers or guesses — there is no third option. Instead of asking an LLM to guess if you’ll win a grant, we ingest millions of public award records (USAspending, EU CORDIS, NIH, UKRI) and use deterministic code to calculate your real odds.&lt;/p&gt;

&lt;p&gt;Same team structure as before:&lt;/p&gt;

&lt;p&gt;AI #1: Writes features (React, Supabase, Edge Functions).&lt;/p&gt;

&lt;p&gt;AI #2: Handles design and infrastructure.&lt;/p&gt;

&lt;p&gt;AI #3: Exists for one reason: to audit everything the first two ship.&lt;/p&gt;

&lt;p&gt;Me: The founder, PM, and QA department of one.&lt;/p&gt;

&lt;p&gt;Month 1 looked like progress. We had a data pipeline, a dashboard, and a Paddle checkout.&lt;/p&gt;

&lt;p&gt;Then I pointed AI #3 at the codebase before letting anyone pay.&lt;/p&gt;

&lt;p&gt;It came back with ~100 unique bugs and 56 code-quality issues. Some of them would have destroyed the product on day one. Here are the ones that almost killed us, and how we fixed them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The $0.00 Paddle Webhook Disaster
The Bug: The AI configured the Paddle webhook to listen for price IDs. But it accidentally mapped two products to the same priceId.
The Consequence: Users who bought the 1-credit pack received 5 credits. Users who bought the 5-credit pack received zero. The frontend showed "Success", the webhook returned 200 OK, but the database was silently dropping the money.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: We moved the idempotency check to the database level (Postgres unique index) instead of the application layer. If a webhook event arrives twice, or a mapping is wrong, the database throws an error and we log it.&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE UNIQUE INDEX uq_credit_transactions_kind_reference&lt;br&gt;
  ON credit_transactions (kind, reference_id)&lt;br&gt;
  WHERE reference_id IS NOT NULL;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client-Side Credit Spending (The "Free SaaS" Glitch)
The Bug: The AI wrote the credit deduction in the React frontend. If the user had credits &amp;gt; 0, the UI let them click "Generate" and then called the Edge Function.
The Consequence: Anyone who opened the browser console could bypass the UI and call the API directly. We were one curl command away from going bankrupt on OpenAI API costs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: We deleted all client-side credit logic. Spending now happens exclusively via a Postgres SECURITY DEFINER RPC that checks the user's balance atomically on the server.&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE OR REPLACE FUNCTION public.spend_credit(p_kind text)&lt;br&gt;
RETURNS boolean LANGUAGE plpgsql SECURITY DEFINER AS $$&lt;br&gt;
BEGIN&lt;br&gt;
  UPDATE credits SET balance = balance - 1 &lt;br&gt;
  WHERE user_id = auth.uid() AND kind = p_kind AND balance &amp;gt; 0;&lt;br&gt;
  IF NOT FOUND THEN RETURN false; END IF;&lt;br&gt;
  RETURN true;&lt;br&gt;
END; $$;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Public Data Moat Leak
The Bug: We spent a month ingesting 500,000 grant records into tables like awards and win_assessments. The AI enabled Row Level Security (RLS), but left the SELECT policy open to the anon role for caching purposes.
The Consequence: Our entire proprietary Data Empire — the thing we built the company around — was fully readable by anyone with a Supabase anon key (which is public by design).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: We dropped the public read policies. If a table contains the "secret sauce" (historical awards, win probabilities), it is locked to service_role or authenticated users only.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Zombie Function
The Bug: The AI built an entire compliance checker. A beautiful UI, a complex prompt, and a Deno Edge Function.
The Consequence: It literally didn't work. The AI forgot to export the handler (export default async function...). The function compiled, but when called by the frontend, it silently failed. It was a zombie feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: We added a CI gate that explicitly tests the exports of every Edge Function before deployment.&lt;/p&gt;

&lt;p&gt;Why did the AI miss these?&lt;br&gt;
Here is the hard truth about coding with LLMs: The AI is incredible at writing isolated files. It is terrible at understanding cross-file intersections.&lt;/p&gt;

&lt;p&gt;AI #1 wrote the React checkout. AI #2 wrote the Paddle webhook. Neither of them knew that they needed to agree on how a user_id is passed. The bug lived in the gap between them.&lt;/p&gt;

&lt;p&gt;The Rule We Build By Now&lt;br&gt;
We didn't just fix the bugs. We changed the process.&lt;/p&gt;

&lt;p&gt;The Invariants Doc: We wrote a document of cross-file rules. "Every paid checkout ends with credits on the right identity." "No public table is writable with the anon key." AI #1 reads this before coding. AI #3 reads this before auditing.&lt;/p&gt;

&lt;p&gt;Regression-Testing the Auditor: We kept the old, buggy commit. Every time we update the auditor's prompt, we run it against the old code. If it doesn't find the 100 bugs again, the prompt got too soft, and we reject it.&lt;/p&gt;

&lt;p&gt;What's Next?&lt;br&gt;
GrantPro AI is live. We are tracking real grants across the US, EU, UK, Canada, and Japan.&lt;/p&gt;

&lt;p&gt;If you are building with AI, remember this: The code the AI writes is only half the product. The other half is the system you build to catch it.&lt;/p&gt;

&lt;p&gt;You can run a free win-check on your next grant proposal here: grantproai.com/win-check&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Have No Coding Skills. My Team Is 3 AI Models. Here's What We Built in 2 Months.</title>
      <dc:creator>Bogdan</dc:creator>
      <pubDate>Tue, 06 Oct 2026 18:43:19 +0000</pubDate>
      <link>https://dev.to/bpecha14/i-have-no-coding-skills-my-team-is-3-ai-models-heres-what-we-built-in-2-months-1c59</link>
      <guid>https://dev.to/bpecha14/i-have-no-coding-skills-my-team-is-3-ai-models-heres-what-we-built-in-2-months-1c59</guid>
      <description>&lt;p&gt;Two months ago I started building a SaaS with zero programming background. My whole team is 3 AI models and one human (me). This is the honest account — the features, the bugs only an AI could find, and the rule we now build by.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I'm a solo founder from Ukraine. No code background. Instead of learning to code first, I hired a team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI #1&lt;/strong&gt; writes features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI #2&lt;/strong&gt; handles design and infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI #3&lt;/strong&gt; exists for one purpose: auditing everything the first two ship.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm the founder, product manager, and QA department of one. We run three products (ThumbRank, GrantPro AI, DataEmpire) with two more in development.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem we solve
&lt;/h2&gt;

&lt;p&gt;Every YouTube creator knows the math: a viewer scrolling search results spends about &lt;strong&gt;half a second&lt;/strong&gt; on each thumbnail. If yours doesn't win that half-second, the video doesn't exist — no matter how good it is.&lt;/p&gt;

&lt;p&gt;Yet almost everyone checks their thumbnail the wrong way: full screen, on a desktop monitor, alone. Not next to nine competitors. Not on a phone. Not in the actual place where the decision happens.&lt;/p&gt;

&lt;p&gt;I spent three years growing a channel and made every mistake in that list. &lt;strong&gt;ThumbRank&lt;/strong&gt; is the tool I wish existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built (stack: Next.js + Supabase + Vercel + Paddle)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SERP Radar&lt;/strong&gt; — type any keyword, see the real top-9 YouTube results, every thumbnail scored for contrast, focus, and readability. Upload yours, get a verdict: clickable, or invisible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Thumbnail Score&lt;/strong&gt; — computer-vision grading in the browser (canvas + two-step downscale so JPEG noise doesn't move the score). Nothing is uploaded to a server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitor tracking&lt;/strong&gt; — follow up to 10 channels, get alerted when one swaps a thumbnail. A thumbnail swap is the most honest signal of what's working in a niche.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel X-ray&lt;/strong&gt; — every week the system finds your three weakest thumbnails and writes a diagnosis for each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video Doctor&lt;/strong&gt; — paste a link to any of your videos (even unlisted), get a full packaging report: title, thumbnail, hook, structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Morning digest&lt;/strong&gt; — a daily email with new competitor videos and alerts. (Resend + verified domain, because emails that only reach the founder aren't a product.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Month 1 looked like progress
&lt;/h2&gt;

&lt;p&gt;180K+ previews rendered. Features shipping daily. A launch plan, affiliate links, the whole classic indie playbook.&lt;/p&gt;

&lt;p&gt;Everything looked fine.&lt;/p&gt;

&lt;p&gt;Everything was not fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Month 2: the audit
&lt;/h2&gt;

&lt;p&gt;Before letting anyone pay, I pointed AI #3 at the codebase the other two had written. It read 124 files and came back with 14 bugs. Four were critical — and every one was invisible from the outside:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The payment webhook returned 401 for days.&lt;/strong&gt; Root cause: the signature header format (&lt;code&gt;t=...;h1=...&lt;/code&gt;) wasn't parsed correctly, and after rotating the secret &lt;em&gt;every&lt;/em&gt; live event failed — while the dashboard politely showed "Active". My own subscription was broken and I didn't know it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cron job had never run once.&lt;/strong&gt; Silently. Since the day it was created. The schedule existed, the code existed, the trigger didn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A wrong price ID sat under a correct-looking button.&lt;/strong&gt; A real customer would have paid $49 for the $79 plan and received the wrong thing, with no error message anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two ID systems.&lt;/strong&gt; &lt;code&gt;profiles.id&lt;/code&gt; ≠ &lt;code&gt;auth.users.id&lt;/code&gt; — rows were linked to the wrong identity in half the app. Took a SQL migration (&lt;code&gt;auth_user_id&lt;/code&gt; backfill via email) to converge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix pattern that emerged: &lt;strong&gt;store webhook events first, dedupe by event ID, retry failures, and never trust a green dashboard.&lt;/strong&gt; The dashboards were green the entire time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule we now build by
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fix first. Sell second.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then, because trust in a fix is not proof, I ran a real $20 charge through my own checkout. A fire drill, not revenue. The webhook fired, the plan flipped, the badge updated. Zero real customers so far — but the first one can't break what we already broke ourselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;More honest numbers, posted publicly. The Product Hunt launch. The first real sale when it happens — and the reasons why it took as long as it did.&lt;/p&gt;

&lt;p&gt;If you're building with AI as your team: the code it writes is only half the product. The other half is what you build to catch it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building ThumbRank in public. Free preview, no signup: &lt;a href="https://thumbrankpro.com" rel="noopener noreferrer"&gt;thumbrankpro.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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