AboutData & PortabilityBlogFeaturedInstances

Build as You Need, Fix as You Go

There's a particular feeling that comes from fixing something that meets a need of ours. It all started with trying to do something with vanilla HTML, JS, and CSS.

Photo by Zongnan Bao on Unsplash

For a decade, I could only reach as far as design, or just imagination. Whether you like AI or not, that technology really opened up a path for me. I explored many directions I otherwise wouldn’t have gone.

Now I’ve reached a point where I did the “rewrite it in Rust” thing. I hesitated to try that out in the beginning, as it felt like a lot. But there comes a point when you really need to solve a problem and you’re ready to try anything, because you can’t justify the current solution and you don’t want to abandon it either. So the only way to make up for the time already spent is to find a solution that actually works.

What I’m talking about above involves two Windows apps I created with the help of AI. They’re not native Windows apps. More like wrappers that use a PWA, but not as heavy as Electron.

I Prefer Local Only Apps

In the early days of the AI boom, I limited myself to simple static websites and Python scripts, because anything beyond that felt like too much, and not getting anywhere is a draining experience. It was like I left from a point, never reached anywhere, and I can’t go back either. So my only option was to float.

I gave it time to settle, and slowly I became familiar with a lot of things, which gave me the courage to try new things. I moved into the world of npm, Next.js, Astro, Go, SQLite, and so on.

I built a few local only applications that store data in a simple SQLite file. That gave me the freedom not to worry about third party pricing or user management or security when go online. I just had to focus on a single user and the problem at hand.

The first blocker I hit was backing up the database files, and Git. I didn’t want to automate this in any way. I was ready to spend time backing it up properly, because I needed to stay in control. So I built the first phase, a simple Python script. Then I hit another blocker, managing each project’s backups. So I upgraded the script to export a JSON file with all the metadata, and built a simple frontend to view that JSON history neatly.

Tray App Idea

It went on like that for a while, until I hit another blocker where I just didn’t want to keep doing this manually. I tried optimizing it with a PowerShell script, but that didn’t really go anywhere. Then one day I thought, why not a tray app? That exploration led to Go + React + Vite, which emits an .exe that opens a PWA in a Chrome window. With this, I learned that I could just wrap things up. That solution fixed my backup problem, and I don’t have to think about it again until I hit the next blocker.

Friday - A Backup ManagerI haven’t shared the binary file with this repo, especially because it is vibe-coded. If you need it, please clone it and run the build script.
Clone Repo
Friday Features
  • System tray integration — double-click to open, right-click for quick actions
  • Versioned backups with diff visualization (+ added, ~ modified, - deleted, ∅ excluded)
  • File exclusion patterns (e.g. node_modules/**)
  • Retention limits but nothing is enforced only for fast manual cleanup.
  • No setup, no external dependencies — single .exe

Now, on to other things. A similar pattern occurred in my everyday tools too. Opening a terminal and typing a command to launch an app was fine occasionally, but for tools I used daily, it became friction I didn’t want to deal with.

I explored Electron, Tauri, and so on. But setting up a Next.js project inside these again felt like a lot. One day, I thought why not just wrap this too? So I built a Go script in the root of each project that handles the terminal processes in the background, behaving like a tray app. Now I can click it like any other Windows app, and it just opens. No extra steps!

With these learnings, I tried experimenting with another idea. One that exists only because Windows’ built-in clipboard solution feels too limited to me. You can press Windows + . to open the clipboard manager and see recently copied and pinned items, but it’s very limited. You have this useful thing, but can’t really do anything with it beyond looking. The real problem is having to sacrifice older pinned items for new ones. This bugged me for months, but I kept thinking it was too much effort to fix. Eventually my patience ran out, and I built another Go + Vite + React app. Simple problem, simple solution. But once I was preparing it for public release, I checked its RAM usage and it is almost 50MB, which I wasn’t happy with. My backup app uses about the same, but that one’s a one-off I don’t keep running in the tray all the time. The clipboard manager is different, it runs constantly.

So I looked into alternatives, and Claude gave me a breakdown of options.

Yes, Rust would be the most impactful swap.

Rust

  • Binary: 2–5MB
  • RAM: 5–15MB at idle
  • But: steep learning curve, not vibe-code friendly at all

Other options:

  • Zig — even smaller binaries, but very low level, worse for vibe-coding
  • C# (.NET 9 NativeAOT) — good Windows support, ~10MB binary, ~20–30MB RAM, more vibe-code friendly than Rust
  • Python + PyInstaller — easy to vibe-code but binary is huge (50MB+) and RAM is worse
  • .NET MAUI / WPF — Windows-native, reasonable RAM, but heavier framework

Honest take: None of these are worth rewriting for a clipboard manager. 51MB RAM is not a problem — Chrome uses 500MB+ just idling. Your current stack (Go + React) is the right balance of vibe-code friendly and performant.

Still, after committing my last changes, I created a prompt with full context and files and tried DeepSeek for the Rust conversion. I followed its instructions line by line, but got increasingly frustrated, because fixing one thing kept breaking several others. Mostly because the AI wasn’t working directly inside my IDE. So I switched to Antigravity, and its Flash model (on low thinking mode) fixed everything in one continuous loop. I manually tested all the cases, and it worked fine. The background process now uses under 10MB. That felt like a real win, and I learned the very basics of how to work with Rust without any prior experience in it. Now I have the courage to experiment other projects in it. Maybe another day.

ClipboardI haven’t shared the binary file with this repo, especially because it is vibe-coded. If you need it, please clone it and run the build script.
Clone Repo
Clipboard Features
  • Stays in the system tray; one click to open.
  • Text clips persist until cleared. Screenshots are lost on quit (not window close), but pinned items stay until manually cleared.
  • Auto-detects and tags folder paths, URLs, code, commands, passwords, tokens, and similar content.
  • Syntax highlighting for code clips.
  • Merge multiple clips into one.
  • Export selected clips as a .txt file, or pin, copy, delete or assign tags to them.
  • Edit clips inline.
  • UI-level masking for auto-detected sensitive content — not encrypted, display only.
  • Sort and filter to manage your clip feed.
  • Manually add clips or import from .txt or .md files.
  • Toggle the app on or off from settings.
  • Right-click the tray icon to quickly access recent clips or toggle the app.
  • Clear All removes all unpinned clips from the feed.
  • To quickly open the window (only when the tray icon is active) press Ctrl + Alt + (backtick)
  • Closing the window won’t quit the app, it minimizes to the tray and runs as a background process. Last checked, it uses under 10 MB of RAM.

One Side Learning

I came across a tool called UPX, which compressed the binary size even further, though it still uses the same RAM at runtime. Still useful for saving disk space.

Without these pain points, I’d never have arrived at these solutions. So in a way, it’s correct that things need to bother you enough before you step out of your comfort zone to fix them, and once you do, it becomes habit.

My other local apps are in the pipeline. I’ll release them as soon as i finish polishing them up a bit more. The idea is simple. Get out from the subscription lifestyle and migrate into a life where you own what you use.