Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,63 @@ The release workflow publishes the section that matches the tag as the
GitHub release notes, so each version gets a heading of the form
`## X.Y.Z (date)`.

## Unreleased

- The window is redesigned around one design system, in the product
site's black, white and hairlines, set in Geist and Geist Mono. Colour
now means something: green for ready, amber for needs attention, red
for broken, and the logo's violet only for keyboard focus and
progress. Every text colour meets WCAG AA on every surface it sits on;
the old footer and captions did not.
- Tabs across the top: **Machines**, **Sharing** and **Settings**
(Command-1, 2 and Command-comma on a Mac; Ctrl elsewhere; Escape goes
back). The Sharing tab is new in the unified app: this machine's setup,
what it reports (Tailscale, streaming engine, network, Wake-on-LAN,
controllers), the devices paired with it, its options and its log.
Until now the unified window showed only a one-line summary and a
setup button; paired devices, the log and Stop service were
unreachable.
- The machine list shows each machine's state as a dot and one line,
with **Connect** (or **Wake and connect**) and a menu for Wake, Test
wake, Sleep, Restart, Shut down and Copy Tailscale address. Buttons
stay put and dim while a connection is in progress instead of
disappearing. This machine leads the list and opens its Sharing tab.
- Connecting says what is happening and what to expect; pairing shows
the PIN in boxes. A failure is titled "Couldn't connect to …" or
"… disconnected", with **Try again**, and a lighter profile is offered
only when the stream itself failed. The empty list, "looking",
Tailscale missing and Tailscale stopped each say what to do.
- Settings is grouped (Stream, Window and input, Power, Updates, Relay,
About) and the quality profile is one control: Recommended, Smooth,
Balanced, Sharp or Custom. Mouse capture is now a setting as well as a
toolbar choice. "Command acts as Ctrl" shows only on a Mac, and "Keep
this PC awake" only on Windows, where it does something.
- In a stream, the toolbar's menus look and behave the same, open
towards the window's middle, and fold into one **More** menu on narrow
windows. The host key is shown as keycaps (control option on a Mac,
Ctrl Alt elsewhere) when a stream starts and on the toolbar. The
connecting screen has a **Cancel** button, so leaving no longer needs
the host key. Stream settings and Stream performance are proper
panels with a close button; Escape closes Stream settings.
- Every menu, dropdown and panel fits the window down to its smallest
size (640×420). A menu opens upwards when there is more room above,
and scrolls, with its scroll bar showing, when neither side has room
for all of it; at the smallest size the stream toolbar's More menu cut
off "Command acts as Ctrl" and the PC's power items. Stream settings
and Stream performance stay below the toolbar, and Tab scrolls the
control it reaches into view.
- A notice's actions line up with its text: "Dismiss" sat 12 points to
the right of the words above it.
- A relayed path is amber, not red: it works, and Connection details
says how to get a direct one.
- The idle window no longer repaints on a timer (it redrew 2.5 times a
second forever), and the Tailscale check that could start a process
every two seconds on the UI thread now runs on its own thread.
Unpairing and installing the controller driver no longer block the
window.
- The app is about 470 KB smaller (11.7 MB for the macOS release
binary): Geist's five cuts replace Inter's three.

## 4.0.2 (2026-09-22)

- `panel.log` and `service.log` no longer grow without end. Both were
Expand Down
13 changes: 12 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,18 @@ keep their meaning.
cargo test -p brolink-client -p brolink-host snapshots -- --ignored
```

renders every screen to `target/ui-snapshots/*.png`.
renders every screen to `target/ui-snapshots/*.png`: each state of the
machine list, Settings, the Sharing page and the stream overlay at the
minimum window (640×420), a typical one (1280×800) and a large one
(1920×1200), at 1× and 2× (`client-lobby-1280x800@2x.png`); `*-full.png`
show whole scrolling pages. The window is built headless with default
settings, so nothing reads or writes your real configuration. The same
states run unignored, checking that nothing runs past the window and no
two controls overlap, at the minimum and the large size.

Every colour, size and distance comes from `crates/ui/src/theme.rs`, and
every control from `crates/ui/src/widgets.rs`; a screen that needs
something new adds it there, with accesskit info and a focus ring.

## Tests against a real Sunshine

Expand Down
8 changes: 6 additions & 2 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,9 @@ Used when present, never redistributed:

Fonts:

Inter, SIL Open Font License 1.1, Rasmus Andersson and the Inter Project
Authors. crates/ui/assets/LICENSE-Inter.txt https://github.com/rsms/inter
Geist and Geist Mono, SIL Open Font License 1.1, The Geist Project
Authors (Vercel). Regular, Medium and SemiBold of Geist and Regular
and Medium of Geist Mono, unmodified, v1.7.2.
crates/ui/assets/LICENSE-Geist.txt https://github.com/vercel/geist-font
egui's fallback fonts: Hack (MIT), Ubuntu Light (Ubuntu Font Licence),
Noto Emoji (OFL 1.1) and emoji-icon-font (MIT), through epaint.
23 changes: 12 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,17 @@ machine answers only peers signed in to the same Tailscale account.

## How a session goes

1. Open BroLink. Every machine on your Tailscale account is listed with
what it can do right now. **Share this machine** sets up the streaming
engine so others can Connect here.
1. Open BroLink. **Machines** lists every machine on your Tailscale
account, with a dot and a line for what it can do right now. The
**Sharing** tab sets up the streaming engine so others can Connect here.
2. Click **Connect**. If a Windows PC is asleep, BroLink wakes it and waits.
The first time, it pairs by itself: the PIN goes to BroLink on that
machine over Tailscale, which enters it for you.
3. The desktop appears, full screen by default, and nothing else: the
mouse is captured the moment you click the picture, as in a game, so
games that read raw mouse movement work. **Ctrl+Alt** is the host key,
as in a hypervisor: it frees the mouse and drops a toolbar over the
games that read raw mouse movement work. **Ctrl+Alt** (Control-Option
on a Mac) is the host key, as in a hypervisor: it frees the mouse and
drops a toolbar over the
picture with the stream details, whether the path is direct or relayed,
the mouse mode, a **Keys** menu for Ctrl+Alt+Del and friends and what the
Command key does, stats, full screen, the PC's power menu, **Stream
Expand All @@ -46,7 +47,7 @@ machine answers only peers signed in to the same Tailscale account.
[latest release](https://github.com/MrBeldum/brolink/releases/latest)
and unzip it. Run `brolink-host.exe`, or `install-host.ps1` for
shortcuts and start-at-logon.
3. Click **Share this machine**. One administrator prompt installs the bundled
3. On the **Sharing** tab, click **Set up as administrator**. One administrator prompt installs the bundled
streaming engine as a Windows service (if none is installed), gives
BroLink a login to it, opens the control port to your tailnet only,
turns Fast Startup off and arms the network card for Wake-on-LAN.
Expand Down Expand Up @@ -76,8 +77,8 @@ open BroLink.app
```

The `xattr` step is needed for a browser download because the app is
ad-hoc signed rather than Developer-ID signed. Open BroLink and click
**Share this machine** so a Windows PC (or another Mac) can Connect here;
ad-hoc signed rather than Developer-ID signed. Open BroLink and set up
sharing on the **Sharing** tab so a Windows PC (or another Mac) can Connect here;
macOS will ask for Screen Recording the first time. Details, including the
toolbar and keyboard behaviour, in [docs/MACOS.md](docs/MACOS.md).

Expand Down Expand Up @@ -106,7 +107,7 @@ from the Mac to every PC whose host reports an older version, over the same
Tailscale-authenticated control API that can put the PC to sleep; the host
verifies the digest, replaces its executable and restarts. That path
updates only `brolink-host.exe`. The Windows zip on GitHub also contains
the pinned engine archive for first-time **Set up this PC**; a host update
the pinned engine archive for first-time setup; a host update
does not install or migrate the engine. A PC that is asleep gets the host
update the next time the Mac sees it. Nothing is downloaded on the PC, and
no GitHub login is needed there.
Expand Down Expand Up @@ -145,8 +146,8 @@ and to the PC's public address.
| Same network as the PC | works | works if the board's firmware allows wake from power off |
| Elsewhere | needs the PC's router to forward UDP 9 to the PC, or a Tailscale subnet router on that network | same, and the firmware condition |

**Test wake** in the PC menu on the Mac settles it for the network you are
on: it sends the packet while the PC is awake and asks BroLink Host whether
**Test waking it from this network** in a machine's **…** menu settles it for the network you are
on: it sends the packet while the PC is awake and asks BroLink there whether
it arrived. Setup on the PC takes care of Windows' side (Fast Startup off,
the adapter's wake keywords, wake allowed in power management). Wired
Ethernet is strongly preferred; most Wi-Fi adapters cannot wake a PC.
Expand Down
Loading
Loading