Commit graph

99 commits

Author SHA1 Message Date
c6f2e7c46d whisrs: emit dictation as one batch instead of streaming
Streaming typed every phrase as soon as a 250ms pause came along,
which made long dictations trickle in slowly and double-emitted the
last phrase (once as the phrase, once in the final flush — the source
of the phantom "Thank you."). With phrase_silence_ms at 5s, phrases
only flush at the very end, so the whole text lands in one piece
about 0.1s after the key is released. The 20s force-split still
emits during very long continuous speech, so nothing is lost there.
2026-09-18 06:54:48 +09:00
85c22a3938 hypr: switch rutherford dictation from AltGr to bare Pause
AltGr is itself a modifier, and holding it broke dictation twice:
Hyprland drops long-hold release events for modifier keys, so the
daemon kept recording after the key went up, and the first phrase
injected while the modifier was held never reached the target TUI.
Bare Pause (Fn+F12 on the TypeMatrix) holds no modifier, so neither
applies. The cheatsheet drops the AltGr mention again.
2026-09-18 06:50:16 +09:00
6723c9a59e whisrs: stream phrases sooner and type slower for TUIs
Streaming dictation only emits a phrase after phrase_silence_ms of
silence; the 400ms default stalled long continuous speech until the
20s force-split, which read as "the text cuts off". 250ms emits at
short breathing pauses instead.

key_delay_ms was the 2ms default, which drops characters in busy
Node/Ink TUIs like the pi chat while they are streaming output;
10ms keeps dictation readable there.
2026-09-18 06:50:09 +09:00
c3465a4a9d docs: rutherford dictates on the RTX 3060 via cuda
The README described the vulkan iGPU rebuild as the only variant.
rutherford decodes on its RTX 3060 through the cuda cargo feature, and
build.sh now takes the feature as its argument, so document both.
2026-09-18 06:17:36 +09:00
47b958ecfe whisrs: raise the silence auto-stop timeout to 6s
The default 2s auto-stop ended dictations whenever a thinking pause ran
a little long while the key was still held. 6s keeps room to think
while still bounding a lost-release recording (the guards make missed
releases rare, so the longer bound costs little).
2026-09-18 06:17:36 +09:00
76f1ece0ad hypr: add AltGr hold-to-talk dictation on rutherford
The desktop's TypeMatrix has no Copilot key, so bind the guarded
hold-start/stop scripts to bare right Alt: Alt_R is the keysym that
keycode 108 produces under us,dvorak (the Lua bind helper rejects
code:NNN). The release bind carries the ALT modifier because Alt_R is
itself Mod1 and still active while its release is processed — a
modmask-0 release bind never matches, which left the daemon stuck
recording. The se group remaps right Alt to ISO_Level3_Shift and is
left alone on purpose so AltGr combos keep working there.
2026-09-18 05:45:48 +09:00
06de4dcb8a hypr: make the per-host config lookup case-insensitive
The hosts files were written capitalized (Rutherford.lua, Chester.lua)
but the require uses the hostname exactly as `hostname` prints it —
lowercase — so on a case-sensitive filesystem the lookup missed and
pcall silently swallowed it. The per-host monitor overrides therefore
never loaded on either machine. Normalize the hostname to lowercase
and name the files in lowercase so any casing matches.
2026-09-18 05:45:44 +09:00
f522222836 fcitx5: Commit config normalized to defaults
fcitx5 rewrote these files, commenting out every key set to its
default value (empty Layout in profile, Dubeolsik keyboard and
default keybindings in hangul.conf). Nothing behavioral changes, so
commit the normalized form rather than fight it on every rewrite.
2026-09-18 05:01:27 +09:00
Jeena
b49fd02a55 hypr: add Pause as the alternate dictation key
The SUPER+SHIFT+F23 combo exists on the laptop's Copilot key only. On
other keyboards (TypeMatrix 2030 with Dvorak, laptops without a Copilot
key) there is no F23, so bind the same state-guarded scripts to
SUPER+SHIFT+Pause as well: Pause is Fn+F12 on the TypeMatrix and a
spare key elsewhere. Binds stay modifier-gated so bare Pause keeps its
existing use.
2026-09-15 09:13:47 +09:00
Jeena
41c9ef4609 docs: refer to the dictation key by its combo, not Copilot key
The Copilot key only exists on one laptop; the binding is the
SUPER+SHIFT+F23 combo, which any keyboard can send. Name the combo and
mention the Copilot key only as the thing that emits it.
2026-09-15 09:11:39 +09:00
Jeena
3bc4156668 docs: keep whisrs dependency entries distro-neutral
The rest of the list does not assume a distro, so the AUR mention and
the Arch package names for the Vulkan driver should not either. State
what is needed and give the Arch names as a parenthetical.
2026-09-15 09:09:59 +09:00
Jeena
f35c745580 docs: fold voice dictation notes into the dependency list
No other feature gets its own README section; the install doc is a
dependency list and keybindings live in the cheatsheet. The detailed
setup notes live in the knowledge base, so the README only keeps the
short parentheticals a fresh install actually needs.
2026-09-15 09:09:09 +09:00
Jeena
01e13bb27c hypr: track whisrs config and symlink it like the other dotfiles
Keep the dictation daemon config versioned with the rest of the setup.
The file carries no secrets (local backend), but if a cloud backend with
an API key is ever configured it must not be committed; whisrs accepts
WHISRS_GROQ_API_KEY-style env vars instead.
2026-09-15 08:48:41 +09:00
Jeena
6cac8ce12e docs: point whisrs rebuild note at whisrs-local-build script
Manual re-application of the PKGBUILD edits is easy to forget after an
AUR update, which would silently bring back the five-second stock
build. The tracked rebuild script in ~/Projects/whisrs-local-build
does pull, patch, build, install and restart in one command.
2026-09-15 08:39:21 +09:00
Jeena
7102e59dc5 hypr: guard whisrs hold-to-talk binds with daemon state
Long holds occasionally dropped the release event in Hyprland, leaving
whisrs recording until its silence auto-stop, and any stray toggle
(key repeat, re-fired press) could invert the state so that pressing
stopped and releasing started. The press and release binds now go
through tiny scripts that check the daemon status first, making the
toggle pair idempotent: start only when idle, stop only when recording.

Also a note-to-self: Hyprland auto-reloads when files under the config
symlink change, so a git rebase in this repo can transiently drop
newly added binds; run hyprctl reload after git operations.
2026-09-15 08:36:08 +09:00
Jeena
0651dd13ef docs: correct whisrs dependencies and describe hold-to-talk
wtype is not actually used by whisrs: injection happens through the
Wayland virtual-keyboard protocol with a uinput fallback, so listing
wtype as a dependency would send fresh installs down the wrong path.
pipewire-alsa on the other hand is essential and was missing: whisrs
captures through raw ALSA, and without the PipeWire bridge the default
PCM is the silent headset-jack mic.

Also document the hold-to-talk binding, the [audio] device setting, and
the local rebuild (-march=native plus the vulkan feature) that moved
decoding to the iGPU, since the stock AUR build is far too slow for
dictation.
2026-09-15 08:32:02 +09:00
Jeena
0b9718cf2c hypr: add hold-to-talk voice dictation via whisrs
Bind the Copilot key (SUPER+SHIFT+F23) to whisrs on press and release,
so holding it records and letting go transcribes. Injection uses wtype,
which works natively on Hyprland and reaches any focused window,
including TUIs running in the dockerized agent containers.

Decoding runs on the iGPU through the Vulkan feature of a locally
rebuilt whisrs-git: the stock AUR build is CPU-only and compiled with
generic -march, which made dictation take around five seconds. Requires
whisrs-git (AUR), wtype and pipewire-alsa; documented in the README
along with the config and model locations.
2026-09-15 08:31:35 +09:00
a7168e8f2b Remove link to DHH Omachy
https://stopomarchy.neocities.org/
2026-09-13 11:48:40 +00:00
4c497ed538 fix(hyprlock): make input field always visible
With fade_on_empty=true, a 0.3-alpha inner_color and placeholder_text=$LAYOUT
(which resolves empty under fcitx5), the empty input field faded to nothing —
only the clock rendered and there was no visible way to type the password.

- fade_on_empty = false
- inner_color alpha 0.3 -> 0.6
- static placeholder 'Enter password' instead of $LAYOUT

Also document the graceful emergency unlock (pkill -USR1 hyprlock) in
lock.sh: SIGTERM/SIGKILL on a running lock latches Hyprland's crashed-
lockscreen state, requiring hl.clear_crashed_lockscreen() to recover.

Clarify in hyprlock.conf that the fingerprint auth block is for Chester and
is a no-op on machines without fprintd (e.g. Rutherford).
2026-08-29 09:34:30 +09:00
f9553329ef fix(hypr): unify special workspace, drop 'magic' name
The Lua conversion had introduced a named 'magic' special workspace on the
SUPER+S keybinding while KeePassXC and the terminal still targeted the default
'special' workspace, splitting them into two separate scratchpads and making
KeePassXC unreachable. Route everything through the single default special
workspace to match the original .conf behavior.
2026-08-27 19:43:36 +09:00
Jeena
997f112baa fix: drop upstream multi-GPU workarounds that don't work on Chester
Restore hypridle.conf to the working Chester baseline (Step 1 dim + simple
step-3 resume) keeping our after_sleep_cmd (sleep 2; dpms on). Remove the
orphaned wake-display.sh / unstick-display.sh scripts added upstream for the
multi-GPU black-screen workaround.
2026-08-24 10:18:08 +09:00
Jeena
d0cfa59fb0 chore(hosts): drop redundant return {} from host lua files
require() only needs the module's side effects; the returned value is
ignored by hyprland.lua. Chester.lua and example.lua now match
Rutherford.lua in ending after their config statements.
2026-08-24 10:15:06 +09:00
Jeena
6365e1d122 refactor(hosts): never load example.lua; make it a pure template
hyprland.lua now just uses its defaults when no hosts/<hostname>.lua
matches, instead of requiring hosts/example.lua. example.lua is kept only
as a documented template for contributors.
2026-08-24 10:15:06 +09:00
Jeena
70807f473a chore: track all hypr/hosts files (remove host gitignore)
Let reusable host configs be versioned regardless of suffix, so others
don't lose history and their own host files get committed.
2026-08-24 10:15:06 +09:00
Jeena
e9f65e1675 chore(hypr): remove legacy .conf configs now that Lua is active
Hyprland loads hyprland.lua (not hyprland.conf) when present, so the
hyprlang configs are dead weight. Delete the Hyprland .conf files and
their gitignored host .conf counterparts, leaving only hypridle.conf and
hyprlock.conf (used by separate tools that still use hyprlang).
2026-08-24 10:15:06 +09:00
Jeena
2e6e19348a fix(hosts): set Chester display scaling to 1.5
Keeps the 2880x1800 internal panel at a comfortable virtual 1920x1200.
2026-08-24 10:11:22 +09:00
Jeena
b4fa650685 feat: convert hypr config to Lua and add Chester host
- Add Lua equivalents for hyprland, autostart, keybindings, programs, windowrule
- Add per-host Lua configs (Chester, Rutherford, example) with hostname detection
- Rename old host 'William' to 'Chester'; fix 2x scaling on the 2880x1800 panel
- Update .gitignore to track *.lua host files instead of example-host.conf
2026-08-24 10:11:22 +09:00
Jeena
00d0cac9e8 fix: black screen on wake from suspend (hypridle)
Enable misc:key_press_enables_dpms / mouse_move_enables_dpms so the
compositor re-enables the display on input when hypridle's after-sleep
dpms-on races with GPU resume. Also delay after_sleep_cmd dpms-on by 2s.

Fixes black Hyprland VT after wake while kernel console stays visible.
2026-08-24 10:11:22 +09:00
1384fc68da temp: disable hypridle auto-lock (causes black screen on multi-GPU)
Re-enable once the Aquamarine layer-surface orphan issue or
the dual-GPU buffer fight root cause is resolved in upstream.
2026-08-19 14:37:06 +09:00
7e9bf498ff fix: remove dim step that leaks orphaned layer surfaces
dim creates a wlr-layer-shell surface that Hyprland never cleans up
when the process exits — leaves an opaque full-screen overlay (pid=-1)
covering the entire display until the layer tree is rebuilt.

Removing step 1 (dim) from hypridle prevents future occurrences.
unstick-display.sh now restarts waybar to force a layer tree rebuild
as a recovery measure.
2026-08-19 14:30:09 +09:00
7d2a0100e9 fix: handle multiple Hyprland sockets in recovery/wake scripts
Both scripts used ls | head -1 to find the socket, which picks the wrong
(dead) session when old socket dirs linger. Now iterates over all sockets
and picks the one that actually responds.
2026-08-19 14:24:37 +09:00
4e8a6fad37 chore: update fcitx5 config 2026-08-15 19:22:41 +09:00
24344598e9 fix: prevent black lock screen on dual-GPU system
- AQ_DRM_DEVICES=/dev/dri/card0 forces Aquamarine to use only the
  Intel iGPU, avoiding EGL_BAD_MATCH errors from the NVIDIA RTX 3060
  after VT/DPMS cycles (page-flip lockups, black display)
- lock.sh: guard against duplicate hyprlock instances (second instance
  steals surfaces, leaves screen black)
- lid-close.sh: same guard for laptop
- wake-display.sh: conditional DPMS cycle (only when display is off)
  to restore hyprlock surfaces without flicker
- unstick-display.sh: emergency recovery script for tty3
2026-08-15 19:22:38 +09:00
6199866e4c fix: make portal startup uwsm-aware to stop light-mode race
Logging in via a bare Hyprland session never activates
graphical-session.target, so the systemd xdg-desktop-portal units can't
start. The old script worked around this by killing and relaunching the
portals manually, but that delayed the portal past waybar/chromium
startup, so they intermittently came up in light mode.

Switch to the "Hyprland (uwsm-managed)" session: uwsm activates
graphical-session.target and systemd starts the portals in the right
order. The startup script now detects that target and bows out, falling
back to the manual launch only on a bare session (e.g. another machine
without uwsm). Document uwsm in the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 16:47:44 +09:00
6ece13e84b fix: update config for Hyprland 0.55 breaking changes
Remove dwindle:pseudotile option (removed in 0.55) and switch the
togglesplit keybind to layoutmsg, togglesplit (dispatcher reworked
in 0.54).
2026-05-16 01:15:55 +00:00
Jeena
ebea0fd6ec feat: add mirror-display toggle to launch menu
Adds a "Mirror Display" entry that calls a helper script which finds
the first connected non-internal monitor and toggles mirroring of
eDP-1 onto it via hyprctl. Use case: plugging into a conference room
TV/projector while travelling.

Also fixes the menu's "Screenshot full" entry to capture the active
output instead of the hardcoded DP-1, matching the equivalent fix to
the Ctrl+Print keybind.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 12:44:11 +00:00
Jeena
8ac4023dc1 fix: capture active monitor in screenshot bind instead of hardcoded DP-1
Ctrl+Print was tied to DP-1, so it failed on the laptop alone or with
a different external. Using -m active picks the currently focused
output, so the same bind works on any host.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 12:30:50 +00:00
Jeena
7b99932299 feat: add wob overlay for volume and brightness keys
Move FIFO setup and percentage emission into helper scripts so the
Hyprland config has no raw $VAR references — Hyprland's parser
substitutes $varname at parse time, which mangled awk's $2 and
$HYPRLAND_INSTANCE_SIGNATURE and left binds broken after reload.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 12:03:43 +00:00
Jeena
c351285963 fix: remove hardcoded TypeMatrix keyboard name so language widget works on all hosts 2026-05-09 02:27:37 +00:00
Jeena
1dd6072a8c docs: replace JetBrainsMono Font with ttf-jetbrains-mono-nerd in dependencies 2026-05-09 02:24:19 +00:00
Jeena
80d2b978ee feat: increase touchpad sensitivity to 0.33 2026-05-09 10:42:12 +09:00
dc79f3e687 fcitx5: Set hangul as default input method 2026-05-09 08:49:08 +09:00
Jeena
1e65b6da57 fix: auto-detect battery so waybar hides it on machines without one 2026-05-09 08:36:01 +09:00
Jeena
e7add39b93 feat: enable fingerprint unlock in hyprlock 2026-05-09 08:36:01 +09:00
Jeena
5b81e86c5b feat: add battery widget to waybar 2026-05-09 08:36:01 +09:00
Jeena
11d2d51544 fix: lock screen on lid close without desktop flash on open
- Add lid-close.sh: starts hyprlock in background and immediately cuts
  the display via dpms off, so the display is dark while hyprlock renders
- William.conf: bind lid close to lid-close.sh; bind lid open to kill dim
  and turn display back on
- lock.sh: pass --no-fade-in to hyprlock
- hyprlock.conf: disable fadeOut animation
- hypridle.conf: add inhibit_sleep = 3 and use loginctl lock-session
2026-05-09 08:36:01 +09:00
0f64cf7137 Add korean keyboard with fcitx5 2026-04-30 18:24:31 +09:00
feafe252dc Add systemd timers to auto-mute/unmute when idle-inhibit is active
Mutes audio at 21:00 and unmutes at 07:00, but only when the
idle-inhibit toggle is active (PID file exists). This is useful
for leaving the computer running overnight for SSH access while
keeping it quiet for sleeping.
2026-04-11 14:41:24 +00:00
14a94a4ece feat: auto-mute audio on lock and unmute on unlock 2026-04-11 06:54:59 +00:00
6bab9ea200 kitty: Fix OpenCode middle mouse to paste 2026-03-19 14:14:25 +09:00