Skip to content

chore: release v0.1.21 - #128

Merged
whackur merged 19 commits into
mainfrom
dev
Oct 31, 2026
Merged

whackur merged 19 commits into
mainfrom
dev

Conversation

@whackur

@whackur whackur commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Promote the tested development branch to main for patch release v0.1.21.

Release contents:

The preparation PR passed Windows, Linux, macOS, package policy, Rustfmt, and viewer unit/visual checks. Merge this promotion with a merge commit only after its own CI and the development merge CI pass. Official-main CI and the release workflow must pass before the release is reported complete; the workflow publishes the four platform binaries and SHA256SUMS.

whackur and others added 19 commits October 28, 2026 15:01
chore: synchronize main into dev after v0.1.20
The viewer's scripts run TypeScript directly, which older Node.js
releases reject, and CI uses Node.js 26. Pinning it lets nvm select the
same version locally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
`nightcrow notify [MESSAGE]`, run inside a pane, sends the pane's
NIGHTCROW_PANE_TOKEN to the daemon as a one-shot request. The daemon asks
each repository's hub which live pane holds the token; that hub broadcasts
an `attention` frame, which now carries an optional message.

Hubs also publish these to a session-wide `Notices` registry, for listeners
not attached to the repository (Web Push, next). Entering a plugin's
`needs_attention` recovery state is published the same way, once per entry.

The web viewer decodes `attention` and shows the message as a toast. The
TUI keeps its project-tab marker and ignores the message.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
`web::viewer::push` listens to the session's `Notices` and sends each as a
Web Push message to every subscribed browser. One background thread
encrypts to the browser's key (RFC 8291 aes128gcm, checked against the
RFC's worked example), signs a VAPID token (RFC 8292 ES256) and posts over
https with ureq. Notices for one pane are coalesced for 10 seconds, and a
404/410 answer drops the subscription.

The key and subscriptions live owner-only in ~/.nightcrow/push. New
authenticated routes: GET /api/push/key and POST /api/push/{subscribe,
unsubscribe,status,test}. An endpoint must be https on a public host name;
there is no push-service allowlist, since anyone able to subscribe can
already run shell commands here.

Adds p256, hkdf, aes-gcm and base64.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
A loopback-bound viewer refuses any Host that is not a loopback name, to
stop DNS rebinding. A local HTTPS proxy such as `tailscale serve` forwards
the browser's host name (machine.tailnet.ts.net), so it was refused too,
leaving off-loopback binding as the only way to put HTTPS in front.

`[web_viewer] allowed_hosts` lists names the loopback check also accepts,
matched without the port and ignoring case. A listed name stays safe from
rebinding because the operator controls what it resolves to.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
scripts/visual/Dockerfile copies nothing from the checkout, which is
bind-mounted at run time, but `docker build .` still uploaded the whole
tree, including a multi-gigabyte target/. Ignore everything.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
A service worker (public/sw.js) shows each push and, when tapped, opens the
viewer with `notice-repo`/`notice-pane` in the address. The page applies
that once at startup: it remembers the pane as the project's last one and
puts the project in front before its first poll, so the usual attach
focus selects it. The worker caches nothing and answers no fetch.

The settings menu gains a Notifications section: a per-browser switch, a
test button, and the reason when push cannot be offered (not a secure
page, iOS outside a Home Screen app, permission blocked, no browser
support, or no daemon key). Permission is asked only from that switch. A
subscription the daemon has dropped is dropped in the browser on the next
read, so the switch does not claim "on" falsely.

docs/notifications.md covers enabling it, `tailscale serve` with
`allowed_hosts`, iOS, and why notifications may not arrive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
feat: notify a person when a terminal finishes, including Web Push
The splash predated the terminal row, the phone view switcher and the
mark-only phone header, so the first paint changed shape when the app
arrived. It now shows the header as Brand/Header draw it, list and
content over the terminal on wide screens, and the bottom switcher on a
phone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
fix(viewer): draw the loading splash in today's shell outline
Describes a pull-based setup that needs no code: startup commands open an
orchestrator and workers, nightcrow-memory notes carry tasks and results,
and nightcrow notify reports back. Explains why pushing input into other
panes is outside the plugin host's trust boundary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
…'s style

Icon buttons in the header and on project tabs were a different size and
lit a background on hover, unlike the terminal toolbar. They now share its
24px square and colour-only hover; a tab's close button keeps its red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
fix(viewer): give header and project-tab buttons the terminal toolbar's style
Settings, sign-out and tab-close icons were pinned to 14px, so they looked
smaller than the terminal toolbar's icons in the same 24px buttons. They
now use the icons' default size. The `open` button's plus stays at 14px,
sized to its text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9Y6nr4J3kMp6GVQNUd9Ry
fix(viewer): draw header and tab icons at the terminal toolbar's 16px
Preserve functional commits and prepare patch release v0.1.21 after all required CI checks passed.
@whackur
whackur merged commit 80cab7c into main Oct 31, 2026
12 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.

2 participants