Session log — Zoom Apps, footer fix and webinar support
Session log — Zoom Apps, footer fix and webinar support
Summary
Picked up after a power outage that interrupted yesterday's work. Confirmed the v0.3.1 source (with the main process notification IPC fix written by the laptop session) was sitting unbuilt in iCloud. Rebuilt the v0.3.1 DMG on the home Mac. User installed it but the footer did not show v0.3.1. Investigation showed my own CSS allowlist from the anti, Zoom, popup work was hiding the footer element. Shipped v0.3.2 with :not(footer) added to the allowlist and the footer then displayed correctly.
User then attempted to test notifications. None fired and macOS did not register the app under System Settings, Notifications, which means no notification attempt actually reached the OS. Set up a diagnostic plan: run npm run dev so the renderer console output goes to the terminal, toggle a phone camera off, then paste the resulting log lines. The missing line will pinpoint which gate failed. User went to lunch before running the test.
After lunch, user returned with a new use case: trying to use Camera Monitor to join a Zoom webinar (the After Hours event). The app rejected with “This webinar requires registration” even though the bot account had registered and received a confirmation email. Diagnosed as a webinar versus meeting distinction, webinars need a registration token, tk, embedded in the personalised join URL from the registration confirmation email. Added a paste, the, URL field at the top of the form plus a Registration token field below the passcode, with a parser that auto, extracts meeting number, passcode and tk from any Zoom URL. Wired tk into client.join() only when present so non, webinar joins still work as before. Bumped to v0.4.0 and built the DMG.
Decisions
- v0.3.2 patch bump only, the change just unhides existing UI rather than adds capability.
- v0.4.0 minor bump because webinar support is a new capability.
- For webinar support, prefer paste, the, full, URL with auto, extraction over making the operator copy three values out of the email separately. Matches the actual workflow of receiving a Zoom registration confirmation.
tkgets passed toclient.join()only when set, to keep backwards compatibility for normal meetings.- Notifications diagnostic deferred until user runs the dev mode and reports log output, no point speculating further without seeing which gate fails.
Changes made
renderer/styles.css: added:not(footer)to thebody > *:not(...)allowlist so the version footer is no longer hidden by the anti, Zoom, popup rule.renderer/index.html: added a “Join URL” input at the top of the form and a “Registration token” input below the passcode, both with hint text.renderer/renderer.js: added aparseJoinUrl(raw)helper that handles/j/,/w/,/wc/join/and/s/URL paths and returns{ meetingNumber, passcode, tk }. Wired aninputlistener on the new Join URL field that auto, fills the three downstream fields. AddedregistrationTokenElreference and passedtkinto theclient.join()call when set, with a console log so we can see in dev mode that the token was used.package.json: bumped from0.3.1to0.3.2for the footer fix, then to0.4.0for the webinar support.- Built
Camera Monitor-0.3.1-arm64.dmg, thenCamera Monitor-0.3.2-arm64.dmg, thenCamera Monitor-0.4.0-arm64.dmg. All three landed inZoom Companion/dist/. The latest, v0.4.0, completed at end of session. - Updated project memory at
~/.claude/projects/.../memory/project_camera_status_app.mdwith current state, including the diagnostic plan for notifications and the webinar feature.
Follow-ups
- User to install v0.4.0 (delete old
Camera Monitor.appfirst) and test joining the After Hours webinar with the new paste, URL flow. Expected behaviour: bot joins as a registered attendee, no “registration required” rejection. - Notifications diagnostic still open. User to run
npm run dev, toggle a phone camera off, and paste the terminal log lines. The missing line tells us which gate failed:peer-video-state-changenot firing, on, to, off transition not detected, IPC failing,Notification.isSupported()returning false, or macOS silently blocking an unsigned app. - Bot showing in its own roster regression noted but not addressed today. Likely
client.getCurrentUser()returning null or a different field shape in Zoom Web SDK 3.13.2. To fix after notifications are resolved. - Once Shape A is fully working (notifications plus bot filtering), distribute the DMG to the studio team and document the operator workflow caveat: do not sign Zoom Workplace into the bot account on the same Mac that runs Camera Monitor.
- After Shape A is shipped, start Shape B (server, side bot). Recall.ai versus self, hosted decision still open.