<?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: roberto carlesso</title>
    <description>The latest articles on DEV Community by roberto carlesso (@roby61).</description>
    <link>https://dev.to/roby61</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%2F4067379%2Fb72ae0b4-3536-4262-9186-f726e3875ef6.png</url>
      <title>DEV Community: roberto carlesso</title>
      <link>https://dev.to/roby61</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roby61"/>
    <language>en</language>
    <item>
      <title>I built a local-first document organizer for Windows because DEVONthink doesn't exist there</title>
      <dc:creator>roberto carlesso</dc:creator>
      <pubDate>Fri, 07 Aug 2026 11:33:44 +0000</pubDate>
      <link>https://dev.to/roby61/i-built-a-local-first-document-organizer-for-windows-because-devonthink-doesnt-exist-there-1klo</link>
      <guid>https://dev.to/roby61/i-built-a-local-first-document-organizer-for-windows-because-devonthink-doesnt-exist-there-1klo</guid>
      <description>&lt;p&gt;I kept accumulating PDFs, invoices, and contracts in one messy folder with no real way to search inside them — just filenames. DEVONthink solves this well, but it's Mac-only. The open-source alternative, Paperless-ngx, is solid but requires Docker and a self-hosted server, which is overkill if you just want something that runs locally on your own machine.&lt;/p&gt;

&lt;p&gt;So I built Robelius — a Windows desktop tool that indexes PDF, DOCX, and TXT files, makes them fully searchable by content (not just filename), and organizes them automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full-text search, including inside DOCX tables and scanned PDFs (automatic OCR via Tesseract)&lt;/li&gt;
&lt;li&gt;Auto-detects document type (invoice, contract, quote, receipt, resume, certificate) and sorts into folders&lt;/li&gt;
&lt;li&gt;Smart rename based on actual content — document type + date, with a preview before applying anything&lt;/li&gt;
&lt;li&gt;Duplicate detection with a recoverable internal trash (nothing is permanently deleted without explicit confirmation)&lt;/li&gt;
&lt;li&gt;Automatic backup before any operation that moves or deletes files&lt;/li&gt;
&lt;li&gt;Real-time folder monitoring — new files get indexed as soon as they land&lt;/li&gt;
&lt;li&gt;Multi-folder profiles, each with a separate search index (useful if you manage multiple clients)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technically annoying parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SQLite + threading.&lt;/strong&gt; Running the indexer in a background thread (so the GUI doesn't freeze) while sharing a single SQLite connection threw &lt;code&gt;SQLite objects created in a thread can only be used in that same thread&lt;/code&gt; — the fix was &lt;code&gt;check_same_thread=False&lt;/code&gt;, but figuring out &lt;em&gt;why&lt;/em&gt; it broke took longer than fixing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interrupting mid-file, not just mid-folder.&lt;/strong&gt; My first version of the Stop button only checked between files — meaning if you hit Stop while OCR was running on a big scanned PDF, nothing happened until that file finished, sometimes minutes later. Had to push the stop check down into the page-by-page OCR loop itself, and make sure a stopped file doesn't get saved with partial content (otherwise it'd be skipped forever on resume, stuck half-indexed).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tkinter's native dialogs don't theme.&lt;/strong&gt; &lt;code&gt;messagebox&lt;/code&gt; and &lt;code&gt;simpledialog&lt;/code&gt; ignore your app's color scheme entirely — ended up building themed replacements from scratch with &lt;code&gt;Canvas&lt;/code&gt; and &lt;code&gt;Toplevel&lt;/code&gt; to keep a consistent dark UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;p&gt;Windows-only, everything runs locally, nothing sent to the cloud. Free 7-day trial, full features, no credit card:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://payhip.com/b/cUDBw" rel="noopener noreferrer"&gt;https://payhip.com/b/cUDBw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've built something similar or use a different local-first tool for this, I'd like to hear what you use.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>productivity</category>
      <category>windows</category>
    </item>
    <item>
      <title>I built a Windows app to generate compliant e-invoices for 32 European countries</title>
      <dc:creator>roberto carlesso</dc:creator>
      <pubDate>Fri, 07 Aug 2026 11:31:20 +0000</pubDate>
      <link>https://dev.to/roby61/i-built-a-windows-app-to-generate-compliant-e-invoices-for-32-european-countries-242c</link>
      <guid>https://dev.to/roby61/i-built-a-windows-app-to-generate-compliant-e-invoices-for-32-european-countries-242c</guid>
      <description>&lt;p&gt;As a freelancer working across Europe, invoicing was a mess: different VAT rules per country, different e-invoicing formats, and no single tool that handled more than one or two markets well.&lt;/p&gt;

&lt;p&gt;So I built Quorvinfact — a Windows desktop app that generates invoices, quotes, and credit notes for 32 European countries, with proper e-invoicing XML for the four that require it: Italy (FatturaPA), Belgium (Peppol BIS), Poland (KSeF), and Romania (RO e-Factura).&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Company profile + client address book, saved locally&lt;/li&gt;
&lt;li&gt;Invoices, quotes, and credit notes with automatic VAT calculation&lt;/li&gt;
&lt;li&gt;E-invoicing XML generation for IT/BE/PL/RO, alongside a standard PDF for every other supported country&lt;/li&gt;
&lt;li&gt;Document register with search, CSV export, and a monthly VAT summary&lt;/li&gt;
&lt;li&gt;Payment tracker for unpaid invoices (overdue / due-soon status)&lt;/li&gt;
&lt;li&gt;Interface in Italian, English, and Spanish&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technically annoying part
&lt;/h2&gt;

&lt;p&gt;Each country's e-invoicing format is its own small nightmare. FatturaPA wants a specific XML schema with SDI transmission codes. Peppol BIS has its own UBL structure. KSeF requires a different set of mandatory fields entirely. There's no shared standard — I ended up building a separate module per country (&lt;code&gt;fatturapa.py&lt;/code&gt;, &lt;code&gt;peppol.py&lt;/code&gt;, &lt;code&gt;ksef.py&lt;/code&gt;, &lt;code&gt;ro_efactura.py&lt;/code&gt;) instead of trying to force one generic invoice generator to cover all four.&lt;/p&gt;

&lt;p&gt;Font handling was its own problem: DejaVu Sans had to be bundled directly for the extended character sets some countries' fields require (diacritics, etc.), since relying on system fonts broke silently on some Windows installs after PyInstaller packaging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important caveat, stated upfront
&lt;/h2&gt;

&lt;p&gt;The app generates the correct file, but it does &lt;strong&gt;not&lt;/strong&gt; auto-submit it to tax authorities — uploading to the government portal (or a Peppol Access Point for Belgium) is still a manual step. It's a document generator, not a filing service, and I say that explicitly in the app's disclaimer too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;p&gt;Windows-only, no subscriptions. Free 7-day trial, full features, no credit card:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://payhip.com/b/SiLY7" rel="noopener noreferrer"&gt;https://payhip.com/b/SiLY7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If anyone here invoices across multiple EU countries, curious what you currently use and what's missing from it.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>freelance</category>
      <category>europe</category>
    </item>
    <item>
      <title>I built a Windows tool to automate the tedious parts of ebook self-publishing</title>
      <dc:creator>roberto carlesso</dc:creator>
      <pubDate>Fri, 07 Aug 2026 11:27:56 +0000</pubDate>
      <link>https://dev.to/roby61/i-built-a-windows-tool-to-automate-the-tedious-parts-of-ebook-self-publishing-20o9</link>
      <guid>https://dev.to/roby61/i-built-a-windows-tool-to-automate-the-tedious-parts-of-ebook-self-publishing-20o9</guid>
      <description>&lt;p&gt;I publish my own ebooks, and I kept losing hours to the same repetitive checks every time: cover dimensions rejected by KDP, EPUB validation errors that only showed up &lt;em&gt;after&lt;/em&gt; upload, and a spreadsheet to track royalties that I dreaded opening.&lt;/p&gt;

&lt;p&gt;So I built PublishWizard — a Windows desktop tool that automates the parts of self-publishing that have nothing to do with actually writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;EPUB validation via EPUBCheck integration, before you upload anywhere&lt;/li&gt;
&lt;li&gt;Cover validator against KDP / Google Play Books / Gumroad / StreetLib specs&lt;/li&gt;
&lt;li&gt;DOCX → EPUB conversion pipeline with drop caps and auto-generated TOC&lt;/li&gt;
&lt;li&gt;Royalty calculator with visual reports&lt;/li&gt;
&lt;li&gt;AI-assisted keyword research for KDP listings&lt;/li&gt;
&lt;li&gt;Multilingual interface (IT/EN/ES/FR/DE)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technically annoying parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PyInstaller path resolution.&lt;/strong&gt; The app worked perfectly from source, then broke immediately once packaged — turns out frozen builds need a clear split between a writable &lt;code&gt;APP_DIR&lt;/code&gt; and a read-only &lt;code&gt;RESOURCE_DIR&lt;/code&gt;, and I hadn't accounted for that at all in the first version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;f-string compatibility.&lt;/strong&gt; Some users were still on Python 3.10, I was developing on 3.12 — a few f-string constructs I used are 3.12-only. Silent failures on older versions until I caught it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Threading.&lt;/strong&gt; The GUI would freeze during long operations (EPUB generation on large files). Fixed by moving blocking work off the main thread and routing all UI updates back through &lt;code&gt;root.after()&lt;/code&gt; — obvious in hindsight, less obvious when you're debugging a frozen window at 1am.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;p&gt;Windows-only, no subscriptions, no cloud dependency. Free 7-day trial, full features, no credit card:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://payhip.com/b/EiyTM" rel="noopener noreferrer"&gt;https://payhip.com/b/EiyTM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Genuinely curious what other self-publishers here think is missing — I built this around my own workflow, so I know there are blind spots.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>indiehackers</category>
      <category>selfpublishing</category>
    </item>
  </channel>
</rss>
