Repository navigation
feat(ui): add the full player's Transcript panel - #478
Merged
Merged
Conversation
The full player has no Transcript panel yet, so all three fail on choosing it.
… transcription verbs groupCues takes its soft and hard limits, so the panel groups word-level and half-sentence cues into sentence lines while every note keeps its paragraphs. transcript.ts loads, groups and caches the current episode's published transcript. ShellServices gains the two transcription commands, IPodNotes exposes the transcription service, and SearchField forwards onkeydown.
The player gains a Transcript panel between Chapters and Up next. It shows the feed's published transcript as sentence lines with times and speakers, marks and follows the line playing now, plays from a tapped line, finds a word, and saves the note the Transcribe current episode command writes. A user scroll stops following until Follow brings the line back. Without a published transcript it offers the paid transcription from audio. Chapters and transcript lines share one row style in Panel.
… feeds, and keep Save as note free
…rivate feed's quoted address
Deploying podnotes with
|
| Latest commit: |
46594f3
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://7fcda2bd.podnotes.pages.dev |
| Branch Preview URL: | https://feat-ui-transcript-panel.podnotes.pages.dev |
…e the transcript is fetched, for the note and the panel alike
…te addresses end to end, and phone target sizes
This was referenced Oct 14, 2026
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 free
to 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.
Why
A listener can now read, search and play from an episode's published transcript inside the full player, without writing a note first. The panel follows the line being spoken, plays from any line, and saves the same note the "Transcribe current episode" command writes. Episodes without a published transcript offer the paid transcription in one tap. Refs #348.
What changed
TranscriptPanelis a third player panel between Chapters and Up next. It loads the transcript through TRANS1's ownfindPublishedTranscriptandfetchPublishedTranscriptand groups cues into sentence-sized lines with the note'sgroupCuesunder shorter limits (5 s soft, 30 s hard). There is no second parser and no second grouper.transcribeCurrentEpisode({ paid: false })), so the note is the command's note byte for byte and the Free button never sends audio to a provider. "Transcribe with OpenAI" runs the from-audio command. Deepgram users see "Transcribe with Deepgram".fetchPublishedTranscriptnow redacts the transcript text where it is fetched. It hides the private feed's address, and the transcript's own address when that carries a credential, by the fix(feeds): keep private subscriptions working across devices #428, feat(feeds): protect documented private feed addresses #440 and fix(privacy): keep private feed addresses out of generated notes #454 detection. The note and the panel read that one result, so neither keeps its own sanitizer.scripts/size.mjsrises from 100,000 to 103,000.Scope
Tradeoffs
Size
The owner approved the panel on 2026-10-14: "This is an incredible feature that's well worth 1.9 KB." It measures +2,576 gzip at the feature commit and +2,691 against the current master after review (99,056 to 101,747). The extra roughly 700 bytes over the estimate, and the budget of 103,000 rather than 102,000, are a coordinator decision to keep Find and the Follow chip and to leave room for fixes in flight.
groupCueslimits,transcript.ts, view verbsTranscriptPanel, Player wiring, shared row styleBlast radius
The change adds one panel and touches the player's panel list, Escape order and shared row style. Chapters now shares its row rules with transcript lines, and the view's Escape closes Find before it collapses the player. On phones every panel head control is now at least 44 px tall, including Up next's Edit.
renderTranscriptBodyno longer redacts, because its input arrives redacted. Outside the panel's files:IPodNotesgainsgetTranscriptionService(),TranscriptionService.transcribeCurrentEpisodegains apaidoption (default unchanged, so the command behaves as before),IconTypegainscaptions(type only), the verify skill gains atranscriptscreens state, and AGENTS.md states the new budget. No data.json, IAPI or URI change.Verification
tests/e2e/journey-transcript.test.ts. The timed journey plays and sees the current line advance, taps a line and keeps playing from it, finds "PALACE" (marks, Enter moves the hit, Escape closes Find and keeps the player open), then checks that the note Save as note writes is identical to the note the command writes. A second journey shows the paid button, and a third disables it offline. All three fail on master at "Timed out waiting for player panel Transcript" and pass on this branch.npm run test:e2eon a fresh vault passes at the final head, 197 tests in 27 files.npm run lint,format:check,typecheck,build,test(124 files, 2,606 tests),test:tooling(13),docs:build: all pass on the final head. Node 22.23.2.?token=address and the feed's address shows neither in the panel or the saved note. On a 390 x 844 phone, Save, the Find field, Follow and Up next's Edit measure 44 px.Mutations (standing order 32)
Each wrong alternative was planted, failed the named test, and was reverted.
erroronly, missing a stale feedScreens
320, 820 and 390 in light and dark, each beside the prototype:
Follow, tap to play, scroll away and Follow, then Find "walk" with Enter and Escape, in Obsidian 1.14.4: screen recording (frames).
Docs at release
docs/src/content/docs/podcasts.md, "Play an episode", add a Transcript bullet. It shows the feed's transcript. Select a line to play from it, Find filters the lines, Save as note writes the transcript note, and Follow returns to the line being spoken.docs/src/content/docs/transcripts.md, add a section on reading a feed's transcript in the player (Feed transcript, Free), and say that without one the panel offers Transcribe with OpenAI (or Deepgram), marked Paid, for audio episodes while online.docs/src/content/docs/transcripts.md, "Limits and error messages", say that the transcript of a feed that publishes one has timestamps. Pair this line with TRANS1's docs.Follow-ups
findPublishedTranscriptreports "could not look" apart from "found none", andFeedRepository.loadresolves false for an unavailable private address. The panel's own check could then go.Note
Add full player Transcript panel with search, follow-playback, and note saving
fetchPublishedTranscript, so transcript content and credential-bearing source URLs are sanitized before saving to a note. index.tstranscribeCurrentEpisodegains apaidflag; whenfalseand no published transcript exists, it emits a notice instead of falling back to audio transcription. TranscriptionService.tsfetchPublishedTranscriptnow requires anEpisodeargument, andShellServicesconsumers must implementsaveTranscriptNoteandtranscribeFromAudio. Raises the gzip size budget from 100,000 to 103,000 bytes. size.mjsMacroscope summarized 46594f3.