feat(voxtype,garble,polybar): add voxtype and garble

Amolith created

Add voxtype configuration for text-to-speech integration with polybar
and
standalone usage. Configure garble for Go code obfuscation. Update
polybar
to include voxtype status indicator and control scripts.

New configuration files:
- dot_config/voxtype/config.toml
- dot_config/garble/config.toml
- dot_config/polybar/executable_voxtype-polybar.sh

Modified:
- dot_config/polybar/config.ini.tmpl (add voxtype module)

Assisted-by: Kimi K2 Thinking via Crush <crush@charm.land>

Change summary

dot_config/garble/config.toml                    | 21 ++++++
dot_config/polybar/config.ini.tmpl               | 14 ++++
dot_config/polybar/executable_voxtype-polybar.sh | 56 ++++++++++++++++++
dot_config/voxtype/config.toml                   | 32 ++++++++++
4 files changed, 122 insertions(+), 1 deletion(-)

Detailed changes

dot_config/garble/config.toml 🔗

@@ -0,0 +1,21 @@
+provider = "synthetic"
+model = "hf:deepseek-ai/DeepSeek-V3.2"
+directions = """
+Correct the following Whisper transcription to match how I would actually type, after edits and corrections.
+
+- Follow inline dictation instructions, example follows in the section below
+- Remove filler words like "um", "uh", "like", "you know", "so" (when meaningless)
+- Correct words from the transcription engine when the context makes obvious what the word should be, example follows in the section below
+- Remove false starts and repeated words
+- Preserve my intended meaning without rephrasing or "improving" my words
+- No markdown, no formatting, just clean plain text
+
+<dictation_interpretation_example>
+<in>
+This is. An example of speaks, an audio compression codec. Specifically tuned for reproducing. Specifically tuned for the reproduction of the human voice. No, human speech.
+</in>
+<out>
+This is an example of SPEEX, an audio compression codec specifically tuned for the reproduction of human speech.
+</out>
+</dictation_interpretation_example>
+"""

dot_config/polybar/config.ini.tmpl 🔗

@@ -30,7 +30,7 @@ font-1 = "JetBrainsMono NF:style=Regular:size=12;2"
 modules-left = i3
 modules-center = xwindow
 {{- if ne .chezmoi.hostname "glade" }}
-modules-right = updates caffeine notifications mic pulseaudio cpu memory date time {{ if eq .chezmoi.hostname "sidhe" }}battery{{ end }}
+modules-right = updates voxtype caffeine notifications mic pulseaudio cpu memory date time {{ if eq .chezmoi.hostname "sidhe" }}battery{{ end }}
 {{- else }}
 modules-right = wlan pulseaudio cpu memory date battery
 {{- end }}
@@ -228,6 +228,18 @@ format-prefix = "󱄋 "
 margin-top = 5
 margin-bottom = 5
 
+[module/voxtype]
+type = custom/script
+exec = ~/.config/polybar/voxtype-polybar.sh
+click-left = ~/.config/polybar/voxtype-polybar.sh toggle
+interval = 1
+format = <label>
+label = %output%
+
+env-color_foreground = ${colors.foreground}
+env-color_primary = ${colors.primary}
+env-color_secondary = ${colors.secondary}
+
 [module/caffeine]
 type = custom/script
 trail = false

dot_config/polybar/executable_voxtype-polybar.sh 🔗

@@ -0,0 +1,56 @@
+#!/bin/bash
+# Wrapper for voxtype status to output polybar-friendly format
+#
+# Usage:
+#   voxtype-polybar.sh         - output status for polybar
+#   voxtype-polybar.sh toggle  - launch if stopped, toggle recording if running
+#
+# Environment variables (set in polybar module):
+#   color_foreground - default text color
+#   color_primary    - accent/alert color (used for recording)
+#   color_secondary  - secondary accent (used for transcribing)
+
+output=$(voxtype status --format json 2>/dev/null)
+
+if [[ -z "$output" ]]; then
+	echo ""
+	exit 0
+fi
+
+alt=$(echo "$output" | jq -r '.alt // "idle"')
+
+# Handle toggle action
+if [[ "$1" == "toggle" ]]; then
+	if [[ "$alt" == "stopped" ]]; then
+		setsid fish -c "opx voxtype" >/dev/null 2>&1 &
+	else
+		voxtype record toggle
+	fi
+	exit 0
+fi
+
+# Use env vars if set, otherwise fall back to reasonable defaults
+fg="${color_foreground:-#cdd6f4}"
+recording="${color_primary:-#f38ba8}"
+transcribing="${color_secondary:-#f9e2af}"
+
+case "$alt" in
+stopped)
+	echo ""
+	;;
+idle)
+	echo "󰍬"
+	;;
+recording)
+	echo "%{F${recording}}󰍬%{F-}"
+	;;
+transcribing)
+	echo "%{F${transcribing}}󰼍%{F-}"
+	;;
+error)
+	echo "%{F${recording}}îȘ‡%{F-}"
+	;;
+*)
+	echo "󰍬"
+	;;
+esac

dot_config/voxtype/config.toml 🔗

@@ -0,0 +1,32 @@
+state_file = "auto"  # Or custom path, or "disabled" to turn off
+
+[hotkey]
+#enabled = false
+key = "SCROLLLOCK"
+
+[whisper]
+model = "large-v3-turbo"
+language = "en"     # Or "auto" for detection, or language code (es, fr, de, etc.)
+translate = false   # Translate non-English speech to English
+
+[audio]
+device = "default"  # Or specific device from `pactl list sources short`
+sample_rate = 16000
+max_duration_secs = 60
+
+[audio.feedback]
+enabled = true
+theme = "default"  # Built-in themes: default, subtle, mechanical
+volume = 0.7       # 0.0 to 1.0
+
+[output]
+mode = "type"       # "type", "clipboard", or "paste"
+fallback_to_clipboard = true
+type_delay_ms = 0   # Increase if characters are dropped
+
+[output.post_process]
+command = "garble"
+timeout_ms = 30000
+
+[status]
+icon_theme = "nerd-font"