experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

docs(changelog): record window-placement / web-permissions / page-host FSM / load-error overlay anchoring + regenerate RSS

Captures the week of 2026-04-27 — window-placement refactor sprint
(Phases 1–6), web permissions feature (Phases 1–5 + polish), page-host
window FSM (Phases 1–3), branded load-error overlay + Cmd+L anchoring
fix, window-open explicit-key skip-reuse, IZUI transient-on-blur
restore, cmd panel api.izui migration, lex auth-expiry handling, tile
consolidation (lists), Cmd+Shift+T from inside webview, and websearch
single-tile consolidation.

+100 -1
+48
CHANGELOG.md
··· 13 13 14 14 Newly done items go here, grouped under level-2 headings by week (date = Monday of that ISO week). 15 15 16 + ## 2026-04-27 17 + 18 + Desktop - window-placement refactor sprint (Phases 1–6) 19 + - [x] Phase 1 — extract pure `backend/electron/window-placement.ts` with `computePlacement` + `Placement` discriminated union; full unit-test coverage with synthetic display layouts so the regression class becomes single-failing-test catchable 20 + - [x] Phase 2 — record a `placement` intent on every window at registration time (never re-derived from current screen state, so display swaps can re-resolve against the original intent) 21 + - [x] Phase 3 — wire `computePlacement` into URL-reuse, fresh-open fallback, and display-watcher second pass; stranded-rescue (<50% area on any display) is built into the pure module and replaces `isWindowAccessibleNow` + `repositionOnCursorDisplay`, which are deleted 22 + - [x] Phase 4 — slides renderer no longer computes x/y; passes `screenEdge` semantics, main process owns placement (`placement: { mode: 'edge', edge }`) and resolves coords against the current cursor display every show; renderer no longer reads `window.screen.width/height` 23 + - [x] Phase 5 — `tile-ipc.ts` v2 positioning consolidated through `computePlacement` (single placement decision path across reuse / fresh / v2 tiles) 24 + - [x] Phase 6 — close out sprint, document the new module, mark display-switch tasks resolved 25 + - [x] Fix: page-host window jumps to wrong position after switching primary monitor (cmd+L on a different display than where window was last opened) — `cursor-display-fallback` placement causes display-watcher to re-evaluate against current cursor display 26 + - [x] Fix: slides anchor to stale `window.screen` coordinates after display switch — every display change now triggers a generic `computePlacement` pass via display-watcher 27 + 28 + Desktop - web permissions feature (Phases 1–5 + polish) 29 + - [x] Phase 1 — per-permission policy module (`permission-policy.ts`): visibility surface + default-deny for unknown permissions; chrome-extension:// origins hard-allowed 30 + - [x] Phase 2 — user approval prompt UI for risky web permissions (camera/mic/geolocation/notifications/clipboard etc.) 31 + - [x] Phase 3 — persist per-origin decisions to SQLite (`web_permissions` table) 32 + - [x] Phase 4 — Settings UI for inspecting + revoking stored decisions (per-origin grouped rows) 33 + - [x] Phase 5 — favicon + multi-prompt queueing UX (consecutive prompts on the same origin coalesce into a single dialog with a queue indicator) 34 + - [x] Polish: per-permission emoji glyphs, nav count badge in Settings, relative timestamps, clearAll button reset, test-coupling cleanup 35 + - [x] Refactor: extract `resolveWithStored` as a pure, unit-testable function 36 + - [x] New `tests/desktop/permissions-*.spec.ts` — Allow+Remember coverage; settings rows grouped by origin 37 + 38 + Desktop - page-host window FSM (Phases 1–3) 39 + - [x] Phase 1 — maximize state + round-2 polish (state-driven maximize/restore replaces ad-hoc class toggles) 40 + - [x] Phase 2 — drag/resize/drag-out-of-maximized states modeled explicitly 41 + - [x] Phase 3 — `fsmState` is the source of truth (DOM classes derived from state, not the other way round) 42 + 43 + Desktop - page-host load failures 44 + - [x] Show branded error overlay when a page fails to load (`did-fail-load`) — replaces Chromium's default error chrome 45 + - [x] Hung-load timeout surfaces the same error overlay — no more blank-white-page-forever when DNS/TCP stalls 46 + - [x] Anchor the load-error overlay to `.center-column` (`position: absolute; inset: 0; z-index: 25`) so Cmd+L surfaces the navbar without window growth — pre-fix the overlay was `position: fixed` at z-index 9998 anchored to the viewport, hiding the navbar and stretching with show()'s panel-overhang window expansion 47 + - [x] New `tests/desktop/cmdl-on-error-page.spec.ts` pins the symptom: webview width unchanged, overlay sized to center-column (< document width), body not maximized, navbar visible, navbar z > overlay z 48 + 49 + Desktop - window-open / IZUI fixes 50 + - [x] Fix `window.open` URL-reuse collapsing distinct callers — when caller provides an explicit `key`, skip URL-reuse so two windows with the same URL but different keys both open; new `tests/desktop/window-url.spec.ts:120` covers it 51 + - [x] Restore window-level transient-on-blur auto-hide regressed by panel-type focus events — macOS NSPanels don't fire `BrowserWindow.on('blur')` on intra-app focus shifts, so a main-process `win.on('focus')` loop now hides/closes other visible windows whose role is in `TRANSIENT_ROLES` (palette / quick-view / overlay) 52 + 53 + Desktop - cmd panel + lex 54 + - [x] Migrate cmd panel to `api.izui` + replace `api.modes` calls; surface `open <noun>` variants in tab cycle so noun-registered features show alongside bare commands 55 + - [x] Lex: short-circuit on auth expiry — surface re-authentication UI and stop polling instead of looping failed token refreshes 56 + 57 + Desktop - tiles + shortcuts 58 + - [x] Collapse `lists` bg+home into a single tile + harden tile-launcher (`frame`, `keepLive`) 59 + - [x] Cmd+Shift+T (reopen closed window) now works from inside webview content — accelerator was previously swallowed by the focused webview 60 + 61 + Desktop - websearch 62 + - [x] Consolidate websearch to a single tile + fix multi-word command query bleed (subsequent token of a chained command was leaking back into the search query) 63 + 16 64 ## 2026-04-20 17 65 18 66 Desktop - thumbnail close-race fix
+52 -1
docs/feed.xml
··· 4 4 <title>Peek Changelog</title> 5 5 <link>https://tangled.org/burrito.space/peek</link> 6 6 <description>Recent changes to Peek</description> 7 - <lastBuildDate>Mon, 27 Apr 2026 10:09:33 GMT</lastBuildDate> 7 + <lastBuildDate>Tue, 28 Apr 2026 21:28:01 GMT</lastBuildDate> 8 8 <generator>changelog-to-rss.js</generator> 9 9 <atom:link href="https://tangled.org/burrito.space/peek/raw/main/docs/feed.xml" rel="self" type="application/rss+xml"/> 10 + <item> 11 + <title>2026-04-27</title> 12 + <link>https://tangled.org/burrito.space/peek/blob/main/CHANGELOG.md#2026-04-27</link> 13 + <guid isPermaLink="false">https://tangled.org/burrito.space/peek#2026-04-27</guid> 14 + <pubDate>Mon, 27 Apr 2026 12:00:00 GMT</pubDate> 15 + <description>Desktop - window-placement refactor sprint (Phases 1–6) 16 + - Phase 1 — extract pure backend/electron/window-placement.ts with computePlacement + Placement discriminated union; full unit-test coverage with synthetic display layouts so the regression class becomes single-failing-test catchable 17 + - Phase 2 — record a placement intent on every window at registration time (never re-derived from current screen state, so display swaps can re-resolve against the original intent) 18 + - Phase 3 — wire computePlacement into URL-reuse, fresh-open fallback, and display-watcher second pass; stranded-rescue (&lt;50% area on any display) is built into the pure module and replaces isWindowAccessibleNow + repositionOnCursorDisplay, which are deleted 19 + - Phase 4 — slides renderer no longer computes x/y; passes screenEdge semantics, main process owns placement (placement: { mode: &apos;edge&apos;, edge }) and resolves coords against the current cursor display every show; renderer no longer reads window.screen.width/height 20 + - Phase 5 — tile-ipc.ts v2 positioning consolidated through computePlacement (single placement decision path across reuse / fresh / v2 tiles) 21 + - Phase 6 — close out sprint, document the new module, mark display-switch tasks resolved 22 + - Fix: page-host window jumps to wrong position after switching primary monitor (cmd+L on a different display than where window was last opened) — cursor-display-fallback placement causes display-watcher to re-evaluate against current cursor display 23 + - Fix: slides anchor to stale window.screen coordinates after display switch — every display change now triggers a generic computePlacement pass via display-watcher 24 + 25 + Desktop - web permissions feature (Phases 1–5 + polish) 26 + - Phase 1 — per-permission policy module (permission-policy.ts): visibility surface + default-deny for unknown permissions; chrome-extension:// origins hard-allowed 27 + - Phase 2 — user approval prompt UI for risky web permissions (camera/mic/geolocation/notifications/clipboard etc.) 28 + - Phase 3 — persist per-origin decisions to SQLite (web_permissions table) 29 + - Phase 4 — Settings UI for inspecting + revoking stored decisions (per-origin grouped rows) 30 + - Phase 5 — favicon + multi-prompt queueing UX (consecutive prompts on the same origin coalesce into a single dialog with a queue indicator) 31 + - Polish: per-permission emoji glyphs, nav count badge in Settings, relative timestamps, clearAll button reset, test-coupling cleanup 32 + - Refactor: extract resolveWithStored as a pure, unit-testable function 33 + - New tests/desktop/permissions-*.spec.ts — Allow+Remember coverage; settings rows grouped by origin 34 + 35 + Desktop - page-host window FSM (Phases 1–3) 36 + - Phase 1 — maximize state + round-2 polish (state-driven maximize/restore replaces ad-hoc class toggles) 37 + - Phase 2 — drag/resize/drag-out-of-maximized states modeled explicitly 38 + - Phase 3 — fsmState is the source of truth (DOM classes derived from state, not the other way round) 39 + 40 + Desktop - page-host load failures 41 + - Show branded error overlay when a page fails to load (did-fail-load) — replaces Chromium&apos;s default error chrome 42 + - Hung-load timeout surfaces the same error overlay — no more blank-white-page-forever when DNS/TCP stalls 43 + - Anchor the load-error overlay to .center-column (position: absolute; inset: 0; z-index: 25) so Cmd+L surfaces the navbar without window growth — pre-fix the overlay was position: fixed at z-index 9998 anchored to the viewport, hiding the navbar and stretching with show()&apos;s panel-overhang window expansion 44 + - New tests/desktop/cmdl-on-error-page.spec.ts pins the symptom: webview width unchanged, overlay sized to center-column (&lt; document width), body not maximized, navbar visible, navbar z &gt; overlay z 45 + 46 + Desktop - window-open / IZUI fixes 47 + - Fix window.open URL-reuse collapsing distinct callers — when caller provides an explicit key, skip URL-reuse so two windows with the same URL but different keys both open; new tests/desktop/window-url.spec.ts:120 covers it 48 + - Restore window-level transient-on-blur auto-hide regressed by panel-type focus events — macOS NSPanels don&apos;t fire BrowserWindow.on(&apos;blur&apos;) on intra-app focus shifts, so a main-process win.on(&apos;focus&apos;) loop now hides/closes other visible windows whose role is in TRANSIENT_ROLES (palette / quick-view / overlay) 49 + 50 + Desktop - cmd panel + lex 51 + - Migrate cmd panel to api.izui + replace api.modes calls; surface open &lt;noun&gt; variants in tab cycle so noun-registered features show alongside bare commands 52 + - Lex: short-circuit on auth expiry — surface re-authentication UI and stop polling instead of looping failed token refreshes 53 + 54 + Desktop - tiles + shortcuts 55 + - Collapse lists bg+home into a single tile + harden tile-launcher (frame, keepLive) 56 + - Cmd+Shift+T (reopen closed window) now works from inside webview content — accelerator was previously swallowed by the focused webview 57 + 58 + Desktop - websearch 59 + - Consolidate websearch to a single tile + fix multi-word command query bleed (subsequent token of a chained command was leaking back into the search query)</description> 60 + </item> 10 61 <item> 11 62 <title>2026-04-20</title> 12 63 <link>https://tangled.org/burrito.space/peek/blob/main/CHANGELOG.md#2026-04-20</link>