diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0d0b561..f703437 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,17 @@ jobs: - name: Derive version id: version run: echo "value=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" + # The homepage draws the panel footer, version string included, and it + # sat on 1.8.0 through two releases because nothing checked. Fail here + # rather than publish a site that misreports what is current. + - name: Homepage states this version + run: | + want="${GITHUB_REF_NAME#v}" + if ! grep -q "Perch $want — up to date" docs/index.html; then + echo "docs/index.html does not mention $want:" >&2 + grep -o 'Perch [0-9][^<]*— up to date' docs/index.html | sort -u >&2 + exit 1 + fi # Imported before the build so Scripts/build-app.sh finds the identity # in the keychain and signs with it instead of falling back to ad-hoc. # A stable identity is what stops macOS dropping the Accessibility grant diff --git a/docs/index.html b/docs/index.html index 0052d74..1490057 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,7 +4,7 @@ Perch — a dozen Mac utilities in one place - + @@ -230,7 +230,7 @@ .live-tabs { display: flex; gap: 2px; padding: 9px 9px 4px; } .live-tab { flex: 1; text-align: center; padding: 5px 0; border-radius: 7px; - font-size: 10.5px; font-weight: 600; color: var(--muted); + font-size: 9.5px; font-weight: 600; color: var(--muted); transition: background .3s ease, color .3s ease; } .live-tab.on { background: var(--mtint); color: #fff; } @@ -278,6 +278,27 @@ font-size: 10.5px; color: var(--muted); width: 54px; text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } + /* Value rows (GPU, disk), interface columns (network) and the audible list + (sound). Only CPU and memory rank things with bars, so only they get one. */ + .live-row .val { + font-size: 10.5px; color: var(--muted); margin-left: auto; + font-variant-numeric: tabular-nums; white-space: nowrap; + } + .live-row .val.good { color: var(--free-fg); } + .live-row .col { + font-size: 9.5px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + color: var(--muted); width: 54px; text-align: right; + font-variant-numeric: tabular-nums; flex: none; + } + .live-row .col.up { color: var(--faint); } + .live-row .dot { color: var(--mtint); font-size: 9px; flex: none; } + .live-colhead { justify-content: flex-end; font-size: 8.5px; color: var(--faint); } + .live-colhead span { width: 54px; text-align: right; } + /* Volume is a setting, not a measurement, so the Sound tab has no trace — + the same reason the app leaves the graph off that tab. */ + .live.no-spark .live-spark { display: none; } + .live.no-spark .live-gauge { padding-bottom: 11px; } + .live-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } @media (max-width: 900px) { .live { width: 100%; max-width: 320px; } } @@ -364,6 +385,38 @@ position: absolute; top: 50%; width: 11px; height: 11px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.35); transform: translate(-50%,-50%); } + /* The brightness slider is the one control on the page that acts on the page. + Widened hit area: a 3px track is honest to the app but hopeless to grab. */ + #brightSlider { cursor: grab; touch-action: none; } + #brightSlider::before { content: ''; position: absolute; inset: -9px 0; } + #brightSlider.drag { cursor: grabbing; } + #brightSlider:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; border-radius: 2px; } + + /* Perch dims a non-built-in display with a black overlay window pinned above + everything, click-through, never past 0.85 so the slider stays findable + (Brightness.swift). This is the same trick, scoped to the page. */ + #dimmer { + position: fixed; inset: 0; z-index: 9999; pointer-events: none; + background: #000; opacity: 0; + } + /* Night Mode shifts the gamma ramps warm. Multiply against an amber pane is + the closest a web page gets: it pulls the blues down instead of laying a + haze over everything, which is what a plain translucent overlay does. */ + #warmer, #warmLift { + position: fixed; inset: 0; pointer-events: none; opacity: 0; + transition: opacity .45s ease; + } + /* Multiply pulls the blues out of everything light. On its own that is all a + warm overlay can do — against a near-black background it multiplies to + near-black, so a dark page would not shift at all. */ + #warmer { z-index: 9998; background: #ff9526; mix-blend-mode: multiply; } + /* So the shadows get the other half of a gamma shift: screen lifts red and + green where there is nothing to take blue away from. Together the two read + as one warm ramp in either theme. */ + #warmLift { z-index: 9997; background: #2b1600; mix-blend-mode: screen; } + @media (prefers-reduced-motion: reduce) { + #warmer, #warmLift { transition: none; } + } /* ---------- layout tiles ---------- The app draws a 26pt tile glyph for each window action, then a divider and @@ -567,6 +620,10 @@ + + + +

A dozen Mac utilities. Meet Perch.

macOS 14+ Apple silicon & Intel No telemetry - 4 MB + 2.5 MB download

@@ -725,18 +783,20 @@

Put windows where you want them

- - 100 + + 100
Night Mode - +
- Perch 1.8.0 — up to date + Perch 1.9.1 — up to date Check
@@ -749,9 +809,11 @@

Put windows where you want them

02 — SYSTEM

Know what your Mac is doing

Click CPU and you get per-core load and the processes driving it, - helpers grouped under the app that owns them. Click GPU, memory, disk or - network and you get the same treatment for each. End a runaway process - without opening Activity Monitor, and pin any figure next to the clock.

+ helpers grouped under the app that owns them. GPU, memory, disk, network + and sound each get the treatment that suits them — a ranked list where + ranking means something, plain figures where it does not. End a runaway + process without opening Activity Monitor, and pin any figure next to the + clock.

⌃⌥Space
@@ -782,11 +844,11 @@

Know what your Mac is doing

stroke-linejoin="round" vector-effect="non-scaling-stroke"/>
-

PER CORE

+

BY CPU

- Perch 1.8.0 — up to date + Perch 1.9.1 — up to date Check
@@ -828,7 +890,7 @@

The small stuff, one click away

- Perch 1.8.0 — up to date + Perch 1.9.1 — up to date Check
@@ -848,7 +910,7 @@

Everything in the box

Custom layoutsFive presets that tile your frontmost windows at once.
Alt-Tab switcherLive window previews, type to filter, close or quit inline.
Clipboard historySearchable, pinnable, with image previews and source apps.
-
System monitoringCPU, memory, disk, network, battery health, thermals.
+
System monitoringCPU, GPU, memory, disk, network, battery health, thermals.
Disk cleaningSixteen cache targets plus your own. Always to the Trash.
Screen cleaningFlat colours that double as a dead-pixel test.
Keyboard cleaningInput locked on a countdown so you can wipe the keys.
@@ -857,6 +919,7 @@

Everything in the box

Updates install themselvesPerch replaces itself and restarts. The new build must be signed by the same key as the running one, or it is refused before anything moves.
Night mode6500K to 2400K via display gamma. Manual or scheduled.
BrightnessPer display, including external monitors over any cable.
+
SoundOutput level and mute, switch between outputs, and see which apps are actually making noise. No per-app sliders: macOS exposes no volume on a process, and the only way round it is shipping an audio driver.
Keep awakeHold it open, or for 15 minutes to 8 hours with the time left on the row. It can start itself while plugged in, while an app runs, or while the CPU is busy, and let the display sleep while the machine works.
@@ -982,7 +1045,7 @@

Press ⌃⌥Space

Needs Swift 6 and the macOS SDK. Command Line Tools are enough — full Xcode is not required.

git clone https://github.com/ishanmalu/Perch.git
-cd perch
+cd Perch
 Scripts/install.sh

Builds, runs the self-test, installs to /Applications and launches it. @@ -999,7 +1062,7 @@

Privacy

Keystrokes are counted, never recordedThe cleaning modes discard every event they swallow. Key codes are never stored or logged.
Clipboard history stays localOwner-only permissions. Password managers and credential-shaped strings are skipped.
-
Two network features, both manualThe update check talks to GitHub. The speed test fetches a block of bytes from Cloudflare when you press Run. Nothing else opens a socket.
+
Every network call is one you asked forChecking for an update, and downloading it, talk to GitHub. The speed test fetches a block of bytes from Cloudflare when you press Run. Nothing else opens a socket.
Disk cleaning cannot go rogueA path guard rejects system and home directories. Removal is always to the Trash.
Accessibility reads geometry, not contentWindow positions, sizes, titles and app names. Never what is inside a window.
Window previews are optionalCaptured only while the switcher is open, held in memory, never written to disk.
@@ -1009,7 +1072,8 @@

Privacy

Every release ships a checksum, and you can run the built-in checks yourself with Perch --selftest.

- +
+