Skip to content

docs: rewrite the README around what it is and what we learned - #66

Merged
nbkdoesntknowcoding merged 2 commits into
mainfrom
docs/readme
Aug 26, 2026
Merged

nbkdoesntknowcoding merged 2 commits into
mainfrom
docs/readme

Conversation

@nbkdoesntknowcoding

Copy link
Copy Markdown
Owner

The old README had drifted from the code in ways that would catch a new user immediately, and was arranged to be read start-to-finish rather than skimmed for the one thing someone came for.

Corrected — wrong, not merely dated

  • Fullscreen is F, not F11 — documented wrong in two places. First thing a new user would try.
  • "50 unit tests" → 201 Swift, 53 Rust, 33 frontend checks.
  • HDCP was described as protected video not playing on the virtual display. It doesn't play on any display while that one exists — a different problem with a different answer. And there's now a Release the screen control for it that the README never mentioned.
  • A dated status banner and a "Phases 0–7" reference that now collides with the latency phases. Both replaced with things that don't go stale.
  • The latency figure was a browser measurement of a path the shipping receiver doesn't take. Replaced with the honest position: per-stage numbers are on the HUD, and nobody has recorded them on real hardware.

Added

Badges, a contents list, a contributing section. Ordinary furniture, all of it missing.

How it compares — Sidecar, Duet, Luna, Deskreen, spacedesk. Written to be useful rather than flattering, including where each of them is the better choice (Sidecar if you own an iPad; spacedesk when Windows is the source; Deskreen for one screen on many devices). Nobody in this category publishes one, and the honest version is more persuasive than a feature grid. The comparison sticks to architecture — extends vs. mirrors, needs a driver, direction — because that's stable and verifiable, rather than pricing that goes stale.

What we measured — the findings, promoted out of footnotes:

  • Chrome's hardware H.264 decoder carries ~69 ms, 22× worse than software decoding the identical stream
  • CGVirtualDisplay silently gets geometries above ~1920×1200 wrong, and reports success
  • Protected playback evaluates the whole output topology, which is why Sidecar has the same bug
  • EnableLowLatencyRateControl is a specification, not a property — setting it afterwards does nothing, silently
  • Network.framework's .idempotent installs no completion handler, so there's no back-pressure signal
  • An idle desktop sends nothing, which breaks anything measuring health in encoded frames — we shipped that mistake twice before catching it

These cost real time to find and are useful to anyone working nearby. They're also the most linkable thing in the repo.

The agent setup prompt survives, collapsed in a <details>, with its keys corrected.

Verification

Every internal anchor and every local file link is checked to resolve — 18 internal links against 28 headings, no breaks. Badge URLs return 200. Copy passes check-user-strings.py.

Still missing

There is no screenshot or recording. For an app whose entire pitch is visual, that's the single biggest remaining gap in this file — and it needs someone with both machines in front of them to produce.

🤖 Generated with Claude Code

nbkdoesntknowcoding and others added 2 commits August 26, 2026 17:36
The old one had drifted from the code in ways that would catch a new user
immediately, and was arranged to be read start to finish rather than
skimmed for the one thing someone came for.

Corrected, because these were wrong rather than merely dated:

* Fullscreen is F, not F11, and had been documented wrong in two places.
* "50 unit tests" is now 201 Swift, 53 Rust and 33 frontend checks.
* HDCP was described as protected video not playing on the virtual
  display. It does not play on ANY display while that one exists, which is
  a different problem with a different answer — and there is now a Release
  the screen control for it, which the README did not mention.
* A dated status banner and a "Phases 0-7" reference that now collides
  with the latency phases; both replaced with things that do not go stale.
* The latency figure was a browser measurement of a path the shipping
  receiver does not take. Replaced with the honest position: per-stage
  numbers are on the HUD and nobody has recorded them on real hardware.

Added:

* Badges, a contents list, and a contributing section. Ordinary
  furniture, all of it missing.
* How it compares — Sidecar, Duet, Luna, Deskreen, spacedesk. Written to
  be useful rather than flattering, including where each of them is the
  better choice. Nobody in this category publishes one, and the honest
  version is more persuasive than a feature grid.
* What we measured — the findings, promoted out of footnotes. Chrome's
  hardware H.264 decoder carrying 22x the latency of software decoding the
  same stream; CGVirtualDisplay silently getting large geometries wrong;
  protected playback evaluating the whole output topology;
  EnableLowLatencyRateControl being a specification rather than a
  property; .idempotent installing no completion handler; an idle desktop
  breaking anything that measures health in encoded frames. These cost
  real time to find and are useful to anyone working nearby.

The agent setup prompt survives, collapsed, with its keys corrected.

Every internal anchor and file link is checked to resolve.

Still missing, and worth saying: there is no screenshot or recording. For
an app whose entire pitch is visual, that is the single biggest remaining
gap in this file, and it needs someone with both machines to produce.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The README had no image at all, which for an app whose whole pitch is
visual was the largest thing missing from it.

This one is genuine rather than a mock-up: a live session on a real Mac,
captured from the receiver's own canvas at 1920x810 as it arrived over
H.264. The macOS menu bar in it is the part that matters — it is the
evidence that macOS is drawing a whole second screen rather than copying
the first, which is the one claim the project rests on and the hardest to
believe from prose.

Nothing in it is anyone's data. The window on that display was put there
for the photograph and says what it is; everything else is wallpaper.

Also splits the connect walkthrough by machine, because the single
five-step list ran the two halves together and the two halves happen in
different places. The Bonjour step now says what to do when mDNS is
blocked, since guest and AP-isolated Wi-Fi routinely block it and that is
the most common way the first connection fails. The one-receiver-at-a-time
message is called out, because it reads as a fault and is a design choice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@nbkdoesntknowcoding
nbkdoesntknowcoding merged commit ef07147 into main Aug 26, 2026
3 checks passed
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.

1 participant