# 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](https://github.com/qptqpt199-prog/Technetium.git)

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).
