Repository navigation
Tiles, Virtual Display and Send Audio on by default; no virtual display under 800 points - #236
Merged
Merged
Conversation
Noah, 2026-10-27: "make tiles not list the default behavior of the app. ... Of course, if a user changes a setting remember their choice for future sessions as you do now." ConnectionList.defaultStyle is .tiles and storedStyle reads a stored Sill.connectionStyle, "list" or "tiles", as it is; nothing stored, or a value no build writes, reads as the default. ConnectScreen keeps the key optional (@AppStorage String?), so the rule alone decides, as StreamClient's connectionStyle already did; the switch and a saved Mac's menu write it through toggleStyle, as before. Only an install that never toggled changes. With tiles the default, a picture of each saved Mac's screen is kept as its sessions end unless the list is chosen (takesPreview is unchanged: only with tiles), and Disconnect asks for the fresh keyframe first. The switch beside the title now shows once a saved Mac is listed, whichever style is on. #117 also showed it whenever tiles were on, its way back from tiles while the list was the default; with tiles the default that showed it on a fresh install and took it away under the finger of someone with no saved Mac who chose the list, with no way back until they paired one. The list's rule is #117's as it was. DEBUG: -SillStyleToggleAt <s>[,<s>...] toggles the style as the switch does, for the gates that have no finger; the console's connect: lines say the style and what is stored. Tests/checks/connection-list: 162 checks (154 before), 76 of 76 mutants. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Noah, 2026-10-27: "Also have Virtual Desktop on by default. Of course, if a user changes a setting remember their choice for future sessions as you do now." HostConfig.app is Sill.app's defaults: the CLI's standard with the virtual display on. HostSettings registers it, so the default is never written: a virtualDisplay key set from the menu, Settings › Virtual Display or a device (saved like a menu click, as before) always wins, a Mac that turned it off keeps it off, and -virtualDisplay 0 turns it off for one run. Only an install that never set the key changes. The CLI keeps standard: --virtual-display stays opt-in, and its output is what it was. The menu's checkmark and Settings › Virtual Display's switch follow config; no pane says what the default is. Tests/checks/away-quality: 88 checks (83 before), 27 of 27 mutants: standard off, app on, app standard but for the virtual display. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sill.log had five virtual displays at 1x (2026-09-26, 09-28, 10-08 twice,
10-15), each asked with both sides under 800 points: 754×784 or 762×792,
the envelope of an iPhone held upright (its 377- or 381-point picture,
doubled for Aa's smallest step) with the menu bar. macOS listed the 2x
mode asked for ("754×784 pt @ 1508×1568 px"), waitUntilOnline asked for
it every half second, and the display stayed at 800×832 points at 1x
until the stage's 3 s wait ran out ("online 3312 ms"): the pick waited
3 s more, and the staged window was captured at 2x from a 1x display
(eleven captures "filter (800.0, 832.0) scale 1.0"). Every display with
a side of 800 points or more came up at 2x, one side under 800 or not
(754×979, 838×792, 1000×784, 900×800, 848×878, and larger). It never
followed the main display's scale: those five were made beside the
Mac's own Retina display, and on 2026-10-27, beside an external
2560×1440 display at 1x, every staged capture read "scale 2.0".
VirtualDisplaySize (pure, in CaptureScale.swift beside
CaptureScale.virtualDisplay, which it keeps true): every side 800 to
4096 points, so an iPhone held upright gets an 800×830 display.
VirtualStage's envelope and ensureDisplay use it in place of their own
floor of 320, VirtualDisplay's.
The creation line said "@2×" whatever came up; it now prints the mode
the display came up at (VirtualDisplay.currentScale), and
--virtual-display-selftest takes a size after the flag (`800x830`) as it
takes a refresh rate.
Tests/checks/capture-scale: 148 checks (122 before), 39 of 39 mutants.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… at 1x README: the connect screen's tiles (a paired Mac's picture kept until removed or forgotten, the list a tap away and remembered); On iPhone, Text size and the virtual display with it on unless turned off; Good to know, the window off the Mac's screen while it streams. The site: support.html gains "A window left your Mac’s screen" (true of 0.5.1's Virtual Display too), its sentence on the default marked <!-- Virtual Display for the release that turns it on, and says "It says Not paired" for tiles and rows alike. privacy.html's tiles items say the pictures are kept unless the list is chosen, "touch and hold it" forgets a Mac, dated October 27, 2026; the virtual display needs no word there (Accessibility, "so Sill can move and size the window it shows"). The release checklist lists the new marker, its perl line and grep. The App Store drafts: the description's "Your Mac shows up." (3,032 characters), the next What's New's tiles paragraph (232; the draft 1,805). DEVELOPMENT.md: Sill.app's default and how to go back to it, the connect screen's default and the switch's rule, the harness's -Sill.connectionStyle list and -SillStyleToggleAt, the self-test's size. The checks README: connection-list, capture-scale and away-quality. CLAUDE.md: the Current step entry with what was verified and what waits for Noah. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ker and the checklist Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Noah, 2026-10-27: "The list/tiles switch should always show", whichever style is on and whether or not a Mac is listed. #117 showed it for tiles alone, and this branch's first rule only once a saved Mac was listed; both left someone with no saved Mac a way to lose it. Only the card, which takes the title's place, and a link's confirmation leave it out. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Noah, 2026-10-27, testing #235: "Send Audio should be on by default, and mute should be off by default." HostConfig.app, the app's registered defaults, sets sendAudio too; the CLI's --audio still opts in and a saved key wins. README, the support and privacy pages, DEVELOPMENT.md and the Current step entry say so. Mute on the device was off by default already. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… too (#236) The check asserted the virtual display was the one knob HostConfig.app changes; with Send Audio on by default there are two. Two checks more (90), and a mutant that turns the app's Send Audio off again (AQ28, 28 caught). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CLAUDE.md's Current step conflicted (both branches added an entry at the top); both kept, this branch's first. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Eight files met: CLAUDE.md's Current step (both entries, this branch's first); README, the support and privacy pages, DEVELOPMENT.md and the App Store drafts, where #235's words (Send Audio from a device, Mute in its panel) now carry this branch's default (on); the checks README's away-quality row and mutants.py (#235's acceptance mutants AQ25–AQ26 and this branch's app-defaults mutants, now AQ27–AQ30; 96 checks). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…h always shown, the numbers at the head (#236) The review of #236: three source comments, BRIEF.md, the App Store drafts (the description's sound bullet, the review notes' sound line at the same byte length), docs/audio-plan.md's Q1 and the lines premised on off by default, the Current step entry's numbers (away-quality 96 and 30 of 30, five previews, the warning's line, the photos under the always-shown switch, this Mac's saved keys), the simulator instruction (a simctl spawn defaults write never reaches the app: plutil on the container's plist instead), README's virtual display bullet (a device's panel turns it off too). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
addhumal
added a commit
to addhumal/sill
that referenced
this pull request
Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Noah's two defaults of 2026-10-27, as one pull request after #117 merged: "make tiles not list the default behavior of the app. Also have Virtual Desktop on by default. Of course, if a user changes a setting remember their choice for future sessions as you do now. Make this a separate PR after #117 merges."
What changes
The device: tiles by default.
ConnectionList.defaultStyleis.tiles, andstoredStylereads a storedSill.connectionStyle("list" or "tiles") as it is: a choice made with the switch beside "Connect to a Mac" or a saved Mac's menu always wins, so only an install that never toggled sees the change. Nothing stored, or a value no build writes, reads as tiles. ConnectScreen now keeps the key optional (@AppStorage … String?), so the rule alone decides the default (StreamClient'sconnectionStylealready read it that way).takesPreviewunchanged: only with tiles), and Disconnect asks for its fresh keyframe first (300 ms at most before the connect screen with Sill for Mac 0.5.1, which skips kind 44). The privacy page says so.style == .tiles ||back in ContentView's overlay.-SillStyleToggleAt <s>[,<s>…]toggles the style as the switch does (toggleStyle), for gates with no finger; the console'sconnect:lines say the style and what is stored.The Mac: Virtual Display and Send Audio on by default in Sill.app.
HostConfig.appis Sill.app's defaults: the CLI'sstandardwith the virtual display and Send Audio on (Noah, 2026-10-27, testing #235: "Send Audio should be on by default, and mute should be off by default"; Mute on the device was off by default already; the CLI's--audiostill opts in).HostSettingsregisters it, never writes it: avirtualDisplaykey set from the menu, Settings › Virtual Display or a device (saved like a menu click, as now) always wins, so a Mac that turned it off stays off;-virtualDisplay 0turns it off for one run. The CLI keepsstandard:--virtual-displayis still opt-in and its output is unchanged. The menu's checkmark and the pane's switch followconfig; nothing on screen names the default.Why the virtual display came up at 1x. Not in the session of 2026-10-26/27: every staged capture that night, beside the 2560×1440 display at 1x, read "scale 2.0" (
filter (1456.0, 1486.0),(2560.0, 1486.0),(2560.0, 2264.0)); its "scale 1.0" captures were real windows and the Desktop on that display (#233's case). Sill.log's 1x virtual displays were five earlier ones (2026-09-26, 09-28, 10-08 twice, 10-15), all asked with both sides under 800 points, 754×784 or 762×792: an iPhone held upright (its 377- or 381-point picture, doubled for Aa's smallest step) plus the menu bar, beside the Mac's own Retina display too, so the main display's scale played no part. macOS listed the 2x mode asked for,waitUntilOnlineasked for it every half second, and the display stayed at 800×832 points at 1x until the stage's 3 s wait ran out: the pick waited 3 s more, and the staged window was captured at 2x from a 1x display (eleven capturesfilter (800.0, 832.0) scale 1.0). Every display with a side of 800 or more came up at 2x (754×979, 838×792, 900×800, 1000×784, 848×878 and larger). SoVirtualDisplaySize(pure, in CaptureScale.swift) holds every side to 800…4096 points: an iPhone held upright now gets 800×830. The creation line said "@2×" whatever came up; it now prints the mode it came up at, and--virtual-display-selftesttakes a size (60 800x830).Words: README (the connect screen's tiles; On iPhone, Text size and the virtual display with it on by default; Good to know), the support page (a section, "A window left your Mac’s screen", whose sentence on the default is marked
<!-- Virtual Displayfor the release; "It says Not paired" for tiles and rows alike), the privacy page (the tiles' items: kept unless the list is chosen; dated October 27, 2026; the virtual display needs no word there: Accessibility "so Sill can move and size the window it shows" already says it), the release checklist (the marker, its perl line and grep), the App Store drafts (the description's "Your Mac shows up.", the next What's New's tiles paragraph), DEVELOPMENT.md, CLAUDE.md, the checks README.Checks
swift build -c release: only the CaptureProbe warning.Tests/checks/run-all.sh: all 55 pass.git archive,--syntheticon loopback with the software encoder: idle 35 s identical masked and sorted (8 lines); withsillclient.py PORT 8 desktopidentical (23 lines; a first pair differed only in which counters three stats lines listed,cursor.shapeamong them, as base against base).SillMenuBar --synthetic(its defaults domain deleted before and after): no key → "Virtual display: private CGVirtualDisplay API present…" and "✓ Virtual Display" in the menu;-SillSetAfter '2 virtualDisplay=0'→ one "Settings: virtual display on → off" and the key saved as 0; a relaunch → off;-virtualDisplay 1→ on for that run, the key still 0. Main's binary with no key: off.-SillRenderPreviews) from main's and this bare binary at one path: 146 files each, and onlymenu.txt(the update-available sample's ✓ Virtual Display and ✓ Send Audio (Beta)),pane-virtualDisplay-light.png,pane-virtualDisplay-dark.png,pane-streaming-light.pngandpane-streaming-dark.pngdiffer, each pane only in its switch.-SillConnectCasecases at 466×678 and 951×669 against main's Debug build. This build withliststored against main with nothing stored: 58 of 58 pixel for pixel. This build with nothing stored against main withtilesstored: 43 of 58; the other 15 are the switch beside the title, now absent with no saved Mac listed (denied, hint, looking, methods, nearby, notice, update at both sizes), and the pairing case's spinner, which differs from itself between takes._silltest._tcpso the screen has a row: a fresh install shows tiles;-SillStyleToggleAt 5(the switch's own action) storeslist; a relaunch shows the list; toggled back it storestiles; a relaunch shows tiles. The key was read from the app's container plist (xcrun simctl spawn … defaults read <container>/Library/Preferences/me.saffer.sill.plist): the domain read by name is somewhere else.SillHost --virtual-display-selftest 60 800x830, run once while this Mac had been idle 601 s and no device was connected to Sill.app: up at the requested mode in 446 ms, 1600×1660 px (@2×), a 30-point menu bar, gone 158 ms later (its HID move reset the Mac's idle time).What Noah tests
Send Audio on a Mac that never set the key (another Mac or user account, or
defaults delete me.saffer.sill.mac sendAudiowith Sill quit; this Mac has it saved on by hand already): the menu shows ✓ Send Audio (Beta) and a connected device hears the Mac's sound at once; a device beside the Mac doubles every sound a moment late until its Mute is on.The iPad, a fresh install (delete Sill first): the connect screen shows tiles, with the switch beside "Connect to a Mac" there from the start; switch to the list, quit Sill from the app switcher and reopen it: still the list. Switch back to tiles and reopen: tiles. An install that had chosen the list keeps the list.
A Mac that never set the key: your own Mac has
virtualDisplaysaved as 0 (read today), so it stays off there, as it should. To see the new default: another Mac or user account, or quit Sill and rundefaults delete me.saffer.sill.mac virtualDisplay. Then the menu shows ✓ Virtual Display, and a window picked on the device moves onto the virtual display (Sill.log: "Virtual display … @2× id …: created", "Moved …", "Capturing … of virtual display") and comes back where it was on Disconnect. Turn it off from the menu and relaunch: still off.The iPhone held upright with the virtual display on: the first window picked makes "Virtual display 800×830 pt @2×" with no "online but not at" line before it, and the window's text is crisp.
🤖 Generated with Claude Code