Do we need the heavy local Clawern daemon on Windows, or is a small uploader plus server-side processing the right shape? Short answer: the daemon was never on Windows to begin with, and a thin client + the Azure pipeline is the correct architecture for a Windows firm.
Clawern's rich local experience does not run on Windows today.
daemon-factory.ts
is explicit:
throw new Error(
`Daemon mode is not supported on ${process.platform}. ` +
`Use manual mode: lavern --serve --claw`
);
daemon.ts)daemon-systemd.ts)menubar/) → macOS SwiftUI, no Windows equivalentSo on Windows there is no background daemon, no tray surface, no set-and-forget watcher. The question isn't "should we keep the Windows Clawern?" — there isn't one. It's "what should the Windows experience be?"
Separate the Clawern function from the Clawern implementation.
On Windows, keep the function. Move the implementation to the server — which is the Azure pipeline we already designed.
| Option | What it is | Effort | When |
|---|---|---|---|
| A. No local component | Just the web dashboard. Drag a file into the browser → engagement runs server-side. | Zero — exists | Most Windows firm users. The simplest answer. |
| B. Cowork mode | The viz/src/cowork/ File System Access API path — the browser reads and writes a local folder while the tab is open. A thin uploader that already ships. |
Zero — exists | Users who want folder-level work without an install. Chromium-only; tab must stay open. |
| C. Tiny tray uploader | A genuinely small background agent: watch a folder, push new files to Blob via SAS, done. No analysis, no state, no model. The "drop and forget" feel, brain in Azure. | Small — ~1 week | Customers who want the set-and-forget retainer experience on Windows. |
The uploader is just the ingestion mouth of the pipeline already specified in the Azure migration doc. It does one job and stops.
Windows folder (watched)
│ new file appears
▼
Tiny uploader ──①── request user-delegation SAS from lavern-api
│
└────②── PUT file → Blob container lavern-uploads/<user>/<dropId>/
│
③ Event Grid: BlobCreated
▼
Service Bus → Azure Function (analysis/ingest)
│ (parse · SMAC-L1 sanitise ·
│ anonymise · dispatch workflow)
▼
lavern-worker (Container Apps, KEDA)
│ runs the engagement
▼
Deliverable + audit bundle → Blob lavern-deliveries/
│
④ notify (email / dashboard / webhook)
Everything from step ③ onward is the same code path the dashboard and KB use. The uploader contributes only steps ① and ②. No Clawern runtime on the client at all — the processor, curator, and precedent board all run server-side.
The heavy local Clawern exists for a single promise: your documents never leave your machine — local Ollama, anonymise-before-escalate, on-device state. Thin-client + server gives that up. Documents go to Azure.
Two mitigations keep most of the value:
sanitize-text.ts
and the reversible anonymiser in
anonymize.ts
both run inside the ingest Function. You keep the injection
defence and can still redact before any frontier call.| Surface | Windows default | Built only on demand |
|---|---|---|
| Interactive review | Web dashboard (A) / Cowork (B) | — |
| Set-and-forget retainer | Tray uploader (C) → Azure pipeline | — |
| Strict local-only | Not offered | Windows Service + local model |
| macOS / Linux | Full local Clawern (daemon, menu bar) | — |
Net: on Windows you carry the local daemon as a privacy-tier exception, not as the default. The cloud pipeline is the natural home, and you avoid porting the daemon, menu bar app, and on-device pipeline to a platform that didn't have them.