Author: Fabian A. Santiago

  • The October .NET security updates, and why FileHasher is not affected

    Microsoft published out-of-band security updates for .NET on 25 October 2026. If you use FileHasher on Windows, the short version is that none of it reaches you: there is nothing to patch, nothing to reinstall, and nothing to turn off. Here is why, in enough detail that you can check it rather than take my word for it.

    What the updates fix

    The headline issue is an out-of-bounds write in .NET’s Brotli decompressor, CVE-2026-111497. It can be triggered by decompressing Brotli data that came from somewhere you do not control: a web response, an upload, a compressed stream handed to the compression APIs. The same release also re-issues two fixes from earlier in the month, one in Windows socket handling and one in the Blazor WebAssembly debugger, and corrects file ownership in Linux source-build packages.

    Every one of those requires an application to be doing something FileHasher does not do.

    Why FileHasher is not affected

    FileHasher reads files from your disk and computes hashes of them. That is the whole program. It opens no network connections, so there is no HTTP client to decompress a hostile response and no socket code to corrupt. It is not a web application, so the Blazor fix is not about anything it contains. It never decompresses anything, Brotli or otherwise: it reads bytes and hashes them.

    I checked that rather than assuming it, by searching the source for every API named in the advisory. FileHasher is open source, so you can run the same search yourself.

    The copy of .NET inside the app

    One detail worth being straight about. FileHasher for Windows is self-contained: it carries its own copy of the .NET runtime inside the download rather than using one installed on your PC. That is deliberate, because it means the app does not care what is or is not installed on the machine it lands on. It also means a .NET security fix does not reach FileHasher through Windows Update. It arrives when I publish a new build.

    So the current release does contain the unpatched version of the component in question. It also contains no code that can reach it. The next release will be built against the patched runtime, and if a security scanner at your workplace flags the runtime version inside the executable before then, the paragraph above is the answer to give it.

    The macOS version

    FileHasher for macOS has no .NET in it at all. It is a native app written in Swift, sharing a file format with the Windows version rather than any code. None of this touches it, in either edition.

    What you should do

    For FileHasher, nothing. If you have .NET installed for other software, update it as you normally would; Microsoft’s advisory covers the versions and the fixed builds. And if you would rather ask than read, support@fabianasantiago.com reaches me, as does the support page.

  • Teaching an Arduino UNO Q to recognize faces, locally

    My current experiment: turning an Arduino UNO Q and a plain USB camera into a small face-recognition sensor that runs entirely on the board and reports to Home Assistant. No cloud service ever sees the video.

    Why the UNO Q

    The UNO Q is an unusual Arduino. Alongside the familiar microcontroller, the same board carries a small Linux computer with enough headroom to run compact AI models. Arduino ships ready-made building blocks for it, including face detection on a live camera feed.

    Detection only answers one question, though: is there a face in view? I want the board to answer a more useful one: whose face is it?

    How it works

    • The camera feeds frames to a small detection model, which finds any faces in the picture.
    • Each face goes through a second, recognition model that turns it into a compact numeric signature.
    • That signature is compared against a handful of enrolled people. A close match gets a name; anything else is reported as unknown.
    • Only the result leaves the board, over MQTT, and shows up in Home Assistant as ordinary sensors.

    What Home Assistant does with it

    Known people are logged quietly: who was seen, and when. An unknown face is different; it sends a push notification to my phone with a snapshot attached. Because the results are plain Home Assistant entities, they can drive any other automation later without touching the board.

    Private by design

    Everything happens locally. The video stream never leaves the board, and what it sends out is a name or the word unknown, plus a single snapshot when a stranger appears. The board stores no photos of the people it knows, only a numeric signature for each one, and nobody is enrolled without agreeing to it.

    What’s next

    It is early days. The open questions are the practical ones: how well recognition holds up in changing light, and how many frames per second the board can sustain. I will write a follow-up once it has been running for a while, and I may share the source code once it settles.

  • FileHasher for macOS 1.1: choose how deep a scan goes

    FileHasher for macOS 1.1 is out in both editions: on the Mac App Store, and as a notarized direct download. It adds a Subfolders control that sets how deep a folder scan goes, remembers the settings you use on every run, and opens the Browse panels where you are already pointing.

    Choose how deep a scan goes

    Pointing FileHasher at a folder used to be a yes-or-no question: include subfolders, or don’t. That is now a Subfolders control with three settings. This folder only remains the default, so nothing changes unless you ask it to. All subfolders descends as far as the tree goes. Limit depth to a number of levels descends exactly that far and stops, which is the useful one when a folder has a few layers worth hashing and a great many that are not.

    Verify Sidecars uses the same depth as the hash run. That matters more than it sounds: a verification that looked less deep than the run which wrote the sidecars would report files as having no sidecar, when the truth is that it never looked at them. Tying both to one setting means the two can never disagree about which files are in scope.

    It remembers how you work, but not what you hashed

    Your hash algorithm and the Include file metadata option now persist between launches. If you always work in SHA512, that is how the app will greet you.

    What it deliberately forgets is just as considered. The two options that cause the app to write something, sidecar hash files and CSV export, always start switched off, so a run only ever creates files because you ticked the box in that session. The target path is not restored either: reopening on last week’s folder invites a run against the wrong thing. The rule, in one line, is that a setting describing how you work is remembered, and a setting describing what you were working on is not.

    Browse panels open where you are already pointing

    The file and folder pickers used to open wherever the system last left them, which was frequently some other application’s business. They now open at the path already in the box beside them, and the CSV panel keeps the filename you chose instead of replacing it with a fresh timestamp. If that path has since been deleted, or lives on a drive that is no longer attached, it falls back to the nearest folder that still exists rather than giving up.

    Two editions, and why their version numbers differ

    The Mac App Store edition is 1.1.0. The standalone edition is 1.1.2. Same app, same features; the standalone edition went through two extra releases to fix how it was packaged, and those two builds were withdrawn. If you downloaded 1.1.0 or 1.1.1 of the standalone edition and macOS would not open it, that is why; replace it with 1.1.2 and it will behave. The FileHasher page has the details.

    One consequence worth stating plainly for standalone users on 1.0.2: the in-app updater cannot install this one for you, because the permission it needs is checked by the copy already running. Download 1.1.2 and replace the app by hand, once. Automatic updates work normally from there.

    Getting it

    FileHasher is free and MIT-licensed. The App Store edition is on the Mac App Store; the standalone edition, which is notarized and updates itself, is on GitHub alongside the source and the changelog. Every release publishes a .sha256 file beside the download, so you can verify it with FileHasher itself before installing.

    Sidecar files and CSV exports still move cleanly between the Mac and Windows versions, which both gained this same scan model. The support page covers either one.

  • FileHasher for Windows 0.5.0: choose how deep a scan goes

    FileHasher for Windows 0.5.0 adds a Subfolders control, so a folder scan can cover everything underneath, just the folder you picked, or a set number of levels down. It also starts remembering the settings you use on every run, while deliberately forgetting the ones that write files.

    Choose how deep a scan goes

    Until now, pointing FileHasher at a folder meant hashing everything beneath it, however deep that went. That is still what happens by default, so nothing changes unless you ask it to. But a release folder with a dozen build directories under it, or a backup drive with years of history, is not always what you meant to hash.

    The Target group now has a Subfolders setting with three choices: All subfolders, which is the default and the old behaviour; This folder only, which ignores subdirectories entirely; and Limit depth to N levels deep, which descends as far as you say and no further.

    Verify Sidecars uses the same setting as Run, which matters more than it sounds. If a verification pass looked less deep than the run that wrote the sidecars, it would report files as having no sidecar when the truth is that it never looked at them. Tying both walks to one setting means the two can never disagree about which files are in scope.

    It remembers how you work, but not what you hashed

    FileHasher now remembers your hash algorithm and the Include file metadata option between runs, in a small settings file under your own user profile. If you always work in SHA512, it will be waiting for you in SHA512.

    What it deliberately does not remember is just as considered. The two options that cause the app to write something, sidecar hash files and CSV export, always start switched off, so a run only ever creates files because you ticked the box in that session. The target path is not restored either: reopening on last week’s folder invites a run against the wrong thing. The rule, if you want it in one line, is that a setting describing how you work is remembered, and a setting describing what you were working on is not.

    Browse opens where you are already pointing

    The Browse buttons used to open wherever Windows last left the file picker, which was often some other application’s business entirely. They now open at the path already in the box next to them: the folder you typed, or the folder containing the file you selected, with that file highlighted. The CSV picker keeps the filename you chose instead of replacing it with a fresh timestamp. If the remembered path has since been deleted or lives on a drive that is no longer attached, it quietly falls back to the deepest folder that still exists.

    One more scaling fix

    0.4.0 made the controls scale properly at high display scaling. One case survived: at 200% scaling the window itself wanted to be about 1605 pixels tall, which is taller than a 2560×1600 display, so Windows pinned it to the top and the bottom edge fell off the screen. The window now measures the available space before it opens and never exceeds it. Checked again at 100%, 150%, 175% and 200%; the smaller three are pixel-identical to before, which is how I know the change does nothing when the window already fits.

    Getting it

    FileHasher is free and MIT-licensed. The FileHasher page has the full feature list, the support page covers both the Windows and macOS versions, and the source, changelog and signed downloads are on GitHub. The previous release, 0.4.0, brought the app to the Microsoft Store, Chocolatey and Scoop.

    As always, every channel delivers the identical build, code-signed by FSP Productions, LLC, with a .sha256 file published next to every download. If something misbehaves, the help window’s Support topic reaches me with your version number already attached.

  • FileHasher for Windows 0.4.0: now on the Microsoft Store, Chocolatey, and Scoop

    FileHasher for Windows 0.4.0 is out, and it is now installable four ways: from the Microsoft Store, winget, Chocolatey, or Scoop. Under the hood the app has moved to .NET 10, which makes the download about a quarter smaller, and the window finally behaves properly on high-resolution displays.

    Four ways to install it

    Until now the only managed route was winget. There are now four, and they all deliver the same signed build; pick whichever matches how you already install software.

    The Microsoft Store is the simplest, and it keeps itself updated. If you prefer the command line, pick one of these; you do not need more than one.

    winget install FSPProductions.FileHasher
    choco install filehasher
    scoop bucket add fsantiago https://github.com/fsantiago07044/scoop-bucket
    scoop install filehasher

    Those differ in more than syntax. winget, Chocolatey and the Store all install the signed MSI machine-wide, into Program Files, with a Start Menu entry and an entry in Add/Remove Programs. Scoop instead unpacks the portable build into your own user profile: nothing touches Program Files, nothing appears in Add/Remove Programs, and no administrator rights are needed. If you keep a machine deliberately clean, that is the one to reach for.

    Smaller, on a supported runtime

    The app has moved from .NET 8 to .NET 10, the current long-term-support release. Nothing about that is visible while you use it, and there is still no runtime to install: FileHasher remains a single self-contained executable. What you will notice is the size. The installer dropped from 62.9 MB to 45.8 MB, a little over a quarter smaller, because the newer runtime trims more of what the app never calls.

    It now scales properly

    If you run Windows at anything above 100% display scaling, which most laptops and every high-resolution monitor do by default, earlier versions did not treat you well. The text grew with the display but the layout did not, so buttons truncated to a single word, checkbox labels were cut mid-sentence, and the sidecar format options overlapped each other. It was ugly and, at 200%, close to unusable.

    0.4.0 fixes it: the window and everything in it now scale together. I tested at 100%, 150%, 175% and 200%, the last on a 2560×1600 display, and the layout holds at all of them.

    The same build, wherever you get it

    One thing worth saying plainly for an app whose whole job is verifying files: every one of those channels installs the identical binary, code-signed by FSP Productions, LLC. Each release publishes a .sha256 file next to every download, and the package definitions for winget, Chocolatey and Scoop all pin that checksum, so an installer that did not come from me fails before it runs. You can also check by hand, with FileHasher itself: hash the installer you downloaded and compare it against the published sidecar.

    FileHasher is free and MIT-licensed. The FileHasher page has the full feature list, the support page covers both the Windows and macOS versions, and the source, changelog and signed downloads are on GitHub. The previous release, 0.3.1, added sidecar verification and the in-app help window.

    If something misbehaves, the help window’s Support topic reaches me with your version number already attached.

  • FileHasher for macOS 1.0.2: now also available outside the App Store

    FileHasher for macOS now comes in a standalone edition: a notarized direct download from GitHub Releases, no App Store account required. It updates itself automatically, and it’s built from the same open source code as the store version, with identical features.

    Two editions, one app

    Some people live in the Mac App Store; some prefer a plain download they can fetch, archive, and install anywhere. FileHasher now serves both. The Mac App Store edition stays exactly as it is: free, updated through the store, and making no network connections at all. The new standalone edition trades that for independence: download the zip, drop the app in Applications, and it keeps itself current by checking for updates on its own (you’re asked once whether to allow automatic checks, and there’s always a manual “Check for Updates” in the menu).

    Verify the download with the app itself

    A hashing tool’s downloads ought to be verifiable, so every release on GitHub ships with a .sha256 sidecar written in FileHasher’s own format. Point FileHasher at the downloaded zip, and it will confirm the file matches the published hash. The app is also signed with my Developer ID and notarized by Apple, so macOS verifies it independently before first launch.

    Links

  • FileHasher for macOS is now open source

    FileHasher for macOS is now fully open source. The complete source code is on GitHub at github.com/fsantiago07044/filehasher-macos, under the MIT license, the same terms as its Windows sibling.

    What’s in the repo

    This is the whole workshop, not just the code. Alongside the SwiftUI app and its hashing engine you’ll find the automated test suite (known hash vectors for all four algorithms, sidecar round-trips, every verification verdict), the project definition, the script that generates the macOS app icon from the original Windows artwork, and the App Store paper trail: listing copy, review notes, screenshots, and the screen recording that went to App Review. If you’ve ever wondered what shipping a small app to the Mac App Store actually involves, it’s all in there.

    Verify everything

    A hashing tool should hold itself to its own standard, so the repository does: every commit and release tag in the project’s history is GPG-signed, and GitHub shows them as verified. The current Mac App Store build (1.0.1) was produced from this repository’s v1.0.1 tag.

    Links

    If you read the code and spot something worth fixing or improving, the repo’s issue tracker is open.

  • FileHasher for Windows 0.3.1: verify mode, a sharper results list, and built-in help

    FileHasher for Windows 0.3.1 is out. It is the biggest update since the app landed on winget: sidecar verification is now built in, the results list finally behaves like a power tool, sidecars got smarter, and the same in-app help system that came to the Mac earlier this month is now on Windows too.

    Verify what you hashed

    FileHasher has always written sidecar checksum files next to the files it hashes. 0.3.1 closes the loop: a new Verify Sidecars button re-hashes your files and compares the results against those sidecars, turning a folder full of checksums into an actual integrity audit. Every file gets a verdict in the results list: OK, MISMATCH, MISSING FILE (a sidecar whose file is gone), or NO SIDECAR (a file the scan covers that has no sidecar yet). That last one matters: you see gaps in your coverage, not just corruption.

    The algorithm is detected per sidecar from the hash itself, so a folder holding a mix of MD5, SHA-1, SHA-256, and SHA-512 sidecars verifies correctly in a single pass, regardless of what the algorithm selector happens to be set to. The hash alone decides pass or fail; a sidecar whose recorded date or size differs gets an informational note instead of a failure, because a legitimately copied file changes its timestamps without changing its content.

    A right-click that earns its keep

    Every row in the results list now has a context menu: open File Explorer with the file pre-selected, open PowerShell or Command Prompt in its folder, copy the hash, or copy the full path. Double-clicking a row jumps straight to the file in Explorer. Small things, but they remove the constant detour of retyping paths somewhere else after hashing.

    Sidecars, smarter

    A third sidecar format joins the familiar two: HASH *filename *modified *size, for when a sidecar should attest to more than the bytes. The modified timestamp is written in ISO-8601 UTC, matching the CSV export. And the suggested sidecar extension now follows the selected algorithm (.md5, .sha1, .sha256, .sha512), along with the format label; a custom extension you typed yourself is never overwritten.

    The help window comes to Windows

    Like the macOS app got in 1.0.1, the Windows app now has real built-in help: press F1 or use the Help menu for a topic window covering everything the app does, plus links to the support site and privacy policy. The Email Support link pre-fills its subject with the exact version you are running, read from the app itself, so support mail arrives self-identified.

    Where to get it

    The quickest path is winget:

    winget install FSPProductions.FileHasher

    (or winget upgrade FSPProductions.FileHasher if you already have it). Prefer a manual download? The v0.3.1 release on GitHub has the signed MSI installer plus a signed portable exe and zip, and every asset ships with its own .sha256 sidecar, so you can verify the download with FileHasher itself. The app is free and MIT-licensed, with the full changelog and source in the same place. More background on the FileHasher page.

    If something misbehaves, the help window’s Support topic reaches me, version number already attached.

  • FileHasher for macOS 1.0.1: now universal, now with help

    FileHasher for macOS 1.0.1 is now live on the Mac App Store, and it brings the two upgrades I most wanted to ship since launch: the app is now a universal binary, and it finally has real, built-in help.

    Native on Apple Silicon

    Version 1.0.0 shipped as an Intel-only build, which Apple Silicon Macs ran through Rosetta 2. It worked, but translated is not the same as native. As of 1.0.1, FileHasher is a universal app: one download, two architectures, each running natively. Before release, the same build was tested natively on both an Apple Silicon Mac and an Intel Mac, with the full engine test suite passing on each; hashing gives you no room to be approximately correct.

    Built-in help

    The Help menu used to produce the stock “help isn’t available” message, which always bothered me. It now opens a proper help window (also reachable with Cmd-?) with topics covering everything the app does: choosing targets, folder scan options, the four hash algorithms, sidecar formats and conflict handling, verification verdicts, CSV export, logs, and how the app’s privacy and sandboxing work.

    One small touch I like: the Email Support link in the help window pre-fills the subject line with the exact app version you are running, read from the app itself at runtime. Every support email arrives self-identified, and the mechanism can never drift out of date between releases.

    Where to get it

    FileHasher is free on the Mac App Store (macOS 13 or later). If you are new to it: the app computes cryptographic hashes for files and folders, writes standard sidecar checksum files next to them, and verifies everything later, so you can prove a download or archive has not changed since you hashed it. More on the FileHasher page, including the Windows sibling it descends from.

    If you try it and something feels off, the help window’s Support topic knows how to reach me.