Download it, check it, run it. No administrator. Nothing to install first.

1 Two ways to get it. Same result.

d47-setup-….exe it puts itself away d47.zip you unpack it yourself ONE FOLDER that you can pick up and move wherever you like Not into Program Files — somewhere you own, so it never needs to ask for permission.

2 Check it is really ours.

WHAT YOU GOT Get-FileHash A FINGERPRINT compare THE PUBLISHED ONE SAME — run it DIFFERENT — do not Builds are unsigned, so Windows will warn you. This is how you check instead of trusting.

3 What ends up in the folder.

d47.exe runtimes\ data\ settings.json secrets.json models\ logs\ keep these two together apart, it starts — but cannot hear you everything it writes your settings, your keys, your logs move the folder and all of it moves Never your Windows profile. Everything is here, beside the program.

4 Updating itself.

IT TELLS YOU a banner appears YOU PRESS IT nothing moves before this IT CHECKS the fingerprint again IT SWAPS and restarts If any step fails, it puts everything back. You never end up with half an update.

5 What leaves your PC.

YOUR PC your voice your journal your keys A VERSION NUMBER the update check — switchable off A SPEECH MODEL once, ~75 MB, coming in Nothing else is sent out of the box. Nothing in the dashed box ever crosses the line.

The details

Download the installer — d47-setup-0.78.1.exe, or whatever version is current — from the latest release and run it. The version is in the filename on purpose, so a folder with several of them in it still tells you which is which. There is no runtime prerequisite, and it never asks for administrator rights.

It installs for your account only, into %LOCALAPPDATA%\Programs\d47, and appears in Add/Remove Programs like anything else. Running a newer installer upgrades the existing install in place rather than leaving two copies behind.

The portable zip

d47.zip is published beside the installer for anyone who would rather not install: unpack it into a folder you own — not Program Files, which D47 could not write to without elevation it never asks for — and run d47.exe.

Either way the layout is the same: one executable, plus the speech-recognition native libraries in a runtimes folder beside it. The executable is a self-contained publish, with the .NET runtime and every managed dependency inside it; the natives sit beside it as plain files because that is where their loader looks. Keep them togetherd47.exe without its runtimes folder starts fine but cannot transcribe a word.

What you can rely on, installed or portable:

  • No .NET runtime needs to be installed first.
  • No elevation, ever.
  • Everything D47 writes lives in a data folder beside the executable. Move the whole folder, and the program, your settings and your secrets all move together.

Uninstalling

Uninstall from Add/Remove Programs. It removes the program and asks — once — whether to delete your data folder as well. Answering no keeps your settings, your saved keys and any speech models you downloaded, so a later install picks up where you left off. The default is to keep them.

Verifying the download

Code signing is pending. Directive 47 has applied to the SignPath Foundation, which grants free code signing certificates to open-source projects, with the signing itself run by SignPath.io. Once that is granted and wired into the release pipeline, releases will be signed and Windows will show a publisher name instead of an unknown one. It is not granted yet, so everything below describes how things stand today.

Builds are unsigned, so Windows SmartScreen will likely warn — on the installer as readily as on the executable. Rather than ask you to trust that, every release publishes a SHA-256 beside each download. Compare whichever you took:

Get-FileHash .\d47-setup-0.78.1.exe -Algorithm SHA256

Match the result against the .sha256 file published beside it in the same release — or d47.zip.sha256 if you took the zip. If it differs, do not run or unpack the file.

Where things are written

Everything is under data, beside the executable:

d47.exe
runtimes\
  win-x64\             speech-recognition natives — shipped with the build, not downloaded
data\
  settings.json        plain JSON, hand-editable, unknown keys named at startup and kept
  secrets.json         API keys, DPAPI-encrypted for your Windows account only
  models\              speech models — only if you chose one and agreed to the download
  logs\
    d47-20260812.log     human-readable
    d47-20260812.jsonl   the same events as newline-delimited JSON

Finding it again

The installer adds a Start Menu entry, so this section is mostly for the portable zip.

Either way D47 is just the folder it lives in — the exe, its runtimes libraries, and everything it writes in data/ beside them. Copy that folder and the whole thing, program and state, comes with it; move only d47.exe and it leaves its ears behind.

The cost of that is a program you can only reach by remembering where you left it, so the first run offers to add a Start Menu entry — unless the installer already made one, in which case it stays quiet. It is one shortcut, for your account only, needs no elevation, and you can delete it like any other. Decline it and you will not be asked again; Settings → About → Add to Start Menu is there if you change your mind.

The shortcut points at the file rather than at a copy of it, so an in-place update leaves it pointing at the new build — the same reason a pinned taskbar icon keeps working.

Only one D47 runs at a time. Starting a second one raises the copy you already have instead, whichever version that is: two copies would mean two journal readers, two microphones and two writers over one data/ folder.

Update checks

On startup, D47 asks GitHub’s public releases API for the latest tag and compares it against its own version. If a newer build exists, a banner offers Update now.

Update now downloads that release’s d47.zip, checks it against the d47.zip.sha256 published beside it, and puts each file it contains where the running one is — the executable and the runtimes libraries both — renaming what it replaces to .old rather than overwriting it, then starts the new build. The .old files are deleted the next time D47 starts, and a failure part-way puts everything back; you never end up with half an update. If any step fails — no build attached, the download did not finish, the checksum did not match, the archive was not a d47 build, or the folder D47 lives in needs elevation to write — it says which, and opens the release page so you can do it by hand.

Builds older than v0.5.14 predate the zip and cannot install it; their update banner opens the release page instead, and moving up is the three download-unpack-run steps at the top of this page once more.

Nothing is downloaded unless you press the button, and D47 will only fetch a URL that is an asset on a release of this repository.

Offline or GitHub unreachable is treated as “no update” — startup never waits on the check and never fails because of it.

What leaves the machine

Nothing about you or your game.

Out of the box D47 makes two kinds of outbound request, and neither carries anything about you:

  • The update check described above — a GET with no Commander data, no journal data and nothing identifying. Switch it off in Settings and D47 makes no network call of its own. Pressing Update now on the banner it raises adds one more: downloading that release from GitHub. That is a download rather than an upload, and it happens only when you press it.
  • A speech model download — once. D47 ships with the smallest English model selected and fetches it from huggingface.co on first run, about 75 MB; choosing a different one fetches that instead. Only the model file is transferred, nothing about you goes with the request, and once it is on disk transcription runs entirely on this machine — no audio and no transcript leaves it. Set the speech model to none if you would rather it fetched nothing.

Providers that send game-derived data off the machine — a cloud LLM, a paid voice, INARA, web search — are each enabled individually and each states what it transmits.

You never have to take this page’s word for any of it. D47 computes the answer from your current settings: ask it “what are you sending”, or open the Privacy and egress section of Settings. A page can go stale; that report cannot.

secrets.json is encrypted with Windows DPAPI scoped to your user account. Copying it to another machine or another account leaves it undecryptable, and D47 treats an unreadable secret as that capability being switched off rather than as an error.