Repository navigation
Releases: poli0981/frameledger
Release list
FrameLedger 0.1.0-beta.23
The twenty-third pre-release: a game's artwork on its page, in a band that takes the picture's colour, and pages
that open and change session without freezing. The same unsigned installer: verify its hash against
SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.22: Help ▸ Check for updates, then Restart to update with no game running. The
Privacy Policy (2.11) is shown once for you to accept. No game is read again: the detection rules (2026.10.4) are
beta.22's. The artwork shows by itself for the games Steam or GOG GALAXY installed; Settings ▸ Games turns it, or
its colour, off.
Added
- A game's page shows its artwork (owner request 2026-10-14, decisions D60/D61). At the top of the page: the
banner and the cover the Steam or GOG GALAXY app already keeps on your PC for the game it installed — read where that
app keeps them, never downloaded and never copied — or an image you choose yourself in Edit… ▸ Choose image… (a
copy is kept in the data folder'scoversfolder; Use the store's image goes back). The band they sit in takes the
picture's main colour, never so strongly that a text on it gets hard to read (primary and secondary text keep 4.5:1,
the faintest 3:1, in both themes), and follows a theme switch. A game from itch, the Epic Games Launcher or another
store has a picture only once you choose one, because those apps keep no image files. Settings ▸ Games has Show
game artwork and Colour the game page from its artwork, both on. Privacy Policy 2.11 names the images read and
the copies kept; FrameLedger still makes no request to any store.
Changed
- The list of tested games has its first Vulkan game: Everhex Demo, measured through FrameLedger's Vulkan layer on
2026-10-13 when Play started it directly (docs/LIST_GAME_TESTED.md,LIMITATIONS.md). Four places in the developer
documents that described something never built, or kept a count that went stale, are corrected in place.
Fixed
- A game's page opens and changes session without freezing the window (owner request 2026-10-14). Measured on the
dev PC over a ledger shaped like the owner's (docs/spike-notes.md§21): a game with 100 sessions took 1.2–1.5 s to
open — its Sessions list built every row, now only the rows on screen (it scrolls itself and hands the wheel to the
page at its ends) — 0.37 s now; choosing a two-million-frame session froze the window 0.8–1.0 s — the session was read
and decoded on the UI thread, then sorted three times for the Distribution tab — 17 ms now: it is read on the thread
pool and what the charts need from all of it is worked out there once. The page also asks whether the game's.exeis
on disk off the UI thread (a USB drive that sleeps answered on it), and no longer summarises every game to show one. - Each visit to the Dashboard or Logs no longer stays in memory. Every Dashboard ever opened stayed alive and kept
listening to the capture agent, so at each session's end each one reloaded its lists and raised its own "Session
saved" notice — twenty visits, twenty notices, the last one shown. The Dashboard listens only while it is on screen,
and the notice has one home for the App's life, shown once whichever page is open; each Logs page kept its tail of up
to 2 MB, twice. - The Logs page reads its file only when it changed, not every two seconds, and filters it off the UI thread; Play
reads the stores' lists of installed games off the UI thread (Steam's manifests sit on whatever drive its libraries
are on). At Debug level the App now logs how long each page took to appear (ui: page … shown … ms). - The native ring-buffer tests no longer pass or fail by the scheduler's luck (developers only). The
hammering-writer test required the reader to keep more than half of the stream, which measured how the operating
system scheduled two threads: on a hybrid Intel processor it failed 5 of 200 runs with the ring correct every time.
Both concurrency tests now start the writer only once the reader is running, repeat until the reader really read
the ring while the writer wrote it, and require that; the small-ring test's old check also passed a reader that
started after the writer had finished (src/native/tests/ring_test.cpp).
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
71e017bafe0ccb0fe67d4a02519af0c89db6d998fd54b77c70d2580e9cd8c291 assets.win.json
b9c9f4ba8e7da25d4088f253835a8eb363f0fe6e85fdef40134c29a0161a90a0 FrameLedger.App-0.1.0-beta.23-delta.nupkg
89d2f6867c9fc888fbae03e4027e36dce58bc3f0985b56a9accb8283dfad7418 FrameLedger.App-0.1.0-beta.23-full.nupkg
9c90bd889dc9264ec4ce6a892ff27596c67ac759486cd718f599bbd81a374cc9 FrameLedger.App-win-Portable.zip
54e6c1b283106375c19ab07ee1f997d09a9bbe217545bc575ebae6b5412c24c7 FrameLedger.App-win-Setup.exe
b0fdfffa12f3b237d0f7157b4025cca5366b4bed8c5beb973ae1809930d71ed8 RELEASES
7d81ecbb505c7941e7d4ee330cf260beebbac9213020ddda3b66f93914569b71 releases.win.json
FrameLedger 0.1.0-beta.22
The twenty-second pre-release: a request the capture agent never answered is said as such, never as a crash. The
same unsigned installer: verify its hash against SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.21: Help ▸ Check for updates, then Restart to update with no game running. Nothing is
shown to accept and no game is read again: the legal documents and the detection rules (2026.10.4) are beta.21's.
Fixed
- A request the capture agent never answered is said as such, never as a crash. When the agent stopped, or restarted
for an update, while FrameLedger was asking it something, deleting sessions ended in the crash dialog, and turning a
game's hooking on or off or making or withdrawing an anti-cheat exception showed IOException or TimeoutException as
its notice. Each now says that the agent did not answer and that whether it was done is not known, and the page shows
what is stored; Play says the same (it said the agent was not running). A request that could not be sent because the
agent was already gone still says that nothing was changed (docs/07_IPC.md§Client behavior).
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
a50eed0bb69b987d0da159e990215fb685ed528ecba89ced31a9dca532310f7a assets.win.json
c3f76fec147d43e0842cc3610d2a812bb0c17b8c995ddbd9bdaf8e47c60d7599 FrameLedger.App-0.1.0-beta.22-delta.nupkg
384b000bec1458974d62bc3f4ce118d199322ed51a597c6d8588768652c116f5 FrameLedger.App-0.1.0-beta.22-full.nupkg
c5a65520e6d4f46a8ba3a729f54995316dd3900b2b4f32ae1eacda8f4d6dcda1 FrameLedger.App-win-Portable.zip
280feb78554eefa9ad03fc9e9222bb0fe179aa1f6f607a1f5e159850b65b2b28 FrameLedger.App-win-Setup.exe
86f7fb5871283e5b70bcbad52d5391018c4217d9bf6059ec0810d1ea4ede82e8 RELEASES
573001278ccae50697f4cadb0b4957411e52307419f868538e40af89e115c8e5 releases.win.json
FrameLedger 0.1.0-beta.21
The twenty-first pre-release: an anti-cheat kept beside a game's executable found before anything is injected, four
itch.io downloads that carry malware, documents that scroll further and smoothly, and Play. The same unsigned
installer: verify its hash against SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.20: Help ▸ Check for updates, then Restart to update with no game running. The Privacy
Policy (2.10) is shown once for you to accept. Every game is read and checked for anti-cheat once more (detection rules
2026.10.4): Wuthering Waves, and any game that keeps an anti-cheat beside its executable, has its hooking turned off.
If you installed HELLO, HELLO WORLD!, A Doll's Locket - Remake, City of Bones or Träumerei Chapter 2 from itch.io, read
Security below first.
Added
- Play, on a game's page and on each game in the library. Through the store that installed the game — Steam or the
Epic Games Launcher starts it, GOG GALAXY runs it, the itch app asks which copy to launch — or started directly by
FrameLedger, recorded from its first frame: Settings ▸ Games ▸ Play button switches between the two. A game no
store installed, and a GOG game without GOG GALAXY, is started directly. FrameLedger never starts a game as
administrator: Start directly does not start one that asks for it, and while FrameLedger itself runs as
administrator, Play starts every game directly so that the game does not. A game whose recording is off is started
only through its store. The Epic Games Launcher's link is the one its own shortcuts carry and has not been tried on a
real Epic game yet (docs/08_UI.md§Games). - The Privacy Policy (version 2.10) names the store records Play and the library import read — the lists of installed
games the Steam, GOG GALAXY, Epic Games and itch apps keep on your disk, and where GOG GALAXY is installed; the import
read the Epic and itch lists before and the policy did not say so — and that Play hands a game to its store's app,
which may connect to its store while FrameLedger itself connects to nothing. It is shown once for you to accept.
Changed
- The documents in the app scroll further and smoothly — the user guide, Help ▸ Limitations, About's documents, the
Legal Gate and the update notes. A wheel notch moved them a fixed short step whatever the wheel or touchpad sent;
it now moves the number of lines Windows is set to scroll (a screen if it is set to that), about twice as far by
default, in proportion for a touchpad, and glides there unless Windows' animations are off. At the end of the update
notes the wheel scrolls the window instead; Ctrl+wheel still zooms. A page is drawn once when it is opened, not two or
three times, and going back to a page you have read in the same window is immediate.
Fixed
- An anti-cheat kept beside a game's executable is found before anything is injected. The safety check looked three folder
levels into a game's install folder and no further, so an anti-cheat beside an executable that is itself three levels down
was never seen: Wuthering Waves keeps Tencent's Anti-Cheat Expert inClient\Binaries\Win64\AntiCheatExpert\, its
page read clean, and a session with hooking turned on was hooked for 37 seconds before the check that runs every 30 seconds
met the anti-cheat's driver — and because a driver counts for the whole PC, the game's hooking stayed on. The check now also
looks in the executable's own folder, on the game's page and before every injection. Wuthering Waves is also named by its
Steam id (owner decision D58), and ACE's files, its second driver, its driver's service and its module are named (detection
rules2026.10.4). Every game is checked for anti-cheat once more after the update; one found this way has its hooking
turned off, as any finding does (docs/19_SAFETY_AND_ANTICHEAT.md§Pre-injection checks, item 4). - A game's Supports card said Not scanned yet for a game the agent had read whenever the game ships none of the
upscaler, frame-generation or Vulkan files the rules name — beside a Details card the same read had filled. It says
so now only until the agent has read the game, then None found.
Security
- Four itch.io downloads this project's documentation used as examples carry malware. HELLO, HELLO WORLD!, A Doll's
Locket - Remake, City of Bones and Träumerei Chapter 2 put the same 213 MB program in front of their RPG Maker game.
Read without running it, it ships a registry file that switches off Windows' script scanning (AMSI) and adds
Microsoft Defender exclusions, carries an encrypted payload, and checks for virtual machines and debuggers before it
starts the game. The documentation called it a launcher and, for A Doll's Locket, said to measure it with the agent
running as administrator: that advice is withdrawn. If you installed one of them, remove it and scan your PC.
FrameLedger itself does not change: it reads a game's files to find its engine and anti-cheat, and does not judge
whether a game is safe (docs/spike-notes.md§20).
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
2ca88c176c2e0ec6b290572f27a426ec38f485e8c39aee5a22c9c707ec7ea730 assets.win.json
195fe24e62ee4ad794ff5f7d21a5526e51326be4f6f9b15ddb84fef98d2f13b9 FrameLedger.App-0.1.0-beta.21-delta.nupkg
807cffe4ffb27b7e123a4b5748b7e5bf1653f3ba608d903df9b9be315f3f5033 FrameLedger.App-0.1.0-beta.21-full.nupkg
41dd014c5acf8d88618115acd329dfca264a219df49f10d535cb57b03791c9ba FrameLedger.App-win-Portable.zip
730b8c473b383b017c42bc0bb28c8b56d49a35232b8c332aed85e3222c4f012c FrameLedger.App-win-Setup.exe
8dd341a5e1c482a828924d0d611eb739ba97d66a2504e1c0b0363bbd81a98a81 RELEASES
34040f8c725f8a9796a1fde56ae48acf42ed8d3d2b721a38b627bece848662a8 releases.win.json
FrameLedger 0.1.0-beta.20
The twentieth pre-release: the engine version of Ren'Py games. The same unsigned installer: verify its hash against
SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.19: Help ▸ Check for updates, then Restart to update with no game running. The Privacy
Policy (2.9) is shown once for you to accept. Every game is read once more for its engine (detection rules 2026.10.3).
Added
- The engine version of Ren'Py games, as Unity's, Godot's and RPG Maker's have been shown since beta.19 — on the game's
page with what it was read from, the engine's ownrenpy/vc_version.py: Ren'Py 8.5.0. A game whose engine names no
version there reads as not found. Every game is read once more after the update (detection rules2026.10.3;
docs/05_DETECTION.md§Engine version — Ren'Py). - The Privacy Policy (version 2.9) names that file among the version marks it reads; it is shown once for you to
accept.
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
009a8816d15e8734aaffcf9bd90dd891c56c44854be66fbbb90fc5fd52a55fb3 assets.win.json
9b90cdb4318aa1cea20cec4b54b28a1b3e2b85bc56aec55af4bcc1b0e0c2e4a9 FrameLedger.App-0.1.0-beta.20-delta.nupkg
28016491f649349f13b341e6d201ab7680e48f66e2e67feec374d50dff7c4df7 FrameLedger.App-0.1.0-beta.20-full.nupkg
4c20ca344b45e38d06fd22b4de8e8d7cedd3cfd295ae535718752a232df63c81 FrameLedger.App-win-Portable.zip
beb374f20a6c3eb4195cec6495b3962be6f4f3cfe0f21ff147c2c7e4e43ec98d FrameLedger.App-win-Setup.exe
371c22aa7441656be5c608bff37b22a6be9706528e3b8c8c6a5193d82f9e6824 RELEASES
599706d3c240a8fb713a2a768fd7e02a414b890f9a11cc6d545b58c13666e1fb releases.win.json
FrameLedger 0.1.0-beta.19
The nineteenth pre-release: an imported game that is its own runtime and not a helper, Change executable… in the game's
folder, the engine version of Unity, Godot and RPG Maker games, and games you uninstalled leaving the library by
themselves. The same unsigned installer: verify its hash against SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.18: Help ▸ Check for updates, then Restart to update with no game running. The Privacy
Policy (2.8) is shown once for you to accept. Every game is read once more for its engine (detection rules 2026.10.2).
The agent removes the entries of games you uninstalled that have no sessions, about ten minutes after it sees them gone —
turn Settings ▸ Data ▸ Remove uninstalled games off first if you want them kept. An entry an earlier import made for a
helper is not changed: re-point it with Change executable….
Added
- The engine version of Unity, Godot and RPG Maker games, as Unreal Engine's has been shown since beta.10 — on the game's
page with what it was read from, and the maker on the library card too: Unity 2022.3.39f1 (from the player library,
else its data file; a game whose data file is encrypted reads without the release letter, 2019.4.40), Godot 4.4.1
(from its data pack), RPG Maker MZ 1.10.0 and MV 1.6.2 (from the core script), RPG Maker VX Ace (RGSS 3.0.1)
(from the runtime library itsGame.ininames — that number is the library's, not the editor's). A Unity version used
to read as its library's build number (2022.3.39.5118735), and a Godot one was never found. Every game is read once
more after the update (detection rules2026.10.2). RPG Maker 2000/2003 is not recognised (docs/05_DETECTION.md
§Engine version — Unity, Godot, RPG Maker). - The Privacy Policy (version 2.8) names the files those versions are read from, and two that were already read and
never named (Unity's player library and an RPG Maker game's title); it is shown once for you to accept. - A game you uninstalled leaves the library by itself when it has no sessions: the agent removes an entry whose
.exe
has been gone for ten minutes, if its drive is connected and the folder it was installed in is still there — an
unplugged or re-lettered drive never counts — and never one where anti-cheat was found. A game with sessions stays, with
them, and reads Not installed as before. The Games page says so when it happens — once, naming them, for all the games
one check removes; Settings ▸ Data ▸ Remove uninstalled games turns it off (docs/02_SPEC.mdFR-1.8).
Changed
- Change executable… opens in the game's own folder — the install folder a store made (
steamapps\common\<game>
and the like), or above an Unreal game'sBinaries\Win64, else the folder the executable is in — instead of wherever
the last file dialog was. For a game whose folder is gone it opens at the nearest folder still there
(docs/08_UI.md§Games).
Fixed
- An imported game is no longer one of its helpers, and an RPG Maker MV/MZ game behind a launcher is its runtime.
A Doll's Locket - Remake (itch) was added asnotification_helper.exe, NW.js's notification helper, because the itch
app's own record named only that file (it leaves out a launcher that asks for administrator and anything a folder
deeper) and the import took it as the game. A helper named by the store is skipped now and the executable is guessed —
the import list says so — and the guess takes the executable beside NW.js'snw.dllandpackage.json, the process
that draws (css\Game.exethere; its launcher asks for administrator, so it is measured with Run the agent as
administrator on). The import also no longer offers a store's game again when the library has it at another
executable: an entry already there is re-pointed with Change executable… (docs/05_DETECTION.md§Library import). - The Games page shows its newest read of the library. When two reads overlapped — a session ending while an import
added games — the one that started first could finish last and be shown, an older list until the next read.
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
87de7e9a69b528aa4cafc7dc50139970b55a505f501568770ce6fa41086b6df2 assets.win.json
084cf480641da16cd0a4da59fa4ff528763e5258800255a6c36001c796a8f0ec FrameLedger.App-0.1.0-beta.19-delta.nupkg
a4b082b3f633e71f073584cc4b63844583da5386c1087e6191c4346652ab58e2 FrameLedger.App-0.1.0-beta.19-full.nupkg
50858fa45e67abceba20f0376f735358f44bfc4e564e30c36817f30903c1e47c FrameLedger.App-win-Portable.zip
859e88aa391292f7b977d4aa0f68fb3a9bfcbbe8cbab8b9c2653ac4bf53f32ad FrameLedger.App-win-Setup.exe
2b03f091279d35fb98ba4bf34ccb84f641f440c0e0f05f27eb8d013ea51b8ab9 RELEASES
c556617aaebe5bb515e862902106b85f644ddbc4c915c53884b2908a1b69ab8a releases.win.json
FrameLedger 0.1.0-beta.18
The eighteenth pre-release: every page readable in the dark theme, notices that say what happened in words, and a
release whose build no longer calls itself dirty. The same unsigned installer: verify its hash against
SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.17: Help ▸ Check for updates, then Restart to update with no game running. Nothing in
the database changes and nothing is shown again for you to accept; sessions already stored keep their status.
Fixed
- Page titles and section headings read in the dark theme again. Every page's title and its section headings — Dashboard,
Recent sessions, Games, Compare, Settings and each of its groups, Logs — were drawn near-black on the dark window
(owner's screenshots of beta.17; beta.16 had it too). A page is shown in WPF UI's navigation Frame, which passes no text
colour into the page, and a text that sets none is black; a page open during a theme switch picked the right colour up,
and the next one navigated to did not. Every page now sets the theme's text colour itself.AccessibilityTests.EveryPageSetsItsOwnTextColour
andPagesLoadTests.EveryTextIsReadableInBothThemes(every surface hosted as the App hosts it, ≥ 3:1 in both themes)
went red on the unfixed pages first; the theme-switch check now hosts pages in the Frame too, and its harness derives the
accent for each theme as the App does (docs/08_UI.md§Contrast,docs/16_WPFUI_SYNTAX.md§Gotchas,docs/14_TESTING.md). - Every notice says what happened in words. With Disable all hooking on, a game's notice read "kill switch was
detected in this game (the global 'disable all hooking' switch is on (FR-2.4); …)" — it reads "All hooking is switched
off in Settings, so nothing was measured." now, and a game blocked before reads as that, not as a finding. A refusal no
anti-cheat names read "… reason RefusedByGuard." and is said in the guard's words ("the game is 32-bit, and the hook
runs in 64-bit games only"); the agent sends the guard's reason for every refusal (docs/07_IPC.md). A safety re-scan
that could not look while the game ran read "Access is denied. was detected" and says the check could not be made. And
Measurement stopped printed "The hook stopped (WriterSelfDisabled); the session continues without measuring." — it
says why in a sentence, and no longer that the session went on: a stop ends it.NoticesFromTheAgentTestsbuilds the
agent's own events for every refusal and every stop and went red with each text above (docs/08_UI.md§Notifications policy). - Disable all hooking says when it applies. Turning it on said "The capture agent reads it at the next session start";
a game being measured stops at its next safety scan, within 30 seconds, and the message says so. - Turning hooking off with no agent says nothing changed — Settings' Turn off, the game page's switch and a
withdrawn exception said "Nothing was enabled.", the enabling path's words. - A viewer over a copy leaves every agent setting alone. The user-mode exception option, the three Recording numbers
and the update channel stayed live in--data-dir, where no agent reads them (ViewerModeTests). docs/08_UI.mdlisted a "PawnIO missing" banner that was never built; struck, with the banners that do exist.- A release's overlay build no longer calls itself dirty. The Dashboard read Overlay build v0.1.0-beta.17-dirty (and
beta.16's, and every release's before): the release workflow writes the release date into the legal documents before
the build, and the build id was read from the tree after that. It is read from the clean checkout first and handed to
the build, andtools/buildid-check.ps1reads it back out of the published binaries (docs/12_BUILD.md§Release-time
token substitution). Nothing changes for a game: both sides of the ring's handshake always carried the same id. - Two end-to-end tests no longer fail CI by a race (developers only). The Vulkan launch test asks the test harness
whether this machine can present through Vulkan before it starts the capture host: on GitHub's runners the harness's
own "skip" line never reached the host's output, and a scan of the exiting harness failed the test instead of skipping
it. The target-exit test holds its harness 15 seconds instead of 6, the margin a slow runner's host needed
(docs/13_CI_CD.md).
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
b010d980b39708a3401d34257382d309fe0469cc7c0cb21ef14e524332e45d5a assets.win.json
5b5bdfe89e82d5a7e2ce7fc930f5784b7526e7704e564160dd76e6f4c512ede6 FrameLedger.App-0.1.0-beta.18-delta.nupkg
8d67ae427a5c2107de021ae4f66d4ed9a5aa83526a581f1b040d47ca870fa578 FrameLedger.App-0.1.0-beta.18-full.nupkg
b8a09d53f72adad676b0fab113f684df58c93888ba3a274e5ea5ba078693b292 FrameLedger.App-win-Portable.zip
3d93804459f51500de9605dd6598443f180ee68bc9d80c993f4b0a50aafb6e6c FrameLedger.App-win-Setup.exe
1f502a4554623b647ab57a63e11b347bf5e0b0e93033a331152156c3ea19652e RELEASES
fde0f774515c3446655c9fc6f599c2af645de78bc248a37c952642b45ca56683 releases.win.json
FrameLedger 0.1.0-beta.17
The seventeenth pre-release: text that keeps up with a change of theme, scroll bars hidden everywhere when you ask, a
user guide that answers more, and a wiki. The same unsigned installer: verify its hash against SHA256SUMS.txt, then
More info → Run anyway.
Updating from 0.1.0-beta.16: Help ▸ Check for updates, then Restart to update with no game running. Nothing in
the database changes and nothing is shown again for you to accept; sessions already stored keep their status.
Fixed
- Text keeps up with a change of theme. After switching between Light and Dark, the descriptions and captions of the
page in view — Settings above all, where the theme is chosen — kept the old theme's colour: light grey on white, or dark
grey on dark. Every such text now follows the switch, on every page, window and dialog (08_UI§Contrast,
16_WPFUI_SYNTAX§Gotchas). - Hide scroll bars hides every scroll bar. With Settings ▸ Window ▸ Hide scroll bars on, the Dashboard still drew its
scroll bar — and so did the first run, About, the user guide and a game's wide sessions table; only screens with a
switch or a tick box on them lost theirs. Every scroller follows the option now, and still scrolls with the wheel, the
keyboard and touch (08_UI§Settings,16_WPFUI_SYNTAX§Gotchas). - The first run names the right place to import your library. Its last step said File ▸ Import library… on the
Games page; File is the main window's menu, and the Games page has no such button. In Vietnamese it now names the menu
as it is shown (Tệp).
Added
- The user guide looks things up too. Four pages join it, in Help ▸ User guide: The screens (every page, menu,
button and shortcut), Every setting (what each one does and its default), When something goes wrong (what you see,
what it means, what to do) and Words FrameLedger uses. Tests now fail when a setting or a menu item is added without
its line in the guide, or a link names a section that does not exist. - A wiki. The project's wiki has two halves: the user guide, the
same pages the app shows, and short pages for developers — the architecture, the repository, building and testing,
the rules every change keeps, capture, metrics, data, the app's UI and releasing — each linking to its full document.
It is published from the repository whenever a release is made (wiki.yml), so it always matches the newest
release, and./build.ps1 checkfails on any link in it that leads nowhere (13_CI_CD§wiki.yml).
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
ee84cdcfac8ea9eccec80c4e8b4e19226e763045e1dcd8ab367744f412d846de assets.win.json
31ec505611e2a195ebc750bd753efd01d4c9d9926fd44eb262e9e9234f99f9bf FrameLedger.App-0.1.0-beta.17-delta.nupkg
9ee0fa3f285f29ad19fc1fcdb3e36939e34554defcfc3fa79971d31f28fb3645 FrameLedger.App-0.1.0-beta.17-full.nupkg
19c34e9d0cfec59b724e8ff61ddd2bca50be86838a0275a602f81b628d715f5d FrameLedger.App-win-Portable.zip
d3d935e86493c50ed9585d74c2b39fb16f5822312e28b7102fa74c67023a11d5 FrameLedger.App-win-Setup.exe
719336632725acf603c730dee270cae0c2360ed4058bcbe5eccbc97ddf562c37 RELEASES
a579be9f8f8c03c7e8f6963164d06d1b2eb4722042c273db8d37db7872a27d88 releases.win.json
FrameLedger 0.1.0-beta.16
The sixteenth pre-release: nothing changes in the app. It is 0.1.0-beta.15 as the owner verified it on real hardware
the same day, with the developers' end-to-end tests made reliable. The same unsigned installer: verify its hash against
SHA256SUMS.txt, then More info → Run anyway.
Updating from 0.1.0-beta.15: Help ▸ Check for updates, then Restart to update with no game running. Nothing in
the database changes and nothing is shown again for you to accept; sessions already stored keep their status.
Fixed
- Development: the Agent's and the capture host's end-to-end tests no longer fail when another test project starts
the test harness at the same moment. Each such suite now records into a copy of the harness under a name of its
own, so the target it asks for is never ambiguous (14_TESTING). Nothing in the app changes.
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
cf571a1f02ed493e4965aa118b6222696a3088b2ec3e2573bf807862aa6426b4 assets.win.json
7203cba7bab0707c31645fff545a4aa0bb87be28b04119d5618bdd5f0b7d0f10 FrameLedger.App-0.1.0-beta.16-delta.nupkg
51bc19fb986eb4e4ae243bb94e7afcc628a9fb2b7365b8d8136df738f80eb981 FrameLedger.App-0.1.0-beta.16-full.nupkg
60be7624af2f3eb8391783956b8f93c8f60e9583730d2d4dd7d53c274eef061d FrameLedger.App-win-Portable.zip
ffcd11f78e9dfedeab23f0ec0e5a41c1f7d9f8485fc0989aa167aa047133cc57 FrameLedger.App-win-Setup.exe
f5bedbd8032badbda7205ae312352440ce075ec2ec292ae98724c54bdcb7866f RELEASES
033f4754556d8b61d8ad5c5b5d52c22536f04db94ee0faf0e0a9959c619c4268 releases.win.json
FrameLedger 0.1.0-beta.15
The fifteenth pre-release: a quick restart recorded, an anti-cheat check that stays on the game's own programs, a
change of language that reaches every list, and a launcher followed to its game. The same unsigned installer: verify
its hash against SHA256SUMS.txt, then More info → Run anyway. What changed for a user:
- A game started again a few seconds after closing is recorded — while the session before it was being saved, the
new start used to be turned away and never looked at again. - The anti-cheat check stays on the game's own programs. Windows reuses process numbers, and a program that had
taken over the number of a game's closed launcher could be scanned as part of the game — refusing the session, or
turning the game's measuring off. It no longer is. - A change of language reaches every list at once — the theme and update-channel lists, the Logs page, the Games
sort order, the tray's menu and the Agent's status — without a restart. - A game started through its launcher is followed to the game itself (the Agent's console
launch). FrameLedger.exe --data-dir <folder>opens a copy of a data folder to look at, with no Agent and nothing on the PC
changed.
Updating from 0.1.0-beta.14: Help ▸ Check for updates, then Restart to update with no game running — FrameLedger
stops its Agent before the update is applied. Nothing in the database changes and nothing is shown again for you to
accept; sessions already stored keep their status.
Added
FrameLedger.exe --data-dir <folder>opens a copy of a data folder to look at, for checking a build of your own
against real data without touching your own. Such a window starts and contacts no Agent, records nothing and changes
nothing on the PC — the controls that would are disabled, and a banner says whose data it shows. It refuses
FrameLedger's own folder.
Fixed
- The anti-cheat check could scan a program that had nothing to do with the game: Windows reuses process numbers, and
once a game's launcher had closed, the check followed its number to whatever program held it now — a protected one
refused the session, one carrying anti-cheat turned the game's measuring off for good. A program started after the game
is no longer taken for its launcher, nor one started before the game for its child; when FrameLedger cannot read when a
program started, it still scans it, as before. - A game started again within a few seconds of closing was not recorded: while FrameLedger was still saving the
session that had just ended, the new start was turned away ("one session at a time") and never looked at again. It is
recorded now, as soon as the session before it is saved — unless the game's other processes are still running beside
it, as a multi-process game's helpers are. - A game started through its launcher was never followed to the game itself (the Agent's
--console launch): when
the launcher exited or never drew a frame, FrameLedger was to find the game the launcher had started and record it, and
it never did — the launcher's process id was not passed on, so the search stopped before it began. It is passed on now,
and a launch that ends without one says so in the log. - After a change of language some text stayed in the old one until FrameLedger restarted: the theme and update-channel
lists in Settings, the log and level lists on the Logs page, the sort order on the Games page, the tray icon's menu and
the Agent's status in the title bar. They follow the language at once now.
SHA-256
Releases are not code-signed (11_UPDATER). Verify before running:
63826bb2654caf09c05de18ec3935dd91ef066f37bafd4bb0037e50f45507f53 assets.win.json
782b8e6928eca20106f47a6531c6fe70e47b1b0c449318c5dbd7dcea624ca7e7 FrameLedger.App-0.1.0-beta.15-delta.nupkg
d082e13fda91b965310cfa8fc8da60bdbbffbabfecf63d95416f71d0927b660b FrameLedger.App-0.1.0-beta.15-full.nupkg
cb0df821799f04d4d5f16306fc32ba44d31973a20367daa69fb41b7f682f2454 FrameLedger.App-win-Portable.zip
ca2d78f7dfe4d8980d59d1d04fd336391bbf9d609de02e50c0aef3444d39e376 FrameLedger.App-win-Setup.exe
9b0f28bc953a664a3e25fe2464cd7e16cd0dd9bb3e6ebf96ee75271bcd159d47 RELEASES
31536b98e59c49df4cf5703bc02e2e5ac8a2c8d7888c6572eecf962f3329b1c4 releases.win.json
FrameLedger 0.1.0-beta.14
The fourteenth pre-release: a wheel that scrolls, updates that find this channel and wait for your games, crashes told
apart from memory reports, and new measurements. The same unsigned installer: verify its hash against
SHA256SUMS.txt, then More info → Run anyway. What changed for a user:
- The mouse wheel scrolls every page, dialog and chart; over a chart the wheel scrolls the page and Ctrl+wheel
zooms the chart. Settings ▸ Window ▸ Hide scroll bars draws no bar and still scrolls. The import list is readable
in the dark theme. - Updates come from the channel of the copy you run — a beta looks for betas — and are never applied on their own
when the App starts; restarting to update waits while a game FrameLedger measured is still running, and says so. - A game that crashed reads crashed, and only then: a Windows memory report about a game no longer counts as a
crash, and an Unreal Engine game that opens its crash reporter and closes is recorded as crashed, the reporter named. - A game starting up or closing during FrameLedger's anti-cheat check is read again once instead of refused, and a
check that could not read a game that had already closed ends the session as the game's own exit. - New in every session's summary: time below 30 and 60 FPS and below the monitor's refresh rate, how even the frames
were, VSync and tearing, the graphics card's clocks, fan and memory temperature, how much of the time its power limit
or heat held it back (NVIDIA), frames per watt, and a render scale chart. Trend and Compare have them too. - FrameLedger's own programs say what they are in Explorer and Task Manager (FrameLedger Agent).
Updating from 0.1.0-beta.13:
- First choose Beta in Settings ▸ Updates. beta.13 looks for stable releases by default, and every release so far
is a pre-release, so it finds nothing until you do. From beta.14 on the channel follows the copy you run. - Update with no game running. beta.13 still applies a downloaded update the next time the App starts, stopping the
Agent to do it; beta.14 no longer does. - The database is migrated in place (schema 0019, new columns only). An earlier version cannot open it afterwards.
- Sessions already stored keep their status — a few may still read crashed because Windows logged a memory report
about the game. The Privacy Policy (version 2.7) is shown once for you to accept.
Added
-
Settings ▸ Window ▸ Hide scroll bars. No scroll bar is drawn anywhere in the app while it is on, and everything
still scrolls with the mouse wheel, the keyboard and touch. Off by default; it applies at once, to the open windows
too, and off brings every bar back. -
New measurements in every session (recorded from this version on; earlier sessions read N/A):
- time below 30 FPS, below 60 FPS and below the monitor's refresh rate, and how much one frame's time differs from
the next. A game held at its frame limit is not counted as dropping below it for the small wobble every frame limit
has — on the developer's machine a game capped at 60 read half its time "below 60" by the plain rule; - VSync and tearing: how many of the game's frames asked to wait for the display, and how many allowed tearing
(Direct3D games); - the graphics card's clock speeds, fan speed and memory temperature, and — on NVIDIA cards — how much of the time
its power limit or its temperature held it back; - frames per watt: the game's own frames per second for each watt the graphics card drew, never counting generated
frames.
The session's sensor statistics table shows the new card readings in their own units. The database is migrated in
place (schema 0019), and an earlier version cannot open it afterwards. - time below 30 FPS, below 60 FPS and below the monitor's refresh rate, and how much one frame's time differs from
-
Where the new measurements are shown: the session summary has a card for each (the 1% low card also shows the
displayed frames' 1% low when frame generation was counted, beside the game's own), a Render scale chart — the
share of the screen's resolution the game rendered at, over the session — and a Clocks and fan chart under
Sensors, with the moments the card was held back shaded; the card's memory temperature joins the temperatures chart.
A game's Trend has nine more metrics and Compare nine more rows, where a figure taken over presents says
(presented) beside one taken over the game's own frames. The Latency tab is shown only for a game with a session
that measured latency — none does yet.
Fixed
- A session could read "crashed" when the game had not crashed, and an Unreal game's crash read "ended normally".
Any Windows report that named the game counted as a crash — on the developer's machine a memory-leak report Windows
writes about large games marked an ordinary The Witcher 3 session crashed; hang reports and another program whose
name contains the game's would have done the same. Only a crash report of this game's own process counts now. And
Unreal Engine games handle their own crash: they open their crash reporter and exit with code 3, which said nothing;
FrameLedger now sees the crash reporter a game starts (Unreal's, CD PROJEKT RED's, Capcom's, BugSplat's) and records
the session as crashed when the game exits within a minute of it — the summary names the reporter. Unity's and
Chromium's crash handlers start with their game and are never taken for a crash. Sessions already stored keep their
status. BugSplat's sender (Kingdom Come: Deliverance II) can no longer be picked as a game's executable by the import.
The Privacy Policy (2.7) now says that FrameLedger reads Windows' crash reports and the names of programs a game starts. - A game that exited as FrameLedger's anti-cheat check ran could be recorded as "unhooked (safety)" — and, under a
user-mode anti-cheat exception, end the exception's trial for good. The check reads every process in the game's
tree every 30 s; one that was just starting (an engine's crash reporter as its game dies, any helper the game launched
a moment before) or already gone could not be read, and the check refused. Such a process is now read once more a
quarter of a second later, and refused only if it is still unreadable (a protected process never gets the second
look). And when the check could not read and the game itself has exited, the session ends as that exit, normal or
crashed by its exit code. Anything the check finds is a refusal exactly as before (owner decision D48). - An installed copy never found an update unless you had changed its channel. The update channel was Stable by
default and every FrameLedger release so far is a pre-release, so the check found nothing. The channel is now
Automatic: a pre-release looks for pre-releases and a release for releases; choosing Stable or Beta still decides. - A downloaded update was applied the next time FrameLedger started, before anything could check for a running game.
The update library applies a waiting package at start unless told not to, and nothing told it: it stopped the capture
agent mid-session instead of letting it finish. The App now offers such a package as Restart to update, which waits
for the session to end and stops the agent properly, as it always did for a download in the same run. - The update dialog said ~102 MB when the download was the 1.6 MB delta. It now says the delta's size and names the
full package as the fallback; the updater's own lines are in the App's log, so a full download shows there. - Restart to update could fail half way when a game FrameLedger had measured was still running — its loaded overlay
cannot be replaced — or when an agent was still waiting on the administrator prompt, and it gave the agent 10 s to stop
where the agent takes up to 15. It waits for all three now and says why. A full disk no longer reads as "offline",
and uninstalling removes the Start FrameLedger with Windows entry. - The import list was unreadable in the dark theme. File ▸ Import library (and Games ▸ Refresh) drew every row white
with white text, and each tick box as a sliver at the row's edge: a row style added in beta.11 to dim the games already
in the library fell through to Windows' own row, which is white in every theme, and WPF UI's check box is too wide for
its 40 px column. The rows take the theme's colours again and the boxes are whole, and the list is the one thing in the
dialog that scrolls — its intro and the count under it stay in view, where a list scrolling inside a scrolling dialog
used to carry the intro away. Compare's session picker draws the theme's check boxes too (it drew Windows' old ones). - The mouse wheel scrolled nothing on the Dashboard, Games, a game's page, Compare and Settings — only dragging the
scroll bar did. WPF UI wraps a page in a scroller of its own unless the page says otherwise, and inside it each page's
own scroller had nothing to scroll and still took every wheel. Every page scrolls itself now. The Logs page had the same
cause: its tail grew to hold every line and never followed the newest one, as it was meant to. A scroller inside a
dialog (the consent, administrator, anti-cheat exception and bug report dialogs) hands the wheel on at its ends. - The chart-wheel test read the real keyboard (developers): a Ctrl held anywhere on the machine while the test ran
turned its plain wheel into a zoom, and a local gate went red once. The keys held are now the test's own input, and the
Ctrl+wheel half is driven end to end as well.
Changed
- Over a chart, the wheel scrolls the page; Ctrl+wheel zooms the chart. ScottPlot zoomed on every wheel, which with
the pages scrolling again would have zoomed the chart and scrolled the page at once. Dragging still pans and
double-click still resets. - FrameLedger's own programs say what they are. In Explorer (...