<?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: Yann_</title>
    <description>The latest articles on Forem by Yann_ (@yannbuilds).</description>
    <link>https://forem.com/yannbuilds</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%2F3768491%2F709edc40-37e6-4189-b4f1-9e6a80ed6b69.png</url>
      <title>Forem: Yann_</title>
      <link>https://forem.com/yannbuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yannbuilds"/>
    <language>en</language>
    <item>
      <title>How I Built a Legal Document Generator for French Small Businesses</title>
      <dc:creator>Yann_</dc:creator>
      <pubDate>Fri, 03 Apr 2026 20:49:29 +0000</pubDate>
      <link>https://forem.com/yannbuilds/how-i-built-a-legal-document-generator-for-french-small-businesses-1i10</link>
      <guid>https://forem.com/yannbuilds/how-i-built-a-legal-document-generator-for-french-small-businesses-1i10</guid>
      <description>&lt;p&gt;I'm a solo developer shipping SaaS products for the French market. One of my recent builds is &lt;a href="https://auto-duerp.fr" rel="noopener noreferrer"&gt;Auto-DUERP&lt;/a&gt; — a tool that generates a mandatory workplace risk assessment document (called "DUERP" in France) that every employer must have.&lt;/p&gt;

&lt;p&gt;Here's the story of why I built it, and the technical decisions behind it.&lt;/p&gt;

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

&lt;p&gt;In France, &lt;strong&gt;every company with at least one employee&lt;/strong&gt; must produce a DUERP (Document Unique d'Evaluation des Risques Professionnels). It's a legal obligation since 2001.&lt;/p&gt;

&lt;p&gt;The reality? Most small business owners either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pay 200-500 EUR to a consultant for a generic template&lt;/li&gt;
&lt;li&gt;Download a random Word file from the internet and hope it's compliant&lt;/li&gt;
&lt;li&gt;Simply don't have one (and risk fines up to 10,000 EUR)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I saw an opportunity for a self-service tool at 49 EUR — 4-10x cheaper than a consultant, but actually tailored to their specific industry.&lt;/p&gt;

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

&lt;p&gt;I used the same monorepo setup I use for all my products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router) with TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prisma + PostgreSQL&lt;/strong&gt; for data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; for payments (one-shot, no subscription)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@react-pdf/renderer&lt;/strong&gt; for PDF generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini API&lt;/strong&gt; for AI-powered risk suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The monorepo also hosts &lt;a href="https://sci-facile.fr" rel="noopener noreferrer"&gt;SCI Facile&lt;/a&gt; (a tool for creating French real estate companies) and &lt;a href="https://lmnp-facile.fr" rel="noopener noreferrer"&gt;LMNP Facile&lt;/a&gt; (rental property tax filing). Shared auth, shared Stripe integration, shared UI components.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Sector-specific data
&lt;/h3&gt;

&lt;p&gt;I compiled risk data for &lt;strong&gt;34 professional sectors&lt;/strong&gt; from INRS (France's national occupational safety institute). Each sector has pre-filled risks, prevention measures, and severity ratings.&lt;/p&gt;

&lt;p&gt;A restaurant owner doesn't see the same risks as an electrician. This is the key differentiator vs. generic templates.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The 5-step wizard
&lt;/h3&gt;

&lt;p&gt;The user flow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Company info&lt;/strong&gt; — name, SIRET, sector, employee count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work units&lt;/strong&gt; — define areas/departments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk identification&lt;/strong&gt; — AI suggests risks based on sector, user validates/edits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevention measures&lt;/strong&gt; — existing and planned measures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review &amp;amp; generate&lt;/strong&gt; — preview, pay, download PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No account required. Privacy-first: we don't store personal data after PDF generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. PDF generation
&lt;/h3&gt;

&lt;p&gt;The hardest part was making the PDF look professional. &lt;code&gt;@react-pdf/renderer&lt;/code&gt; is powerful but has its quirks — no CSS grid, limited flexbox, font loading issues.&lt;/p&gt;

&lt;p&gt;I ended up building a custom PDF template with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company header with logo&lt;/li&gt;
&lt;li&gt;Risk matrix (severity x probability)&lt;/li&gt;
&lt;li&gt;Color-coded risk levels&lt;/li&gt;
&lt;li&gt;Prevention action plan with deadlines&lt;/li&gt;
&lt;li&gt;Legal compliance footer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. AI-assisted risk identification
&lt;/h3&gt;

&lt;p&gt;When a user selects "Restaurant" as their sector, the AI pre-fills common risks (burns, slips, repetitive strain, etc.). But it also adapts based on the specifics — a restaurant with a terrace has different risks than one with only indoor seating.&lt;/p&gt;

&lt;p&gt;I use Gemini for this because the cost per generation is negligible at our volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO as the growth engine
&lt;/h2&gt;

&lt;p&gt;No ads budget. No sales team. Just SEO.&lt;/p&gt;

&lt;p&gt;I built programmatic pages for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every sector (&lt;code&gt;/secteur/restaurant&lt;/code&gt;, &lt;code&gt;/secteur/electricien&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Major French cities (&lt;code&gt;/ville/paris&lt;/code&gt;, &lt;code&gt;/ville/lyon&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;A glossary of workplace safety terms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives us ~500 indexable pages from day one. The same strategy I used for my &lt;a href="https://comparatif-compta.fr" rel="noopener noreferrer"&gt;comparison sites&lt;/a&gt; — but applied to a SaaS product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live in production in 10 days from idea to launch&lt;/li&gt;
&lt;li&gt;Indexed by Google within 48 hours (thanks to IndexNow)&lt;/li&gt;
&lt;li&gt;First organic traffic within a week&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one-shot pricing (49 EUR) means no churn to worry about. Each customer is profitable from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Legal products need trust signals.&lt;/strong&gt; Security headers, legal pages, HTTPS — the basics matter more when you're selling compliance tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PDF generation is underrated as a moat.&lt;/strong&gt; Most competitors offer Word templates. A polished, auto-generated PDF feels 10x more professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monorepo saves weeks.&lt;/strong&gt; Sharing auth, payments, and UI across &lt;a href="https://auto-duerp.fr" rel="noopener noreferrer"&gt;Auto-DUERP&lt;/a&gt;, &lt;a href="https://sci-facile.fr" rel="noopener noreferrer"&gt;SCI Facile&lt;/a&gt;, and &lt;a href="https://lmnp-facile.fr" rel="noopener noreferrer"&gt;LMNP Facile&lt;/a&gt; meant I only had to build the domain-specific logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI is the seasoning, not the dish.&lt;/strong&gt; The real value is the sector-specific data and the compliance structure. AI just makes the UX smoother.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;If you're building for a regulated market, don't underestimate the power of "making the boring thing easy." Nobody &lt;em&gt;wants&lt;/em&gt; to write a DUERP. But everybody &lt;em&gt;has to&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's where the money is.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I ship 15 web products solo — here's my AI-assisted workflow</title>
      <dc:creator>Yann_</dc:creator>
      <pubDate>Wed, 25 Mar 2026 12:48:12 +0000</pubDate>
      <link>https://forem.com/yannbuilds/i-ship-15-web-products-solo-heres-my-ai-assisted-workflow-2645</link>
      <guid>https://forem.com/yannbuilds/i-ship-15-web-products-solo-heres-my-ai-assisted-workflow-2645</guid>
      <description>&lt;p&gt;I'm a solo developer running 15 web products in production. SaaS tools, programmatic SEO sites, an npm package, a brand kit generator. No team, no cofounder, no agency. Just me, a standardized stack, and Claude Code as a copilot embedded in every step of the pipeline.&lt;/p&gt;

&lt;p&gt;This is not a "look how smart I am" post. Half of these products make zero revenue. But the system that lets me ship them fast, maintain them, and kill the losers early — that part works. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The factory mindset
&lt;/h2&gt;

&lt;p&gt;I call my system "L'Usine" (French for "the factory"). It's a monorepo of markdown files, shell scripts, checklists, and prompt templates that wraps around Claude Code. The idea is simple: &lt;strong&gt;standardize everything so the AI can be useful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When every project uses the same stack (Next.js, TypeScript, Tailwind, Prisma, Stripe), the same file structure, and the same conventions, the LLM doesn't have to guess. It knows where the DB singleton lives. It knows &lt;code&gt;"use client"&lt;/code&gt; goes on leaf components only. It knows &lt;code&gt;select&lt;/code&gt; not &lt;code&gt;include&lt;/code&gt; on listing pages.&lt;/p&gt;

&lt;p&gt;The whole pipeline is one command: &lt;code&gt;/build&lt;/code&gt;. It walks through phases — Discovery, Spec, Design, Scaffold, Code, QA, Ship — with a gate at each step. The AI proposes, I decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real session looks like
&lt;/h2&gt;

&lt;p&gt;Here's an actual example. I needed &lt;a href="https://lmnp-facile.fr" rel="noopener noreferrer"&gt;LMNP Facile&lt;/a&gt;, a one-shot tool that generates French tax declarations for rental property owners. 49 EUR, no subscription, peak season in April-May.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt I gave Claude Code:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;/build new&lt;br&gt;
SaaS one-shot 49 EUR. Generates LMNP tax declarations (cerfa 2031/2033) for French micro-BIC landlords. User inputs property info + rental income,  app generates pre-filled PDFs ready to submit to tax authorities.&lt;br&gt;
Target: non-accountant landlords who don't want to pay 500 EUR/year for an expert-comptable. Season: April-May.&lt;/p&gt;

&lt;p&gt;Claude walked me through Oracle scoring (PAIN 22/25, MONEY 20/25), generated the brief, built the Prisma schema, scaffolded routes with the standard template. The whole spec-to-scaffold phase took about 90 minutes of interactive work.&lt;/p&gt;

&lt;p&gt;Then for the code phase, Claude worked inside the project directory with its own &lt;code&gt;AI-CONTEXT.md&lt;/code&gt; — a machine-readable spec file that keeps the LLM on track across sessions. No "remind me what this project does." The context is always there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The multi-agent harness
&lt;/h2&gt;

&lt;p&gt;For more ambitious builds, I use a multi-agent architecture: three separate Claude processes chained via a bash script.&lt;/p&gt;

&lt;p&gt;Planner (1M context) → plan.md → Generator (1M context) → code → Evaluator (1M context)&lt;br&gt;
                                          ↑                              |&lt;br&gt;
                                          └── feedback if FAIL ──────────┘&lt;/p&gt;

&lt;p&gt;Each agent gets a fresh 1M-token context window. No pollution between them. The planner generates an ambitious feature list. The generator builds it feature by feature. The evaluator runs &lt;code&gt;npm run build&lt;/code&gt;, reads the code, and scores it across functional completeness, infrastructure (security headers, Prisma indexes, SEO setup), and design quality.&lt;/p&gt;

&lt;p&gt;If the score is below threshold (default 7/10), the evaluator's feedback loops back to the generator for another round. If the score stagnates after two rounds, the system kills the loop — because a fresh context will do better than patching a degraded one.&lt;/p&gt;

&lt;p&gt;This is not autonomous AGI magic. It's structured prompt engineering with file-based communication. But it lets me prototype a full SaaS in hours, not days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 682-line QA checklist
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody tells you about AI-generated code: &lt;strong&gt;it compiles but it doesn't ship.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The LLM will forget &lt;code&gt;security.txt&lt;/code&gt;. It will use &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; instead of &lt;code&gt;next/image&lt;/code&gt;. It will slap &lt;code&gt;shadow-2xl&lt;/code&gt; on every card and &lt;code&gt;bg-gradient-to-r from-purple-500 to-pink-500&lt;/code&gt; on every heading. It will skip &lt;code&gt;@@index&lt;/code&gt; on your Prisma &lt;code&gt;userId&lt;/code&gt; fields. It will put Stripe secret keys in &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; variables.&lt;/p&gt;

&lt;p&gt;So I built a 682-line QA checklist organized in three tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T1 BLOQUANT&lt;/strong&gt; (24 items) — no deploy without these. Legal pages, security headers, &lt;code&gt;robots.ts&lt;/code&gt; blocking AI bots, &lt;code&gt;poweredByHeader: false&lt;/code&gt;, correct French accents in all data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T2 CRITICAL&lt;/strong&gt; (first week) — structured data, OG images, Prisma &lt;code&gt;select&lt;/code&gt; on listings, font &lt;code&gt;display: "swap"&lt;/code&gt;, loading skeletons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T3 GROWTH&lt;/strong&gt; (month 1-3) — CRO, content scaling, domain authority.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evaluator agent in the harness grades against this checklist automatically. In my manual workflow, I run &lt;code&gt;/qc&lt;/code&gt; which loads the checklist and audits the project. It catches things like: "you have 437 occurrences of missing French accents in your data files" (true story from one of my &lt;a href="https://comparatif-compta.fr" rel="noopener noreferrer"&gt;programmatic SEO sites&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I also maintain a design knowledge base extracted from auditing Linear, Vercel, and Stripe. It defines exact shadow hierarchies (&lt;code&gt;shadow-sm&lt;/code&gt; for cards, &lt;code&gt;shadow-xl&lt;/code&gt; for modals only), radius rules, transition durations (150ms for color, 200ms for transforms), and a list of things elite products never do. This is what keeps the output from looking like a free template.&lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;/sample&lt;/code&gt; command: parallel exploration
&lt;/h2&gt;

&lt;p&gt;When I need creative variation — landing pages, UI components, pricing sections — I use &lt;code&gt;/sample&lt;/code&gt;. It launches N parallel Claude agents, each in an isolated git worktree, each with a different creative brief.&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;/sample 3 "LP minimaliste SaaS facturation"&lt;/code&gt; generates three candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A: Minimal radical (inspired by Resend, near-zero color)&lt;/li&gt;
&lt;li&gt;B: Warm and accessible (inspired by Notion, serif headings)&lt;/li&gt;
&lt;li&gt;C: Data-driven and dense (inspired by Linear, dark option)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After generation, deterministic checks run on each: build pass/fail, TypeScript errors, grep for AI-slop patterns (&lt;code&gt;shadow-xl&lt;/code&gt;, &lt;code&gt;hover:scale-105&lt;/code&gt;, &lt;code&gt;animate-bounce&lt;/code&gt;). Then I compare and pick. Or cherry-pick elements from multiple candidates.&lt;/p&gt;

&lt;p&gt;I used this heavily for &lt;a href="https://lecapybara.fr" rel="noopener noreferrer"&gt;LeCapybara&lt;/a&gt;, which is now my gold standard — every new project clones its patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually works and what doesn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Works great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scaffolding. Going from idea to running &lt;code&gt;npm run dev&lt;/code&gt; with auth, DB, Stripe, SEO setup in under 2 hours.&lt;/li&gt;
&lt;li&gt;Repetitive infrastructure. Security headers, sitemap generation, structured data — the LLM nails this when given a checklist.&lt;/li&gt;
&lt;li&gt;Programmatic SEO at scale. I run 10 comparison sites covering French B2B software niches. Same template, different data. AI generates the initial content, &lt;a href="https://indxel.com" rel="noopener noreferrer"&gt;Indxel&lt;/a&gt; (my own npm package / SEO crawler) validates quality.&lt;/li&gt;
&lt;li&gt;Brand generation. &lt;a href="https://oneminutebranding.com" rel="noopener noreferrer"&gt;OneMinuteBranding&lt;/a&gt; started as an internal tool to generate brand kits for my own projects. Then someone paid 49 EUR for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Doesn't work (yet):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revenue. 147 EUR total across 15 products. The factory ships fast but distribution is the bottleneck.&lt;/li&gt;
&lt;li&gt;Design taste. The LLM's default aesthetic is "startup template from 2022." Without the design KB and the anti-slop patterns, every output looks the same.&lt;/li&gt;
&lt;li&gt;Complex business logic. Tax calculation rules, regulatory compliance, financial formulas — these need manual verification every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The uncomfortable truth
&lt;/h2&gt;

&lt;p&gt;I built an elaborate system to ship products fast. But "shipping fast" is the easy part. Finding paying customers is the hard part, and no amount of AI assistance changes that.&lt;/p&gt;

&lt;p&gt;The system does give me one advantage: &lt;strong&gt;I can afford to experiment.&lt;/strong&gt; When you can go from idea to production in a weekend, you can test 15 ideas and see what sticks instead of betting everything on one. Two products have actual sales. Most have growing search traffic. The factory is young.&lt;/p&gt;

&lt;p&gt;If you want to try something similar, start with the boring parts: standardize your stack, write down your conventions in a machine-readable format, build checklists for the things you keep forgetting. The AI gets dramatically better when it has guardrails.&lt;/p&gt;

&lt;p&gt;You can find my work at &lt;a href="https://yann-lephay.com" rel="noopener noreferrer"&gt;yann-lephay.com&lt;/a&gt;. The factory keeps shipping.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I built a CLI that fails your build on broken SEO</title>
      <dc:creator>Yann_</dc:creator>
      <pubDate>Thu, 12 Feb 2026 11:14:00 +0000</pubDate>
      <link>https://forem.com/yannbuilds/i-built-a-cli-that-fails-your-build-on-broken-seo-425k</link>
      <guid>https://forem.com/yannbuilds/i-built-a-cli-that-fails-your-build-on-broken-seo-425k</guid>
      <description>&lt;p&gt;Last week, I spent two hours copy-pasting data from Screaming Frog into my CLI so Claude could analyze the issues and suggest fixes. One page at a time. Like it was 2014.&lt;/p&gt;

&lt;p&gt;Then I thought: there has to be an API for this. I found DataForSEO. Went to sign up. They asked me to explain &lt;em&gt;why&lt;/em&gt; I wanted access — like I was applying for a loan, not an API key. I closed the tab.&lt;/p&gt;

&lt;p&gt;That's when I decided to build my own tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem nobody talks about
&lt;/h2&gt;

&lt;p&gt;Here's what happens to most developers: you ship a site, it looks great, traffic comes in. Then one day you refactor a layout, or you update a CMS, or you deploy a new page — and silently, without any warning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A meta description disappears&lt;/li&gt;
&lt;li&gt;An og:image starts returning 404&lt;/li&gt;
&lt;li&gt;Structured data breaks because someone renamed a field&lt;/li&gt;
&lt;li&gt;A page accidentally gets &lt;code&gt;noindex&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody tells you. There's no error in the console. No failing test. No red CI badge.&lt;/p&gt;

&lt;p&gt;Three weeks later, traffic drops. You check Google Search Console. Half your pages lost their rich snippets. The og:image that's been broken? That was your most shared page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEO breaks silently. That's the entire problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if your build just... failed?
&lt;/h2&gt;

&lt;p&gt;I wanted something dead simple. Like ESLint, but for SEO. You run a command, it tells you what's broken, and in CI mode it exits with code 1 so your build fails before broken SEO reaches production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx indxel check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Found 12 pages

  /                 95/100  A
  /pricing          88/100  B
  /blog             91/100  A
  /blog/my-post     62/100  D
    ✗ Missing og:image
    ! Title too short (42 chars)
  /about            90/100  A

  Score: 85/100 (B)
  Pages: 11/12 pass
  1 critical issue.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;30+ rules, zero config, 30 seconds. It checks title and meta description (presence + length), Open Graph tags, canonical URLs, structured data (JSON-LD), robots directives, Twitter cards, viewport meta, favicon, and hreflang for multi-language sites.&lt;/p&gt;

&lt;p&gt;Each rule has a point value. Total score out of 100. Letter grade. You know exactly where you stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CI/CD guard
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most proud of. One flag and your SEO is protected on every deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx indxel check &lt;span class="nt"&gt;--ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs the same audit, but exits with code 1 if there are critical errors. Plug it into GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SEO Check&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;seo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx indxel check --ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or into your Vercel build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx indxel check --ci &amp;amp;&amp;amp; next build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Broken SEO never reaches production. That's the promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO diff between deploys
&lt;/h2&gt;

&lt;p&gt;This one came from my own frustration. I'd fix 3 issues, deploy, then realize I'd introduced 2 new ones. So I added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx indxel check &lt;span class="nt"&gt;--diff&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Score: 78 → 83 (+5)

IMPROVEMENTS (2):
  + /pricing  82 → 88
  + /about    85 → 90

REGRESSIONS (1):
  - /blog/my-post  70 → 62
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git diff, but for SEO. You see exactly what improved and what regressed since the last check.&lt;/p&gt;

&lt;h2&gt;
  
  
  It also works with AI
&lt;/h2&gt;

&lt;p&gt;Indxel ships as an MCP server, which means Claude, Cursor, and other AI assistants can audit your SEO while you're editing code.&lt;/p&gt;

&lt;p&gt;Instead of copy-pasting from Screaming Frog into your AI tool (like I was doing last week), you just ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check the SEO on /pricing"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude runs the audit and tells you your og:image is broken. Without leaving your editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"indxel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"indxel-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the full setup for Claude Desktop or Cursor. It's a small thing, but it closes the loop — the same tool that guards your CI also powers your AI assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm sharing this
&lt;/h2&gt;

&lt;p&gt;I use AI tools heavily, I build things to solve my own problems, and I ship fast. I built Indxel in 1 week.&lt;/p&gt;

&lt;p&gt;I'm sharing this because the problem is real and I know I'm not the only one who's been burned by silent SEO regressions. If you've ever deployed a site and found out weeks later that half your pages had no meta tags — this is for you.&lt;/p&gt;

&lt;p&gt;The npm package and CLI are MIT licensed, free forever. There's a paid dashboard for monitoring and indexation tracking, but the core tool will always be open source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it now — takes 30 seconds, no signup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx indxel init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/indxel/indxel" rel="noopener noreferrer"&gt;github.com/indxel/indxel&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/indxel" rel="noopener noreferrer"&gt;npmjs.com/package/indxel&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://indxel.com" rel="noopener noreferrer"&gt;indxel.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What SEO checks would you add? What did I miss? Drop a comment or open an issue on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>nextjs</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
