Repository navigation
Releases: wanderingstan/vibeconf-app
Release list
v0.8.55
The app's windows are restyled. First release on the stable track since v0.8.53, and the first to carry the new look.
Changed
- The app's windows now use the site's visual system (#713) — the Fluent palette, with Syne, DM Sans and JetBrains Mono vendored locally so nothing is fetched at paint. Covers the panel, Bot Settings, Brain, Troubleshooting, About, App Settings and first-run setup. The app icon is unchanged, and your avatar artwork still fills the panel; only the chrome on top of it changed.
- The bot's name and ⚙ sit on a translucent chip so they stay readable over any artwork, light or dark. The gear went from 36 to 44px.
- Long bot names step down from 26px to a 15px floor before eliding, rather than pushing the window furniture off the edge.
- The panel uses an outline rather than chips, and the call button is green (#794).
- You can drag the window by the whole banner, not just a strip above the name.
Fixed
.agent-namewas an inline<span>, so itstext-overflow: ellipsisnever applied and long names overflowed silently..bot-herohad nomin-width: 0, so a nowrap name inflated the banner past the window's right edge and took the gear with it.
Known issue
- The footer Sign in control is hard to read on dark avatar artwork — a palette ink used against unconstrained background, measuring as low as 1.7:1, and in a different font from the text beside it. Tracked as #801; the fix is small and will follow.
Internal
- The macOS release build in CI is still broken (#791) — this build's Mac assets were produced locally, signed and notarized.
Mac updates come from latest-mac.yml / the -mac.zip; the .dmg is for fresh installs.
v0.8.54
Release candidate. Three of these are fixes for failures hit in live cohort sessions.
Fixed
- The bot's own speech no longer excuses an entire caption stall (#265, #790). The old rule excused the whole gap if the bot had spoken at any point since the last remote caption — and stall age only grows, so one sentence at minute 1 excused minute 44. Measured against real logs, it was writing off 4 of 5 genuine deaf windows as "that was just me talking". It now covers only the speech itself plus one detector window for captions to resume.
- "Chat pane open" now means the panel is actually showing (#572, #788). Meet keeps the chat composer mounted after the side panel switches back to People, so from the second send of a call onward the bot typed into a hidden input and then clicked People while People was already showing — toggling it shut and blinding speaker detection for ~1.4s per message.
send_chatreports its outcome when the message is sent, not after the pane restore (#572, #660). The message had already gone; the timeout was the restore, not the send.- The "bot is logged out of Google" error now has a button (#346, #764). It named the fix but gave you nowhere to click, and the two obvious in-app guesses both touch a different credential. The action reveals the bot's view rather than navigating it, so it's safe to use mid-call.
Internal
- The Mac release is built, signed and notarized in CI (#770) — not yet working, see #791. This build's macOS assets were produced locally.
Mac users update from latest-mac.yml / the -mac.zip; the .dmg is for fresh installs.
v0.8.53 (candidate)
Candidate build. Eleven changes since v0.8.52, weighted toward transcript correctness and the app not stranding you.
Hearing and transcripts
- An anchor loss no longer replays the caption pane (#389, #12). When Meet pruned its captions past the turn the bot was holding, recovery gave up and re-ingested everything still on screen as new speech, handing the agent most of the call again. It now re-anchors on what was actually delivered. Caught live on a 48 minute call where one anchor loss produced 22 replayed entries a second later.
- A long-poll with no cursor now warns (#12). It is the shape of a client that will be handed the whole session, so it says so instead of quietly doing it.
Calls
- Bots no longer sit alone in a call forever (#757). There is a cap, and the agent is told why it left rather than just finding itself gone.
- Calendar auto-join no longer rejoins the room the bot is already in (#588).
Recording
- 16:9 YouTube-ready recordings are now the default. The view is sized so the captured region is 16:9.
- The output frame is sized from the capture, not from the first crop (#735), so a mid-call crop change no longer skews the whole recording.
App
- Closing the window actually quits the app (#752). It used to leave the process running with no way back to it.
- A "Vibeconferencing" launcher that can recover a windowless app (#751), for exactly the state above.
- The app's sign-in can now ask for calendar access (#754). The website makes calendar an opt-in via a checkbox on its sign-in page, and the app bypassed that page entirely, so an app-only user could never reach a calendar consent screen: no error, and calendar auto-join that silently did nothing. The opt-in is now on the first-run wizard and App Settings, and the panel's "Reconnect calendar" button asks for the scope it exists to restore.
- Switching bots is macOS-only (#746), so other platforms launch the binary directly instead of failing.
Known gaps
v0.8.52 (candidate)
What's Changed
- feat(whiteboard): read the fit the board publishes, instead of polling for it (#644) by @wanderingstan in #710
- feat(screenshot): return the picture, not a path to it by @wanderingstan in #726
- feat(screen): notice a shared screen changing in silence, and wake the bot for it (#673) by @wanderingstan in #711
- chore(menu): rename "Copy Chat Command" to "Copy Terminal Command" by @wanderingstan in #725
- Detect permission prompts via a Notification hook by @wanderingstan in #348
- fix(tts): say "point" for a dot between digits by @wanderingstan in #728
- chore(release): 0.8.52 by @wanderingstan in #729
Full Changelog: v0.8.51...v0.8.52
v0.8.51 (candidate)
Candidate build. Not published — for testing first.
Nineteen changes since v0.8.50. The theme is things that reported success while doing
nothing: a bridge that never started, an ordering rule that never ordered, a board
measurement that read the previous board, and fleet prefs written to a file nothing loads.
⚠️ Fixes a v0.8.50 regression that stopped every bot connecting (#708)
If you are on the v0.8.50 candidate, take this build. v0.8.50 shipped an import that
reached from mcp-server/ into electron-app/. That resolves fine in the repo and throws
in the packaged app, because mcp-server/ is copied in as extraResources while
electron-app/ is compiled into app.asar.
The MCP server is the bot's only channel to the app, so it failed to start and no bot
could connect to any call — the app runs, the bot sits in the room, deaf and mute. 1978
tests passed, because every test runs from the repo where the path exists. Caught by
hot-swapping onto 0.8.50 mid-call and losing the bridge.
Ranked speaking order is actually on now (#718)
Ranked ordering shipped in #426 on 17 Aug and then never ordered a single call — the
preference defaulted to jitter. Every [bot-order] line in three weeks of logs, on both
Stan's and Seth's machines, says so. It is now the default, bot-vs-bot collisions resolve
by rank instead of a second dice roll (that was up to 4.5s of two bots talking by design,
against measured overlaps of 4.5s and 3.4s), the stash replay is ordered, and the bot named
last in a sentence answers — "ok Jimmy, that's enough. Alice, what were you saying?"
gave Jimmy the floor 1103 times out of 2000; now Alice takes it every time.
Review caught two high-severity defects in the branch, both fixed before merge — including a
name skew that had bots ranking themselves under a different name than their peers used.
Watch for: an uncomputable order still returns null and falls back to jitter, so the worst
case is the old behaviour.
The whiteboard fit report no longer describes the previous board (#723)
The measurement added in v0.8.50 waited 600ms for the board's height to stop changing. Before
a re-render begins the old board is sitting there perfectly stable, so that test passed
immediately and measured the board being replaced. A board cut from ~4,000 characters to
~1,200 still reported "3.11 screenfuls, 1687px over" and quoted the old board's last line —
it had in fact become 1.04 screenfuls. The cut had worked.
A stale fit report is worse than none: it tells the author their fix failed, so they cut
again, and the board they are fixing was already fine. Measurement is now two-phase — wait
for the board to become the new content (compared against a signature captured before the
write), then wait for it to stop reflowing. Budget raised to 3s because the board round-trips
through the sync server and comes back over SSE, so pixels move a full network hop after
update_whiteboard returns.
Calendar shows the meeting that will actually happen (#716)
Stan accepted a "vibeconf standup" at noon and it never appeared — the panel showed the
other noon meeting instead, struck through and "(not yet accepted)". Two meetings at 12:00
tie on time-until-start, and the order fell to whatever the API returned first. Ties now
break on the owner's RSVP. Time still dominates, so an accepted 5pm can never displace an
unaccepted noon. The "+N more today" count is over the local calendar day, so it means
exactly what it says.
Signing in as the bot opens a window you can see (#715)
"Sign in to Google as bot" and "Sign into Slack as bot" drove the bot's browser view, which
is hidden by default — the login page loaded where nobody could see it and the buttons looked
dead. You cannot type a password into a window that isn't on screen. Both now pop the bot's
view out first.
Also
- Bot Settings regrouped, and a session name that isn't the bot's now warns in amber rather
than silently taking effect (#717) - Etiquette reads the ride-out marker and records the lane (#656)
- Fleet per-profile prefs are written where the app actually reads them —
#305moved the
store and both fleet scripts kept writing the old path, so every write since had been inert
in a file nothing loads
Test and nightly infrastructure: the shared test fleet is held by one holder at a time (#719),
a 19:00 pre-test check flags what would break the nightly, dedicated per-bot Google accounts
and stable voices (Alice/Ava, Bob/Daniel, Charlie/Fred), screen-reading tests (#692),
sync-calls can re-root rclone by folder id (#686), triage stops re-nominating already-tagged
issues (#675), the recording preflight tests writability before blaming a permission (#653),
and corpus sweep timing and verdicts (#597, #598).
Testing focus: join a real call and confirm the bot connects at all — that is the #708
fix and it is the reason to take this build. Then put two bots on a busy floor and watch
whether they still talk over each other, and check [bot-order] in the logs says ranked
rather than jitter.
v0.8.49 (candidate)
What's Changed
- Crop Google Meet's UI chrome out of call recordings by @wanderingstan in #676
- perf(call-recording): capture H.264 and stream-copy the merge instead of re-encoding by @wanderingstan in #677
- feat(call-recording): crop at capture to the measured Meet video region by @wanderingstan in #679
- feat(bot-view): meetViewSize preference to pick the bot's Meet view size by @wanderingstan in #680
- fix(bot-view): drop the 1280x720 Meet view size option by @wanderingstan in #681
- feat(scripts): launchd fallback that syncs call folders to the Drive archive by @wanderingstan in #683
- fix(scripts): sync-calls config file, zsh login shell, and never-overwrite fail-safe by @wanderingstan in #685
- feat(bot-view): default meetViewSize to 2560x1440 so the bot can read a shared screen by @wanderingstan in #687
- refactor(panel): drop the Agent activity tail from the troubleshooting window (#668) by @wanderingstan in #682
Full Changelog: v0.8.48...v0.8.49
v0.8.48 (candidate)
Candidate build. 14 commits since 0.8.47.
Behaviour changes that ship
#492 — barge-in: a transcript delivery can no longer knock a live utterance out of speaking. A raw this.botState = 'thinking' write in _buildResponse bypassed _setBotState and every guard in it. Measured over one 56-minute call: normal speech held the flag a median 3137ms, replayed speech 48ms, and 18 of 23 replays lost it entirely. Both barge-in gates require botState === 'speaking', so those utterances played with no interrupt monitor at all — nobody could have stopped them.
This is additive to the single-pipeline work (#495), not a duplicate of it: _emitUtterance's own comment names #492 as the thing that guards that write, and says #412 stops being possible by construction only at step 3.
| #626 | times render in the user's format. macOS keeps the 24-hour choice OUTSIDE the locale (AppleICUForce24HourTime), where Chromium's ICU never looks — so asking for the system locale correctly still printed "4:30 PM" to someone with 24-hour time on |
| #629 | a typed App Settings value is no longer lost when the window is closed without blurring the field. The ElevenLabs key was the worst case: pasted, so nothing to retype from |
| #647 | takenBotNames() read the pre-#305 config path, so collision detection was blind to every modern profile |
| #649 | a whiteboard write aimed at another room now fails loudly instead of silently retargeting to the current one |
| #650 | stopCallRecording claims the session before its first await, so two leave routes can't both pass the guard |
| #652 | the brain window gets a real 1000-line scrollback, up from a 16-line cap inherited from the debug overlay |
Plus #630, #632, #633, #635, #638, #648 and a Bot Settings height fix.
npm test: 1927 pass, 0 fail. macOS build notarized; the .app is stapled (spctl: accepted, Notarized Developer ID).
Worth knowing
#492 has not been heard in a live call. Its validation arrives tonight: the etiquette suite now runs nightly, one rule per fresh fleet, and carries both yield-during-replay and real-interruption-2026-08-30 — 28 seconds of a real human being talked over on 2026-08-30, replayed at the bot. If barge-in regressed, that run says so.
#607 (OpenAI realtime voice) merged today but ships nothing here. It lives under experiments/ and electron-builder's file list excludes it — verified three ways. It is a standalone reference you run with node server.mjs, not something that can be switched on for a bot.
Windows and Linux artifacts are built by the tag workflow and are not verified by this process.
v0.8.47 (candidate)
Candidate build. Six changes since 0.8.46, plus two test-only additions.
The one that matters most
#620 — remote log shipping died on the first idle tick. _flushRemote() returned bare when the queue happened to be empty, skipping the finally that reschedules, and left a spent handle in _flushTimer that also disabled the safety net. The first quiet tick ended shipping for the rest of the process — silently, with no error, because nothing was ever attempted again.
Measured on three cloud boxes simultaneously after a restart: 1-2 seconds of coverage per session, against local logs that kept growing all day. Every box has been effectively unlogged since the feature was switched on, and the only observable said it was working.
This is why remote logs have been useless for diagnosing anything. It cost at least three investigations (#417, the "first ~96 seconds of a 54-minute call" note in session-log.js, and a user's bug report on 2026-08-31 that turned out to have no log behind it).
Also in
| #618 | the bot can see the clock: [10:47am · 52m into the call · 8m left of the scheduled hour]. Bethany reported the bots had no sense of time and were estimating from turn count — they were, because nothing rendered callStartedAt or the calendar's end, both already in the payload. |
| #520 | a session's working directory outranks the port it inherited (routing) |
| #616 | the app captures its own UI, keeping a frame only when it changes — the visual baseline before the redesign |
| #621 | nightly lane confirming a complete log reached the server, not merely that some lines did |
| #491 | two etiquette rules for what happens after a bot yields |
Test-only, not in the bundle: #622 replays the actual audio of a human being talked over on 2026-08-30 as an etiquette rule, and #623 runs the etiquette suite nightly, one rule per fresh fleet.
What to watch after updating
- Remote logs should start arriving and keep arriving. The new
remote-loglane reportshealthyvsshipping-stalled— a better confirmation than reading the pref, which said "on" throughout. - The clock is the machine's local time. The cloud boxes were set to real timezones on 2026-08-31 (TA to New York, the rest to Denver), so it should read correctly to people in the call rather than in UTC.
- #616 has not been exercised against a live window.
./scripts/capture-ui-history.sh paneltwice — expect "baseline" then "unchanged".
npm test: 1805 pass, 0 fail. The macOS build is notarized, and the .app is stapled (spctl: accepted, Notarized Developer ID).
v0.8.46 (candidate)
Candidate build. Four changes since 0.8.45, all tagged needs-call-validation — the unit suite is green (1746 on main) but none of this has been judged on a real call yet.
- #495 — one audio pipeline: every utterance a record. Five speech paths collapsed into a single dispatch. The one that can go subtly wrong; listen for replies that never play, play twice, or a barge-in that yields and does not come back. It also carries the
speaking now, no delay (…)log line, so a multi-bot call is the first chance to see ranked ordering winning rather than only losing. - #604 — a calendar call's session is keyed on its invitees (#570). Off by default (
sessionPerCalendarInvitees), and only active on a calendar-joined call. Proving it needs two calls with the same invite list. - #602 — drop
video.webmonce it is safely inside the mp4. Stops the call archive regrowing. - #593 — ⌘⇧L navigates the share window rather than the Meet view, so it no longer hangs up the call you are trying to fix something in.
The Mac build is signed, notarized and stapled (spctl → accepted, Notarized Developer ID). Built from the same tree as this tag; the only commits between are scripts/ and tests/ changes, which electron-builder does not bundle.
Not run in a live call before publishing, unlike 0.8.45 — it goes out to get the Mac mini's nightly suite onto it.
v0.8.45 (candidate)
Candidate build. Three fixes since 0.8.44:
- #578 — the arrival card called an ordinary join "having trouble connecting"
- #579 — two source assertions went stale when #561 and #489 landed together
- #580 — an unkeyed error permanently disarmed every later retraction
The Mac build is signed, notarized and stapled, and was run live in a call before publishing.