Make the Record tab say what it is doing - #18
Merged
Conversation
The page was a meter and a log, and the log took the whole surface because nothing else was on it. But a log is diagnostics — what you open when something is wrong — so giving it the largest panel made the tab read as a console with an instrument bolted on, while leaving both of the questions the page exists to answer unanswered: will this work, and what has it done? Readiness. Five checks, run off one settings read and one endpoint enumeration: ffmpeg, the library folder, which endpoint will be captured, the metadata provider, and VB-CABLE. Blocked and degraded are kept apart deliberately — only ffmpeg and the folder can stop a session, and telling a user their recording will not start when it will is worse than saying nothing. The two quiet ones are the point: a provider selected without credentials degrades silently to untagged files, and a machine with no virtual cable records every sound it makes. Saved this session. TrackSaved was already raised and nothing consumed it. It now fills the panel the log used to have, with a reveal button per row, and the totals sit beside the now-playing strip. Cover art, album and destination. All three were already known and thrown away: the enricher fetches the art to embed it, and the destination is rendered to decide where to write. RecordingSession raises TrackEnriched when the lookup lands — a second into a track, not at the end of one, which is what makes it worth showing. The art is decoded eagerly because the file it comes from is a temporary the encode deletes. The art sits below the display, not on it. Everything on that panel is segments and a colour photograph behind the glass would read as a different device. Also: Microsoft.Hosting.Lifetime is muted. "Application started. Press Ctrl+C to shut down." was the first line of the activity log on every launch, and it is neither Offstream talking nor true — this is not a console application. ReadinessProbe takes IAudioDeviceCatalog rather than calling AudioEndpoints statically, so it is testable without hardware and cannot report different endpoints in its two device rows. 805 Core, 185 UI (Category!=Desktop, as CI runs them). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Uh oh!
There was an error while loading. Please reload this page.
revtex added a commit
that referenced
this pull request
Aug 14, 2026
* Bring the changelog up to date with PRs 12-23 It was last touched in #11 and ten PRs have merged since, so the file described an app several phases behind the one in the tree - which for a Keep a Changelog file is worse than an empty one, because it reads as current. Entries for: the refresh token lost an hour into every session, SMTC as the primary track source and the TFM raise that allows it, endpoint hot-plug, extended-length paths, VB-CABLE detection, the existing-file policy checked before it could know the destination, the Logs tab and the Record page rework, the Spotify match guard, genre from Spotify's artists with Last.fm behind it, the media-session floor and its two mappers, Last.fm's missing album guard, the shutdown that left a ghost process, and the provider summaries on Settings. Readiness is deliberately absent: it was added in #18 and removed in #19, so no release ever carried it and an entry for each would be two lines describing nothing. Test count updated to 1051 (877 Core, 174 UI). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * Require a changelog entry per PR, and drop two stray images The changelog going ten PRs stale was not an oversight anyone would catch by trying harder, so it is a rule with a check behind it now rather than a good intention. CLAUDE.md states it; a CI job fails a pull request whose diff does not touch CHANGELOG.md, with a `no-changelog` label as the escape hatch so a test-only fix opts out by saying so instead of by staying quiet. The job runs on ubuntu with no `needs`, so it answers in seconds alongside the Windows build rather than behind it - which is why it is a job of its own, despite the note on `build` arguing against exactly that for publish-check. That case was gated on `needs: build` and paid for a second VM to run strictly afterwards; this one does not. Also removes 06aa2f03-...jpg and b514cfc3-...jpg from the repository root. Both were untracked, and both were mine to be suspicious of and wrong about: I guessed earlier they were leaked cover-art downloads. They are not. CoverArtFetcher writes to GetTempPath() under the name "<random>.offstream-cover.jpg" and never to the working directory, and these were a matched pair of 1024x572 images, which is not the shape album art comes in. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Record tab was a meter and a log, and the log took the whole surface because nothing else was on it. A log is diagnostics — what you open when something is wrong — so giving it the largest panel made the tab read as a console with an instrument bolted on, while leaving both of the questions the page exists to answer unanswered: will this work, and what has it done?
The log fix
Microsoft.Hosting.Lifetimewas never muted, so every launch opened the activity log with:None of that is Offstream talking, and the Ctrl+C line is advice for a console application. One
MinimumLevel.Override.Readiness
Five checks off one settings read and one endpoint enumeration: ffmpeg, the library folder, which endpoint will be captured, the metadata provider, VB-CABLE.
Blocked and degraded are kept apart deliberately. Only ffmpeg and the folder can stop a session; telling a user their recording will not start when it will is worse than saying nothing. The two quiet ones are the reason the panel exists — a provider selected without credentials degrades silently to untagged files, and a machine with no virtual cable records every sound it makes into the recording.
ReadinessProbetakesIAudioDeviceCatalograther than callingAudioEndpointsstatically, so it is testable without hardware and its two device rows cannot disagree about what is plugged in. 14 new tests.Saved this session
TrackSavedwas already raised and nothing consumed it. It now fills the panel the log used to have — track, destination, length, and a reveal button per row (explorer /select,viaArgumentList, since the path is built from a window title). Totals sit beside the now-playing strip. Capped at 50 rows; the library is the archive.Cover art, album, destination
All three were already known and thrown away — the enricher fetches the art to embed it, and the destination is rendered to decide where to write.
RecordingSessionnow raisesTrackEnrichedwhen the lookup lands, a second into a track rather than at the end of one, which is what makes any of it worth showing. The art is decoded eagerly (BitmapCacheOption.OnLoad) because the file it comes from is a temporary the encode deletes.The art sits below the display, not on it: everything on that panel is segments, and a colour photograph behind the glass would read as a different device.
Not built
The waveform/history graph, by agreement — it looks impressive and tells you nothing the meter doesn't.
Testing
805 Core, 185 UI at
Category!=Desktop, as CI runs them.dotnet format --verify-no-changesclean.Heads-up for manual testing: five
RecordPageTestsFlaUI cases fail locally because the log moved into a collapsed expander and they assert it is directly visible. CI skipsCategory=Desktopso this PR is green either way, but those tests need updating and are worth a look during the manual pass.🤖 Generated with Claude Code