Skip to content

CanvasTTY 1.8.3: selected canvas PRs, integration fixes and CanvasLink 1.0 - #168

Merged
howdeploy merged 31 commits into
mainfrom
integrate/canvaslink-1.0-selected-prs
Oct 26, 2026
Merged

howdeploy merged 31 commits into
mainfrom
integrate/canvaslink-1.0-selected-prs

Conversation

@howdeploy

@howdeploy howdeploy commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

Result

Integrate the selected canvas improvements and CanvasLink into CanvasTTY 1.8.3, with separately installable CanvasLink 1.0.0 Android APKs. Auto-sort, native-browser zoom, animated terminal backgrounds and Android window control can now ship from one source tree.

Contributor work preserved

Source Contributor Original contribution
#158, already in main @pepechka-kun Codex prompt delivery and account-scoped quota observations.
#163 (10a13b11) @BIackFIame Auto-sort with task/status/project/grid criteria, scoped movement, undo, menu placement and menu preloading fixes.
#164 (bbc18acf) @CLOSETTTY Animated ASCII terminal backgrounds, Fine Dots rendering, scene creation, per-terminal controls, presets and quick hiding; includes the author's WebGL/bundle follow-ups.
#165 (7c98a17e) @teo-nex Native browser viewport and pointer/wheel coordinate conversion at non-default renderer zoom.
#166 (19b46df9) @teo-nex Original CanvasLink Android/desktop integration: SRP pairing, encrypted signalling, owned-window capture/control, native terminal input, recovery and installation onboarding.

The original contributor commits and authorship remain in the merge history. Maintainer integration and follow-up patches are separate commits; this PR does not claim the original implementations as maintainer-authored work.

Maintainer follow-ups

  • Preserve terminal backgrounds across F8, prevent transparent WebGL glyph ghosting, retain opaque zoomed-out cards, and attach the deferred readability backdrop correctly when backgrounds are toggled.
  • Repair background-settings scrolling and reset spacing, group the editor visually, add official Lucide reset/reload assets, and retain reduced-motion support for button feedback.
  • Document OpenCode's system theme for animated backgrounds.
  • Route desktop discovery through LAN interfaces and Android signalling through non-VPN Wi-Fi/Ethernet; Android 13+ discovery uses the same network filter. Preserve SRP, session address binding, revocation and input deduplication.
  • Bound connection attempts to 30 seconds, reject stale negotiations, report host failures to the phone, and discard old pending input on network changes.
  • Replace the mobile marketing layout with CanvasTTY Sage surfaces and compact controls; disable button-text selection while retaining editable fields and native IME.
  • Version and build normal/DEV CanvasLink APKs. Keep the persistent owner key private and pin the official APK URL, SHA-256 and certificate fingerprint in the desktop installation prompt. Existing DEV users receive a separate update APK without deleting app data.
  • Make source assertions independent of Windows CRLF, and account for workspace clipping and corner-HUD occlusion in the browser zoom smoke fixture.

PRs #159 and #160 are deliberately excluded. #161 and #162 are also outside this integration.

Validation and release

  • Normal and DEV CanvasLink 1.0.0 APKs compiled locally; v2/v3 signatures verified.
  • Original LAN/VPN DEV received a successful Linux/Android user report; this does not establish universal VPN/WebView or cross-platform compatibility.
  • Updated the existing UI assertions for the removed badge and added bounded-connection/network-change regressions.
  • The integrated source is covered by the standard desktop CI, Android build and 118 contract/UI tests, and macOS PTY checks. Local interactive/UI tests were not run.
  • After merge, publish CanvasLink 1.0.0 from the owner-signed APKs and start the CanvasTTY 1.8.3 Linux, Windows and macOS installer workflow. Private profiles, dependencies, generated binaries and signing keys are not part of this PR.

BIackFIame and others added 30 commits October 12, 2026 13:02
…e startup bundle

The canvas command palette and the canvas context menu are rendered only
while they are open, but both were static imports of the canvas and so
part of the startup bundle. They are now separate chunks, which frees
about 18 KB of the startup bundle, and still open at once: the canvas
preloads both chunks once it is idle after its first paint, and renders
the loaded component directly. There is no lazy() and no Suspense
boundary on this path (React holds a suspended boundary's reveal for up
to 300 ms, which would delay the first right-click and the first
Cmd/Ctrl+K). An open before the preload has finished loads the chunk at
once and shows the menu as soon as it arrives.

renderer-bundle-splitting checks that each is its own chunk, reachable
only through a dynamic import(); canvas-preloaded-surfaces renders both
with the real React through the real imports and checks that a preloaded
menu and palette are in the very first render of an open.
Right-clicking empty canvas now shows a Tools row with one Auto-sort
action. The criteria (by task, by status, by project, grid) are radio rows
in that submenu, built with the existing canvas menu primitives. There is
no separate panel, toolbar, presets or layouts list.

- Scope: the current multi-selection when it holds two windows,
  otherwise terminal, plugin and Browser windows that are not completely
  inside a region. Companion mascots move only when selected. Sticky
  notes, materials and Files cards never move.
- "By task" uses the orchestrator-to-subagent relation that already
  exists (parentSessionId): each subagent goes to the right of its parent.
- The layout is deterministic: ties follow the current reading order, and
  sorting twice changes nothing. The block keeps the windows' top-left
  corner and keeps clear of HOME, regions, notes, materials, Files cards
  and windows it does not move (it shifts right or down, whichever is
  shorter, and never lands inside a region). With snapping on, every
  window lands on the 10px grid with the 20px snapping gap.
- Moved windows get a presentation-only outline that clears on the next
  press or after a few seconds (they are not made the marquee selection),
  and a short glide that is skipped when reduced motion is requested. The
  Browser card does not glide, because its native view is placed from the
  measured card.
- "Undo auto-sort" stays in the submenu while a sorted window is still
  where the sort put it. It restores only those windows. There is no
  global undo shortcut, so terminals and text inputs keep their keys.
- The last criterion is kept in renderer memory for the running session,
  only after a sort happened. Nothing is persisted. A failed load or sort
  shows a localized toast.
- The group-drag commit is extracted into commitLayerBounds and shared
  with auto-sort.
- The Tools submenu body, scope and layout are not in the startup
  bundle: they load while the empty-canvas menu is open (or when Tools
  is pressed first), so the submenu still opens at once.

Adds the official Lucide wrench and undo-2 icons, ru/en strings, and the
UI contract text in en/ru/zh-CN. Tests drive the menu and the submenu.
…ed out

- A context menu opened near a corner panel (minimap, shortcut hints,
  Home/zoom controls) moves up until it clears it; it was drawn over the
  bottom of the Home/zoom bar. When moving up cannot clear every panel (a
  tall menu near the right edge at UI scale 1.25, between the minimap and
  the shortcut hints), it moves sideways beside the panel it hits, at its
  own height; with no room on either side it keeps its place. Menus stay
  above the corner panels.
- A submenu (Tools, Launch agent) opens where it covers no corner panel
  either: when its usual side and direction would run over the shortcut
  hints, minimap or Home/zoom controls (in whichever corners Settings put
  them), it opens in the other direction or on the other side; at UI
  scale 1.25 near the right edge, Tools opened over the hints panel and
  left its clipped text showing beside it.
- The chevrons of Launch agent and Tools point to the side their submenu
  opens (the vendored chevron, rotated), not down.
- "Needs at least 2 windows" is a plain hint, not the uppercase group
  label. It lines up with the radio labels and is as muted as the
  disabled rows it explains, so it does not read like an active item.
- Zoomed out (summary), the outline of the windows a sort moved grows with
  the summary scale, so it stays visible at overview zoom for its 4 s.

The placement code (and the existing chooseCanvasSubmenuSide) moves from
canvasContextRouting to canvasMenuPlacement, which only the lazily loaded
menu imports, so it stays out of the startup bundle.
…ffect ran

When the idle preload settled after an open's render read the surface but
before its effect ran, the effect saw a loaded surface and returned without
re-rendering, so the first context menu or command palette could stay blank.
The effect now re-renders whenever the render it follows had nothing to show.
…menu

A menu first rendered while the Tools body was still loading started with no
body; if the load finished before its effect ran (or before it became the
empty-canvas menu), the effect and Tools both saw the module-level copy and
skipped loading, so Tools expanded with no submenu. Both now copy it in.
Choosing a criterion the layout already follows produced a plan whose
before and after were equal. Storing it as the undo step dropped the
previous sort's positions and hid Undo auto-sort. Such a sort now
commits and outlines nothing and keeps the earlier undo step.
A selection with fewer than two windows falls back to the default
scope, which left out every mascot, including one the person had just
selected. A lone selected mascot was then left behind, or auto-sort was
disabled next to a single regular window. The fallback now skips only
mascots that are not selected, as the UI contract describes.
…ator, and quick-toggle hotkey

- Add 297 animated background scenes with full runtime Fine Dots (Braille subpixel matrix) rendering
- Implement animated background creator modal with autonomous AI agent prompt generator
- Add per-terminal background targeting, custom overrides reset, and background deletion with trash recovery
- Add 'Mom entered' panic hotkey (default F8) to quickly toggle all terminal backgrounds
- Translate entire backgrounds catalog into contextual Russian names
- Fix Hermes hooks startup recovery crash and ensure cross-platform compatibility (macOS/Linux/Windows)
…and fix Hermes journal cleanup

- Remove custom video clips, media and third-party franchise scenes, keeping only the 240 official procedural scenes from ascii.rest (MIT license)
- Reduce repository and installer size by over 140 MB
- Tighten bundle splitting budget to 1.75 MB
- Fix Hermes lifecycle recovery to remove journal only after successful cleanup, preserving retry path on errors
- Consume ascii.rest via official npm dependency (0.4.0, MIT) instead of vendoring 47k lines in core
- Remove src/renderer/src/vendor entirely
- Load official pieces on-demand from ascii.rest package
- Update catalog and test assertions to track upstream library
Integrate opt-in owned-window streaming into Settings, add the Android client,
contract tests, alpha APK CI and explicit platform/acceptance limits.
# Conflicts:
#	src/renderer/src/features/workspace/WorkspaceCanvas.tsx
@howdeploy
howdeploy marked this pull request as ready for review October 26, 2026 19:14
@howdeploy
howdeploy merged commit 3d50657 into main Oct 26, 2026
8 checks passed
BIackFIame added a commit to BIackFIame/CanvasTTY that referenced this pull request Oct 26, 2026
Upstream main 3d50657 (howdeploy#168): howdeploy#163 auto-sort (already in edge, one copy),
howdeploy#164 animated terminal backgrounds and F8 quick hide, howdeploy#165 browser zoom,
howdeploy#166 CanvasLink for Android, maintainer follow-ups, version 1.8.3.

Conflicts kept both sides: changelogs (1.8.3 above edge's 1.8.2 notes),
renderer define for the build commit plus the es worker format, version
1.8.3 with the Edge desktop name, upstream's lockfile (no Edge-only deps),
the Claude/Codex editor keys next to the F8 background toggle (F8 clashes
with every other key, as upstream), plugin names next to the background
types in App, and the Settings keyboard labels.
@howdeploy
howdeploy deleted the integrate/canvaslink-1.0-selected-prs branch October 31, 2026 11:09
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.

4 participants