Skip to content

(2/5) The Windows client - #168

Open
ErickXavier wants to merge 5 commits into
Saffsanity:mainfrom
ErickXavier:feat/windows-client
Open

ErickXavier wants to merge 5 commits into
Saffsanity:mainfrom
ErickXavier:feat/windows-client

Conversation

@ErickXavier

@ErickXavier ErickXavier commented Oct 19, 2026 •

Copy link
Copy Markdown

The second of four pull requests that bring Sill to more systems, each on the one before; each builds and tests on its own. It needs the previous one merged first: until then, its diff also shows the earlier branches' commits, and only its last commit is its own.

  1. feat/android-client: the Android client, Keep Screen On, and Sill.app's device words
  2. feat/windows-client: the Windows client ← this one
  3. feat/linux-host: the Linux host, and the devices calling what they connect to a host
  4. feat/windows-host: the Windows host

The site has its own pull request (docs/site-other-platforms), independent of these four.

Nothing here has run on real Windows or against a real Mac. docs/clients-plan.md lists W1–W9.

What it adds

  • clients/swing-ui: the clients' Swing controls, at the shared layout's rectangles:
    • bar button, key cap, the Aa ruler;
    • the window strip with its lights;
    • the drawer, the Settings panel's rows, switch and segmented control;
    • the trackpad well.
  • clients/desktop, the Windows client:
    • Swing, laid out like the iPad app in a window.
    • FFmpeg 7.1.1 HEVC decoding through bytedeco (Direct3D 11, else the CPU). It is the client's one third-party runtime dependency, LGPL, and docs/BRIEF.md records why: Windows has no HEVC decoder without a paid Store extension.
    • Ctrl acts as ⌘, and the wheel is a scroll gesture.
    • jpackage makes an MSI, and Sill --self-test runs a self-test.
  • The code review's fix for this system: right-side modifiers are released as right-side ones, and modified Return, Tab and Backspace go as keys.
  • Docs:
    • the README's Sill for Windows bullet;
    • SECURITY.md: the client's key is a file in the user's profile until DPAPI;
    • the bug form;
    • clients-plan decisions 7–10, and decision 11 extended to windows-v* tags.
  • CI: clients.yml's windows job runs the tests on Windows and the packaged runtime's self-test.

Sill on Android phones, tablets and foldables, as a client of the Mac:
the Mac's windows, live, with touch, keyboard and mouse, over the same
wire, TLS door and pairing as the iPhone and iPad app, drawn to match
that app. Nothing on the Apple side changes; ci.yml ignores clients/.

- clients/core: the shared Kotlin core (standard library only): the
  wire field for field, pairing crypto and the hand-built certificate,
  TLS 1.3 with the pin as the whole of trust, one-shot mDNS, the
  session with the Mac's rules, pairing (ask, code, link, by address),
  saved Macs, the goodbye words and the redial; a model of the Mac's
  door and real HEVC samples as test fixtures.
- clients/core's ui layer (docs/ui-parity.md): the iOS app's design
  read from its own Swift: Tokens.kt generated (palette, metrics,
  sizes, curves), PhonePortraitLayout, HostSettingsLedger and
  DuoPosture ported and held to vectors swiftc computes from the iOS
  sources, the stream screen's layouts and state machine, the
  trackpad, the key row, the words (checked against the iOS sources).
  A settings change's token comes from the session alone. The Mac's
  menus: MacMenuState, the iOS app's rules for kinds 24, 25 and 27,
  with the subscription at the first window list.
- clients/android: platform APIs only, minSdk 29, MediaCodec, the key
  sealed by the Android Keystore, sill://pair links behind a
  confirmation; every screen drawn from the ui layer, with Android's
  insets, gesture exclusion, 48 dp targets and Back. Foldables: the
  system's window extensions by reflection (no AndroidX), else the
  hinge sensor, into the iOS app's fold rules; tested at the Galaxy Z
  Fold 8's 4:3 and other foldables' sizes in each posture. A Menus
  button with the Mac's menus as Android popups, read when opened.
- clients/wire-vectors and clients/design: what the Mac's and the iOS
  app's own Swift computes, checked in CI.
- clients.yml: the core's tests, the Swift checks, the Android JVM
  tests, lint and the APK.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLHTdv4VtoAFh4pYebBnTE
A switch in the Settings panel's This device group, on by default (Sill.keepScreenOn, never sent to
the Mac): while it is on and the stream screen shows, the screen never dims or locks by itself, so a
stream only watched stays in view. iOS turns off its idle timer (ScreenAwake: a claim per stream
screen, given back as it goes); Android sets FLAG_KEEP_SCREEN_ON on the stream's window. The words
are PanelCopy's and the iOS app's, as check_copy.py requires.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLHTdv4VtoAFh4pYebBnTE
With an Android client, an iPhone or iPad is no longer every device that can pair with or stream
from a Mac, so Sill.app's words say "device" where they meant any of them:

- The menu's and Settings › Devices' "Pair iPhone or iPad…" is "Pair a Device…", and the pairing
  window is "Pair a Device", which says to scan the code or type the one below it (a client
  without a camera types it).
- "An iPhone or iPad Needs Sill Updated" is "A Device Needs Sill Updated".
- The network, permissions, Direct Wireless, Remote Access and clipboard footnotes say "your
  devices" or "your device"; the clipboard's footnote is ClipboardPolicy.macFootnote.
- Where only an iPhone or iPad can do it, the words still say so: the USB cable pairs an iPhone or
  iPad by itself (Settings › Devices' footnote, the cable rule and its report).

The iPhone and iPad app, and the Kotlin core, name the menu item in their pairing messages
("On the Mac, choose Pair a Device… in the Sill menu"), so they change with it, and so do the
checks that hold those words (home-device, policy, home-model, clipboard, and the fixtures of
compatibility, goodbye and door-policy) and their mutants. A device on this build facing Sill for
Mac 0.5.1 is told the new name, which that Mac's menu does not have yet; a 0.5.1 device facing
this Sill.app the old one. docs/DEVELOPMENT.md and the App Store review notes follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLHTdv4VtoAFh4pYebBnTE
- README: "Other systems (in development)" with Sill for Android, Keep Screen On in How it works
  (not in a release yet), how to build the Android client, and clients/'s exception to the Swift
  rule in Contributing.
- SECURITY.md: an Android device among those that control a Mac, and clients/ in scope.
- The issue forms ask for the device and its system, an Android one too.
- docs/clients-plan.md's decision 11 and the release checklist: a client's binary is never
  released on a v* tag or as GitHub's latest release, which Sill.app's update check, the site's
  download link and release.yml all read.
- CLAUDE.md: Keep Screen On, Sill.app's device words and the review's fixes in this branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLHTdv4VtoAFh4pYebBnTE
Sill on Windows PCs, as a client of the Mac, on the Android client's
core and drawn to match the iPad app: Swing, HEVC decoded by FFmpeg
7.1.1 through bytedeco (Direct3D 11 when the GPU has it, else the CPU;
the one third-party runtime dependency, Windows only, recorded in
BRIEF), Ctrl as ⌘, the wheel as a scroll gesture, and jpackage (an MSI
with WiX 3; Sill --self-test).

- clients/swing-ui: the iOS app's controls from the core's tokens and
  curves (bar buttons, key caps, the Aa ruler, the window strip and its
  lights, the drawer, the Settings panel's rows, switches, the
  trackpad well), reused by the PC host.
- clients/desktop: every control at StreamLayout's rectangles, opened
  and closed through StreamUi, the Settings panel on the ledger; the
  native frame, dark scrollbars, Esc and Tab, per-monitor scaling; the
  Menus button with the Mac's menus as a cascading menu, each read
  from the Mac when it opens, shortcuts at the right.

clients.yml gains the client's tests, its real windows under Xvfb at
100 % and 200 % (screenshots kept) and a Windows job (the tests and the
packaged runtime's self-test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLHTdv4VtoAFh4pYebBnTE
@ErickXavier ErickXavier changed the title The Windows client The Windows client (2/4) Oct 19, 2026
@ErickXavier ErickXavier changed the title The Windows client (2/4) (2/4) The Windows client Oct 19, 2026
@ErickXavier ErickXavier changed the title (2/4) The Windows client (2/5) The Windows client Oct 19, 2026
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