<?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: Dicpii</title>
    <description>The latest articles on DEV Community by Dicpii (@dicpii).</description>
    <link>https://dev.to/dicpii</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%2F4194444%2F9fc576c0-0160-4761-81b7-79d2a450192d.png</url>
      <title>DEV Community: Dicpii</title>
      <link>https://dev.to/dicpii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dicpii"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Dicpii</dc:creator>
      <pubDate>Mon, 19 Oct 2026 16:05:17 +0000</pubDate>
      <link>https://dev.to/dicpii/-180d</link>
      <guid>https://dev.to/dicpii/-180d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94" class="crayons-story__hidden-navigation-link"&gt;How I Built a Receipt Scanning PWA for French Freelancers (and What I Learned)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/dicpii" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4194444%2F9fc576c0-0160-4761-81b7-79d2a450192d.png" alt="dicpii profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dicpii" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dicpii
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dicpii
                
                
              
              &lt;div id="story-author-preview-content-4878598" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dicpii" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4194444%2F9fc576c0-0160-4761-81b7-79d2a450192d.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dicpii&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 19&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94" id="article-link-4878598"&gt;
          How I Built a Receipt Scanning PWA for French Freelancers (and What I Learned)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/pwa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;pwa&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/buildinpublic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;buildinpublic&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>mobile</category>
      <category>pwa</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built a Receipt Scanning PWA for French Freelancers (and What I Learned)</title>
      <dc:creator>Dicpii</dc:creator>
      <pubDate>Mon, 19 Oct 2026 15:48:46 +0000</pubDate>
      <link>https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94</link>
      <guid>https://dev.to/dicpii/how-i-built-a-receipt-scanning-pwa-for-french-freelancers-and-what-i-learned-3b94</guid>
      <description>&lt;p&gt;How I Built a Receipt Scanning PWA for French Freelancers (and What I Learned)&lt;/p&gt;

&lt;p&gt;A few months ago, I launched &lt;a href="https://scancompta.eu" rel="noopener noreferrer"&gt;ScanCompta&lt;/a&gt; — a Progressive Web App that lets French freelancers and small business owners scan their receipts and manage expense reports, directly from their phone or browser.&lt;/p&gt;

&lt;p&gt;Here's what I learned building it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Was Solving
&lt;/h2&gt;

&lt;p&gt;France has around 4 million self-employed workers — freelancers, tradespeople, VTC drivers, consultants. Most of them handle their own bookkeeping. And they all deal with the same nightmare: &lt;strong&gt;paper receipts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Under French law, receipts must be kept for 10 years (article L.123-22 of the Code de commerce). But since 2017, a regulation (the "arrêté du 22 mars 2017") allows a digital photo to legally replace the paper original — as long as the scan meets specific quality standards.&lt;/p&gt;

&lt;p&gt;The problem: no one knows about this rule. And even fewer people had a simple, affordable tool that actually handled the French-specific stuff: VAT rates (there are 4 in France: 20%, 10%, 5.5%, 2.1%), URSSAF plafonds, the kilometric allowance (which changes every year), etc.&lt;/p&gt;

&lt;p&gt;Existing tools like Expensify or Dext are either too expensive, too complex, or not designed for the French regulatory context. That was my opening.&lt;/p&gt;




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

&lt;p&gt;I built ScanCompta as a &lt;strong&gt;PWA&lt;/strong&gt; for a simple reason: I wanted one codebase that works on iOS, Android, and desktop without going through the App Store review process or paying 30% fees.&lt;/p&gt;

&lt;p&gt;Here's what I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; — component library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Router&lt;/strong&gt; — for SSR and file-based routing (a genuinely underrated tool, especially for SEO since it makes server-side rendering straightforward)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lovable&lt;/strong&gt; — AI-assisted development platform that accelerated the initial build significantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare&lt;/strong&gt; — for CDN, security headers, cache rules, and Brotli compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCR&lt;/strong&gt; — for receipt scanning and data extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SSR part was important. A PWA that is 100% client-rendered is essentially invisible to Google. Getting SSR working properly with TanStack Router took some trial and error — their documentation for SSR patterns is still maturing — but it's worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The SEO Challenge: Ranking for Hyper-Specific French Queries
&lt;/h2&gt;

&lt;p&gt;Building the product was only half the battle. The harder part was getting discovered.&lt;/p&gt;

&lt;p&gt;French freelancers don't search for "expense management software." They search for very specific things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/blog/auto-entrepreneur-garder-tickets-caisse" rel="noopener noreferrer"&gt;Combien de temps garder ses tickets de caisse auto-entrepreneur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/blog/tva-peage-essence-vtc-taxi" rel="noopener noreferrer"&gt;TVA récupérable péage VTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/ticket-de-caisse-perdu" rel="noopener noreferrer"&gt;Ticket de caisse perdu urssaf que faire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/blog/indemnites-kilometriques-ou-frais-reels-2026" rel="noopener noreferrer"&gt;Indemnités kilométriques ou frais réels 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built dedicated landing pages and blog articles for each of these queries. Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/en/blog/sole-trader-keep-receipts" rel="noopener noreferrer"&gt;How long to keep receipts as a sole trader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/en/blog/vat-fuel-toll-receipts-drivers" rel="noopener noreferrer"&gt;VAT on fuel and toll receipts for VTC drivers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/ticket-de-caisse-perdu" rel="noopener noreferrer"&gt;What to do with a lost receipt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scancompta.eu/en/blog/mileage-allowance-vs-actual-expenses-2026" rel="noopener noreferrer"&gt;Mileage allowance vs actual expenses in 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: &lt;strong&gt;in a niche market, long-tail informational content outperforms generic product pages&lt;/strong&gt;. People landing on a "lost receipt" article are exactly the kind of users who would benefit from a receipt scanning app.&lt;/p&gt;




&lt;h2&gt;
  
  
  The JSON-LD Layer
&lt;/h2&gt;

&lt;p&gt;One thing I spent a lot of time on that paid off: &lt;strong&gt;structured data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every page has properly implemented schema markup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SoftwareApplication&lt;/code&gt; on the homepage with pricing, OS compatibility, app category&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BlogPosting&lt;/code&gt; on every article with &lt;code&gt;datePublished&lt;/code&gt;, &lt;code&gt;dateModified&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt; (Organization, not a person), &lt;code&gt;speakable&lt;/code&gt; sections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BreadcrumbList&lt;/code&gt; on every page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FAQPage&lt;/code&gt; on key landing pages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WebSite&lt;/code&gt; with &lt;code&gt;SearchAction&lt;/code&gt; for sitelinks search box&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a small product competing against established players, structured data gives you a disproportionate advantage. Google's AI Overviews and Perplexity both favor sources with clean semantic markup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons for Other Indie Builders
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Pick a market with regulatory complexity.&lt;/strong&gt; French accounting rules are boring to most people but fascinating to French freelancers who are trying not to get audited. Regulatory complexity = less competition + high user anxiety = strong intent to find a solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. SSR matters more than you think for SEO.&lt;/strong&gt; If you're building a SaaS and care about organic traffic, don't ship a pure SPA. TanStack Router's SSR mode, Next.js, Nuxt — pick one. The traffic difference is real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Build one genuinely useful free tool.&lt;/strong&gt; I created a &lt;a href="https://scancompta.eu/frais-kilometriques-2026" rel="noopener noreferrer"&gt;free kilometric allowance calculator&lt;/a&gt; that gets consistent organic traffic. It converts to signups better than any ad campaign because the intent is perfect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Structured data is underinvested by most indie makers.&lt;/strong&gt; It takes a few hours to implement properly and the payoff in Google Search and AI-powered search engines is significant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Localization is not just translation.&lt;/strong&gt; Building for the French market meant understanding French-specific tax rates, legal references, and terminology. A direct translation of an English SaaS would have missed all of that.&lt;/p&gt;




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

&lt;p&gt;I'm currently working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced OCR accuracy&lt;/strong&gt; for faded thermal receipts (a very common problem with French supermarket receipts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct export to accounting software&lt;/strong&gt; used by French accountants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic kilometric log&lt;/strong&gt; from GPS data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something in the "boring but necessary" category — accounting tools, legal document managers, tax calculators — I'd love to hear about it.&lt;/p&gt;

&lt;p&gt;And if you're a French freelancer drowning in paper receipts: &lt;a href="https://scancompta.eu" rel="noopener noreferrer"&gt;give ScanCompta a try&lt;/a&gt;. It's free to start.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by the ScanCompta team. Questions? Comments? Drop them below — I read everything.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>pwa</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
