Repository navigation
[feature] after a meeting: tabs, who-does-what, find & replace; org pages; ask to record when a call starts; start/stop cues - #659
Open
pathorsdesign wants to merge 121 commits into
Conversation
…t an AI critique
The post-meeting delivery report read as a pile of text: a tone verdict with
an advisory, an "AI read" narrative, and a talk-volume strip on top of the
numbers. The team wants it to read like a small dashboard of objective facts.
The full/replay scorecard is now five tiles - pace, talk share, filler-word
count, long pauses, interruptions - plus a row of the most frequent filler
words as chips ("然後 ×6", "對對對 ×3"). Everything is computed locally from
the saved transcript and respects the replay trim window.
- fillerWords: countFillersByWord tallies lexical crutch words (shared
vocabulary, longest entry first), hesitation sounds folded per shape, and
runs of three or more 對; topFillers ranks them.
- turnTiming: countLongPauses (a >= 3 s gap between the user's own segments
that nobody else spoke in) and countInterruptions (the user starting before
the other side's segment ended, or within 300 ms of an unfinished sentence;
once per other-side segment). Both are null when the session is not split
by source, like talkTimeRatio.
The LLM delivery pass still runs and is saved; this view just stops
rendering its tone and narrative. The live meters are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ck copy per side
The post-meeting action list went unused because it never said who does
what. After a sales call the user wants to paste "here's what we do" to
their team and "here's what you do" to the customer, so each item now
carries an optional side ("us" / "them") and owner (a name as said in the
meeting).
- The action-items prompt (shared/prompts/study.json) now asks for
follow-ups on BOTH sides and for side + owner; the strict schema gains
both as nullable fields. Android's generated prompt copy, the golden
fixture and the phone's word-schema are regenerated from the same JSON;
the phone parser ignores the new fields, so phone-made items stay
side-less.
- The panel groups sided items under "us" then "them" headers (side
name from the user's company / the recording's folder, owners, count)
with a copy button that puts a numbered, LINE-ready list on the
clipboard. Items with no side (older recordings) render as before.
- Both fields are optional on ActionItem, so existing entries and the
cloud copy shared with iOS/Android keep working; MCP writes keep them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… actions, notes, delivery, replay The report was one long scroll (brief, action items, delivery, a hand-off section) behind two titlebar tabs, with a filing suggestion card and a folder bar stacked on top of it. Finding one thing meant scrolling past the others, and the card asked the user to accept a title nobody wanted to think about. Now the page has one header: the recording's name (click to rename, Esc cancels), a Copy menu (this page / transcript / transcript with the analysis prompt), a filing row, and an underline tablist - 總結, 後續行動 (with a count), 筆記 (only when notes were taken in the floating window), 評分 and 回放. The titlebar keeps only the analysis chip. The title is no longer a suggestion (meeting decision: just name it, let them edit). When the filing pass lands with a title and the recording still carries the name it had when the pass started, filingRun renames it through renameHistoryEntry - the same path as a user rename, which also clears the suggestion's title - and sets a session-only titleAutoApplied flag that drives an "auto-named" tag. Any rename clears the flag. Off screen, the saved entry's title is checked instead. Only the folder half stays a suggestion, as chips in the filing row (first one emphasized, a new folder dashed), with "choose another folder" and "not now". studyTab becomes summary | actions | notes | delivery | replay; setStudyTab normalizes the old "report" to "summary". The notes tab reads the notes back out of the saved meeting context (meetingNotesOf, the inverse of contextWithNotes). The summary and actions tabs end with a "saved, won't regenerate" line and a Regenerate button (regenerateArtifact). FilingSuggestionCard, HandoffSection, the report's TOC rail and its sections are gone; their filing logic (spent-suggestion resolution, folder creation, fly-to-folder, the "filed" tick via useRefile) moved into FilingRow, and the hand-off's working parts already live in the guide bar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…moves under the action items The brief's four sections on one page made 總結 too long to read. The saved text is now cut at its headings: 總結 shows one section at a time behind small tabs (重點/決議/待解問題…), and the forward-looking section (Suggested next agenda / Next steps) reads under 後續行動, next to who does what. Cutting the saved text costs no model call and works on every recording already saved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…itle The row highlights on hover like one big target, but only the title was a button, so clicks on the date, the source icon or the stats did nothing and it took several tries to get in. The row now opens on any click that isn't on one of its own controls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ground Opening a shared org recording waited for its whole audio file to download before the page changed — twenty-odd seconds with nothing on screen, so the click looked dead and people clicked again (each click starting another download). The page now opens on the transcript and analysis; the audio attaches to the player when it lands, and is kept for the rest of the run so a reopen plays at once. The row spins while a recording opens, further clicks wait for it, and a failed open says so instead of only logging. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… yet" An org recording is read-only and has no personal folder, so the page's filing row fell through to 還沒歸檔 even when it sat in an org folder such as 內部會議. The library now hands the org and folder over when it opens one, and the row shows them as the destination picker does (org tag › folder), without actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ft open It dated from when 離開 was the only way out of a recording. The library now opens a recording in one click, and the chip, showing only a name, read as where you are rather than a way back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ive in the page header The titlebar showed 'folder › recording name' (renameable) right above a page header showing the same name (renameable) and the same folder (changeable): two breadcrumbs and two places to rename. The titlebar now holds one back button to the recording's folder; the header owns what the recording is and where it is filed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The analysis detects the kind and it is rarely changed, yet it sat at the end of the filing row as a 132px form select. It is now a quiet pill next to the title, as the design canvas has it: it says what the meeting is, and still opens the same menu on a click to correct it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…tton, the kind tag goes - The meeting-kind tag beside the title is gone: nobody used it to read or change anything. The kind is still detected and still shapes the analysis. - 會議背景 left the filing row's ⋯ menu (its only item, so the menu went too) and became a tab, shown only when the meeting had a prepared background; it shows that background without the in-meeting notes, with an edit button for the same sheet. - 連接 AI sits beside 複製: the MCP hand-off the old report's last section carried (Claude Code command, Claude Desktop config, connection status, questions naming this recording), which the tabbed page had dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The prompt copy was disabled on read-only org recordings while the plain transcript copy next to it worked — the same text minus the prompt, so the restriction protected nothing and only looked broken. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Two one-time lines above the speakers and the replay transcript (哪一位是你?…, 點任一句就跳到那個時間…) said what the controls already make plain. Typing a name into your own column still saves it as your name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
複製這一頁 next to 複製逐字稿 left people guessing which page and how the two differed. The item now reads the open tab's name, and on 回放 — whose page is the transcript — it is left out rather than offering the same text twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The last place the kind could be changed from the recording page, sitting by the 時間軸分析 title where it read like a filter for the timeline. The analysis still detects the kind, and the upload wizard still lets you pick one; with no callers left, MeetingKindPicker goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…-to line The backdrop is the UX file's 'Integrations — Main Content' (3105:4659): a pale blue wash over thirteen vertical light bars that rise in one after another as the page opens. The bars fade to transparent rather than #eef9ff so they also sit on the dark theme; reduced motion shows them still. The line under the start buttons (趕時間就直接錄;要先準備背景的會議先建草稿…) repeated what the two buttons already say. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The light sidebar takes the design's #f5f7f9 on every platform (on macOS it was a 55%-translucent tint over the window's vibrancy, which shifted with the desktop behind it). The home backdrop's wash drops to 60% and its bars to 20%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The sidebar drew its own right border right beside the resize handle's 1px line, so the divider read as 2px. The handle's line is the divider now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
It can be dragged to resize the sidebar but looked like any other hairline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Opening an org (e.g. Pathors Technology) from the sidebar showed only the recordings at its root — usually none, so a blank page. It now lays out the org's folders as cards from the UX file (3541:9358 default, 3541:9359 hover): a back panel, two papers and the folder's front, with the name and how many recordings it holds; on hover the back turns blue, the papers rise and the name turns blue. A click opens the folder. Recordings at the org's root still list below, and the page sits on 總覽's wash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The first card, from the UX file (3541:9360 default, 3541:9412 hover): a dashed pale-blue frame with a folder front and a blue button; on hover the front widens and the button turns solid. A click turns the button into a name field; Enter (or clicking away) creates the folder in the org, Esc or an empty name cancels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The UX file's new-folder card changed (3541:9360 / 3541:9412): a solid #f6fcff frame instead of the dashed one, and a slimmer button. A click no longer turns the button into a white field; it adds a grey folder card right after it, the name typed straight into the card's name slot on a transparent, borderless field. Enter or clicking away creates it; Esc or an empty name drops the card. The folder card's drawing is now shared between real folders and the draft. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Per the updated UX file (3541:9360 / 3541:9412): the labelled button gives way to a dashed + in a circle; on hover the frame deepens to #e0edf4, the front widens and the + fills. The whole card is now the button, named by a tooltip (and its aria-label). The + is lucide's Plus, the same 16px icon the design uses, so its exported SVG isn't shipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The new-folder card's hover front is its default front sheared (same bottom, top 11px to the left), but the two were crossfaded in place, so the shape jumped. Both layers now shear together about the bottom edge while they crossfade, so the folder tips open; the + grows a touch. Folder cards move on one longer curve, their papers lifting on a slight overshoot, the front sheet a beat after the back. Reduced motion skips it all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
It changes the same setting as Settings › Basic › Theme, so it no longer takes opening the settings window to switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… the same thing Following the speech-analysis proposal, the tab now reads as four groups built only from data Parley already has, instead of four tiles, a strip and a separate AI box: - 01 語速: the measured pace, or the AI's pace read when nothing was measured. These were a tile and an AI note saying the same thing. - 02 語言習慣: one row for 口頭禪與贅字, with the counted 痾/嗯, the AI's density read and the words it saw. These were a tile plus an AI row. - 03 對話互動: talk share with a bar, and the per-minute talk strip. The group is left out when the session can't separate the user from the others. - 04 語氣與整體表達: the tone verdict, its quote, the AI summary and the advisory together, since they are one judgement. Nothing shows as a dash. A row with no data is left out instead, which is what made the 11/01 trim read as broken. The tone read and the AI narrative stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…acts The grouped tab still showed only a handful of numbers. It now opens with four headline numbers (pace, fillers per minute, talk share, pauses) and draws each group as charts, all computed locally from the saved transcript and respecting the replay trim window: - 01 語速與停頓: a pace-over-time line with the average dashed across and the fastest and slowest stretches stamped, and a pause timeline where a taller mark means a longer pause, with the longest one stamped. - 02 語言習慣: ranked bars of the fillers used most (count and share), with the AI's density read under them, and back-to-back repeated words with where they happened. - 03 對話互動: a talk-share ring, stacked talk-over-time columns (you vs. others), and turns, average and longest turn, median reply time, interruptions and backchannels. - 04 語氣與整體表達: unchanged (tone, quote, AI summary). speechStats.ts holds the maths and has its own tests. countFillersByWord and turnTiming come back from 179ebfb, which had been reverted together with its UI. Facts a recording can't answer, such as interaction in a diarized mix, are left out rather than shown as dashes. Pauses are measured between segments, so they are a lower bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…tered column The non-replay tabs were capped at max-w-2xl and centered, so their left edge moved away from the header's and the replay tab's whenever the window was wider than about 700px. They now use the header's px-6 edges at full width. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The brief's markdown kept prose's rules: table row lines, horizontal rules, quote borders and underlined links. ReportContent takes a plain flag that drops them all, and the 總結 tab uses it. Other places keep the rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Laid out like the speech-analysis proposal's option A. The report reads down the left column and opens with 這場你的說話特徵 as large plain numbers. Each module heading carries its English name. A nav on the right (特徵 / 01 語速 / 02 習慣 / 03 互動 / 04 語氣) stays in place while the page scrolls, highlights the section being read and scrolls to a section when clicked. On a pane narrower than 680px it becomes a row above the report. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…cky nav on the right The brief showed one section at a time behind a row of chips. It now lists every section in the left column under a numbered heading (01 重點, 02 決議 …), divided like 評分's modules. A nav on the right tracks the section being read and jumps to a section when clicked. ReportNav moves to study/ so both tabs share it. A brief with a single section still reads whole, without a nav. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…g on every click
Each reading tab (總結, 後續行動, 筆記, 會議背景, 評分) was unmounted on
every switch (key={tab}) and rebuilt when opened again, so it came back at
the top, on its first section, with charts and placeholders drawn afresh.
Now a tab renders the first time it is opened and is only hidden after
that. Coming back shows the same view, scroll position and section. The
kept set belongs to the recording, so opening another recording starts
clean. 回放 still mounts only while shown, because it owns the audio
player and its shortcuts.
The AI outputs themselves were already generated once and saved with the
recording. Switching tabs never re-ran them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… shows The sample ships prewritten and is never sent to the model, so it fell behind the current format: - Its brief used bold labels instead of the sales lens's ## headings, so 總結 could not cut it into sections and showed one block with no nav. It now has the same four sections a generated sales brief has (Where this landed / Their pain and objections / What we still don't know / Next steps). Next steps moves to 後續行動 like any other brief. - It had no 評分 read, so 04 語氣與整體表達 sat empty. The script now carries a prewritten tone, filler and pace read and a summary, which go into the manifest and onto the entry. A sample imported earlier is brought up to date when it opens (refreshSampleOutputs): only an unsectioned brief or a missing read is replaced, so a brief the user regenerated stays. render.ts copies the new delivery field, and the manifests were updated in place, without re-rendering the audio. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Two things made the speaker count, duration and sync icon wander: - The trailing controls changed width per row. A cloud-only recording has no rename or 移動, so its stats sat further right than a synced one's. Rename, delete and 移動 now share one fixed, right-aligned slot as wide as all three. - Each stat was only as wide as its digits (1 vs 8 people, 0:05 vs 4:53:29). They now get fixed-width columns, so the icons line up. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…inks to an icon toggle Choosing Dark also pinned the native window to dark. WKWebView reports a pinned window theme as prefers-color-scheme, so after that the media query kept answering dark and System resolved to dark on a light OS. System now releases the window theme (setTheme(null)), so the query reads the OS again and its change event re-applies the real answer. The sidebar switch is now a small pill of three icons (sun, moon, monitor), with their names on hover, at the bottom left. It no longer has labels or a divider. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…trip The sidebar colour is translucent, and the new wrapper painted it under the tree, which paints it again. The tree came out darker than the footer, so the switch looked like it sat in its own block. The wrapper no longer paints, and the footer paints the colour once like the tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…er the same The previous fix lightened the whole sidebar to match the footer. That was backwards. The column paints the translucent sidebar colour again, and the footer paints it on top as the tree does, so the footer now matches the tree instead of the other way round. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On macOS dark the sidebar colour is a translucent navy over the window's vibrancy, so every extra layer changes the tone. The theme-switch footer had painted it two or three times over (column, tree and footer). The column now paints it exactly once. The tree and the footer are transparent, which is the single layer the sidebar had before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… the page's theme For 系統, 9e14ee9 released the native window theme (setTheme(null)) instead of pinning it. On macOS the translucent dark sidebar sits on the window's vibrancy, which follows the window's appearance. With the window not pinned to dark, the rail came out grey instead of navy. The window is pinned to the shown theme again in every mode. 系統 still needs the OS's real answer, and a pinned window hides it from prefers-color-scheme (the original 深色 → 系統 bug). So 系統 briefly releases the window, lets WebKit re-read the OS over two frames, then paints and pins that result. It re-checks when the window regains focus or visibility, since a pinned window can't see the OS switch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On macOS the dark rail was translucent over the window's sidebar vibrancy, and it read as muddy grey, especially when the window's appearance and the page's theme drifted apart. It is now solid oklch(0.22 0.026 250) on every platform: lighter than the page (#0c1620) and just under the cards, so it still reads as its own surface. The light rail was already solid and is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…track stands apart from the sidebar The toggle's track used the muted token, which in the dark theme is almost the solid sidebar's navy, so the group melted into the rail. It is now a faint foreground tint with a hairline ring, so it lifts off the sidebar in both themes. The selected icon keeps the page colour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…a grey slab The dashed empty notes (即將開始的會議, 會議草稿, an org's drafts) used white at 20%, which reads as a light grey bar on the dark page. In dark mode they are black at 20% instead. Light mode is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The big bold headline numbers (pace 偏快, a high talk share) used the pause button's warning foreground. With no pale wash behind them they read as a heavy orange. A new --warning-text token sits between the wash and that foreground (light oklch(0.69 0.105 63), dark oklch(0.76 0.08 66)). Only the large numbers use it. Small warning text keeps the darker foreground, since the lighter tone is too faint to read at that size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… tab switching The command table covered navigation, meetings and replay, but not the chords people press without looking anything up: - ⌘N opens a new meeting draft (from the study page it goes home first, since that page's prep fields are the open recording's; never during a meeting). Never starts recording: that stays ⌘R. - ⇧⌘N opens the sidebar's new-folder field, revealing a collapsed tree. - ⌘F focuses the library's search box. - ⌘G / ⇧⌘G step to the next / previous match in the transcript's find bar. - ⇧⌘[ / ⇧⌘] switch the study page's tabs, as Safari and Chrome do. - ⌘M, ⌃⌘F, ⌘H and ⌘Q are listed in the cheat sheet on macOS (AppKit owns them, so they are listed, not bound). ⌘N and ⇧⌘N are also File menu items on macOS. Library and study are now scopes of their own. They are siblings, so ⌘F can mean the library's search on one and the transcript's find on the other; findConflicts now checks only scopes that can be live at once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On a recording's study page the number keys now pick a tab and ⌘← / ⌘→ step through them, as in a browser. Elsewhere they keep going Home / Library / Back / Forward; on the study page Back and Forward are still ⌘[ / ⌘] and the mouse's side buttons. A row may now `shadow` an enclosing scope's command: while its scope is live it takes over the chords the two share. The webview binding of the outer command skips a taken-over chord, the macOS menu bar (which matches ⌘1 before the webview sees it) hands the click to the inner command, and the cheat sheet prints the chord on the inner row only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
⌘1–⌘9 pick the Nth tab and ⌘← / ⌘→ (or ⇧⌘[ / ⇧⌘]) step through them wherever there are tabs: the study page, 語境庫, the meeting window (both layouts) and the Settings window's categories (in the order the nav shows them, so a search narrows what they walk). ⌘F also reaches the search box on 語音輸入記錄 and in Settings. The study page's own tab commands become one shared set (tabs.select / prev / next) that any strip claims through useTabShortcuts. The `tabs` scope can sit on any screen of any window, so it overlaps every scope for conflict checking. On macOS the menu bar owns ⌘1–⌘3, and used to route them straight to the main window, so Settings could never see them. Menu clicks now go to the window in front; a main-window command that window doesn't take over is forwarded to the main window, which comes forward as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The feed's header carried a manual "analyze now" button and, beside it, the auto-analysis cadence menu. The feed refreshes itself, so the header is now just the title and count. The auto-analysis setting stays in the findings panel; the strings only the removed menu used are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Recording starts from the sidebar's record button and the titlebar, and a draft from ⌘N, the File menu and the drafts section, so the pair beside the greeting was a second copy of each. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Nothing has been recorded for a draft, so "started" was untrue. Inside its slot the row now says 已過開始時間 (Past start time), highlighted because 開始 is still the thing to press; once the slot is over it says 已過期 (Missed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The two sheets of paper say the folder holds something; a folder with no recordings (and the one being named) is now drawn without them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
This branch has not been deployed
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.
Reworks what you see after a meeting (from the v2 design canvas and the team's review meeting), gives org pages their folders and drafts, and adds the two desktop cues from #606 and #607 — plus a round of library and polish fixes.
The recording page
**## Highlights**) are unwrapped first.shared/prompts/study.jsonchanges accordingly (Android regenerated; its parser ignores the new fields for now).Find & replace in the transcript
VS Code-style find widget: a side toggle opens a replace row, ↑↓ step through hits, Replace / Replace all as icon buttons (count + shortcut in tooltips, ⌘⌥F). Select text → 「取代…」. Edits persist to the entry (text only, by segment id) and sync; a toast offers 「加入常用詞」 (the fix plus the misheard word as a variant); a notice offers to regenerate the stale analysis. Read-only org recordings have no replace UI (no API to write them).
Ask to record when a call starts (#606)
meeting_detectmodule polls (1 s) which app is using the mic: CoreAudio process objects on macOS 14.2+ (device-running fallback below), the microphone consent store on Windows. No permission prompts.Onboarding
Floating window, reminders, colour
Voice-typing cues (#607)
macOS system sounds via NSSound (Ping to start, Bottle to stop); Windows system aliases via PlaySoundW. Voice typing plays the start cue on press and the stop cue after the capture is cut, always. Meeting recordings play no cue at either end, so there is no setting.
Library, org pages and shell
Checks
bunx tsc --noEmit✓bunx vitest run✓ (1798 tests)cargo clippy --all-targets -D warnings(macOS) ✓; the Windows-only code was clippy-checked in isolation — the Windows CI job is the real check.Notes for review
is_dev()); a bundled app uses Parley's icon.🤖 Generated with Claude Code
https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Refs #676 (mobile follow-up)