-
released this
2026-09-19 00:55:38 +00:00 | 0 commits to main since this releaseDo not download this one. It exists to be found.
The one link in the update chain that has never run is the handover: an elevated installer
replacing the supervisor's own executable, while Windows refuses to overwrite a running binary.
Everything up toCommand::new(installer).arg("/S")has tests; that line has only ever been read.0.2.4was meant to be the release an install found and applied to itself, and it was installed by
hand instead — so the handover is exactly as untested as before. An install on the newest build
cannot be asked to replace itself, which is why this exists.Nothing shipped changes from
0.2.4. Deliberate, and the same reason0.2.1carried an identical
payload: if something breaks, it is the handover and not what was handed over.To use it as intended: launch the console as administrator, wait about fifteen seconds for the
uploader's check, and press Install and restart in the indicator at the bottom left. Elevated
matters — the supervisor assumes it inherits elevation from a capture run, and in this path there
is no capture run to inherit it from.Signed, and proven before publishing:
bundle: signed, and accepted by the key this build trusts trusted comment: timestamp:1789779272 file:here capture_0.2.5_x64-setup.exeSHA-256
a208a5d1af007c34f0df4c2033eec4c09a0d4e2992cc0d5b6ad4bdce44281531
Where this came from. This repository is a distribution point, not the source. These bytes were
built fromHERE/Captureatc27cd14.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-19 00:32:17 +00:00 | 0 commits to main since this releaseThe release that asks whether an install can replace itself.
What it fixes
Processes that outlived the window that started them. The console starts a gate in reader mode
and an uploader in cleanup-only mode; neither has a window or a tray. Closing the console stopped
them, but killing it did not — and killing a running app is what an installer does. Two invisible
processes kept running and kept the install directory locked, with Task Manager as the way out.
This was hit twice, both times by somebody installing a release.They now leave through the pipe that is already there: the console holds their stdin open and never
writes to it after a greeting byte, so when the console dies the operating system closes the write
end and the read returns end-of-file. No polling, no process id to be reused, no platform code. The
capturing tree is deliberately unaffected — the floating indicator and its tray are the off switch,
and pulling a recording out from under somebody who closed a window would be the opposite of what
this promises.The greeting byte is not decoration: a stdin that is not a pipe reads end-of-file immediately,
which is indistinguishable from a dead parent, and the first version of this exited the moment it
started.What it is for
The one link in the update chain that has never run is the handover — an elevated installer
replacing the supervisor's own executable while Windows refuses to overwrite a running binary.
0.2.3can find a release, verify it, stage it, offer it, and ask for it without capture running.
This is the thing for it to find.Signed, and proven before publishing:
bundle: signed, and accepted by the key this build trusts trusted comment: timestamp:1789777893 file:here capture_0.2.4_x64-setup.exeSHA-256
457925d592205b301003d4a508de85fe43008e05669c2f9590c3d76cff0ae46f
Where this came from. This repository is a distribution point, not the source. These bytes were
built fromHERE/Captureatdfdfc5f.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-18 23:16:34 +00:00 | 0 commits to main since this releaseSix defects in the update path, every one found by installing a release and using it, none by
the 1,077 tests that pass.What was wrong
The update button could not appear. The check feeding the only update control ran once on
mount and never again, and the uploader stages seconds after that. The only way to see the
button was to already have a staged update from an earlier session.Applying required capture to be running. The supervisor applies updates and existed only while
capture ran, so installing a fix meant starting to record yourself.The button said "Download". By the time it appears the installer is already fetched and
verified, so the press applies it — and it claimed not to stop capture and never said it was
irreversible.A successful update jammed the next one. Nothing removed the staged artifact and the reader
refuses to choose between two, so the second update any install was ever offered turned the
surface off permanently. Every install reaches that state, and a successful first update is what
causes it.An install on the newest build was told it had nowhere to look.
Currentexisted in the code
and was never constructed: an artifact is only staged when it is newer, so being up to date and
never having looked were the same empty directory. The uploader now records what the feed named.A successful update reported itself as a failed check. The artifact an update was applied from
stays behind and names the running version, which reads as "0.2.3 is not newer than the running
0.2.3" — rendered everywhere as a failure, permanently, for everything having worked.Also
Insights no longer promises that a day's capture "appears tomorrow": digests are written by the
retention sweep, and a gate in reader mode asks for no sweeps, so nothing is summarised while
capture is off.Signed, and proven before publishing:
bundle: signed, and accepted by the key this build trusts trusted comment: timestamp:1789773345 file:here capture_0.2.3_x64-setup.exeSHA-256
b7b411e5c4f1020cf9364c02bc50aeed0e348a268b20cf6e0bf345d31d855c5a
Where this came from. This repository is a distribution point, not the source. These bytes were
built fromHERE/Captureat3007721.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-18 21:54:12 +00:00 | 0 commits to main since this releaseThe first build whose update surface tells the truth. Everything below was found by pressing the
buttons on a real install of0.2.0, not by a test.Three ways the update button was broken
It could not appear. The check that feeds the only update control in the app ran once, on
mount, and never again — andAppnever unmounts. The console starts the uploader, the uploader
looks for a release when it starts, and it finds one moments after the UI has already asked.
Measured: the window rendered at 00:13:37, an update to0.2.1was staged and verified at
00:13:51, and no update control existed until the app was restarted. The only way to see the
button was to already have a staged update from an earlier session — which is what happens to
somebody launching the app twice while testing, and to nobody else.Applying one required capture to be running. The supervisor is the only thing that can apply
an update, and it did so only from inside a loop that exists while capture runs. With capture off,
pressing the button wrote a request file and the screen said the update "will be applied by the
service" when no service was there to read it. The obvious instruction — start capture first — is
the part that was not acceptable: it asks somebody to begin recording themselves in order to
install a fix.The button said "Download". There is no download step. By the time it appears the installer is
already fetched and verified, so the press applies it — the one irreversible action in this
product — and it declared that it did not stop capture and never mentioned that it cannot be
undone.What changed
The update surface polls instead of asking once. The console starts a supervisor for this alone
(--apply-update, no roles started, same verification against the compiled-in key) when none is
running, and takes the request back if it cannot. Platforms that cannot apply an update now handle
the flag rather than falling through to the normal path and starting capture. The button says
Install and restart and carries both warnings, pinned by a rendering test.Also: a stale collector now says it is from an earlier build instead of failing as an empty
result, andbundlesigns and verifies what it packages.Signed, and proven before publishing:
bundle: signed, and accepted by the key this build trusts trusted comment: timestamp:1789768400 file:here capture_0.2.2_x64-setup.exeSHA-256
28022669cef9e7dc096493276e9f0e39c1c9b2a66c15b80de4dd63ba64c79f0e
Where this came from. This repository is a distribution point, not the source. The tag above is
where the release was filed; it is not the tree that produced the installer. These bytes were built
fromHERE/Captureatd92c850.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-18 21:09:04 +00:00 | 0 commits to main since this releaseThe release that exists to answer one question: can an install replace itself?
Nothing shipped changes from
0.2.0. The commits between them are a build tool, a test and
documentation, and that is deliberate — the one link in the update chain that has never run is the
handover, an elevated installer replacing the supervisor's own executable while Windows refuses to
overwrite a running binary. Everything up toCommand::new(installer).arg("/S")has tests; that
line has only ever been read. An identical payload is the right payload for the experiment: if
something breaks, it is the handover and not what was handed over.0.1.0could not have been the other half of this. It was packaged at 19:09 and a forge release
only became readable as a feed at 21:46, so an install of it has nothing it can point at.Signed, and proven before publishing — by
cargo xtask bundle, which now signs what it packages
and then verifies that signature against the key compiled into the binaries it just built:bundle: signed, and accepted by the key this build trusts trusted comment: timestamp:1789765700 file:here capture_0.2.1_x64-setup.exeSHA-256
1e7cd131f4399831df1cc6151ff7ce3b08e7f798d484bd7c51ad407045c1238e
Where this came from. This repository is a distribution point, not the source. The tag above is
where the release was filed; it is not the tree that produced the installer. These bytes were built
fromHERE/Captureat131e5c8("Release 0.2.1, to find out whether an install can replace
itself").That distinction is the point of the signature. Nothing here has to be trusted — not the tag, not
the repository, not the feed that pointed at it.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-18 20:07:59 +00:00 | 0 commits to main since this releaseThe first release this project can actually update from.
Windows installer, signed. Verified against the key compiled into the client:
verify-release: accepted by the key this build trusts trusted comment: timestamp:1789758066 file:here capture_0.2.0_x64-setup.exeSHA-256
4044b091d9b3073857279ff4617dbb9b10db6ed4e9d5548adab3410c249a21a4Updates now work from a public repository. The client reads either a purpose-built
{version, artifact, signature}feed or a forge release like this one — so an install can be
updated without a server to deploy, a certificate to issue or a proxy to configure.To point an install at this:
HERE_UPDATE_FEED=https://everything.hereandmore.com/api/v1/repos/mikebrandon/here-telemetry-rnd/releases/latestNothing installs itself. The client verifies the signature against a key built into its own
binary, reads the version back out of that signature rather than trusting this page, and waits
for somebody to press Update.Since 0.1.0
- Display recording ships — pick a window, see what would be captured, decide.
- The app can be reset to a genuine first run, identity and all.
- It asks once whether to look for updates, and says what version it is and what is newer.
Where this came from. This repository is a distribution point, not the source. The tag above is
where the release was filed; it is not the tree that produced the installer. These bytes were built
fromHERE/Captureatd19f666("Release 0.2.0").That distinction is the point of the signature. Nothing here has to be trusted — not the tag, not
the repository, not the feed that pointed at it. The client verifies the artifact against a public
key compiled into its own binary and reads the version back out of the signature's trusted comment,
so the most a feed can decide is what to look at.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-09-04 11:30:52 +00:00 | 51 commits to main since this releaseBoth clients are now green on their own machines. This is the first release with a Windows
binary in it — and the reason it isv0.1.3rather than an asset added tov0.1.2is worth
saying plainly, because it is the same kind of finding this product exists to surface.v0.1.2cannot produce a Windows build. Itscrates/here-indicator/src/windows.rsstill
importsCardandbuild_bannerfrom the modules they were moved out of, so the Windows half
of that tree does not compile. The macOS work was written on a Mac, which cannot compile
anything depending onhere-store(SQLite is built from C and wants the Windows SDK headers),
said so in its handoff, and named the two files it could not check. Both faults were in those
two files.v0.1.2's note promising a Windows attachment was written in good faith; the
attachment belongs here instead.What is in this release
here-capture-windows-x64.ziptwelve binaries in one folder, the layout the console and supervisor both expect macOS not rebuilt for this tag — see below v0.1.2'shere-capture-macos-universal.zipis still the current macOS build. This tag differs
from it, on the macOS side, only by lint fixes to shared files. Rather than attach a bundle
built from a different commit and label it as this one, there is no macOS asset here: the next
release cut from a Mac will carry one.Windows
Unzip it and run
here-console.exe. It is not signed at all — not ad hoc, not EV — so
SmartScreen will object, andmodules.signature_okrecordsfalserather than pretending
otherwise. An EV certificate is the only fix and there isn't one yet.Nothing is captured until you switch a signal on. The Start button applies the firewall rules
that deny every collector a network path, which needs administrator rights; a collector that
could not be blocked is not started at all.Since v0.1.2
- The Windows half compiles and lints. Four errors from the module move, then sixty clippy
findings in crates that had never been linted — the Win32 modules, the collectors' Windows
bodies, the supervisor, the five spikes. - The console stopped reporting running collectors as stopped.
tasklist's default table
truncates the image-name column at 25 characters, sohere-collector-input-metrics.execame
back ashere-collector-input-metrand acontainscheck on the full name said no. Three of
these binaries are long enough to hit it, and that answer is what the console prints directly
under the Start button — so it would have reported a partial failure with all seven collectors
running. Telling somebody their capture is broken when it is working is the same class of lie
as the reverse, and this client is built to prevent both. - A test suite that never cleaned up after itself. Nothing that opened a store on disk ever
deleted it: 641 directories and 392 MB had collected in%TEMP%. Both fixtures now remove the
directory on drop, and keep it — with the path printed — when the test failed, because then it
is the evidence.
453 tests pass on Windows (367 Rust, 86 TypeScript), clippy included, plus the end-to-end
suite that drives a real gate process over real named pipes. macOS runs 444 via
scripts/verify.sh. All seven signals have been exercised against a real desktop on both
platforms; the release binaries here were smoke-tested as a running stack, not only as a build.Not built, and named so it is not mistaken for done
- No code signing on either platform, and no installer.
- The browser extension is unpacked; it loads through Developer mode.
- Nothing server-side. That belongs to the platform team, and
docs/PLATFORM-INTEGRATION.mdis their handoff. - Linux has the transport and the paths and nothing else.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The Windows half compiles and lints. Four errors from the module move, then sixty clippy
-
released this
2026-09-04 10:27:15 +00:00 | 59 commits to main since this releaseThe macOS client is complete: every signal, and every part of the indicator except a click.
What is in this release
here-capture-macos-universal.zip— one bundle for Apple Silicon and Intel (via Rosetta), signed ad hoc. Gatekeeper will refuse it after a download: right-click and choose Open, orxattr -d com.apple.quarantine "/Applications/here capture.app".- The Windows build is not here, and cannot be: this tree's
crates/here-indicator/src/windows.rsstill importsCardandbuild_bannerfrom the modules they were moved out of, so the Windows half of it does not compile. That was found by runningscripts/verify.ps1on a Windows machine, which is what this note originally asked for. The Windows binary is on v0.1.3, whose macOS half is unchanged from this one apart from lint fixes.
Since v0.1.1
- The hover flyout. Resting the pointer on a chip opens a panel beside the pill with that signal's last six records — a time, the gate's verdict as a shape, one line of summary, and never a payload. The pill still takes no clicks: the pointer is observed by polling
NSEvent.mouseLocationrather than captured, so a panel sitting in the corner of somebody's screen all day never swallows a click meant for the window underneath. - A banner bug that only existed on macOS.
build_bannerlived in the Windows body, so the Mac pill built its own fromhealth.paused— and the load-bearing case,Zoom — not captured, appeared on one platform and not the other. Absence made observable is the one thing a contributor cannot check for themselves. The pill's words are now shared, with twelve tests they never had.
Everything since v0.1.0
- Capture cards, the captured-window outline, and the hover flyout on macOS.
- A console bug:
if p.scope == "all"had two identical branches, so any pause marked every signal paused — while a content-only pause leaves input metrics counting keystrokes. - The uploader was silently dead on macOS: its own copy of
data_dir()fell back to".", so it read an empty store beside the binary, decided capture had stopped, and exited cleanly twenty times until the supervisor's restart ceiling left it down. - Clippy is a gate now in both verify scripts. Neither ran it before.
- A universal, ad-hoc-signed bundle, with the script's header stating precisely what that signature does and does not buy.
444 tests pass on macOS, clippy included. The Windows-only packages and the end-to-end suite are checked by
scripts/verify.ps1on a Windows machine.The one deliberate difference from Windows: the Mac pill never takes a click, so the capture card's two controls (
seen,quiet this) live in the menu bar rather than on the card.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-09-04 10:02:29 +00:00 | 61 commits to main since this releaseSuperseded by v0.1.2, which adds the hover flyout and fixes a banner bug that only existed on macOS. This build works; that one is the current one.
Every signal now has a macOS body and each was exercised against a real desktop.
What is in this release
here-capture-macos-universal.zip— one bundle for Apple Silicon and Intel (via Rosetta), signed ad hoc.
Since v0.1.0
- Capture cards on macOS, and the captured-window outline.
- A console bug:
if p.scope == "all"had two identical branches, so any pause marked every signal paused. - The uploader was silently dead on macOS: its own copy of
data_dir()fell back to".". - Clippy is a gate now, in both verify scripts.
- A universal, ad-hoc-signed bundle.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.1.0 — the Windows client, and macOS Pre-release
released this
2026-09-04 08:16:15 +00:00 | 67 commits to main since this releaseWork-session telemetry that captures on a contributor's own machine, gates every byte locally,
and shows the person what it took.This is the first release, and it carries two clients: the Windows one, which is the reference,
and a macOS port of all seven signals.What is in the box
Nothing server-side. That belongs to the platform team and
docs/PLATFORM-INTEGRATION.mdis
their handoff.here-capture-macos-arm64.ziphere capture.app— Apple Silicon, twelve binaries in one bundleWindows to follow, from a Windows machine macOS
Unzip it, put it in
/Applications, open it. It is not signed, so Gatekeeper will refuse
it after a download — right-click and choose Open, or:xattr -d com.apple.quarantine "/Applications/here capture.app"It will ask for nothing until you switch a signal on, and three signals need a permission
that only you can grant — Screen Recording, Accessibility and Input Monitoring, in System
Settings › Privacy & Security. Until they are granted the Capture screen lists exactly which
signals are refused and which setting each one needs, rather than switching them on to produce
nothing.Apple Silicon only. An Intel or universal build is a one-line change to
scripts/bundle-macos.shif anybody needs one.What each platform enforces, and where they differ
Two claims are weaker on macOS than on Windows, and the client says so on its own first screen
rather than leaving it in a document:- Network denial is not enforced. On Windows every collector is blocked by a firewall rule
before it starts, and one that could not be blocked is not started at all. macOS has no
per-process rule, so "a collector cannot leak" rests on a reviewed binary with no network
code. Weaker, and stated as weaker. - The store's key is a file only its owner can read, rather than wrapped by DPAPI. The
Keychain is the right API and cannot be used until the client is signed: an item's access list
is per-binary, this client is four processes, and a second unsigned binary reading an item the
first created blocks on a modal dialog.
Not built, and named so it is not mistaken for done
- No code signing on either platform. SmartScreen and Gatekeeper will both object, and
modules.signature_okrecordsfalserather than pretending. - No installer.
- The browser extension is unpacked; it loads through Developer mode and registers with
scripts/install-extension.shor.ps1. - The macOS pill is read-only — it says what is being captured and offers no way to act on it.
- Linux has the transport and the paths and nothing else.
HANDOFF.mdis where to pick any of that up.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Network denial is not enforced. On Windows every collector is blocked by a firewall rule