Skip to main content

Technetium

Updated 6 min readMarkdown
Technetium

Technetium: A Portable Windows Utility Toolbox Built From Scratch With C++ and Qt

The problem I kept running into

Every time I needed to rename a batch of files, clear out junk from my disk, or convert a folder of images to another format, I ended up either doing it manually or installing yet another bloated utility app — most of which come with ads, forced installers, or background telemetry I didn't ask for.

The open-source alternatives that do exist are often either abandoned, poorly maintained, or trying to do too much at once. So I decided to build my own, focused on exactly the handful of tasks I actually repeat often, nothing more.

That project became Technetium — a free, portable Windows utility built entirely with C++ and Qt Widgets.

Design goals from day one

  • No installer. Unzip, run the .exe, done.
  • No ads, no telemetry, no dark patterns.
  • Safety first for anything destructive. Deleting files automatically should never happen silently or instantly.
  • Small, focused feature set rather than trying to be an all-in-one system tool.

With that in mind, here's what's inside.

Feature breakdown

1. Batch Rename with full undo history

Select a batch of files, apply prefixes, suffixes, sequential numbering, or find-and-replace rules, and preview the resulting filenames before committing anything.

What makes this more than a basic renamer: every operation is logged persistently (last 25 operations, saved to disk, surviving app restarts), and each one can be undone individually. If a file was since moved, deleted, or locked by another process, the undo process simply skips it instead of failing the whole batch — a small detail, but one that took a few iterations to get right.

2. System Cleanup across 11 categories

Scans and clears:

  • Temporary files
  • Recycle Bin
  • Browser cache
  • Windows Update cache
  • Thumbnail cache
  • Prefetch data
  • Memory dump files
  • Shader cache
  • Delivery Optimization files
  • Windows Error Reporting files
  • Leftover driver installation files

Sizes are calculated and shown before deletion, and every category can be toggled independently.

3. Scheduled Cleanup — the feature I spent the most time on

This is the part of the project I'm most proud of, and also where I hit the most interesting bug.

The idea: let the cleanup run automatically on a schedule (daily, weekly on specific weekdays, monthly on a specific date, or a simple "every N days" interval) — but do it safely. When the scheduled time hits, the app:

  1. Scans the selected categories first.
  2. Shows a system tray notification.
  3. Waits a full 60 seconds, during which the user can cancel.
  4. Only then moves the files to the Recycle Bin — never permanent deletion through the automated path.

The bug: my first implementation of calcNextRun() tried to do two jobs at once — computing "the next scheduled time to display in the UI" and "deciding whether to run right now" — using the same function. Because the function always projected forward from the current moment, the condition if (now >= next) inside the scheduler check could never be true, even when the scheduled time had clearly passed. The fix was splitting it into a pure calculation function (computeNextRun(after)) and a separate function that computes-and-persists the next run time to disk (recomputeNextRun()), so the actual trigger check compares against a stored value instead of recalculating a constantly-shifting target. Classic case of one function trying to serve two different callers with incompatible needs.

One limitation I'm upfront about: if the PC is fully shut down (not sleeping), there's no way for a background scheduler to fire — Windows just doesn't support that without BIOS-level wake timers, which felt like overkill for this project. On next launch, the app checks if a run was missed and catches up if so.

4. Image Format Converter

Batch-converts a folder of images (regardless of original extension) between PNG, JPG, BMP, and ICO, using QImageReader::canRead() to silently filter out non-image files rather than erroring out.

A few details that mattered more than I expected once real testing started:

  • Filename collisions (e.g., photo.png and photo.jpg both converting to .jpg) needed automatic _1, _2 suffixing instead of silently overwriting one of them.
  • ICO export only supports a single fixed resolution per file (16–256px) — not a multi-resolution bundle like dedicated icon tools produce. I decided this tradeoff was acceptable for the scope of the project rather than implementing multi-size ICO packing.

5. Basic multi-language support without rewriting the whole codebase

The original translation system was a simple Translator::t(viText, enText) call sprinkled throughout the codebase — fine for two languages, but not scalable to more.

Rather than refactor every call site (which would have touched hundreds of lines across the project), I kept the existing t(vi, en) call signature completely untouched everywhere else, and changed the internal logic of Translator::t() instead:

  • Vietnamese and English still return directly as before.
  • For six additional languages (Chinese, French, Spanish, Arabic, Russian, Hindi), the English string is used as a dictionary key to look up a translation. If no entry exists, it silently falls back to English instead of breaking or showing blank text.

This was a deliberate tradeoff: full coverage for two languages, partial (and growing) coverage for the rest, achieved without touching the rest of the codebase. Translation contributions for the secondary languages are welcome.

Tech stack

  • Language: C++
  • UI: Qt Widgets (Qt 6)
  • Build system: CMake
  • Compiler: MinGW 64-bit
  • Platform: Windows only (for now)

Licensing note

Technetium is source-available under a non-commercial license (PolyForm Noncommercial 1.0.0) — free to use, modify, and share for non-commercial purposes. Commercial use requires reaching out directly.

What's next

Still on the table for future iterations:

  • Windows Explorer right-click context menu integration (open a folder directly into a specific tab)
  • A file-lock finder/unlocker built on the Restart Manager API
  • Deeper translation coverage for the secondary languages

Check it out

This is a solo side project, built incrementally in my spare time — so bug reports, feedback, and translation contributions are genuinely welcome.

GitHub: github.com/qptqpt199-prog/Technetium

If you find it useful, there's a donation section in the README (currently set up for Vietnamese bank transfers / e-wallets via QR code — international donation options may come later).

No comments yet. Be the first to comment.