<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andrew Armstrong</title>
    <description>The latest articles on DEV Community by Andrew Armstrong (@techygeeks1).</description>
    <link>https://dev.to/techygeeks1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1343241%2Fe8199b8b-4297-4be9-926b-93cd5b8e4ef0.png</url>
      <title>DEV Community: Andrew Armstrong</title>
      <link>https://dev.to/techygeeks1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techygeeks1"/>
    <language>en</language>
    <item>
      <title>ReelGeek: photos to a vertical video with Pillow, numpy and no watermark</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Fri, 18 Sep 2026 09:11:04 +0000</pubDate>
      <link>https://dev.to/techygeeks1/reelgeek-photos-to-a-vertical-video-with-pillow-numpy-and-no-watermark-54ha</link>
      <guid>https://dev.to/techygeeks1/reelgeek-photos-to-a-vertical-video-with-pillow-numpy-and-no-watermark-54ha</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Every photos to reel app I tried on the desktop either stamped a watermark on the export, capped the length, or wanted a monthly fee for 1080p. For pointing at a folder of holiday photos and getting a vertical video out, that felt steep.&lt;/p&gt;

&lt;p&gt;ReelGeek does the plain version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick the photos, pick a style, pick some music&lt;/li&gt;
&lt;li&gt;Renders 1080x1920, the vertical format the platforms actually want&lt;/li&gt;
&lt;li&gt;Pans and crossfades, so it does not look like a 2004 slideshow&lt;/li&gt;
&lt;li&gt;No watermark, no length cap, no account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;This is not a hard problem. It is a Ken Burns pan, a crossfade, and an encode. The whole reason it is a subscription elsewhere is distribution, not compute. Rendering locally means a two minute video costs the same as a ten second one, which is to say nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Pillow for the image work&lt;/li&gt;
&lt;li&gt;numpy for the frame maths, the pan and zoom transforms and the crossfade blending&lt;/li&gt;
&lt;li&gt;ffmpeg for the encode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;numpy is doing the heavy lifting. Generating frames one at a time through Pillow alone was far too slow, but expressing the pan as an array operation and blending transitions as weighted sums makes it tolerable on a normal laptop.&lt;/p&gt;

&lt;p&gt;The soundtrack sync is deliberately simple. Transitions land on a fixed interval rather than beat detection, because beat detection that is slightly wrong looks much worse than a steady rhythm that ignores the music.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run. Rendering is CPU bound, so a long video on an old machine takes a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/reelgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/reelgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/ReelGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/ReelGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/aRIQr_0RMGg" rel="noopener noreferrer"&gt;https://youtu.be/aRIQr_0RMGg&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Styles are the part I expect to grow. Tell me what is missing.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>AppGeek: one update run across winget and the Microsoft Store</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Wed, 16 Sep 2026 18:39:47 +0000</pubDate>
      <link>https://dev.to/techygeeks1/appgeek-one-update-run-across-winget-and-the-microsoft-store-4058</link>
      <guid>https://dev.to/techygeeks1/appgeek-one-update-run-across-winget-and-the-microsoft-store-4058</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Keeping a Windows machine current is still a chore. Some apps update themselves, some nag, some do nothing at all, and the Microsoft Store sits in its own corner doing its own thing on its own schedule.&lt;/p&gt;

&lt;p&gt;AppGeek pulls both worlds into one list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asks winget and the Store what has a newer version&lt;/li&gt;
&lt;li&gt;Shows everything with an update waiting, in one place&lt;/li&gt;
&lt;li&gt;Updates whatever you tick, in a single run&lt;/li&gt;
&lt;li&gt;No installers to download by hand, no per app update checker in your tray&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;winget already does most of this from a terminal. The gap is that it is a terminal, and the Store is not in it. Most people who need this are not going to run &lt;code&gt;winget upgrade --all&lt;/code&gt; and read the output, and the ones who would still have the Store sitting outside that list.&lt;/p&gt;

&lt;p&gt;So the app is mostly a decent list with two sources behind it. That is not a groundbreaking piece of engineering and I am fine with saying so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0-windows&lt;/li&gt;
&lt;li&gt;System.Text.Json, and not much else&lt;/li&gt;
&lt;li&gt;Shells out to winget and reads its JSON output rather than reimplementing package resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the one app in the range without Avalonia. It started as a small thing and the dependency was never justified.&lt;/p&gt;

&lt;p&gt;Parsing winget's output is the fragile part. It is a CLI aimed at humans, so column widths shift and the format is not a stable contract. Using its JSON output where available helps, but it is still the bit most likely to break on a winget release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/appgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/appgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/AppGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/AppGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/hDmh3ida9Po" rel="noopener noreferrer"&gt;https://youtu.be/hDmh3ida9Po&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How many updates does it find waiting on yours? Mine is usually embarrassing.&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>DriverGeek: reading the Windows driver inventory with System.Management</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Mon, 14 Sep 2026 09:10:35 +0000</pubDate>
      <link>https://dev.to/techygeeks1/drivergeek-reading-the-windows-driver-inventory-with-systemmanagement-2n05</link>
      <guid>https://dev.to/techygeeks1/drivergeek-reading-the-windows-driver-inventory-with-systemmanagement-2n05</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Windows Update quietly holds back a lot of driver updates. It gives you the ones Microsoft has certified for your machine and stays silent about the rest, so you can sit on a two year old chipset or GPU driver without ever being told there is a newer one.&lt;/p&gt;

&lt;p&gt;DriverGeek just lists what you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every device, with its current driver version, date and provider&lt;/li&gt;
&lt;li&gt;Whether a newer release exists&lt;/li&gt;
&lt;li&gt;Nothing installed behind your back, and no bundled driver pack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You look at the list and decide. That is the whole app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The driver updater category has an unpleasant reputation and mostly deserves it. Scare screens, invented issue counts, and a paid unlock to actually download anything. The genuinely useful part, telling you what is stale, costs nothing to provide.&lt;/p&gt;

&lt;p&gt;I deliberately stopped short of auto installing. Driver installs are the one class of update that can leave a machine unbootable, and I did not want to own that decision on someone else's hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0-windows&lt;/li&gt;
&lt;li&gt;Avalonia for the UI&lt;/li&gt;
&lt;li&gt;System.Management for the WMI queries against Win32_PnPSignedDriver&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WMI is slow enough that a naive synchronous enumeration makes the window look hung on a machine with a lot of devices, so the inventory is streamed in and the list fills as it goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/drivergeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/drivergeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/DriverGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/DriverGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/S4RGmR1mYkA" rel="noopener noreferrer"&gt;https://youtu.be/S4RGmR1mYkA&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Curious how many stale drivers it turns up on your machine, mine had more than I expected.&lt;/p&gt;

</description>
      <category>developer</category>
      <category>programming</category>
      <category>software</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>LingoGeek: translating whole documents offline with CTranslate2 and a Python desktop app</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Sat, 12 Sep 2026 00:31:23 +0000</pubDate>
      <link>https://dev.to/techygeeks1/lingogeek-translating-whole-documents-offline-with-ctranslate2-and-a-python-desktop-app-22b5</link>
      <guid>https://dev.to/techygeeks1/lingogeek-translating-whole-documents-offline-with-ctranslate2-and-a-python-desktop-app-22b5</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Pasting a document into a translation site works right up until the formatting matters. Then you get a wall of text back and rebuild the layout by hand. And if the document is a contract or a medical letter, you have just uploaded it to somebody else's server to save yourself ten minutes.&lt;/p&gt;

&lt;p&gt;LingoGeek translates the file rather than the text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.docx comes back as .docx, with headings, tables and lists intact&lt;/li&gt;
&lt;li&gt;PDFs keep their layout&lt;/li&gt;
&lt;li&gt;SRT and VTT subtitles keep their timings and cue numbers&lt;/li&gt;
&lt;li&gt;Everything runs locally, nothing is uploaded, no per word charge&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The translation quality problem is basically solved by open models now. The remaining problem is plumbing: getting the translated strings back into the document structure they came from without wrecking it. That is unglamorous work and it is the whole product.&lt;/p&gt;

&lt;p&gt;Subtitles were the easiest, they are already segmented for you. Word documents were the fiddliest, because a single sentence can be split across several runs with different formatting, and you have to translate the sentence but reapply the runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python, packaged as a desktop app&lt;/li&gt;
&lt;li&gt;pywebview 5.3.2 for the shell, with fastapi 0.115.6 and uvicorn 0.32.1 behind it&lt;/li&gt;
&lt;li&gt;ctranslate2 4.5.0 and sentencepiece 0.2.0 for inference&lt;/li&gt;
&lt;li&gt;python-docx 1.1.2 and pypdf 5.1.0 for the document handling&lt;/li&gt;
&lt;li&gt;pydantic 2.10.4 for the request models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running a local FastAPI server behind a webview is an odd shape for a desktop app, but it meant the translation pipeline stayed a normal Python service I could test without a UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run. Complex PDF layouts are still the weak spot, multi column academic papers in particular.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/lingogeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/lingogeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/LingoGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/LingoGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/hOF9UWpFFd8" rel="noopener noreferrer"&gt;https://youtu.be/hOF9UWpFFd8&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which language pairs do you actually need? That is what decides what I bundle next.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>software</category>
      <category>tools</category>
    </item>
    <item>
      <title>SoundGeek: offline audio cleanup with sherpa-onnx and Avalonia</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:10:58 +0000</pubDate>
      <link>https://dev.to/techygeeks1/soundgeek-offline-audio-cleanup-with-sherpa-onnx-and-avalonia-36om</link>
      <guid>https://dev.to/techygeeks1/soundgeek-offline-audio-cleanup-with-sherpa-onnx-and-avalonia-36om</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Most of us record in rooms that were never meant for it. A fan in the corner, a laptop fan under the mic, a fluorescent buzz that only shows up on playback. The usual options are a full DAW you have to learn, or an online cleanup service that wants your audio and a subscription.&lt;/p&gt;

&lt;p&gt;SoundGeek does the three things that actually matter and stops there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Background noise removal&lt;/li&gt;
&lt;li&gt;Mains hum removal, 50 and 60 Hz plus harmonics&lt;/li&gt;
&lt;li&gt;Loudness levelling, so nobody has to ride the volume knob&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It runs locally, so the recording never leaves the machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Scope discipline, mostly. Every audio tool I looked at started with these three problems and then grew into a mixer, an editor and a plugin host. I wanted the version that stays a three button app, because that covers the interview and voice note case completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0&lt;/li&gt;
&lt;li&gt;Avalonia for the UI&lt;/li&gt;
&lt;li&gt;org.k2fsa.sherpa.onnx for the denoise model in the core library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hum removal is not a model at all, it is notch filtering, which was a good reminder that not every audio problem needs inference thrown at it. The denoise is where the model earns its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/soundgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/soundgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/SoundGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/SoundGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/ssu5cK18Q3Y" rel="noopener noreferrer"&gt;https://youtu.be/ssu5cK18Q3Y&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a recording it cannot rescue, that is the interesting case, send it my way.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>CutGeek: running background removal locally with ONNX Runtime and SkiaSharp</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Mon, 07 Sep 2026 09:01:43 +0000</pubDate>
      <link>https://dev.to/techygeeks1/cutgeek-running-background-removal-locally-with-onnx-runtime-and-skiasharp-2mmb</link>
      <guid>https://dev.to/techygeeks1/cutgeek-running-background-removal-locally-with-onnx-runtime-and-skiasharp-2mmb</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;The online background removers all follow the same script. Free preview at 500 pixels, full resolution behind credits or a subscription, and your image goes through their server to get there. For product shots or anything with a person in it, that last part is the one that bothered me.&lt;/p&gt;

&lt;p&gt;CutGeek does the cutout on your machine and hands back the original resolution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full resolution export, same size in as out&lt;/li&gt;
&lt;li&gt;Batch a whole folder&lt;/li&gt;
&lt;li&gt;Alpha edge cleanup, which matters for hair and fur&lt;/li&gt;
&lt;li&gt;No watermark, no credits, no account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The models that do this well are small enough to run on a laptop CPU. Once that is true, the entire subscription model for background removal is a distribution decision rather than a compute one. So the honest version of the tool is a local one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0&lt;/li&gt;
&lt;li&gt;Avalonia for the UI&lt;/li&gt;
&lt;li&gt;Microsoft.ML.OnnxRuntime for inference&lt;/li&gt;
&lt;li&gt;SkiaSharp for the image pipeline and compositing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SkiaSharp did more work than expected. The segmentation mask comes back at the model's input size, so you are upscaling the mask and compositing against the full size original, and getting that to not look like a paper cutout is most of the quality problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/cutgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/cutgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/CutGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/CutGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/4sfjmieGSrc" rel="noopener noreferrer"&gt;https://youtu.be/4sfjmieGSrc&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hair against a busy background is still the hard case. If you have one it fails on, send it over.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dotnet</category>
      <category>machinelearning</category>
      <category>showdev</category>
    </item>
    <item>
      <title>AuthGeek: a desktop TOTP authenticator with an Argon2 vault and no cloud sync</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Sun, 06 Sep 2026 00:05:43 +0000</pubDate>
      <link>https://dev.to/techygeeks1/authgeek-a-desktop-totp-authenticator-with-an-argon2-vault-and-no-cloud-sync-2dbp</link>
      <guid>https://dev.to/techygeeks1/authgeek-a-desktop-totp-authenticator-with-an-argon2-vault-and-no-cloud-sync-2dbp</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;I was fed up picking up my phone to type a six digit code into the machine I was already sitting at. The desktop authenticators I tried either wanted an account, synced my secrets to their cloud, or both, which rather defeats the point of the thing being under my control.&lt;/p&gt;

&lt;p&gt;AuthGeek is a TOTP and HOTP authenticator that keeps everything local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets in a local vault, encrypted with Argon2id&lt;/li&gt;
&lt;li&gt;Add accounts by scanning a QR code off the screen, or paste the secret&lt;/li&gt;
&lt;li&gt;Encrypted backup and restore, so you are not locked into one machine&lt;/li&gt;
&lt;li&gt;No account, no sync, no telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The design brief was one sentence: nothing about my second factor should require somebody else's server.&lt;/p&gt;

&lt;p&gt;I want to be straight about the trade though. Keeping codes on the same machine you log in from is weaker than a separate phone. If your PC is compromised, both factors are on it. For a lot of threat models that is fine, for some it is not. If it is not, keep using your phone, and I would rather say that than pretend otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0&lt;/li&gt;
&lt;li&gt;Avalonia for the UI&lt;/li&gt;
&lt;li&gt;Konscious.Security.Cryptography.Argon2 for the vault key derivation&lt;/li&gt;
&lt;li&gt;ZXing.Net for QR decoding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Argon2id over PBKDF2 because the whole value proposition here is the vault, and memory hard is the right default in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run. For a security tool I appreciate that is a worse look than usual. It is on the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/authgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/authgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/AuthGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/AuthGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/HtrjpdrUe-g" rel="noopener noreferrer"&gt;https://youtu.be/HtrjpdrUe-g&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you spot something wrong in the crypto, please open an issue rather than being polite about it.&lt;/p&gt;

</description>
      <category>authentication</category>
      <category>opensource</category>
      <category>privacy</category>
      <category>security</category>
    </item>
    <item>
      <title>TranscribeGeek: offline transcription with speaker labels, no upload limit</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Sat, 05 Sep 2026 00:46:48 +0000</pubDate>
      <link>https://dev.to/techygeeks1/transcribegeek-offline-transcription-with-speaker-labels-no-upload-limit-585o</link>
      <guid>https://dev.to/techygeeks1/transcribegeek-offline-transcription-with-speaker-labels-no-upload-limit-585o</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;Every transcription service I looked at had the same shape. A free tier of about thirty minutes, then per hour billing, and your audio goes to their servers to get processed. That is fine for a podcast. It is not fine for a client call, a GP appointment recording, or an interview you promised to keep private.&lt;/p&gt;

&lt;p&gt;TranscribeGeek runs the model locally. Drop in an audio or video file and you get back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plain text transcript&lt;/li&gt;
&lt;li&gt;SRT and VTT subtitle files with timings&lt;/li&gt;
&lt;li&gt;Speaker labels, so you can tell who said what&lt;/li&gt;
&lt;li&gt;No length limit, because there is nobody metering it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The privacy angle is the obvious one, but the length limit was the thing that actually annoyed me. Recordings of real meetings are ninety minutes, not five. Every tool wanted me to either split the file or pay per hour, and neither is a good use of anyone's afternoon.&lt;/p&gt;

&lt;p&gt;Running locally means the only cost is your own CPU time, so a two hour recording is exactly as free as a two minute one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0&lt;/li&gt;
&lt;li&gt;Avalonia for the UI, plus Avalonia.Fonts.Inter&lt;/li&gt;
&lt;li&gt;Local speech model, no network calls at inference time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Speaker diarisation was the hardest part by a distance. Getting the segmentation to agree with the transcript boundaries took more iterations than the transcription itself did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run. Also, first run downloads the model, so it is not instant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/transcribegeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/transcribegeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/TranscribeGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/TranscribeGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/eykR2ekTYYs" rel="noopener noreferrer"&gt;https://youtu.be/eykR2ekTYYs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it mangles a particular accent or a noisy recording, I would like to know about it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>showdev</category>
      <category>tools</category>
    </item>
    <item>
      <title>CleanGeek: a free Windows cleaner with no registry cleaner and no upsell</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Sat, 05 Sep 2026 00:46:05 +0000</pubDate>
      <link>https://dev.to/techygeeks1/cleangeek-a-free-windows-cleaner-with-no-registry-cleaner-and-no-upsell-fa7</link>
      <guid>https://dev.to/techygeeks1/cleangeek-a-free-windows-cleaner-with-no-registry-cleaner-and-no-upsell-fa7</guid>
      <description>&lt;p&gt;Hi DEV!&lt;/p&gt;

&lt;p&gt;I got tired of free PC cleaners that bundle a registry cleaner nobody needs, count up a scary number of "issues", and then dangle a paid version at the end. So I wrote the boring version.&lt;/p&gt;

&lt;p&gt;CleanGeek finds and clears:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Temp folders, user and system&lt;/li&gt;
&lt;li&gt;Browser caches across the installed browsers&lt;/li&gt;
&lt;li&gt;Windows Update leftovers and Delivery Optimisation cache&lt;/li&gt;
&lt;li&gt;Crash dumps and error reports&lt;/li&gt;
&lt;li&gt;Thumbnail cache and font cache&lt;/li&gt;
&lt;li&gt;Recycle Bin, if you tick it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every item shows what it is and how much space it is worth. Nothing is deleted until you press the button, and you can untick anything you want to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;There is no registry cleaner in it and there never will be. Cleaning the registry has not meaningfully sped up a Windows machine in about fifteen years, and the risk of breaking something is real. Same reason there is no "optimise your PC" button. The tool does one job and tells you exactly what it did.&lt;/p&gt;

&lt;p&gt;The other reason is the business model. Free cleaners generally are not free, they are a funnel. CleanGeek has no paid tier to funnel you into, no upsell screen, and no telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET 8, net8.0-windows&lt;/li&gt;
&lt;li&gt;Avalonia for the UI, with Avalonia.Desktop and Avalonia.Themes.Fluent&lt;/li&gt;
&lt;li&gt;No third party cleanup engine, the scanning is all in the app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avalonia was the right call. WinForms would have been quicker to get moving but the styling story is grim, and WPF ties you down harder than I wanted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveat
&lt;/h2&gt;

&lt;p&gt;The installer is not code signed yet, so SmartScreen may warn on first run. I am sorting that out. If that is a dealbreaker for you, fair enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://techygeekshome.info/cleangeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/cleangeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/CleanGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/CleanGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://youtu.be/Z2s2p3nkIvY" rel="noopener noreferrer"&gt;https://youtu.be/Z2s2p3nkIvY&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it misses something obvious on your machine, tell me and I will add it.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>tools</category>
    </item>
    <item>
      <title>Rewriting an 11-year-old WinForms app in Go and WebView2</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Tue, 18 Aug 2026 10:29:51 +0000</pubDate>
      <link>https://dev.to/techygeeks1/rewriting-an-11-year-old-winforms-app-in-go-and-webview2-1jdp</link>
      <guid>https://dev.to/techygeeks1/rewriting-an-11-year-old-winforms-app-in-go-and-webview2-1jdp</guid>
      <description>&lt;p&gt;Hi DEV! Ultimate Settings Panel is a free Windows tool I've maintained since 2014 — 250+ Windows settings, tools, diagnostics and commands behind one search box. Version 8.0 is a complete rewrite, and the interesting part isn't the app, it's what the old one was doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with the old version
&lt;/h2&gt;

&lt;p&gt;It was C#/WinForms sitting on MetroFramework, which stopped being maintained years ago. That alone would be reason enough. But the bigger issue was &lt;strong&gt;how it launched things&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To run a classic Control Panel applet or a shell command, the old version wrote a script to disk and invoked it through &lt;code&gt;mshta&lt;/code&gt;. It worked. It is also, more or less exactly, the behaviour that antivirus heuristics are built to catch — and they were right to be suspicious. Any tool doing that is one signature update away from being quarantined, and the user has no way to tell the difference between my app and something genuinely nasty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 8.0 does instead
&lt;/h2&gt;

&lt;p&gt;A small Go program (no CGO) that renders the panel in a &lt;strong&gt;Microsoft Edge WebView2&lt;/strong&gt; window, with a JavaScript-to-Go bridge handling the launching. Nothing is written to disk. The UI is HTML, so the same panel ships as a standalone &lt;code&gt;index.html&lt;/code&gt; web edition — browsers can't launch local programs, for good reason, so those items give you &lt;strong&gt;Copy&lt;/strong&gt; and &lt;strong&gt;Get .bat&lt;/strong&gt; instead, while &lt;code&gt;ms-settings:&lt;/code&gt; deep links and web links still work directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;windows &lt;span class="nv"&gt;GOARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 &lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="se"&gt;\&lt;/span&gt;
  go build &lt;span class="nt"&gt;-trimpath&lt;/span&gt; &lt;span class="nt"&gt;-ldflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-H windowsgui -s -w"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"Ultimate Settings Panel.exe"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole build. One binary, no runtime to install, no installer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I deleted
&lt;/h2&gt;

&lt;p&gt;This was the genuinely satisfying part. Google Analytics. Internet Explorer entries. Telnet "tricks" that stopped working somewhere around Windows 8. Google+ links. A rewrite is the only time you get to honestly audit an eleven-year-old feature list, and roughly a third of it was dead weight.&lt;/p&gt;

&lt;p&gt;What replaced it: Windows 11 &lt;code&gt;ms-settings:&lt;/code&gt; deep links, a Terminal &amp;amp; Shell category (Windows Terminal, PowerShell 7, &lt;code&gt;winget&lt;/code&gt;), modern diagnostics (&lt;code&gt;sfc /scannow&lt;/code&gt;, DISM RestoreHealth, battery and Wi-Fi reports, Winsock reset), favourites, light/dark themes and &lt;code&gt;.bat&lt;/code&gt; export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Web edition (runs right now, no download): &lt;a href="https://techygeekshome.info/ultimate-settings-panel-online/" rel="noopener noreferrer"&gt;https://techygeekshome.info/ultimate-settings-panel-online/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/Ultimate-Settings-Panel" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/Ultimate-Settings-Panel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Walkthrough video: &lt;a href="https://www.youtube.com/watch?v=ATa4AXIVzvM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ATa4AXIVzvM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to talk about the WebView2 embedding, why Go rather than staying on .NET, or the JavaScript-to-Go bridge. If you maintain something old enough to have an mshta call in it, I'd genuinely like to hear what you replaced it with.&lt;/p&gt;

</description>
      <category>go</category>
      <category>windows</category>
      <category>showdev</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>PDFGeek: a free, offline PDF toolkit for Windows</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Tue, 18 Aug 2026 08:46:51 +0000</pubDate>
      <link>https://dev.to/techygeeks1/pdfgeek-a-free-offline-pdf-toolkit-for-windows-41nc</link>
      <guid>https://dev.to/techygeeks1/pdfgeek-a-free-offline-pdf-toolkit-for-windows-41nc</guid>
      <description>&lt;p&gt;Hi DEV! I built PDFGeek because I kept hitting the same wall: I'd need to merge two PDFs, end up on some web tool, and find myself about to upload a bank statement to a server I know nothing about. And then it'd tell me the free tier allows three tasks an hour.&lt;/p&gt;

&lt;p&gt;It's a Windows desktop app. Nothing is uploaded, which also means none of the limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Merge any number of files, in the order you set&lt;/li&gt;
&lt;li&gt;Split into one file per page, or fixed-size chunks&lt;/li&gt;
&lt;li&gt;Extract or remove pages using print-dialog ranges (&lt;code&gt;1-3, 5, 9-&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Rotate, reorder, watermark&lt;/li&gt;
&lt;li&gt;Add or remove AES-128 password protection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The online PDF tools are genuinely good at what they do. The problem is the trade: your documents go to someone else's machine, and the free tier is deliberately annoying enough to push you to a subscription. For a job that's just "put these two files together", that's a ridiculous amount of ceremony — and for anything sensitive it's not a trade I want to make at all.&lt;/p&gt;

&lt;p&gt;Once it's a local app, the caps stop making sense. There's no reason to limit you to 25 files per merge when the work is happening on your own CPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;Avalonia UI on .NET 8, PDFsharp for the PDF operations, published as a self-contained win-x64 build so there's no runtime to install.&lt;/p&gt;

&lt;p&gt;The thing I'd point at if you're building something similar: every PDF operation lives in a service layer with &lt;strong&gt;no UI dependencies at all&lt;/strong&gt;. That sounds like architecture-astronaut advice until you try to test a page-range parser through a view model. There are 29 smoke checks that run against real PDF files rather than mocks, and they've caught more than they should have — page ranges are a deceptively nasty little parsing problem once you allow open-ended ranges, duplicates and out-of-order input.&lt;/p&gt;

&lt;p&gt;One honest caveat: it isn't code-signed, so SmartScreen warns on first run. Certificates cost real money annually and I'd rather not put that behind a free tool. SHA256 checksums go out with every release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Homepage: &lt;a href="https://techygeekshome.info/pdfgeek/" rel="noopener noreferrer"&gt;https://techygeekshome.info/pdfgeek/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/techygeekshome/PDFGeek" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/PDFGeek&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download: &lt;a href="https://github.com/techygeekshome/PDFGeek/releases/latest" rel="noopener noreferrer"&gt;https://github.com/techygeekshome/PDFGeek/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions about the Avalonia side, the page-range parser, or the testing setup. Feedback very welcome — especially if you try it on a weird PDF and it falls over.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>dotnet</category>
      <category>showdev</category>
      <category>privacy</category>
    </item>
    <item>
      <title>NeoDark Pro: adding Freemius licensing to a WordPress theme without touching the original codebase</title>
      <dc:creator>Andrew Armstrong</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:37:59 +0000</pubDate>
      <link>https://dev.to/techygeeks1/neodark-pro-adding-freemius-licensing-to-a-wordpress-theme-without-touching-the-original-codebase-253p</link>
      <guid>https://dev.to/techygeeks1/neodark-pro-adding-freemius-licensing-to-a-wordpress-theme-without-touching-the-original-codebase-253p</guid>
      <description>&lt;p&gt;Hi DEV! I recently shipped NeoDark Pro, the premium version of NeoDark (a free dark-mode WordPress theme for tech guides and reviews), and the more interesting part of that launch wasn't the theme itself — it was adding proper license-key licensing to it without touching the original codebase or the free theme at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;NeoDark Pro adds a homepage hero slider, dedicated review content blocks (Quick Facts, Pros &amp;amp; Cons, Comparison Tables, Verdict Boxes), a mega menu, full-width landing page templates, and a built-in download counter on top of everything the free theme already does. It had been selling as a plain WooCommerce downloadable product — pay, get a zip, done. Which meant: no license enforcement, no update delivery, and the raw zip could be shared indefinitely with nothing checking whether the person installing it had actually paid for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just bolt it onto the existing package
&lt;/h2&gt;

&lt;p&gt;The free NeoDark theme is in the WordPress.org Theme Directory review queue, and the Pro package was already a sold, working product. I didn't want to risk either of those by editing in place. So instead of modifying the live Pro codebase, I built a fully isolated copy — same theme, plus the Freemius PHP SDK dropped into vendor/freemius/, plus the SDK's init snippet added to functions.php, plus the readme.txt format Freemius expects. Nothing about the original free theme or the previously-sold package changed at all; the licensed build is a separate artifact that happens to start from the same source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Freemius actually adds
&lt;/h2&gt;

&lt;p&gt;Freemius works as a "merchant of record" — it handles the checkout, generates a license key per purchase, and its SDK checks that key against the activating site before the premium functionality unlocks. Once the licensed build was deployed and the plan released, I switched techygeekshome.info's own Buy button from a plain WooCommerce download link to the Freemius checkout URL, so every real sale now goes through it and issues a license key the SDK verifies. It's not bulletproof — a determined person can still strip license checks out of a theme, same as any WordPress product — but it raises the bar considerably above "here's a zip, enjoy."&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Sandbox checkout tested clean, the plan is live and purchasable at £39 one-time (lifetime updates), and the split between "free theme in WP.org review" and "licensed Pro build sold via Freemius" means neither one can break the other going forward.&lt;/p&gt;

&lt;p&gt;Happy to go deeper on the SDK integration, the isolated-build approach, or the Freemius setup specifically if anyone's tackling something similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;NeoDark Pro: &lt;a href="https://techygeekshome.info/" rel="noopener noreferrer"&gt;https://techygeekshome.info/&lt;/a&gt;&lt;br&gt;
Free version (NeoDark): currently in WordPress.org Theme Directory review&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
