Skip to content

Windows: the Mac features Windows was missing, plus Windows improvements - #849

Open
umarjavaid4335 wants to merge 38 commits into
Louis-CFM:mainfrom
umarjavaid4335:windows-mac-parity
Open

umarjavaid4335 wants to merge 38 commits into
Louis-CFM:mainfrom
umarjavaid4335:windows-mac-parity

Conversation

@umarjavaid4335

@umarjavaid4335 umarjavaid4335 commented Oct 21, 2026 •

Copy link
Copy Markdown

In short

  • Mac features ported to Windows:
    • WhatsApp (with GOWA installed in one click)
    • Mochi feels the computer
    • Screen capture for Claude (Ctrl+Alt+X)
    • Flow prompt mode and translation
    • Notetaker 0.5.0
    • The plan approval card
    • Alerts from every pill
    • Quiet while the session's window is in front
    • Chat dictation
    • Attaching the front window (Ctrl+Alt+F)
    • Emailing a dropped file
    • The Cal.com calendar
    • DeepSeek, Qwen and Moonshot chat
    • The Talk to Coucou shortcut
  • Windows features and fixes:
    • Minimize, a 10 s hide, reliable hover wake and the browser rule
    • No black rectangle at login
    • The pill-slot message and five pills
    • No plan pills of dashes
    • Real CPU and memory numbers
    • A tall full view while an agent works and for WhatsApp, and WhatsApp messages popping up
    • Gemma and Gemini chat fixes, and Gemini web search
    • Claude plan usage for Claude Code in the Claude app, live from claude.ai if you sign in
    • Test results and an optional fix loop (from dotpals, MIT), with an optional Laya / Jev double-check

All of it is Windows-only (windows/). The Mac app is untouched.

Testing

  • npm test: 442 pass. cargo test --release --lib -p coucou: 522 pass. cargo test --release -p coucou-hook: 35 pass. Each feature has new tests.
  • I've used the installed NSIS build daily on Windows 11 (8 GB laptop) and checked each feature by hand.
  • The Linux side compiles, but I haven't run it on Linux.
  • New strings are in all 12 Windows languages. dotpals' MIT notice is in windows/THIRD_PARTY_NOTICES.md.

Notes

umarjavaid4335 and others added 27 commits October 11, 2026 22:53
… chat, Spotify on Windows, pill-slot message

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	windows/src/i18n/extra.json
# Conflicts:
#	windows/src-tauri/Cargo.toml
#	windows/src-tauri/src/lib.rs
#	windows/src-tauri/src/spotify.rs
#	windows/src/core/pills.ts
#	windows/src/i18n/extra.json
#	windows/src/settings/main.ts
#	windows/src/style.css
#	windows/tests/pills.test.mjs
Rust reads CPU load and the busiest programs, memory load, the battery and
the thermal zones every 3 s while Mochi is on screen (vitals.rs); the page
eases them into Mochi's moods (mood.ts, port of MochiMood.swift): panicked
hops and sweat at full load, a flush and heat waves when warm, puffed up
when memory is short, tired then asleep on a low battery, a happy hop when
plugged back in. Pointing at Mochi shows why. Settings > General >
Mochi and your computer, on by default as on the Mac.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sform)

One Claude call cleans the dictation, shapes it as a structured prompt for
an agent (goal, context, steps, constraints, done when) when Prompt mode is
on, and writes it in the language picked in Translate into (73 languages and
regional variants, with the Mac's hints). Any problem and the words are
pasted as heard. Flow > Settings > Prompt and translation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, editable lines

Port of the Mac's Notetaker 0.5.0 (NoteEcho.swift, NoteModels.swift):
- the computer's sound is padded with the silence WASAPI's loopback skips,
  so both recordings share one clock;
- the others' voice coming back into the microphone is removed by its
  energy, then word by word;
- a voice heard only in short bits goes back to the nearest real voice;
- Claude corrects misheard words before the summary (checked: a fix, never
  a rewrite; what was heard is kept) and names people the call names;
- each line can be fixed, given to another person or deleted; corrected
  words are learnt for the next calls; renaming someone with another's
  name merges them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…u shortcut

Port of the Mac's captureScreen and talkToCoucou actions: Ctrl+Alt+X opens the
Windows snipping overlay, the capture lands on the island (paste, copy, annotate,
ask Claude), and dictation pastes a pending capture first. Talk to Coucou has no
key by default, as on the Mac.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Port of WhatsAppController, its gateway, GOWA installer and views: Coucou can
install and start GOWA itself (checked against its published checksums), shows
the QR to link the phone, lists new messages per conversation, opens one to read
and reply (Enter sends, Shift+Enter new line, Escape back), mutes groups unless
mentioned, stays quiet during Do not disturb, and keeps nothing on disk. The
gateway's address and credential live in Windows Credential Manager.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… window, email, Cal.com calendar, more chat providers

Ports of the Mac features Windows can have:
- Crypto pill: Coinbase or OKX public prices, 24 h curve, optional move alert.
- Portfolio pill: read-only exchange keys (Binance, OKX, Bybit, Kraken,
  Coinbase CDP) tested before they are stored in Credential Manager, and
  wallets on 16 networks by public address.
- The chat's microphone, through Flow's on-device model.
- Ctrl+Alt+F attaches the front window's app and title to the next question.
- Send a dropped file by email through Resend, else the mail app opens.
- Cal.com calendar: half-month view, a day's calls, a call's attendee.
- DeepSeek, Qwen and Moonshot as chat providers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Not wanted on this machine: their Rust modules, cards, settings sections,
strings, styles and credential-store keys go; nothing else changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Room for WhatsApp without giving up another pill. The open island shows the
fifth on a third row; the compact view keeps its 2×2 grid. The WhatsApp hint
says the actual limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The island's background is set transparent outright, and after a login it
  waits for Windows to settle (a minute of uptime) before showing: shown any
  earlier, the transparent window stayed a black rectangle.
- The Claude and Codex plan pills only show once they have numbers; Codex is
  asked when the overview opens and, with no Codex installed, again ten
  minutes later rather than on every look.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ork view

- Claude plan usage also comes from the Claude desktop app's own record
  (plan-usage-history.json), where Claude Code runs without a status line; its
  samples carry no reset times, so none is shown.
- The vitals line shows the numbers: CPU %, memory used/total GB (%).
- The overview grows tall while the focused agent works: Mochi and its last
  steps on the left, the file it changes on the right with line numbers; and
  for WhatsApp, room for the conversations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's updater, German and Turkish, GitLab and Gitea, the island clock,
Claude Desktop chats and fixes, with every feature of this branch kept.
Strings this branch adds have German and Turkish now; the Mac's WhatsApp
strings, which its catalog has without them, are carried in extra.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s window, WhatsApp pops up

- Plan approval card (Mac #8d2632c): Claude Code's plan answered from the
  island with the plan sent back (Claude Code ignored a bare allow), Auto mode
  or Manual setting the session's mode, Change plan stopping Claude.
- Open for every pill's alerts (Mac Louis-CFM#683), off by default; never over a
  browser in front, an approval or a card in use.
- A finish or an error stays quiet while the session's own window is in
  front (Mac #9e95732): the badge only.
- A WhatsApp message opens the island, tall, on that conversation, without
  taking the keyboard; not over an approval, a busy card or a reply being typed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The relay keeps the end of a test command's output; the island reads the
  verdict from the output itself (dotpals' testout parser) and shows
  "Tests passed / failed / unclear" on the agent's card.
- Unclear runs can be double-checked by Laya (local, set up from Settings)
  or TypeSafe's Jev (cloud, own API key; output redacted first).
- Optional fix loop: Claude Code finishing with failing tests is sent back,
  at most twice per request. Off by default.
- All new strings translated in the 11 languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The section's buttons changed the settings as they were when it was
  drawn: after any other save (the fix-loop switch) a click on Laya or Jev
  saved "Off" again. They now change the current settings.
- "Laya folder": a Laya already on this computer (its .venv, and its own
  laya_serve.py when it has one) is started from there and never changed
  or removed. A Laya already running is used as it is.
- One start at a time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ffs caught

- dotpals' rules (bridge/ui/story.js, recap.js) kept as they are; the
  decisions move from Rust to the island (island/loop.ts).
- The relay waits for the island's word after a test run (Claude is told
  the tests failed), before a commit or push (denied while the tests fail
  or are out of date) and at Stop (sent back while they fail, weren't run
  after its changes, or were weakened to pass). At most twice per request.
- Failures that were there before Claude changed anything are told, not
  forced. An unreadable run: Claude reruns it, then you're asked to look.
- Git's view of the test files catches a test weakened by any means.
- Claude Code in the Claude app (claude-desktop) is covered too: the old
  Stop check skipped it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Claude app writes its usage record now and then, sometimes hours apart,
so the gauge lagged (14%/74% shown, 78%/82% used). Every minute, Coucou now
asks Anthropic's usage endpoint with Claude Code's own sign-in (read only,
never refreshed or written), with reset times; the app's record stays the
fallback when there is no sign-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Code's command line here runs on another provider (its API key wins
over a /login), so its sign-in can't give the plan's numbers. Settings →
Agents → Plan usage → Connect opens claude.ai in Coucou's own window, with
its own session folder; once signed in, a hidden copy asks claude.ai for
the usage every minute, from inside its page, and reports by a navigation
it refuses. The gauge follows at once; Disconnect deletes the session.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- While you sign in, the page is never asked (the ask ends in a navigation
  that cut claude.ai's page off as it loaded: a blank window); signing in
  is seen from claude.ai's session cookie instead.
- The watch for a sign-in no longer gives up on a window still being made.
- "Continue with Google" / "with Apple" open their popup (and only those,
  and claude.ai's own); the sign-in failed with popups refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Installed in a folder of its own (D:\Coucou, an uninstaller beside it,
  or a folder marked coucou.portable): its data there, its preferences in
  Settings, its windows' browser data in WebView, nothing in AppData. The
  relay finds the folder from the bin it sits in; the uninstaller cleans
  its install folder, wherever that is.
- Laya no longer loads at launch, where its model (a core for minutes,
  gigabytes of memory) stalled the machine with everything else starting:
  it starts when an agent is at work and goes after 20 idle minutes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At launch everything else is starting (the speech model, the windows);
Laya's model on top stalled the machine. Its server also runs below
normal priority, so it never takes the CPU from your apps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Laya loads only when an unclear test run needs it (or Start), and goes
  after 15 unused minutes: loading its model in the background stalled a
  laptop short of memory for minutes.
- It doesn't load without about 2.5 GB free, and says so.
- "Still loading" is said as such, not as an error; Test connection never
  loads it ("isn't running: press Start").
- The fix loop's answers get more time on a busy machine (stop 5 s,
  commit 3 s); one that comes too late is no longer logged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 21, 2026 11:48

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

umarjavaid4335 and others added 7 commits October 21, 2026 17:30
- An agent already at work no longer brings a hidden island back on every
  tool call: with a short hide delay the island flashed in and out all
  through a long request. It still shows when work starts, and for a
  question, an approval, the finish or an error.
- Mochi panics only after half a minute at 85 % or more, not on a spike.
- Attach the front window has no key by default: Ctrl+Alt+F belongs to
  other apps too, and taken globally it opened the island in their place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… island

- Mochi dropped on an app window attaches it to the next question and goes
  back where he came from (the Mac's drag-attach); empty desktop keeps him
  there, the island takes him home.
- OK Coucou answers with Gemini through the Google AI key when there is no
  Claude key: the same tools as function declarations, the web through a
  Google-search call.
- The computer's numbers show while the island is open on its home view,
  not only with the pointer on Mochi (who may be out on the desktop).
- A question about a file just dropped waits for its copy in the inbox;
  pictures up to 14 MB go along instead of by name only.
- A file dragged up from below wakes the island over a browser too, so it
  can be dropped; clicks and drags on the tab strip still don't.
- A dictation that hears nothing says so on the pill, and in the log.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first frame after a wake can be stamped before the moment the loop
started. The negative dt ran the springs backwards in one big step, so
Mochi's size and position shot to millions of pixels and his colours
filled the whole island. dt is clamped at 0 in the island, hub and pill
loops, and a spring ignores a non-positive step and snaps back if it
ever leaves finite numbers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The island's page can load before Rust has set up Mochi's desktop window,
and its one question (can he go out on the desktop?) then failed rather
than answered. The island took the silence for "off": a press on Mochi
never turned into a drag, so he could not be dropped on a window or the
desktop until a restart that happened to win the race. A failed answer
is now asked again in the background (every 250 ms, up to 10 s), and the
launch flight to his spot still happens if the answer comes late.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The chat context's rename_all named the variants only, so Rust wanted
`app_name` while the island sends `appName`: every question about a
window (Mochi dropped on it, Ctrl+Alt+F) failed with "missing field
app_name". The window variant renames its own fields now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rows sat straight against their dividers (the card's spacing did not
reach inside the list) and every row had a filled delete box beside its
menu. The list now spaces its rows, keeps the menus in one column, and
shows the delete as a quiet icon that lights up on hover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the pointer resting on the island, every sync (several a second) threw
away and redrew the header's gear and speaker icons, rewrote the Spotify
buttons' tooltips, the plan pill's label and the vitals line's class. Each
rewrite under the pointer makes the webview set the cursor again, and with an
app behind the island setting its own (the Claude app's text cursor while an
agent works) the pointer flickered between the two. They are written only
when they change now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
umarjavaid4335 and others added 4 commits October 23, 2026 10:12
The hidden window that reads the live plan usage sat in the middle of the
screen. Hidden, its WebView2 still set the cursor for its page wherever its
rectangle was, so over text in the settings window the I-beam blinked to an
arrow twice a second. It now waits off the screen, and is centred only when
shown to sign in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the update: the blue Mochi while a new version waits, What's new
after an update, the phone recap, Android 0.3.0 and the 0.5.3 versions.

WhatsApp: both sides added it on their own. This branch keeps its own
WhatsApp (the tall-view popups, quiet groups, the fifth pill slot, GOWA
started with Coucou), so the update's WhatsApp files (archive, install,
model, prefs, process, webhook, its test) and their wiring in lib.rs,
bridge.ts, main.ts and settings/main.ts are left out, with miniz_oxide,
which only its installer used. Strings: ours plus the update's new ones,
minus those nothing shows any more.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows put the window made at -32000,-32000 back at its default spot, so the
hidden window still sat over the screen until a sign-in moved it. It is moved
off the screen once it exists instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tatuses

Brings in keeping Mochi whole after a monitor change (Louis-CFM#892). The WhatsApp
fix (Louis-CFM#901) was written for the update's own WhatsApp, which this branch
leaves out; the same check is ported to this branch's WhatsApp instead:
Status updates, broadcast lists and channels no longer become chats.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants