No API key and no separate billing: qs-ask now shells out to `claude -p`,
which draws on the existing subscription already authenticated on this
host. The trade is latency — Claude Code boots a Node process per
question, ~6s measured against the raw API's ~1s — so the launcher now
races Wikipedia and Claude instead of chaining them. Wikipedia fills the
card in under a second and Claude supersedes it on arrival; chaining
would have left the card blank for six seconds on every question.
Isolation, verified: --safe-mode drops CLAUDE.md, skills, hooks, plugins
and MCP while leaving auth working, which matters for correctness and not
just speed — the global CLAUDE.md here asks for caveman-mode replies and
that would have leaked into answers. --no-session-persistence writes no
transcript, and a dedicated empty cwd keeps launcher questions out of any
project's history or auto-memory. Confirmed no project namespace, no
transcript and no memory write after a run.
Not --bare, which looks right and is a trap: its auth is strictly
ANTHROPIC_API_KEY, so it cannot use the subscription at all.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Silence on stdout is the launcher's fall-back-to-Wikipedia signal, so it
has to stay clean — but that made a misconfigured key indistinguishable
from a working fallback. Every reason now prints on stderr, which the
launcher discards and a human running qs-ask by hand can read.
Drops curl -f so a 4xx body's own error message ("API key is invalid.")
surfaces instead of just an exit code, and guards the specific mistake of
pasting the sk-ant-... placeholder literally.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds qs-ask on the mediaserver — the Anthropic key lives there and nowhere
else, so neither desktop holds a credential and there's one place to
rotate it. The launcher pipes the question over the same SSH path the
server monitor already uses; the query goes over stdin because
`ssh host cmd arg` would re-parse arg through the remote shell.
Claude answers first, Wikipedia is the fallback. The script is the
feature gate: with no key it exits silently, which is the same signal as
a failed call or an UNKNOWN reply, so the Wikipedia path stays the
default with zero configuration. The card names whichever answered.
Haiku 4.5, no thinking and no effort (effort errors on Haiku) — a
one-sentence fact needs no reasoning tokens. ~$0.0005 per query.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sixth surface in the SDF chrome shader, melting out of the bottom
frame. Volume is reactive via Pipewire so the OSD also fires for
pavucontrol/mixer changes; brightness routes through a new osd IPC
handler since sysfs backlight only notifies via POLLPRI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Remove unnecessary --impure from update alias, shift
auto-upgrade from 04:15 to 05:15 so it runs after the
Forgejo bot updates flake.lock at 04:00 UTC (05:00 BST).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
systemd.network.links didn't generate files; use udev extraRules
to pin NIC names to MACs. Also disable networking.useDHCP catch-all
that silently misconfigured the LAN NIC when it got a wrong name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delete 8 unused matugen template files, remove the matugen package,
homepage custom.css watcher infrastructure, and the wallpaper shell
function. Update remaining comments to reference stylix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ExecStopPost to write 0 to bcm5974's inhibited sysfs node,
so the touchpad is always restored even if the script is killed
mid-inhibit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The AttrKeyboardIntegration=internal quirk caused libinput's native
DWT to permanently disable the touchpad. Keep the custom script.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tell libinput the Apple keyboard is internal so its built-in
disable-while-typing pairing works despite keyboard and touchpad
sharing the same USB device. Keep the custom DWT script as fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The zen-beta headless warmup was causing system unresponsiveness on
the MacBook's limited hardware. XFCE fallback is unnecessary with
Hyprland's emergency mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hyprland's built-in disable-while-typing doesn't work on this
MacBook because the keyboard and touchpad share the same USB
device, breaking libinput's device pairing. Add a lightweight
Python daemon that watches keyboard events and inhibits the
touchpad via sysfs for 500ms after each keypress.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start Zen headless for 3s at login to prime the page cache and shared
libraries on the slow MacBook Air hardware.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ghostty exits cleanly when the last window closes, so on-failure
never triggers a restart. Switch to Restart=always with a 1s delay
so the headless instance respawns and stays warm.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>