<?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: ox3adie1</title>
    <description>The latest articles on DEV Community by ox3adie1 (@ox3adie1).</description>
    <link>https://dev.to/ox3adie1</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%2F3612855%2Fb9d3c9a6-3991-4eb0-aed1-10b430da91fe.png</url>
      <title>DEV Community: ox3adie1</title>
      <link>https://dev.to/ox3adie1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ox3adie1"/>
    <language>en</language>
    <item>
      <title>How I Built a Niche File Converter for Turkish Lawyers</title>
      <dc:creator>ox3adie1</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:36:14 +0000</pubDate>
      <link>https://dev.to/ox3adie1/how-i-built-a-niche-file-converter-for-turkish-lawyers-b8h</link>
      <guid>https://dev.to/ox3adie1/how-i-built-a-niche-file-converter-for-turkish-lawyers-b8h</guid>
      <description>&lt;p&gt;Ever heard of a &lt;code&gt;.udf&lt;/code&gt; file? Probably not — unless you're a Turkish lawyer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Turkey has one of the world's most comprehensive digital judiciary systems called &lt;strong&gt;UYAP&lt;/strong&gt; (National Judiciary Informatics System). It connects all courts, prosecutors, lawyers, and even prisons across the country.&lt;/p&gt;

&lt;p&gt;The catch? UYAP's document editor saves files in a proprietary format called &lt;strong&gt;UDF (UYAP Document Format)&lt;/strong&gt;. These &lt;code&gt;.udf&lt;/code&gt; files can only be opened with the UYAP Document Editor — a program that only runs on computers connected to the UYAP network.&lt;/p&gt;

&lt;p&gt;This means hundreds of thousands of lawyers struggle to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share court documents with clients&lt;/li&gt;
&lt;li&gt;Read case files on their phones&lt;/li&gt;
&lt;li&gt;Archive documents in a universal format&lt;/li&gt;
&lt;li&gt;Print documents outside the courthouse&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://convertudftopdf.com" rel="noopener noreferrer"&gt;convertudftopdf.com&lt;/a&gt; — a free, browser-based UDF to PDF converter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Technical Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. 100% Client-Side Processing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Legal documents are sensitive. No file should ever touch a server. The entire conversion happens in the browser using JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSZip&lt;/strong&gt; for extracting UDF archive contents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jsPDF&lt;/strong&gt; for PDF generation with Turkish character support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noto Serif&lt;/strong&gt; font embedded for proper Turkish characters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Pages&lt;/strong&gt; for hosting (free, fast, global CDN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Turkish Character Support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the trickiest part. Turkish has special characters that many PDF libraries don't handle well. I embedded Noto Serif font variants to ensure perfect rendering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Batch Processing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lawyers often need to convert dozens of files. The tool supports multi-file selection with drag-and-drop, converting all files sequentially and offering a ZIP download.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ultra-Niche Advantage
&lt;/h2&gt;

&lt;p&gt;Here's the interesting business insight: when your product serves an ultra-niche market, &lt;strong&gt;you might be the only solution&lt;/strong&gt;. There's essentially zero competition for "UDF to PDF conversion" because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The market is too small for big companies to care&lt;/li&gt;
&lt;li&gt;Understanding the format requires domain knowledge of Turkish legal tech&lt;/li&gt;
&lt;li&gt;The user base is geographically concentrated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means even basic SEO puts you at the top of search results for your target keywords.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The site launched recently and is already getting organic traffic from Turkish lawyers searching for UDF conversion solutions. The conversion happens entirely in the browser, so server costs are essentially zero (just static hosting on Cloudflare Pages).&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you're curious (or happen to be a Turkish lawyer):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Converter:&lt;/strong&gt; &lt;a href="https://convertudftopdf.com" rel="noopener noreferrer"&gt;convertudftopdf.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;English guide:&lt;/strong&gt; &lt;a href="https://convertudftopdf.com/en/what-is-udf.html" rel="noopener noreferrer"&gt;What is UDF?&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Niche is powerful&lt;/strong&gt; — Being the only solution in a specific space beats being one of thousands in a broad space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy as a feature&lt;/strong&gt; — Client-side processing isn't just a technical choice, it's a trust signal for legal professionals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand your users&lt;/strong&gt; — Turkish lawyers need Turkish language support, mobile compatibility, and zero friction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static sites scale infinitely&lt;/strong&gt; — When processing happens client-side, your hosting costs don't increase with users&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Have you built something for an ultra-niche market? I'd love to hear about it in the comments!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How I Ended Up Building a Stable Async Processor for n8n (and Turned It Into a PRO Tempate)</title>
      <dc:creator>ox3adie1</dc:creator>
      <pubDate>Sat, 15 Nov 2025 19:20:58 +0000</pubDate>
      <link>https://dev.to/ox3adie1/how-i-ended-up-building-a-stable-async-processor-for-n8n-and-turned-it-into-a-pro-tempate-164m</link>
      <guid>https://dev.to/ox3adie1/how-i-ended-up-building-a-stable-async-processor-for-n8n-and-turned-it-into-a-pro-tempate-164m</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Stable Asynchronous Batch Processor for n8n (And Why the Default Loops Weren’t Enough)
&lt;/h1&gt;

&lt;p&gt;Async API workflows in n8n get messy fast.&lt;/p&gt;

&lt;p&gt;Timeouts, rate limits, unstable endpoints, CRM sync delays, retries…&lt;br&gt;&lt;br&gt;
I kept running into the same problems over and over.&lt;/p&gt;

&lt;p&gt;So I built a &lt;strong&gt;modular, safe, reusable async batch processor&lt;/strong&gt; — and this post explains the pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Core Problem
&lt;/h2&gt;

&lt;p&gt;Normal loops in n8n fail when you push large datasets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random HTTP timeouts
&lt;/li&gt;
&lt;li&gt;APIs enforcing strict rate limits
&lt;/li&gt;
&lt;li&gt;Retry logic is inconsistent
&lt;/li&gt;
&lt;li&gt;Long chains become unmaintainable
&lt;/li&gt;
&lt;li&gt;Webhook-based CRMs randomly drop requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed something &lt;strong&gt;predictable&lt;/strong&gt; and &lt;strong&gt;production-safe&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Architecture (High-level)
&lt;/h2&gt;

&lt;p&gt;This pattern has 5 independent responsibilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SplitInBatches → Iteration controller&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Request Wrapper → Safe executor&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry Engine → Idempotent retries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Wait Node → Rate-limit aware sleeps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified Output Contract → Consistent structure&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A clean pipeline:&lt;/p&gt;

&lt;p&gt;Items → Split → Safe Execution → Retry → Dynamic Wait → Output&lt;/p&gt;

&lt;p&gt;yaml&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Safe HTTP Executor (Core Logic)
&lt;/h2&gt;

&lt;p&gt;json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "status": "success",&lt;br&gt;
  "duration": 128,&lt;br&gt;
  "response": { "id": 123 }&lt;br&gt;
}&lt;br&gt;
yaml&lt;/p&gt;

&lt;p&gt;This guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No broken items
&lt;/li&gt;
&lt;li&gt;No partial failures
&lt;/li&gt;
&lt;li&gt;Normalized contract for every loop
&lt;/li&gt;
&lt;li&gt;Predictable behavior in AI agents, CRMs, and bulk API workflows
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Retry Engine
&lt;/h2&gt;

&lt;p&gt;Retries are based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeout detection
&lt;/li&gt;
&lt;li&gt;HTTP error classes
&lt;/li&gt;
&lt;li&gt;API vendor signals
&lt;/li&gt;
&lt;li&gt;Exponential wait pattern
&lt;/li&gt;
&lt;li&gt;Circuit-breaker protection
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified sample:&lt;/p&gt;

&lt;p&gt;json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "retry": {&lt;br&gt;
    "attempt": 2,&lt;br&gt;
    "max": 3,&lt;br&gt;
    "reason": "429 rate limit"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
yaml&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Dynamic Wait Engine
&lt;/h2&gt;

&lt;p&gt;Instead of using the static Wait node:&lt;/p&gt;

&lt;p&gt;Wait 1 second → Still rate limited → Fail.&lt;/p&gt;

&lt;p&gt;diff&lt;/p&gt;

&lt;p&gt;Dynamic Wait computes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vendor’s retry-after value
&lt;/li&gt;
&lt;li&gt;Backoff curve
&lt;/li&gt;
&lt;li&gt;High-load protection
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "waitMs": "={{ $json.rateWait }}"&lt;br&gt;
}&lt;br&gt;
yaml&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Normalized Output Contract
&lt;/h2&gt;

&lt;p&gt;Every item returns:&lt;/p&gt;

&lt;p&gt;json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "status": "success",&lt;br&gt;
  "duration": 128,&lt;br&gt;
  "response": { "id": 123 }&lt;br&gt;
}&lt;br&gt;
yaml&lt;/p&gt;




&lt;h2&gt;
  
  
  7. PRO JSON Template (Preview Only)
&lt;/h2&gt;

&lt;p&gt;Short preview (full version is much larger):&lt;/p&gt;

&lt;p&gt;json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "name": "Async Batch Processor — Core",&lt;br&gt;
  "nodes": [&lt;br&gt;
    {&lt;br&gt;
      "id": "SplitInBatches",&lt;br&gt;
      "type": "splitInBatches",&lt;br&gt;
      "parameters": { "batchSize": 10 }&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "id": "DynamicWait",&lt;br&gt;
      "type": "wait",&lt;br&gt;
      "parameters": {&lt;br&gt;
        "duration": "={{$json.rateWait}}"&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
yaml&lt;/p&gt;




&lt;h2&gt;
  
  
  8. What the PRO Version Adds
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full JSON template
&lt;/li&gt;
&lt;li&gt;Modular clean blocks
&lt;/li&gt;
&lt;li&gt;Retry-safe HTTP node
&lt;/li&gt;
&lt;li&gt;Dynamic wait engine
&lt;/li&gt;
&lt;li&gt;Request isolation
&lt;/li&gt;
&lt;li&gt;Usage guide
&lt;/li&gt;
&lt;li&gt;Best practices
&lt;/li&gt;
&lt;li&gt;Production-ready architecture
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Faster debugging.&lt;br&gt;&lt;br&gt;
Enterprise-grade stability.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Download the Full PRO Template
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;PRO version (import-ready):&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://workflowslab.gumroad.com/l/batch-processor-template" rel="noopener noreferrer"&gt;https://workflowslab.gumroad.com/l/batch-processor-template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full JSON (1500+ lines)
&lt;/li&gt;
&lt;li&gt;Retry-safe executor
&lt;/li&gt;
&lt;li&gt;Modular blocks
&lt;/li&gt;
&lt;li&gt;Rate-limit engine
&lt;/li&gt;
&lt;li&gt;Usage guide
&lt;/li&gt;
&lt;li&gt;Best practices
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Need a Custom Recommendation?
&lt;/h2&gt;

&lt;p&gt;If you want a custom suggestion for your use case (CRM, bots, agents, billing, integrations), send me a message — I’ll recommend the best workflow.&lt;/p&gt;




&lt;p&gt;Thanks for reading!&lt;br&gt;&lt;br&gt;
I’ll publish more production-ready n8n patterns soon.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>async</category>
      <category>developers</category>
    </item>
  </channel>
</rss>
