<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cases on Blog.Airat.Top</title><link>https://blog.airat.top/categories/cases/</link><description>Recent content in Cases on Blog.Airat.Top</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 27 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.airat.top/categories/cases/index.xml" rel="self" type="application/rss+xml"/><item><title>Why I Built Small Public Tools for Daily Workflows</title><link>https://blog.airat.top/p/why-i-built-small-public-tools-for-daily-workflows/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.airat.top/p/why-i-built-small-public-tools-for-daily-workflows/</guid><description>&lt;img src="https://blog.airat.top/p/why-i-built-small-public-tools-for-daily-workflows/cover.webp" alt="Featured image of post Why I Built Small Public Tools for Daily Workflows" /&gt;&lt;p&gt;I keep building small public tools for one simple reason: I actually use them.&lt;/p&gt;
&lt;p&gt;These are not &amp;ldquo;startup products&amp;rdquo; in disguise. They are small focused tools that solve repeated problems in my daily work across automation, internal systems, AI-assisted content workflows, and general operations.&lt;/p&gt;
&lt;p&gt;That is the same logic behind my API collection, just on the browser side instead of the endpoint side. If the API article was about pulling narrow automation logic into reusable URLs, this one is about keeping repetitive interactive tasks in lightweight public tools that I can open instantly and trust for day-to-day work. The API side is covered in &lt;a class="link" href="https://blog.airat.top/p/why-i-built-small-public-apis-for-automation-workflows/" &gt;Why I Built Small Public APIs for Automation Workflows&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-i-prefer-small-tools-over-one-big-platform"&gt;Why I prefer small tools over one big platform
&lt;/h2&gt;&lt;p&gt;The usual temptation is to combine everything into one dashboard: UUIDs, UTM tags, passwords, previews, formatting, randomization, task tracking, and whatever comes next.&lt;/p&gt;
&lt;p&gt;I almost never like that model.&lt;/p&gt;
&lt;p&gt;When a tool has one job, it stays faster to open, easier to understand, and easier to trust. I can go directly to the tool, do one job, and leave.&lt;/p&gt;
&lt;p&gt;That matters more than it sounds. In real work, a lot of friction comes from tiny repeated actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generate a batch of IDs;&lt;/li&gt;
&lt;li&gt;build a campaign URL;&lt;/li&gt;
&lt;li&gt;preview Markdown before publishing;&lt;/li&gt;
&lt;li&gt;inspect or convert a JSON payload;&lt;/li&gt;
&lt;li&gt;generate secure credentials;&lt;/li&gt;
&lt;li&gt;produce many randomized text variants from a template;&lt;/li&gt;
&lt;li&gt;break a task into smaller actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those actions happen often enough, a focused tool is usually better than another overbuilt internal panel.&lt;/p&gt;
&lt;h2 id="the-shared-design-pattern"&gt;The shared design pattern
&lt;/h2&gt;&lt;p&gt;These projects are different, but most of them follow the same operating model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;static deployment on Cloudflare Pages;&lt;/li&gt;
&lt;li&gt;no custom backend to maintain;&lt;/li&gt;
&lt;li&gt;no database layer to babysit;&lt;/li&gt;
&lt;li&gt;local settings or browser-side storage where it actually helps;&lt;/li&gt;
&lt;li&gt;open-source repositories so the behavior is inspectable;&lt;/li&gt;
&lt;li&gt;light and dark themes, minimal UI, and fast load time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most of these tools, that is enough. If a tool&amp;rsquo;s purpose is simple enough, the implementation should stay simple too.&lt;/p&gt;
&lt;h2 id="the-tools-i-actually-use"&gt;The tools I actually use
&lt;/h2&gt;&lt;h3 id="uuid-generation-for-bulk-ids"&gt;UUID generation for bulk IDs
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt; is one of the most practical tools in the whole set.&lt;/p&gt;
&lt;p&gt;When building internal tools or low-code systems, I often need a lot of IDs quickly. That is especially true in AppSheet-related work, data preparation, and migration-style tasks where I may want thousands of UUIDs without writing a separate script just for that one moment.&lt;/p&gt;
&lt;p&gt;The tool supports UUID v4 and v7, and the repository documents generation from 1 to 10,000 values in one run with copy and download support. Once you need that several times a week, it becomes one of the most useful browser tabs you keep around.&lt;/p&gt;
&lt;p&gt;This is also a good example of why I keep both a browser tool and an API. For direct browser use, &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt; is faster. For automation flows, &lt;a class="link" href="https://uuid.api.airat.top" target="_blank" rel="noopener"
 &gt;uuid.api.airat.top&lt;/a&gt; is the right layer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Related API: &lt;a class="link" href="https://github.com/AiratTop/uuid.api.airat.top" target="_blank" rel="noopener"
 &gt;uuid.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="utm-builder-for-marketing-work"&gt;UTM builder for marketing work
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://utm.airat.top" target="_blank" rel="noopener"
 &gt;utm.airat.top&lt;/a&gt; exists because UTM work is repetitive and easy to get wrong in small ways.&lt;/p&gt;
&lt;p&gt;If you build campaign URLs often, you already know the problem: the logic is simple, but the volume is annoying. You need consistency in naming, quick copy actions, and presets that match the channels you use most often. The README documents presets for platforms such as Google, Yandex, VK, YouTube, Telegram, Social, Partner, Email, and Banner.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of utility I want in a dedicated page, not inside a bloated marketing suite.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://utm.airat.top" target="_blank" rel="noopener"
 &gt;utm.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/utm.airat.top" target="_blank" rel="noopener"
 &gt;utm.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="passwords-passphrases-and-usernames"&gt;Passwords, passphrases, and usernames
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://pass.airat.top" target="_blank" rel="noopener"
 &gt;pass.airat.top&lt;/a&gt; grew out of the same practical need: I regularly need strong passwords, usable passphrases, and sometimes usernames.&lt;/p&gt;
&lt;p&gt;The useful part here is not only that it generates values. It is that the generator is narrow, quick, and designed around the actual choices I care about. The project uses &lt;code&gt;window.crypto&lt;/code&gt;, supports separate password and passphrase modes, and includes a username generator based on a local word list.&lt;/p&gt;
&lt;p&gt;That makes it more useful than opening a generic password generator that does one thing well but does not cover the rest of the workflow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://pass.airat.top" target="_blank" rel="noopener"
 &gt;pass.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alias: &lt;a class="link" href="https://password.airat.top" target="_blank" rel="noopener"
 &gt;password.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/pass.airat.top" target="_blank" rel="noopener"
 &gt;pass.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="markdown-preview-for-ai-heavy-workflows"&gt;Markdown preview for AI-heavy workflows
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://md.airat.top" target="_blank" rel="noopener"
 &gt;md.airat.top&lt;/a&gt; is one of the simplest tools here, but it solves a very real problem.&lt;/p&gt;
&lt;p&gt;When you work with AI output, documentation drafts, prompts, notes, or blog drafts, Markdown becomes a working format rather than just a publishing format. I often want to preview Markdown immediately without pushing it into a third-party editor or CMS.&lt;/p&gt;
&lt;p&gt;The tool is just a live Markdown preview with GitHub-flavored rendering, sync scroll, copy, reset, and theme control. It does not need to be more complicated than that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://md.airat.top" target="_blank" rel="noopener"
 &gt;md.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/md.airat.top" target="_blank" rel="noopener"
 &gt;md.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="json-formatting-and-conversion"&gt;JSON formatting and conversion
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://json.airat.top" target="_blank" rel="noopener"
 &gt;json.airat.top&lt;/a&gt; covers another class of repeated technical work: formatting, validating, sorting, and converting payloads.&lt;/p&gt;
&lt;p&gt;When working with APIs, scraping outputs, webhook payloads, and integration responses, I constantly need to inspect JSON quickly. Sometimes I need to validate it. Sometimes I need YAML instead.&lt;/p&gt;
&lt;p&gt;This tool handles JSON formatting, minifying, validation with line and column details, deep key sorting, JSON-YAML conversion, and XML-to-JSON conversion. For integration work, that is a very practical set of capabilities in one page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://json.airat.top" target="_blank" rel="noopener"
 &gt;json.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/json.airat.top" target="_blank" rel="noopener"
 &gt;json.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="text-randomization-and-the-ad-generator-lineage"&gt;Text randomization and the &lt;code&gt;ad-generator&lt;/code&gt; lineage
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://random.airat.top" target="_blank" rel="noopener"
 &gt;random.airat.top&lt;/a&gt; is not a random experiment. It comes out of an older lineage.&lt;/p&gt;
&lt;p&gt;I had a very popular text randomizer project before: &lt;a class="link" href="https://github.com/AiratTop/ad-generator" target="_blank" rel="noopener"
 &gt;ad-generator&lt;/a&gt;. It used a syntax for alternatives, optional blocks, permutations, delimiters, escaped characters, and &lt;code&gt;%rand%&lt;/code&gt; placeholders to generate large volumes of pseudo-unique text. That older project existed as a WordPress plugin and CLI utility. The browser tool is a lighter JavaScript continuation of the same practical idea.&lt;/p&gt;
&lt;p&gt;Template-based randomization is still useful in real workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generating text variants for publications;&lt;/li&gt;
&lt;li&gt;creating many structured text outputs from one template;&lt;/li&gt;
&lt;li&gt;producing JSON, CSV, or plain-text output locally;&lt;/li&gt;
&lt;li&gt;doing all of that without sending templates into a custom server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current browser tool documents unique-output generation for 1 to 10,000 lines, format switching between text, JSON, and CSV, and template presets. That makes it useful for content operations and automation prep work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://random.airat.top" target="_blank" rel="noopener"
 &gt;random.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/random.airat.top" target="_blank" rel="noopener"
 &gt;random.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Legacy project: &lt;a class="link" href="https://github.com/AiratTop/ad-generator" target="_blank" rel="noopener"
 &gt;ad-generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="local-first-task-management-with-ai-help"&gt;Local-first task management with AI help
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://task.airat.top" target="_blank" rel="noopener"
 &gt;task.airat.top&lt;/a&gt; is a slightly different tool because it is more app-like than the others, but it follows the same general principle: keep the surface small and useful.&lt;/p&gt;
&lt;p&gt;The core task list is local-first. Tasks live in the browser, filtering is fast, and the UI stays minimal. On top of that, the project adds AI-assisted auto-tagging and decomposition so a task can become a small actionable list instead of a vague reminder.&lt;/p&gt;
&lt;p&gt;One clarification matters here: this tool is still local-first for storage, but its AI features rely on Gemini integration. So it belongs to the same lightweight tool family, but not to the strict &amp;ldquo;pure static formatter with zero external intelligence&amp;rdquo; subgroup.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://task.airat.top" target="_blank" rel="noopener"
 &gt;task.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/task.airat.top" target="_blank" rel="noopener"
 &gt;task.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="minesweeper-as-a-side-project"&gt;Minesweeper as a side project
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://miner.airat.top" target="_blank" rel="noopener"
 &gt;miner.airat.top&lt;/a&gt; is the outlier, and that is fine.&lt;/p&gt;
&lt;p&gt;It exists mostly because I wanted Minesweeper on macOS in a form that matched how I like to use small browser utilities. It is not an operations tool. It is a side project.&lt;/p&gt;
&lt;p&gt;But it still belongs in the same ecosystem because it follows the same product logic: lightweight, public, simple, and easy to open whenever I want it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live tool: &lt;a class="link" href="https://miner.airat.top" target="_blank" rel="noopener"
 &gt;miner.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/miner.airat.top" target="_blank" rel="noopener"
 &gt;miner.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-these-tools-have-in-common"&gt;What these tools have in common
&lt;/h2&gt;&lt;p&gt;The deeper common point is not &amp;ldquo;they are all utilities.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The real common point is that they remove repeated friction from everyday work without demanding a heavy operational model.&lt;/p&gt;
&lt;p&gt;They are small enough to stay understandable, public enough to stay easy to access, and open enough to be inspectable. If I say a tool is lightweight or local-first, I want the code to be there for anyone to check.&lt;/p&gt;
&lt;p&gt;That is also why I do not think of them as isolated side projects. Together, they form a practical browser-side layer around the rest of my work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public APIs for narrow automation operations;&lt;/li&gt;
&lt;li&gt;browser tools for narrow interactive tasks;&lt;/li&gt;
&lt;li&gt;low-code and automation systems for real business workflows;&lt;/li&gt;
&lt;li&gt;self-hosted infrastructure only where the heavier architecture is actually justified.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="practical-takeaway"&gt;Practical takeaway
&lt;/h2&gt;&lt;p&gt;If you repeatedly open the same kind of utility site, copy the same snippets, or rebuild the same helper logic inside larger tools, that is often a sign you should break the function out into a focused public tool.&lt;/p&gt;
&lt;p&gt;The tool does not need to be large. It needs to be reliable, fast to access, and honest about what it does. That is how this set of projects appeared: from repeated small needs in real work.&lt;/p&gt;
&lt;h2 id="project-links"&gt;Project links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uuid.airat.top&lt;/code&gt;: &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/uuid.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utm.airat.top&lt;/code&gt;: &lt;a class="link" href="https://utm.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/utm.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pass.airat.top&lt;/code&gt;: &lt;a class="link" href="https://pass.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/pass.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;md.airat.top&lt;/code&gt;: &lt;a class="link" href="https://md.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/md.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;json.airat.top&lt;/code&gt;: &lt;a class="link" href="https://json.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/json.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;random.airat.top&lt;/code&gt;: &lt;a class="link" href="https://random.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/random.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;task.airat.top&lt;/code&gt;: &lt;a class="link" href="https://task.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/task.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;miner.airat.top&lt;/code&gt;: &lt;a class="link" href="https://miner.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;, &lt;a class="link" href="https://github.com/AiratTop/miner.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Legacy randomizer lineage: &lt;a class="link" href="https://github.com/AiratTop/ad-generator" target="_blank" rel="noopener"
 &gt;ad-generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are working through a similar problem and want help turning it into a practical system, you can contact me through &lt;a class="link" href="https://airat.top" target="_blank" rel="noopener"
 &gt;airat.top&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Why I Built Small Public APIs for Automation Workflows</title><link>https://blog.airat.top/p/why-i-built-small-public-apis-for-automation-workflows/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.airat.top/p/why-i-built-small-public-apis-for-automation-workflows/</guid><description>&lt;img src="https://blog.airat.top/p/why-i-built-small-public-apis-for-automation-workflows/cover.webp" alt="Featured image of post Why I Built Small Public APIs for Automation Workflows" /&gt;&lt;p&gt;In automation work, the same &amp;ldquo;small&amp;rdquo; functions keep showing up again and again.&lt;/p&gt;
&lt;p&gt;Not every one of them deserves a separate service. But some of them deserve more than another copied code block inside one workflow.&lt;/p&gt;
&lt;p&gt;That is how this set of public APIs appeared in my stack. I did not start with the idea of building an API collection for its own sake. I kept running into the same narrow operations across n8n flows, scraping jobs, document generation, and internal tools, so I pulled those operations into small reusable endpoints instead.&lt;/p&gt;
&lt;p&gt;For this kind of task, a thin Cloudflare Worker is often the cleanest unit: simple input, simple output, minimal moving parts, and easy reuse from different environments.&lt;/p&gt;
&lt;h2 id="the-short-answer"&gt;The short answer
&lt;/h2&gt;&lt;p&gt;I usually turn a utility into a small public API when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I need the same logic in several workflows;&lt;/li&gt;
&lt;li&gt;the input and output contract is narrow and stateless;&lt;/li&gt;
&lt;li&gt;the function is useful from no-code, low-code, and code-based tools;&lt;/li&gt;
&lt;li&gt;there are no secrets or customer-specific rules inside it;&lt;/li&gt;
&lt;li&gt;browser or &lt;code&gt;curl&lt;/code&gt; access is useful for testing and debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That matters most in the kind of automation stack I described in &lt;a class="link" href="https://blog.airat.top/p/n8n-vs-make-vs-zapier-for-business-automation/" &gt;n8n vs Make vs Zapier: Which Automation Stack Fits Real Business Workflows&lt;/a&gt; and in the hybrid internal-tool pattern from &lt;a class="link" href="https://blog.airat.top/p/appsheet-vs-custom-build-vs-hybrid-for-internal-tools/" &gt;AppSheet vs Custom Build vs Hybrid: How to Choose for Internal Business Tools&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-not-keep-everything-inside-n8n-or-app-code"&gt;Why not keep everything inside n8n or app code
&lt;/h2&gt;&lt;p&gt;Some of this logic could stay inside n8n code nodes, helper functions, or application code. In some cases, it should.&lt;/p&gt;
&lt;p&gt;But once the same transformation appears in multiple places, duplication becomes the real cost:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the logic gets copied into several workflows;&lt;/li&gt;
&lt;li&gt;one flow gets updated while another keeps older behavior;&lt;/li&gt;
&lt;li&gt;testing becomes fragmented;&lt;/li&gt;
&lt;li&gt;low-code tools need separate workarounds instead of one shared contract.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;n8n already includes plenty of useful building blocks, and UUID generation is built into many languages and platforms. That does not remove the value of a small external endpoint. It just raises the bar for extraction. I only break out the pieces that I want to reuse from different tools without re-implementing them every time.&lt;/p&gt;
&lt;h2 id="the-apis-i-actually-use"&gt;The APIs I actually use
&lt;/h2&gt;&lt;h3 id="transliteration-for-workflow-safe-text"&gt;Transliteration for workflow-safe text
&lt;/h3&gt;&lt;p&gt;I use &lt;a class="link" href="https://translit.api.airat.top" target="_blank" rel="noopener"
 &gt;translit.api.airat.top&lt;/a&gt; when I need Russian Cyrillic text converted to Latin in automation flows. In practice, that usually means filenames, slugs, folder keys, or text that should be normalized before it moves further through a pipeline.&lt;/p&gt;
&lt;p&gt;This is especially useful in n8n, where a simple HTTP request can keep transliteration behavior consistent across different flows instead of relying on ad hoc string handling in each one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/translit.api.airat.top" target="_blank" rel="noopener"
 &gt;translit.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://translit.api.airat.top/?text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" target="_blank" rel="noopener"
 &gt;translit.api.airat.top/?text=Привет&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="number-to-words-for-invoices-acts-and-payment-documents"&gt;Number to words for invoices, acts, and payment documents
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://num2words.api.airat.top" target="_blank" rel="noopener"
 &gt;num2words.api.airat.top&lt;/a&gt; exists because document workflows often need more than a numeric amount. In generated acts, invoices, or payment-related documents, I may need both the amount itself and the amount written out in words.&lt;/p&gt;
&lt;p&gt;That is not a hard problem, but it is exactly the kind of boring repeated logic that should stay correct and reusable. Instead of embedding currency wording rules into every document flow, I can call one endpoint and keep the result consistent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/num2words.api.airat.top" target="_blank" rel="noopener"
 &gt;num2words.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://num2words.api.airat.top/?number=1234.56" target="_blank" rel="noopener"
 &gt;num2words.api.airat.top/?number=1234.56&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="metadata-and-domain-lookup-for-scraping-and-enrichment"&gt;Metadata and domain lookup for scraping and enrichment
&lt;/h3&gt;&lt;p&gt;For scraping, lead enrichment, or general website analysis, I often need metadata before I need anything more complicated.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://meta.api.airat.top" target="_blank" rel="noopener"
 &gt;meta.api.airat.top&lt;/a&gt; gives me a fast way to fetch title, description, canonical URL, and social metadata from a page. That is useful when a workflow needs to preview a page, validate a target URL, or enrich records before storing them.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://whois.api.airat.top" target="_blank" rel="noopener"
 &gt;whois.api.airat.top&lt;/a&gt; helps when the workflow needs domain information, registration context, or a basic lookup step before deeper processing. If a flow touches websites and domains often enough, having a stable lookup endpoint is cleaner than rebuilding that logic inside each automation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/meta.api.airat.top" target="_blank" rel="noopener"
 &gt;meta.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://meta.api.airat.top/?url=https%3A%2F%2Fairat.top" target="_blank" rel="noopener"
 &gt;meta.api.airat.top/?url=https%3A%2F%2Fairat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/whois.api.airat.top" target="_blank" rel="noopener"
 &gt;whois.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://whois.api.airat.top/?domain=example.com" target="_blank" rel="noopener"
 &gt;whois.api.airat.top/?domain=example.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dns-and-ip-utility-for-server-and-infrastructure-work"&gt;DNS and IP utility for server and infrastructure work
&lt;/h3&gt;&lt;p&gt;Some APIs are less about business documents and more about operational convenience.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://dns.api.airat.top" target="_blank" rel="noopener"
 &gt;dns.api.airat.top&lt;/a&gt; is useful when I want to check records from a script, a browser, or a quick automation step without switching context. It is a small thing, but infrastructure work is full of small things.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ip.api.airat.top" target="_blank" rel="noopener"
 &gt;ip.api.airat.top&lt;/a&gt; is even more direct. Sometimes I simply need to know which public IP a request is leaving with, or I need clean request/network metadata while checking behavior around servers, proxies, or external services.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/dns.api.airat.top" target="_blank" rel="noopener"
 &gt;dns.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://dns.api.airat.top/?name=example.com&amp;amp;type=A" target="_blank" rel="noopener"
 &gt;dns.api.airat.top/?name=example.com&amp;amp;type=A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository: &lt;a class="link" href="https://github.com/AiratTop/ip.api.airat.top" target="_blank" rel="noopener"
 &gt;ip.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a class="link" href="https://ip.api.airat.top" target="_blank" rel="noopener"
 &gt;ip.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="uuid-generation-for-automation-glue"&gt;UUID generation for automation glue
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://uuid.api.airat.top" target="_blank" rel="noopener"
 &gt;uuid.api.airat.top&lt;/a&gt; exists because &amp;ldquo;generate a new ID&amp;rdquo; shows up in more places than it should.&lt;/p&gt;
&lt;p&gt;Yes, UUID generators are already built into many languages, platforms, and libraries. But a dedicated endpoint is still useful when ID generation needs to happen from a plain HTTP request, from a low-code flow, from a shell script, or from a tool that is easier to integrate by URL than by custom code.&lt;/p&gt;
&lt;p&gt;I also keep &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt; as a browser tool. I use it when I need quick manual generation, and it is also handy for bulk ID work in AppSheet-related scenarios where having a simple browser UI is more convenient than opening a local script.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API repository: &lt;a class="link" href="https://github.com/AiratTop/uuid.api.airat.top" target="_blank" rel="noopener"
 &gt;uuid.api.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;API example: &lt;a class="link" href="https://uuid.api.airat.top/?version=7" target="_blank" rel="noopener"
 &gt;uuid.api.airat.top/?version=7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Browser tool: &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Browser tool repository: &lt;a class="link" href="https://github.com/AiratTop/uuid.airat.top" target="_blank" rel="noopener"
 &gt;uuid.airat.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-these-apis-are-public"&gt;Why these APIs are public
&lt;/h2&gt;&lt;p&gt;There is a practical reason these ended up as public endpoints instead of hidden internal microservices.&lt;/p&gt;
&lt;p&gt;Public access reduces friction. A utility becomes immediately usable from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a browser tab;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;an n8n HTTP Request node;&lt;/li&gt;
&lt;li&gt;a server script;&lt;/li&gt;
&lt;li&gt;a low-code or no-code environment that can call URLs but does not want extra runtime logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For small stateless helpers, that matters a lot. The README becomes both documentation and a ready-to-test usage surface. Each repo stays tiny, the deployment model stays simple, and the endpoint can be reused anywhere it makes sense.&lt;/p&gt;
&lt;p&gt;Cloudflare Workers are a pragmatic fit for this pattern because these APIs are intentionally narrow. They do not need a big backend platform. They need a stable edge endpoint and low operational overhead.&lt;/p&gt;
&lt;h2 id="what-should-not-become-a-public-api"&gt;What should not become a public API
&lt;/h2&gt;&lt;p&gt;This pattern works well only when the boundaries are strict.&lt;/p&gt;
&lt;p&gt;I would not expose logic this way if it includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;secrets, tokens, or internal credentials;&lt;/li&gt;
&lt;li&gt;customer-specific business rules;&lt;/li&gt;
&lt;li&gt;sensitive state or write operations;&lt;/li&gt;
&lt;li&gt;permission-heavy internal logic;&lt;/li&gt;
&lt;li&gt;workflows where an extra network hop creates more complexity than value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the part many teams miss. A small public API is useful when it is boring infrastructure: one narrow operation, one clear contract, and no hidden operational risk.&lt;/p&gt;
&lt;h2 id="practical-takeaway"&gt;Practical takeaway
&lt;/h2&gt;&lt;p&gt;If a function keeps reappearing in your automations, ask four questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Is it stateless?&lt;/li&gt;
&lt;li&gt;Is the contract simple enough to explain in one README?&lt;/li&gt;
&lt;li&gt;Would an HTTP endpoint make it easier to reuse from different tools?&lt;/li&gt;
&lt;li&gt;Can it be public safely?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the answer is yes, a tiny API may be cleaner than another copied script block.&lt;/p&gt;
&lt;p&gt;That is how these projects appeared in my stack. Not from a plan to build an API portfolio, but from repeated operational friction inside real workflows.&lt;/p&gt;
&lt;h2 id="project-links"&gt;Project links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;translit.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/translit.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://translit.api.airat.top/?text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num2words.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/num2words.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://num2words.api.airat.top/?number=1234.56" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;meta.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/meta.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://meta.api.airat.top/?url=https%3A%2F%2Fairat.top" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whois.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/whois.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://whois.api.airat.top/?domain=example.com" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dns.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/dns.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://dns.api.airat.top/?name=example.com&amp;amp;type=A" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/ip.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://ip.api.airat.top/" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uuid.api.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/uuid.api.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://uuid.api.airat.top/?version=7" target="_blank" rel="noopener"
 &gt;example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Related browser tool &lt;code&gt;uuid.airat.top&lt;/code&gt;: &lt;a class="link" href="https://github.com/AiratTop/uuid.airat.top" target="_blank" rel="noopener"
 &gt;repo&lt;/a&gt;, &lt;a class="link" href="https://uuid.airat.top" target="_blank" rel="noopener"
 &gt;tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are working through a similar problem and want help turning it into a practical system, you can contact me through &lt;a class="link" href="https://airat.top" target="_blank" rel="noopener"
 &gt;airat.top&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>