Entanglo Entanglo Get Entanglo
Changelog

Every build, every change.

Entanglo ships often and small. Currently on 0.1.52.

0.1.52

2026-07-03 Latest

Cross-platform: brand-new app icon (topology mark)

  • New app icon across Mac, Windows and the website: black squircle with a topology mark — a central monitor with cursor, connected to three peer devices (top, left, right) by nodes and a rounded frame. Replaces the previous circles-and-line placeholder from 0.1.22 that never really said 'this app links your devices'.
  • Mac: AppIcon.appiconset regenerated at all 10 sizes (16 → 1024) with transparent squircle corners, matching the 0.1.50 background-fix line.
  • Windows: Entanglo.png (256) and Entanglo.ico (16/24/32/48/64/128/256) rebuilt from the same source so the tray icon, taskbar and installer all pick up the new mark.
  • Website (entanglo.pages.dev): /img/icon.png (used by favicon, apple-touch-icon, Hero card and top-left Logo) plus a full favicon.ico + apple-touch-icon.png set for older browsers and iOS home-screen adds.

0.1.51

2026-07-03

Mac: Quick Actions now speak up when there's nothing to send

  • Mac: Quick Actions (Dashboard) now surface a transient status line under the buttons instead of failing silently. Clicking 'Push URL to peer' when the clipboard has no URL and no browser tab is active now shows 'No link to send — copy a URL or focus a browser tab first.' The same channel confirms successful pushes ('URL sent to 2 peers.') and the screenshot flow ('No peer online — nothing to capture.'). Auto-clears after 4 seconds.
  • Mac: distribution moved off Netlify — release channel is now Cloudflare Pages (entanglo.pages.dev, unlimited free bandwidth). Windows installers migrated to GitHub Releases (Pages 25 MiB per-file limit); `latest-win.json` URL updated accordingly.

0.1.50

2026-07-03

Mac: transparent icon + stable code signing (TCC permission persistence)

  • Mac: app icon no longer ships with a black rectangular background. The 10 PNGs in AppIcon.appiconset now have a fully transparent squircle — the Dock, Launchpad, Command-Tab switcher and menubar all show a clean shape instead of the black frame that read as 'pugno in un occhio' at every zoom level.
  • Mac: from 0.1.50 the DMG is signed with a stable self-signed certificate ('Entanglo Local Signing', RSA-2048, valid to 2036) instead of ad-hoc. Designated requirement is now identifier + certificate-leaf hash, so TCC recognises the app as 'same app' across releases — Accessibility, Input Monitoring and Local Network permissions persist through every future update. First install of the signed line (0.1.49) required re-granting permissions one last time; from now on it's silent.
  • Mac: scripts/make-dmg.sh switched to hardened runtime (--options=runtime) with the stable identity, matching what a productionised Developer ID build would look like.
  • Housekeeping: the bundled release-notes.json inside Entanglo.app was frozen at 0.1.39 — it now ships with the full history up to 0.1.50, so the News & Updates tab is correct even before the remote refresh completes.

0.1.49

2026-07-03

Windows: background-safe clipboard, RTT dashboard fix, UI polish

  • Windows: clipboard sync no longer dies the moment the app is minimized or closed to tray. UWP Clipboard.ContentChanged only fires while the app is foreground, so ClipboardBridge now polls Win32 GetClipboardSequenceNumber every 500 ms and reads via OpenClipboard/GetClipboardData — background-safe and lock-tolerant with a small retry loop. Writes still go through the UWP DataPackage API since SetContent is safe from any context.
  • Windows: Dashboard latency finally shows a real value. Root cause was subtle: PeerSession was a positional record, and after the Hello handshake the rekey path did `session with { DeviceId = ... }` and put the fresh clone in the peer map, while ReadLoop / Heartbeat handler kept mutating the stale original. LastRttMs was written to the wrong object and ActivePeers pulled the untouched clone. PeerSession is now a mutable sealed class; RekeySession mutates DeviceId/DeviceName in place and only re-keys the dictionary.
  • Windows: peer row RTT pill now formats as '42 ms' / '—' via a computed RttDisplay property on ActivePeer, replacing the raw double bind that was showing 43.7-shaped numbers with no unit when it did populate.
  • Windows: Hero card gains a link-state border — green when linked, subtle white when waiting — mirroring the Mac StatusPill tone system. Card padding tightened from 18 to 16 px, and Entanglo.PInvoke gets Clipboard/GlobalLock bindings alongside the existing SendInput / hook set.
  • Cross-platform: version bumped in lockstep — the Mac DMG is a version-only 0.1.49 with no behavioural change so the fleet stays on a single release number.

0.1.48

2026-07-01

Cross-platform: peer-to-peer update propagation + Windows Files tab

  • Windows: brand-new Files tab (Entanglo.Windows/Pages/FilesPage.xaml). Pick a connected peer from the dropdown, click 'Choose file', and watch chunked transfer progress row-by-row. Backed by a new FileTransferService.cs in Entanglo.Core that mirrors the Mac semantics — 2 MB raw chunks (~2.7 MB base64, comfortably under the codec 4 MB cap), Offered/Active/Completed/Failed status, sequential-write to %LocalAppData%\Entanglo\Downloads\.
  • Windows: ConnectionCoordinator now dispatches FileOffer/FileChunk/FileAck through the new FileTransferService (previously the enum entries were declared but no handler existed). AttachFileTransfers wires the SendToPeer callback so the service reuses the existing NetworkTransport frames.
  • Cross-platform: peer-to-peer update propagation. Drop the freshly built installer into ~/Library/Application Support/Entanglo/Updates/ (Mac) or %LocalAppData%\Entanglo\Updates\ (Win) and every connected peer receives it over TCP. The Windows UpdateService gains PushUpdateToPeers / EvaluateIncomingFile / BeginInstallAsync — same shape as the Mac API — so 'Install' pushes to peers before the local install runs.
  • Windows: receiver-side auto-install countdown. When a peer pushes an installer newer than the running build, a 10-second ContentDialog opens with 'Install now' / 'Not now', matching the Mac autoInstallCountdown UX. RunInstallerAndQuit runs the .exe silently, relaunches, and the helper .cmd deletes the installer after use.
  • Cross-platform: cleanup at launch. UpdateService.CleanupOldInstallers (Win) and cleanupOldDMGs (Mac, extended) delete every Entanglo-<version> installer older than the running build from outbox + downloads, so old dist artifacts don't pile up.
  • Windows: MessageCodec.EncodeRaw — new zero-copy path that wraps an already-JSON-serialized payload in an envelope. FileTransferService uses it so the ~2 MB base64 chunk isn't re-serialized twice per frame.
  • macOS: LocalDistFolderSource now watches ~/Library/Application Support/Entanglo/Updates/ in addition to the dev-only ~/entanglo/Entanglo/dist/ folder — installed copies get the same outbox-as-release-channel behaviour as Windows.
  • Note: this is the first release where the primary Mac + Win peer becomes the update source for the whole fleet. Netlify remains the fallback channel (latest.json, latest-win.json), but with the outbox path Paolo can ship a new build without going through the website at all.

0.1.47

2026-07-01

Windows: self-contained build — no external .NET runtime required

  • Windows: the installer no longer prompts to install .NET. The apphost was previously framework-dependent with a WinAppSDK self-contained bundle, which made the loader search .NET inside 'C:\Program Files\Entanglo\' instead of the global 'C:\Program Files\dotnet\' — so even a correctly installed Desktop Runtime 8 wouldn't satisfy it.
  • Windows: switched to a fully self-contained publish (SelfContained=true, PublishSelfContained=true) so the .NET 8 runtime, Windows App SDK 1.6 runtime, WinUI 3 XAML islands and H.NotifyIcon are all bundled inside the app folder. Zero external dependencies at install time.
  • Windows: installer size grows from ~21 MB to ~45 MB as a result — that's the price of bundling .NET, but it means Entanglo now installs cleanly on a fresh Win11 with no runtime preflight and can be redistributed as a single .exe.

0.1.46

2026-06-30

Windows: system-tray icon, single-instance and NoDelay sockets

  • Windows: Entanglo now sits in the system tray (notification area) while running in the background. The icon uses H.NotifyIcon under the hood; left-click brings the window back, right-click opens a Show / Quit menu — no more relaunching the .exe to reach the UI after closing.
  • Windows: single-instance lock — Program.cs now goes through Microsoft.Windows.AppLifecycle.AppInstance.FindOrRegisterForKey before booting the XAML host, and any second launch (installer 'Launch' checkbox, double-click on the .exe, autostart, anything) is redirected to the running primary, which surfaces its hidden window via the new ShowMainWindow helper. No more zombie process that fails to bind the listen port.
  • Windows: matching TCP_NODELAY pass — ConnectionCoordinator.HandleConnectionAsync sets TcpClient.NoDelay = true on every accepted and dialled socket, so heartbeats, clipboard frames and any controller traffic flowing Windows → Mac round-trip with single-RTT latency, matching the Mac 0.1.45 fix.
  • Windows: Settings Quit button (introduced in 0.1.44) now also dismisses the tray icon and exits cleanly via the renamed App.QuitEntanglo path.

0.1.45

2026-06-30

macOS: TCP_NODELAY — fluid mouse over the bridge

  • macOS: outbound mouse-move stream from Mac to Windows is no longer choppy. NetworkTransport and the DiscoveryService listener now set NWProtocolTCP.Options.noDelay = true so Nagle's algorithm doesn't batch the small position frames, which was adding ~200 ms of jitter and producing the visible 'staircase' cursor motion on the receiver.
  • Cross-platform: same TCP_NODELAY treatment applied to every NWConnection the Mac opens or accepts — heartbeats, clipboard frames and edge-switch handovers all land with single-RTT latency.
  • Note: install this update on every Mac that controls a Windows peer; once shipped, the round-trip feels native in both directions.

0.1.44

2026-06-30

Windows: clipboard sync, background run, system theme & full icon pass

  • Windows: clipboard now syncs both directions — copy text on the Mac and paste on Windows (and the reverse). A new ClipboardBridge service watches the system clipboard, broadcasts changes to every active peer, and writes peer text back into the local clipboard with echo-suppression so the change doesn't bounce.
  • Windows: closing the window keeps Entanglo running in the background — the X button now hides the window instead of disposing the network services, so input sharing, clipboard sync and discovery stay alive. Use the new Quit button in Settings (red power glyph) for a real exit.
  • Windows: live RTT — ConnectionCoordinator now raises PeersChanged the instant a heartbeat round-trip is measured, so the Dashboard LATENCY metric and the per-peer RTT pills update event-driven rather than waiting for the 1.5 s timer.
  • Windows: complete icon pass on Dashboard, Devices, Network, Updates, Logs, Input Sharing and Settings — status, counts, RTT and actions are now Segoe MDL2 glyphs (check, shield, network, bell, search, lightning, link, trash, refresh, power) instead of words like 'Connected', 'Linked', 'RTT' or 'Remove'.
  • Windows: theme-aware chrome — MicaBackdrop BaseAlt with DesktopAcrylicBackdrop fallback when Mica isn't supported, page backgrounds set to Transparent so the system's light/dark choice (and the desktop wallpaper through Mica) show through every tab.

0.1.43

2026-06-30

Windows: cleaner pills, solid hero, live latency

  • Windows: app now opens directly on the Dashboard — the nav was selecting the 'Tools' header instead of the first page, so the content frame stayed blank until you clicked.
  • Windows: Dashboard and Network refresh live every 1.5 s, so the LATENCY metric (and per-peer RTT pills) actually update once the first heartbeats are exchanged — before it would sit on '—' until a reconnect.
  • Windows: status badges (Linked / Alive / Trusted) replaced with compact coloured icons — no more text labels stuck inside oval pills.
  • Windows: hero card on the Dashboard is now a solid accent colour instead of a gradient, matching the cleaner Mac look.

0.1.42

2026-06-30

Windows UI parity and stale-session cleanup

  • Windows: Devices and Pairing tabs merged into a single Devices view that mirrors the macOS layout, with pending requests, status-aware connect buttons (Discovered / Trusted / Connected) and revoke for trusted peers all on one page.
  • Windows: Input Sharing rebuilt around the macOS form — four edge pickers (left, right, top, bottom) bound to the trusted device list with real persistence in AppSettings.EdgeConfig.
  • Windows: Files, Print, Network and Logs pages refreshed with the shared design tokens (cards, pills, hero brushes) so the whole app reads as one product.
  • Cross-platform: fix the orphan-session bug that prevented iMac1 from re-connecting to Windows after a rekey — Windows now finds the live PeerSession by transport reference in the cleanup path instead of trusting the provisional id.
  • macOS: discovery pipeline no longer stacks NWListeners when pollPermissions retries — startAdvertising and startBrowsing cancel the previous instance first, so Bonjour stops registering ' (2)' suffixes after a rebuild.

0.1.41

2026-06-28

Four-edge cursor topology (top & bottom peers)

  • Edge switching now supports all four screen edges (left, right, top, bottom) instead of only left/right. You can map a different trusted peer to each side, so a Mac with another Mac on its left, a third Mac on its right, and a Windows PC sitting above can hand the cursor off in the natural geometric direction with no third-party tools.
  • InputSharingView gets two new pickers ('Top edge → device', 'Bottom edge → device'). EdgeSwitchConfig stores the new target IDs as optional fields, so settings files written by older versions decode cleanly (missing edges stay nil).
  • Virtual-cursor seeding and entry-edge exit logic extended to the Y axis: crossing the local top edge lands the cursor at the bottom of the receiver, and only that same edge can return control to local — the opposite edge becomes an impassable wall, matching the existing anti-loop behaviour for left/right.

0.1.39

2026-06-28

Windows peer handshake and discovery reliability

  • Mac peers now send the v1 hello frame when a TCP link opens, matching the Windows client handshake and exposing device name, roles, app version and platform immediately after connect.
  • Incoming hello frames are now used to refresh peer metadata in the saved device list without dropping the existing trust state, so Windows peers show a useful name/version instead of only a transport endpoint.
  • Windows Devices now rehydrates peers already discovered before the page was opened, fixing the case where SERVERP advertised correctly but the Windows UI appeared not to see either iMac.

0.1.38

2026-06-28

Forward-compat hardening for cross-platform peers

  • Decoder now skips frames with an unknown messageType instead of treating them as a fatal decode failure. The transport logs 'Skipping unknown messageType …' at network level and keeps the connection alive — this is the path that lets a future Windows or Linux peer introduce a new message type within protocol v1 without dropping the link to older Mac peers.
  • InputEventMessage tolerates unknown mediaKey values (e.g. extra media buttons reported by a non-Mac keyboard). Unknown values decode to nil and isValid rejects the event for the .mediaKey case, instead of throwing the whole InputEvent away.
  • HelloPayload gains an optional platform field ('macOS', 'Windows', 'Linux'…) so peers can branch on coarse OS identity at handshake time. Older peers omit it; nothing breaks.

0.1.37

2026-06-28

Latency works, peer screenshot doesn't hang

  • Dashboard → Network Quality → Latency now shows real RTT in ms. Mechanism: every heartbeat carries an opaque sentAtMs timestamp; the peer echoes the last one it saw on its next heartbeat, and the sender computes RTT = now − echo. No clock sync required — each side reads its own monotonic clock (CACurrentMediaTime). The coordinator publishes the lowest live RTT to the NetworkQualityMonitor.
  • Peer screenshot stops spinning forever when the receiver doesn't reply: 8 s timeout on the controller clears the in-progress state and surfaces a clear error ('No reply from <peer> — check Screen Recording permission on that Mac.').
  • Receiver-side capture moved to SCScreenshotManager (ScreenCaptureKit, macOS 14+). The previous CGDisplayCreateImage path is deprecated and returns nil on Sonoma/Sequoia even with the Screen Recording grant — that's why captures from the OCLP-patched iMacs were silently failing. CG path stays as fallback on macOS 13.
  • Wire change is backwards compatible: HeartbeatMessage gains optional sentAtMs / echoSentAtMs fields; older peers omit them and the only loss is the Latency readout staying '—' until both sides are on 0.1.37.

0.1.36

2026-06-28

Double-click works across the link

  • Mouse click state (single / double / triple) now travels with every mouseDown and mouseUp over the LAN. The controller reads the real kCGMouseEventClickState that macOS already computed from its own click cadence, ships it in InputEventMessage, and the receiver applies it to the synthesized CGEvent before posting. Without this field, AppKit/WindowServer always saw clickState=1 on injected events, so two quick clicks were treated as two singles instead of a double-click — Finder wouldn't open files, text fields wouldn't select words, etc. Now Finder double-click-to-open and word/paragraph triple-click work the same way they do locally.
  • Backwards-compatible wire change: clickState is an optional Codable field. Older peers omit it and the receiver falls back to 1.

0.1.35

2026-06-28

Dashboard cleanup + global Emergency Stop

  • LAN Speed Test removed end-to-end: the card is gone from the Dashboard and the speedTestPing/Pong messages no longer travel on the wire. The feature never produced useful numbers on the OCLP'd Wi-Fi setup.
  • Pairing card now lists only currently-connected peers (state == .connected) instead of every device ever paired. Offline trusted devices stay in the Devices tab where they belong.
  • Emergency Stop moved from the Dashboard link banner to the global window toolbar (next to Refresh). It's now visible from every tab — stop.circle.fill in red when armed, play.circle.fill in orange when sharing is currently halted.

0.1.34

2026-06-28

Devices cleanup + gentle notification sounds

  • Devices tab: new trash button on every row to Forget a saved device (removes the entry from devices.json, not just demoting its trust state). Useful for clearing ghost rows left over from Bonjour name collisions (e.g. an old 'iMac Pro (3)' that was really the same Mac under a different LocalHostName).
  • Devices tab: new 'Reset' button in the header — wipes all saved devices behind a confirmation alert. Active discovery will repopulate any device still on the LAN.
  • DiscoveryService now drops self-discovery via loopback (lo0). The app no longer lists itself as a peer when its own Bonjour advertisement is observed under a stale LocalHostName.
  • Notification sounds for peer events (Settings → App Behavior → toggle on/off, default ON): Tink when a file is received, Funk when the peer link drops, Glass when it comes back. Uses only macOS bundled system sounds — nothing shipped in the bundle. DMG auto-update pushes stay silent so they don't double up with the install countdown sheet.

0.1.32

2026-06-27

Printer Bridge — print via a peer that owns the printer's Wi-Fi

  • New 'Print' tab in the sidebar: pick a PDF, pick a paired Mac, hit 'Send to print'. The file ships over the trusted-peer link (kind=printJob).
  • Receiver side: in Settings → 'Printer Bridge', enable the toggle, type the printer's Wi-Fi SSID + password (open networks: leave password empty) and pick the local CUPS queue. The bridge Mac then auto-handles the network swap.
  • How the swap works: save current SSID, networksetup -setairportnetwork to the printer's SoftAP, wait for association, lpr -P <queue> file.pdf, wait for the queue to drain, then networksetup -setairportpower off/on so macOS auto-rejoins your preferred network. Your home Wi-Fi password is never stored — only the printer's.
  • Bounded blast radius: the bridge Mac loses internet for ~30 s per print job. Timeouts at 15 s (network join), 60 s (job completion) and 20 s (restoring network) prevent the Mac from being stuck off-Wi-Fi.
  • Designed for the common HP / Wi-Fi-Direct-only printer case: the other Mac on Ethernet or normal Wi-Fi keeps internet, the bridge Mac sacrifices its Wi-Fi just for the print.
  • Backwards-compatible wire protocol: FileOfferPayload gains an optional 'kind' field; older peers see PDFs as regular file transfers and just save them to ~/Downloads/Entanglo.

0.1.31

2026-06-27

Close button works, permissions refresh automatically

  • Screenshot preview Close button now actually dismisses the sheet. The screenshot state is mirrored at the AppState level so the sheet binding sees the change and clears.
  • No more 'Refresh permissions' dance on the receiver after an auto-update: Entanglo re-checks Accessibility, Input Monitoring and Screen Recording every 2.5 seconds and on every app focus, and restarts Bonjour advertise/browse if they got torn down by the relaunch — incoming URL pushes and screenshot requests start working again as soon as macOS grants the new build.
  • Receiver: if Bonjour advertise or browse is found stopped during the auto-poll, it's restarted in the background so peers can discover the freshly-installed build without a manual refresh.

0.1.30

2026-06-27

Reset TCC grants on auto-replace

  • After replacing the app bundle, the helper runs 'tccutil reset All com.paoloasara.entanglo' so the new code-signed binary is prompted again for Accessibility, Screen Recording and Local Network. Fixes the 'silently denied' state that happened after every rebuild (the orphan grant tied to the old CDHash stayed visible but didn't apply to the new app).
  • On relaunch, macOS will show the standard permission prompts — accept them once and the new build is fully working again.

0.1.29

2026-06-27

Fully automatic peer update — countdown, replace, relaunch

  • Receiver auto-install: when a peer pushes a newer DMG, a 5 second cancellable countdown appears on the other Mac. Cancel keeps the file for manual install; otherwise it auto-replaces and relaunches.
  • Self-replace + auto-relaunch: instead of opening the DMG and asking you to drag, Entanglo now mounts the DMG, swaps its own bundle in /Applications, unmounts, deletes the DMG, and relaunches the new build. Works for both manual Install and the peer-side countdown.
  • Old DMG cleanup: on every startup, Entanglo removes Entanglo-X.Y.Z.dmg files older than the running version from ~/Downloads/Entanglo and the dev dist/ folder.

0.1.28

2026-06-27

One-click peer install

  • Press 'Install…' on the local Mac: the DMG is pushed over the existing trusted-peer link to every connected Mac, the local installer opens, and the app quits — one click does the whole chain.
  • On the receiving Mac the file lands in ~/Downloads/Entanglo/ and the Update banner lights up automatically: clicking 'Install…' there opens the same DMG and quits its app the same way.
  • Progress sheet shows how many peers got the push; 'Skip — install here only' lets you bail out and just open the local DMG without waiting.

0.1.27

2026-06-27

Dashboard Quick Actions are now clickable

  • Quick Actions card has real buttons: 'Push URL to peer' and 'Screenshot peer's screen' — no more dependence on the global hotkey, which on some macOS setups conflicts with system shortcuts (⌘⇧S is a common one).
  • Speed Test no longer hides until the link reports '.connected': as soon as an outbound transport exists, the Run button is enabled. Clear inline status when no peer is paired vs. paired-but-offline.
  • Global shortcuts (⌘⇧U / ⌘⇧S) still work in parallel for power users.

0.1.26

2026-06-27

Quick wins: shortcuts, speed test, live Dashboard

  • Push URL to peer with ⌘⇧U: sends the clipboard URL (or the active browser tab) to every connected trusted peer, which opens it in their default browser.
  • Screenshot a peer's screen with ⌘⇧S: asks the first connected peer for a full-screen capture, then shows a preview with Save / Copy to clipboard.
  • LAN Speed Test: measures real throughput between this Mac and a peer over the existing transport — Mbps, bytes, elapsed time, all live on the Dashboard.
  • Real Dashboard: linked banner with Emergency Stop, This Device + Network Quality + Pairing cards, Recent Transfers (last 3) and Quick Actions with shortcut hints.
  • Settings reorganized into 7 clear sections (Pairing, Roles, Input Sharing, Clipboard, App Behavior, Network, Permissions, About) with version + build info.
  • Network tab moved to the 'utilities' group in the sidebar — same features, less prominent for everyday workflow.

0.1.25

2026-06-27

Port scout + better device identification

  • SSDP/UPnP probe at app start: TVs, routers, IoT now show their real friendlyName + modelName (e.g. 'Samsung TV UE55', 'Fritz!Box 7590', 'Philips Hue Bridge').
  • Reverse DNS on demand: when you Identify a device, Entanglo asks the router for its hostname — often the user-set name like 'Paolo-iPhone'.
  • Click a row in the Network tab to expand → 'Identify (scan ports)' fires a fast parallel TCP probe over ~20 common ports (SSH, HTTP, SMB, AirPlay, Plex, RDP, VNC, …).
  • Banner grab for HTTP and SSH: shows 'Server: nginx/1.24', 'SSH-2.0-OpenSSH_for_Windows_8.6' — instant OS/service hint.

0.1.24

2026-06-27

Network tab: who's on your LAN

  • New 'Network' tab lists every device on your home network — Macs, phones, TVs, IoT — with hostname, IP, MAC and vendor inferred from the OUI prefix.
  • Bonjour-enriched: known devices show their advertised services (AirPlay, SMB, printers, SSH).
  • New-device alert: when a never-seen MAC joins your LAN, a system notification fires once. Useful catch for 'who's that thing online at 3am?'
  • Local Network permission row: replaced the orange warning with a neutral info pill — macOS doesn't expose this state, so the alarm was misleading.

0.1.23

2026-06-27

Sidebar split: tools on top, utilities on bottom

  • Sidebar is now split: Dashboard, Devices, Input Sharing and Files stay at the top; News & Updates, Settings and Logs are pinned at the bottom, separated by a divider.
  • Reduces visual clutter and keeps maintenance items out of the main workflow.
  • Selection works seamlessly across both groups — same keyboard navigation, same badges.

0.1.22

2026-06-27

News & Updates tab

  • New 'News & Updates' tab in the sidebar with embedded changelog and a 'What's new in X' card for the running version.
  • Local update detection: whenever a newer `Entanglo-X.Y.Z.dmg` lands in the project's `dist/` folder, a blue badge appears in the sidebar and an 'Install…' button opens the DMG.
  • Extensible to remote updates: same `UpdateSource` protocol will accept a future HTTP manifest source without view changes.
  • Release notes ship embedded in the bundle — works fully offline.

0.1.21

2026-06-27

Keep this Mac awake while paired

  • New 'Keep this Mac awake while a peer is connected' toggle in Settings → App Behavior. Default ON.
  • Holds IOPMAssertion (display + system idle sleep) only while a trusted peer is reachable and the heartbeat is alive — released automatically on disconnect or emergency stop.
  • Same mechanism as `caffeinate`; no third-party dependency, manual Apple-menu → Sleep still works.
  • News & Updates tab: see what changed in each release and get notified when a new DMG appears in `dist/`.

0.1.20

2026-06-24

Input sharing reliability pass

  • CGEventTap re-enables itself after kernel timeout — prevents silent input freezes.
  • Drag-to-select across the link: mouse moves while a button is held now ship as proper dragged events.
  • Modifier keys (Cmd/Shift/Opt/Ctrl) injected via flagsChanged so Cmd+C, Cmd+V, Shift-click etc. fire on the receiver.
  • Local cursor parked via CGAssociateMouseAndMouseCursorPosition + throttled warp — no more WindowServer races on Sequoia.