
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:
- Scans the selected categories first.
- Shows a system tray notification.
- Waits a full 60 seconds, during which the user can cancel.
- 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.pngandphoto.jpgboth converting to.jpg) needed automatic_1,_2suffixing 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).
Comments
Join the discussionNo comments yet. Be the first to comment.