Rebuild dotfiles as one branch with per-host layers

Replaces the previous repo, which had split into two histories that never
met (mainframe on a dead GitLab remote, the laptops on Gitea) with 146
dirty files across three machines and the NAS never enrolled at all.

Branch-per-machine is gone. One main, with host differences expressed as
small files under hosts/<hostname>/ rather than as branches, so there is
nothing to merge. The reconciled zsh layer reduces 15-33 line forks to
1-7 effective lines per host; distro differences (oh-my-zsh prefix,
syntax-highlighting path, fd vs fdfind) are probed in common/ instead.

Fresh history: the old one carried six plaintext credentials, 45 MB of
mail caches, browser caches and vendored binaries. 5,096 tracked files
and 144 MB become 462 files and 2.6 MB. The .gitignore is now an
allowlist, which is what keeps that true.

Root cause of the rot: ~/.local/bin was a symlink to scripts/ with GOPATH
inside it, so every go install wrote into version control (2.2 GB on the
work laptop). PATH now points at the repo instead of the reverse.

Also: Hyprland replaces sway and is sourced in two halves so $browser is
defined before use; singleton automations carry ConditionHost= alongside
host-layer-only placement; ddns moves from cron to a guarded timer;
package manifests and pkg-snapshot/pkg-restore replace the X11-era
install_scripts/; networkmanager-dmenu added to system76 (the binding
always existed, the package never did).
This commit is contained in:
2026-09-14 14:24:37 -04:00
commit e6644d0616
462 changed files with 23524 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
# Allowlist. Everything is ignored unless explicitly named below.
# This is deliberate: the previous repo used a two-line denylist and
# accumulated browser caches, mail caches and vendored binaries.
**/*
!.gitignore
!install
!README.md
!meta/
!meta/**
!common/
!common/**
!hosts/
!hosts/**
!packages/
!packages/**
# dotbot submodule
!.gitmodules
!dotbot
# Re-exclude noise inside the allowed trees.
**/__pycache__/
**/*.pyc
*.pre-*
*.backup
**/hcache/
**/node_modules/
# Never, under any circumstances.
**/credentials
**/.credentials.json
.secrets.zsh
+4
View File
@@ -0,0 +1,4 @@
[submodule "dotbot"]
ignore = dirty
path = dotbot
url = https://github.com/anishathalye/dotbot
+106
View File
@@ -0,0 +1,106 @@
# dotfiles
Everything that makes a machine mine. One branch, four hosts, no per-machine
branches — see *Why not a branch per machine* below.
## Bootstrap a bare machine
```sh
git clone --recurse-submodules <remote> ~/.dotfiles
cd ~/.dotfiles && ./install
cp common/zsh/secrets.zsh.example ~/.secrets.zsh && chmod 600 ~/.secrets.zsh # then fill it in
common/bin/pkg-restore # install the packages
sudo install -m755 hosts/<host>/sbin/* /usr/local/bin/ # if that host has any
```
`install` picks its host layer from `hostname`, lowercased. If there is no
`meta/hosts/<hostname>.conf.yaml` it stops rather than silently applying only
the base config — a half-configured machine that reports success is worse than
a clear failure. For a new machine, copy the closest host config and edit.
## Layout
| Path | What lives here |
|---|---|
| `meta/base.conf.yaml` | links every host gets |
| `meta/hosts/<host>.conf.yaml` | links only that host gets |
| `common/` | host-agnostic config and scripts |
| `hosts/<host>/` | that machine's deltas |
| `hosts/<host>/bin` | scripts only that machine needs; shadows `common/bin` on `PATH` |
| `hosts/<host>/sbin` | scripts needing root at `/usr/local/bin`; **not** installed by `./install` |
| `packages/` | what is installed, per host |
## Where host-specific things go
The rule is that a file is shared unless the machines genuinely disagree, and
when they do the disagreement is expressed as a small file rather than a fork.
- **zsh** — `common/zsh/{zshenv,zshrc}` source `hosts/$DOTFILES_HOST/zsh/*.zsh`
(interactive) and `*.zshenv` (all shells). Host fragments are 17 lines each.
Things that vary by *distro* rather than by machine — the oh-my-zsh prefix,
the zsh-syntax-highlighting path, `fd` vs `fdfind` — are probed in `common/`
instead, so they need no host file at all.
- **hyprland** — `common/hypr/hyprland.conf` sources the host layer **twice**:
`local-env.conf` near the top for anything used later in the file (`$browser`,
`env`, `monitor`), and `local.conf` at the bottom for gaps, binds and
overrides. Hyprland resolves variables in file order, so a single source at
the end would leave `$browser` undefined at its first use.
- **waybar** — one shared `config` and `style.css`; the latter `@import`s
`local.css` for per-screen padding. `colors.css` is pywal output, regenerated
by `update_colors.sh`.
- **git** — shared settings in `common/git/config`, identity via an `include`
of `hosts/<host>/git/identity`.
## Singleton automations
`inbox-tidy`, `movie-recs`, `rent-utilities` and `ddns` must run on **mainframe
and nowhere else**. They mutate a live mailbox, send notifications, send bills,
and update live DNS records. Two independent guards:
1. The units live only in `hosts/mainframe/systemd/`, never `common/`, so no
other host's config can reference them.
2. Each `.service` carries `ConditionHost=mainframe`. If one is ever enabled on
the wrong machine, systemd logs a condition failure instead of running it.
The scripts themselves are in `hosts/mainframe/bin`. `hypr_refresh` on system76
is **not** a singleton — it is per-machine and correctly unguarded.
Verify after any change: `systemctl --user list-timers --all`.
## `~/.local/bin` is not this repo
It used to be a symlink to `scripts/`, with `GOPATH` pointing inside it. Every
`go install` and `pipx install` therefore wrote into version control — 2.2 GB
on the work laptop, 426 MB on the personal one. `git status` was permanently
unusable, which is why nothing was committed for a year.
Now `~/.local/bin` is an ordinary directory owned by package managers, `GOPATH`
is `~/.local/share/go`, and this repo's `common/bin` and `hosts/$HOST/bin` go on
`PATH` directly. **Do not link a directory that other tools write into.**
## Secrets
Never in the repo. `~/.secrets.zsh`, mode 600, sourced at the end of `zshenv`
so non-interactive shells get it too — deliberately not `rbw`, which would add
a vault round-trip to every script and every `ssh host cmd`. `rbw` stays for
lazy, interactive use, as in `common/zsh/opencode.zsh`.
Back up edits by hand as `~/.secrets.zsh.pre-<thing>`, matching the convention
used across `~/config`.
## Keeping it honest
`dots` reports uncommitted files, ahead/behind, and whether the package
manifest has gone stale. `zshrc` calls `dots --nag` at login, which prints
nothing when everything is clean.
After installing something worth keeping: `pkg-snapshot`, then commit the diff.
## Why not a branch per machine
That was the previous design. A shared change had to be cherry-picked into four
branches by hand, so it got made locally and never committed; the next change
landed on top of an uncommitted one, and the cost of untangling grew until
nobody committed at all. By September 2026 there were 146 dirty files across
three machines, two histories that had never met, and a NAS that had never been
enrolled. Host layers cost a few small files and remove the merge entirely.
+53
View File
@@ -0,0 +1,53 @@
# background_opacity = 0.9
# dynamic_title = true
live_config_reload = true
[colors]
draw_bold_text_with_bright_colors = false
transparent_background_colors = true
[cursor]
style = "Block"
unfocused_hollow = false
[font]
size = 11.0
[font.bold]
family = "FiraCode Nerd Font"
style = "Bold"
[font.bold_italic]
family = "FiraCode Nerd Font"
style = "Bold Italic"
[font.glyph_offset]
x = 0
y = 0
[font.italic]
family = "FiraCode Nerd Font"
style = "Italic"
[font.normal]
family = "FiraCode Nerd Font"
[font.offset]
x = 0
y = 2
[scrolling]
history = 50000
[selection]
save_to_clipboard = true
[shell]
program = "/bin/zsh"
[window]
opacity = 0.44
[window.padding]
x = 2
y = 2
Executable
+22
View File
@@ -0,0 +1,22 @@
#!/bin/zsh
line=$(
rbw list --raw \
| jq -r '.[] | [.id, .name, .user // "-", ((.uris // []) | map(sub("^https?://";"") | sub("/.*$";"")) | join(","))] | @tsv' \
| column -t -s$'\t' -o$'\t' \
| fzf --delimiter=$'\t' --with-nth=2.. --tabstop=1 \
--prompt='rbw > ' --header='NAME USER URIS'
) || exit 0 # Esc / no match → clean exit
uuid=${line%%$'\t'*} # field 1 = UUID
uuid=${uuid%% *} # trim column's padding spaces (UUIDs contain none)
output=("${(@f)$(rbw get --full "$uuid")}")
print -rn -- "$output[1]" | wl-copy # password → clipboard
print -rn -- "${output[2]#* }" | wl-copy -p # username → primary
if [[ $1 == "--show" ]]; then
print -r -- "$output[1]"
fi
print -rl -- "${(@)output[2,-1]}"
+39
View File
@@ -0,0 +1,39 @@
#!/bin/zsh
# --- Extract bare domain from URL argument ---------------------------------
url=$1
domain=${url#*://} # strip scheme (http://, https://, anything://)
domain=${domain%%/*} # strip path
domain=${domain%%:*} # strip port (e.g. :8443)
domain=${domain#www.} # strip leading www.
# --- Tag the browser window so we can find our way back --------------------
hyprctl dispatch tagwindow +browser "title:.*qutebrowser"
# --- Pick an entry (UUID hidden in field 1) --------------------------------
line=$(
rbw list --raw \
| jq -r '.[] | [.id, .name, .user // "-", ((.uris // []) | map(sub("^https?://";"") | sub("/.*$";"")) | join(","))] | @tsv' \
| column -t -s$'\t' -o$'\t' \
| fzf --delimiter=$'\t' --with-nth=2.. --tabstop=1 --no-hscroll \
--select-1 --query="$domain" \
--prompt='rbw > ' --header='NAME USER URIS'
) || { hyprctl dispatch tagwindow -- -browser "title:.*qutebrowser"; exit 0; }
uuid=${line%%$'\t'*}
uuid=${uuid%% *}
output=("${(@f)$(rbw get --full "$uuid")}")
password=$output[1]
username=${output[2]#* }
# --- Return to browser and type credentials --------------------------------
hyprctl dispatch focuswindow "tag:browser"
hyprctl dispatch tagwindow -- -browser "title:.*qutebrowser"
wtype -k Esc
wtype "i"
sleep 0.1
wtype -- "$username"
wtype -k Tab
wtype -- "$password"
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/bash
if grep -q open /proc/acpi/button/lid/LID/state; then
swaymsg output "eDP-1" enable
swaymsg output "eDP-2" enable
else
swaymsg output "eDP-1" disable
swaymsg output "eDP-2" disable
fi
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/sh
TAG=$1
PROCESS=$(sudo docker ps | grep $TAG | awk '{ print $1}')
sudo docker exec -it $PROCESS bash
+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/env bash
# One command, whole answer: is this machine's dotfiles state committed,
# pushed, and does the package manifest still match reality?
#
# With --nag it prints nothing when everything is clean. That silence is the
# point: a login banner that always fires is a banner you stop reading.
set -uo pipefail
REPO="${DOTFILES:-$HOME/.dotfiles}"
HOST="${DOTFILES_HOST:-$(hostname | tr '[:upper:]' '[:lower:]')}"
NAG=0; [[ "${1:-}" == "--nag" ]] && NAG=1
cd "$REPO" 2>/dev/null || exit 0
dirty=$(git status --porcelain 2>/dev/null | wc -l)
ahead=0; behind=0
if git rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1; then
read -r behind ahead < <(git rev-list --left-right --count '@{u}...HEAD' 2>/dev/null || echo "0 0")
fi
pkgdrift=0
tmp=$(mktemp)
if command -v pacman >/dev/null 2>&1; then
pacman -Qqen | sort > "$tmp"
[[ -f "packages/${HOST}.pacman" ]] && ! diff -q "$tmp" "packages/${HOST}.pacman" >/dev/null && pkgdrift=1
elif command -v apt-mark >/dev/null 2>&1; then
apt-mark showmanual | sort > "$tmp"
[[ -f "packages/${HOST}.apt" ]] && ! diff -q "$tmp" "packages/${HOST}.apt" >/dev/null && pkgdrift=1
fi
rm -f "$tmp"
if (( NAG )); then
(( dirty == 0 && ahead == 0 && behind == 0 && pkgdrift == 0 )) && exit 0
printf '\033[33mdotfiles:\033[0m'
(( dirty )) && printf ' %d uncommitted' "$dirty"
(( ahead )) && printf ' %d to push' "$ahead"
(( behind )) && printf ' %d to pull' "$behind"
(( pkgdrift )) && printf ' packages changed'
printf ' \033[2m(dots)\033[0m\n'
exit 0
fi
echo "repo: $REPO [$HOST]"
echo "branch: $(git rev-parse --abbrev-ref HEAD) ahead $ahead, behind $behind"
echo "dirty: $dirty file(s)"
echo "packages: $( ((pkgdrift)) && echo 'manifest is stale — run pkg-snapshot' || echo 'manifest matches' )"
(( dirty )) && { echo; git status --short; }
exit 0
Executable
+16
View File
@@ -0,0 +1,16 @@
#!/bin/zsh
cd ~/docs/notes/dsa/louisville
today="$(date --iso-8601)"
current="$today.md"
previous="$(ls | sort | tail -n 1)"
previous_date="$(echo "$previous" | sed "s/.md//")"
if ! [ -e $current ]
then
cp $previous $current
sed -i "s/$previous_date/$today/g" $current
fi
nvim -c ":Copilot disable" $current && cd -
Executable
+1
View File
@@ -0,0 +1 @@
( kitty & ) &>/dev/null
+4
View File
@@ -0,0 +1,4 @@
mainfont: Roboto
sansfont: Roboto
monofont: Roboto Mono
geometry: margin=0.5in
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -eq 0 ]]; then
echo "Usage: git-commit-all <message>"
exit 1
fi
MESSAGE="$*"
# Commit in each submodule (skip any with nothing to commit)
git submodule foreach --recursive '
git add -A
if ! git diff --cached --quiet; then
git commit -m "'"$MESSAGE"'"
echo " ✔ committed in $name"
else
echo " nothing to commit in $name"
fi
'
# Commit in the parent repo
git add -A
if ! git diff --cached --quiet; then
git commit -m "$MESSAGE"
echo "✔ committed in parent repo"
else
echo " nothing to commit in parent repo"
fi
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -euo pipefail
# Push each submodule to its tracked remote/branch
git submodule foreach --recursive '
BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "")
if [ -n "$BRANCH" ]; then
git push origin "$BRANCH"
echo " ✔ pushed $name ($BRANCH)"
else
echo " ⚠ skipping $name (detached HEAD)"
fi
'
# Push the parent repo
git push
echo "✔ pushed parent repo"
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# Re-skin Hyprland: pick a random wallpaper, crossfade to it, regenerate the
# colorscheme with wallust. Safe to run from a systemd timer.
set -euo pipefail
WALLPAPER_DIR="${WALLPAPER_DIR:-$HOME/photo/wallpapers}"
STATE_FILE="${XDG_RUNTIME_DIR:-/tmp}/hypr_refresh.last"
# If the wallpaper daemon isn't up we're almost certainly not in a graphical
# session (or hyprland hasn't started it yet). Nothing to do -- bail quietly so
# the timer doesn't spam failures.
if ! awww query >/dev/null 2>&1; then
echo "awww-daemon not running; skipping refresh" >&2
exit 0
fi
# Collect wallpapers null-delimited so paths with spaces are safe.
mapfile -d '' -t wallpapers < <(fdfind -0 -e jpg -e jpeg -e png . "$WALLPAPER_DIR")
if ((${#wallpapers[@]} == 0)); then
echo "No wallpapers found in $WALLPAPER_DIR" >&2
exit 1
fi
# Avoid showing the same wallpaper twice in a row.
last=$(cat "$STATE_FILE" 2>/dev/null || true)
if ((${#wallpapers[@]} > 1)) && [[ -n $last ]]; then
filtered=()
for w in "${wallpapers[@]}"; do
[[ $w != "$last" ]] && filtered+=("$w")
done
wallpapers=("${filtered[@]}")
fi
background=$(shuf -n1 -e "${wallpapers[@]}")
echo "Setting background to: $background"
printf '%s\n' "$background" >"$STATE_FILE"
awww img "$background" \
--transition-type random \
--transition-fps 60 \
--transition-duration 2.5
wallust -q run -s "$background"
for s in /tmp/kitty-*; do
kitten @ --to "unix:$s" set-colors --all --configured \
"${XDG_CACHE_HOME:-$HOME/.cache}/wallust/colors-kitty.conf" 2>/dev/null || true
done
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
if hyprctl -j clients | jq -e '.[] | select(.title == "'$1'")' > /dev/null; then
hyprctl dispatch togglespecialworkspace "$1"
else
hyprctl dispatch exec "$2"
hyprctl dispatch togglespecialworkspace "$1"
fi
+3
View File
@@ -0,0 +1,3 @@
#!/bin/bash
hyprctl dispatch layoutmsg mfact exact 0.92
+156
View File
@@ -0,0 +1,156 @@
#!/usr/bin/env bash
set -euo pipefail
self=$(readlink -f "${BASH_SOURCE[0]}")
assets=${MD_TO_PDF_HOME:-}
if [[ -z $assets ]]; then
for candidate in \
"${XDG_DATA_HOME:-$HOME/.local/share}/md_to_pdf" \
"$(dirname "$self")/../md_to_pdf" \
"$(dirname "$self")/md_to_pdf"
do
if [[ -f $candidate/base.css ]]; then
assets=$(readlink -f "$candidate")
break
fi
done
fi
die() { printf 'md_to_pdf: %s\n' "$*" >&2; exit 1; }
view() { ((open_after)) && setsid "${MD_TO_PDF_VIEWER:-xdg-open}" "$1" >/dev/null 2>&1 & :; }
[[ -n $assets ]] || die "cannot find assets (base.css); set MD_TO_PDF_HOME"
themes() { find "$assets/themes" -name '*.css' -printf '%f\n' | sed 's/\.css$//' | sort; }
usage() {
cat <<'USAGE'
md_to_pdf [options] FILE.md [FILE.md ...]
Render markdown to a typeset PDF via pandoc and WeasyPrint.
Output:
-o, --output PATH output file (single input only)
-d, --dir DIR output directory (default: /tmp)
--html also write the intermediate HTML
--html-only write only the HTML, skip the PDF
-O, --open open the result when done
Style:
-t, --theme NAME colour theme (default: paper, or $MD_TO_PDF_THEME)
-l, --list-themes list available themes
--sans sans-serif body text
--ragged ragged-right instead of justified
-s, --size PT base font size, e.g. 11pt (default: 10pt)
--paper SIZE letter, a4, a5, legal, ... (default: letter)
--margin CSS page margin shorthand (default: 0.9in 1in)
Document:
--toc include a table of contents
-n, --number-sections number the headings
--engine ENGINE weasyprint (default) or typst, for documents with math
Anything after -- is passed straight to pandoc.
USAGE
}
theme=${MD_TO_PDF_THEME:-paper}
output=""
outdir=""
keep_html=0
html_only=0
open_after=0
paper=letter
margin="0.9in 1in"
fontsize=10pt
sans=0
ragged=0
toc=0
numbered=0
engine=weasyprint
inputs=()
passthrough=()
while (($#)); do
case $1 in
-o|--output) output=$2; shift 2 ;;
-d|--dir) outdir=$2; shift 2 ;;
--html) keep_html=1; shift ;;
--html-only) html_only=1; keep_html=1; shift ;;
-O|--open) open_after=1; shift ;;
-t|--theme) theme=$2; shift 2 ;;
-l|--list-themes) themes | paste -sd' '; exit 0 ;;
--sans) sans=1; shift ;;
--ragged) ragged=1; shift ;;
-s|--size) fontsize=$2; shift 2 ;;
--paper) paper=$2; shift 2 ;;
--margin) margin=$2; shift 2 ;;
--toc) toc=1; shift ;;
-n|--number-sections) numbered=1; shift ;;
--engine) engine=$2; shift 2 ;;
-h|--help) usage; exit 0 ;;
--) shift; passthrough+=("$@"); break ;;
-*) die "unknown option: $1 (try --help)" ;;
*) inputs+=("$1"); shift ;;
esac
done
((${#inputs[@]})) || { usage >&2; exit 1; }
[[ -f $assets/themes/$theme.css ]] || die "no such theme: $theme (have: $(themes | paste -sd' '))"
(( ${#inputs[@]} == 1 )) || [[ -z $output ]] || die "--output takes a single input file"
pandoc_args=(
--from markdown+smart
--to html5
--standalone
--template "$assets/template.html"
--highlight-style kate
--css "file://$assets/base.css"
--css "file://$assets/themes/$theme.css"
-V "papersize=$paper"
-V "margin=$margin"
-V "fontsize=$fontsize"
)
((sans)) && pandoc_args+=(-V 'bodyfont=var(--font-head)') || :
((ragged)) && pandoc_args+=(-V ragged=1) || :
((toc)) && pandoc_args+=(--toc --toc-depth=3) || :
((numbered)) && pandoc_args+=(--number-sections) || :
pandoc_args+=("${passthrough[@]+"${passthrough[@]}"}")
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
for src in "${inputs[@]}"; do
[[ -f $src ]] || die "no such file: $src"
src=$(readlink -f "$src")
srcdir=$(dirname "$src")
stem=$(basename "$src"); stem=${stem%.*}
dest_dir=${outdir:-/tmp}
mkdir -p "$dest_dir"
pdf=${output:-$dest_dir/$stem.pdf}
if [[ $engine == typst ]]; then
typst_args=()
typst_template=${XDG_DATA_HOME:-$HOME/.local/share}/pandoc/templates/default.typst
[[ -f $typst_template ]] && typst_args=(--template "$typst_template") || :
pandoc "$src" --standalone --pdf-engine typst "${typst_args[@]}" -o "$pdf"
printf '%s\n' "$pdf"
view "$pdf"
continue
fi
html=$tmpdir/$stem.html
((keep_html)) && html=$dest_dir/$stem.html || :
pandoc "${pandoc_args[@]}" -M "pagetitle=$stem" -V "basehref=file://$srcdir/" -o "$html" "$src"
if ((html_only)); then
printf '%s\n' "$html"
continue
fi
weasyprint -q "$html" "$pdf"
printf '%s\n' "$pdf"
view "$pdf"
done
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
exec /home/connor/docs/projects/playlists/target/release/playlists build "$@"
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
exec /home/connor/docs/projects/playlists/target/release/playlists index "$@"
+16
View File
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
# Install everything this host's manifest names. Safe to re-run: --needed and
# apt's own idempotence mean already-installed packages are skipped.
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
HOST="${DOTFILES_HOST:-$(hostname | tr '[:upper:]' '[:lower:]')}"
P="${REPO}/packages"
if [[ -f "${P}/${HOST}.pacman" ]]; then
sudo pacman -S --needed --noconfirm - < "${P}/${HOST}.pacman"
[[ -f "${P}/${HOST}.aur" ]] && paru -S --needed --noconfirm - < "${P}/${HOST}.aur"
elif [[ -f "${P}/${HOST}.apt" ]]; then
xargs -a "${P}/${HOST}.apt" sudo apt-get install -y
else
echo "pkg-restore: no manifest for '${HOST}' in ${P}" >&2; exit 1
fi
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Record what is installed on this machine, into packages/<hostname>.*
# Run it after installing something worth keeping, then commit the diff.
# The diff doubles as a log of what you added and when.
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
HOST="${DOTFILES_HOST:-$(hostname | tr '[:upper:]' '[:lower:]')}"
OUT="${REPO}/packages"
mkdir -p "$OUT"
if command -v pacman >/dev/null 2>&1; then
pacman -Qqen | sort > "${OUT}/${HOST}.pacman"
pacman -Qqem | sort > "${OUT}/${HOST}.aur"
echo "wrote ${HOST}.pacman ($(wc -l < "${OUT}/${HOST}.pacman")) and ${HOST}.aur ($(wc -l < "${OUT}/${HOST}.aur"))"
elif command -v apt-mark >/dev/null 2>&1; then
apt-mark showmanual | sort > "${OUT}/${HOST}.apt"
echo "wrote ${HOST}.apt ($(wc -l < "${OUT}/${HOST}.apt"))"
else
echo "pkg-snapshot: no pacman or apt-mark on this machine" >&2; exit 1
fi
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
/home/connor/docs/projects/playlists/target/release/playlists build -m -s "$@" && ncmpcpp
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
file_name="${1##*/}"
file="${file_name%.*}"
pandoc "$1" --variable "geometry=margin=1in" -o "/tmp/$file.pdf" && zathura "/tmp/$file.pdf"
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
exec python3 /home/connor/docs/projects/playlists/scripts/search.py "$@"
+2
View File
@@ -0,0 +1,2 @@
requests==2.28.2
rich==13.3.2
+36
View File
@@ -0,0 +1,36 @@
#!/bin/sh
if [ $# -ne 2 ]; then
echo "Usage: "${0}" <SWAY_mark> <launch_cmd>"
echo "Example: ${0} 'scratch-emacs' 'emacsclient -c -a emacs'"
exit 1
fi
SWAY_MARK=${1}
LAUNCH_CMD=${2}
scratchpad_show() {
swaymsg "[con_mark=${SWAY_MARK}]" scratchpad show
}
# try showing the scratchpad window
if ! scratchpad_show; then
# if there is no such window...
# launch the application.
eval "${LAUNCH_CMD}" &
# Wait for the next window event.
swaymsg -t subscribe '[ "window" ]'
# Set a mark
swaymsg mark ${SWAY_MARK}
# Move it to the scratchpad workspace
swaymsg move scratchpad
# show the scratchpad window
scratchpad_show
else
echo "Window already exists"
fi
+1
View File
@@ -0,0 +1 @@
sensors | grep "Package id 0:" | awk '{print $4}' | sed "s/+//g" | sed "s/\.0//g"
+123
View File
@@ -0,0 +1,123 @@
$passoptions.latex()$
\documentclass[
$if(fontsize)$
$fontsize$,
$endif$
$if(papersize)$
$papersize$paper,
$endif$
$for(classoption)$
$classoption$$sep$,
$endfor$
]{$documentclass$}
$if(beamerarticle)$
\usepackage{beamerarticle} % needs to be loaded first
$endif$
\usepackage{xcolor}
$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
\usepackage{amsmath,amssymb}
$--
$-- section numbering
$--
$if(numbersections)$
\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
$else$
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
$endif$
$fonts.latex()$
$font-settings.latex()$
$common.latex()$
$for(header-includes)$
$header-includes$
$endfor$
$after-header-includes.latex()$
$hypersetup.latex()$
$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{% add subtitle to \maketitle
\apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
\subtitle{$subtitle$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}
\begin{document}
$if(has-frontmatter)$
\frontmatter
$endif$
$if(title)$
\maketitle
$if(abstract)$
\begin{abstract}
$abstract$
\end{abstract}
$endif$
$endif$
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
$if(toc-title)$
\renewcommand*\contentsname{$toc-title$}
$endif$
{
$if(colorlinks)$
\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}
$endif$
\setcounter{tocdepth}{$toc-depth$}
\tableofcontents
}
$endif$
$if(lof)$
\listoffigures
$endif$
$if(lot)$
\listoftables
$endif$
$if(linestretch)$
\setstretch{$linestretch$}
$endif$
$if(has-frontmatter)$
\mainmatter
$endif$
$body$
$if(has-frontmatter)$
\backmatter
$endif$
$if(nocite-ids)$
\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
$endif$
$if(natbib)$
$if(bibliography)$
$if(biblio-title)$
$if(has-chapters)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
$endif$
$endif$
$if(biblatex)$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
$endif$
$for(include-after)$
$include-after$
$endfor$
\end{document}
+146
View File
@@ -0,0 +1,146 @@
$passoptions.latex()$
\documentclass[
$if(fontsize)$
$fontsize$,
$endif$
$if(papersize)$
$papersize$paper,
$endif$
$for(classoption)$
$classoption$$sep$,
$endfor$
]{$documentclass$}
$if(beamerarticle)$
\usepackage{beamerarticle} % needs to be loaded first
$endif$
\usepackage{titlesec}
\usepackage{xcolor}
\usepackage{listings}
\definecolor{bg}{HTML}{202124}
\definecolor{fg}{HTML}{E8EAED}
\definecolor{g}{HTML}{34A853}
\definecolor{r}{HTML}{EA4335}
\definecolor{b}{HTML}{4285F4}
\definecolor{c}{HTML}{24C1E0}
\definecolor{bbg}{HTML}{5F6368}
\let\oldtexttt\texttt
\pagecolor{bg}
\color{fg}
\titleformat*{\section}{\Large\bfseries\sffamily\color{r}}
\titleformat*{\subsection}{\large\bfseries\sffamily\color{b}}
\titleformat*{\subsubsection}{\large\bfseries\sffamily\color{g}}
\lstset{
backgroundcolor=\color{c},
}
\usepackage{fvextra}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
\definecolor{bgcolor}{HTML}{E0E0E0}
\newcommand{\code}[1]{\begingroup\setlength{\fboxsep}{1pt}\colorbox{bbg}{\oldtexttt{\hspace*{2pt}\vphantom{A}#1\hspace*{2pt}}}\endgroup}
\renewcommand{\texttt}[1]{\code{\oldtexttt{#1}}}
$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
\usepackage{amsmath,amssymb}
$--
$-- section numbering
$--
$if(numbersections)$
\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
$else$
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
$endif$
$fonts.latex()$
$font-settings.latex()$
$common.latex()$
$for(header-includes)$
$header-includes$
$endfor$
$after-header-includes.latex()$
$hypersetup.latex()$
$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{% add subtitle to \maketitle
\apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
\subtitle{$subtitle$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}
\begin{document}
$if(has-frontmatter)$
\frontmatter
$endif$
$if(title)$
\maketitle
$if(abstract)$
\begin{abstract}
$abstract$
\end{abstract}
$endif$
$endif$
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
$if(toc-title)$
\renewcommand*\contentsname{$toc-title$}
$endif$
{
$if(colorlinks)$
\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}
$endif$
\setcounter{tocdepth}{$toc-depth$}
\tableofcontents
}
$endif$
$if(lof)$
\listoffigures
$endif$
$if(lot)$
\listoftables
$endif$
$if(linestretch)$
\setstretch{$linestretch$}
$endif$
$if(has-frontmatter)$
\mainmatter
$endif$
$body$
$if(has-frontmatter)$
\backmatter
$endif$
$if(nocite-ids)$
\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
$endif$
$if(natbib)$
$if(bibliography)$
$if(biblio-title)$
$if(has-chapters)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
$endif$
$endif$
$if(biblatex)$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
$endif$
$for(include-after)$
$include-after$
$endfor$
\end{document}
+171
View File
@@ -0,0 +1,171 @@
#!/bin/zsh
# Open today's note, reconciling it with the server around the edit.
#
# The server rolls the note forward at 00:01, so normally this fetches a file
# that already exists. Everything is arranged so that losing the network
# degrades to editing the local copy, never to losing an edit.
#
# Alongside the note, a pristine copy of the text last agreed with the server is
# kept, with its ETag. Without it there is no way to tell "I have unsaved edits"
# from "I am simply behind", and the second case gets misreported as the first
# every time the phone pushes.
emulate -L zsh
set -o errexit -o nounset -o pipefail
NOTES=${TODO_NOTES:-$HOME/docs/notes/todo}
STATE=${TODO_STATE:-${XDG_STATE_HOME:-$HOME/.local/state}/todo}
REMOTE=${TODO_REMOTE:-https://files.rcjohnstone.com/docs/notes/todo}
DAV_USER=${TODO_USER:-connor}
RBW_ENTRY=${TODO_RBW_ENTRY:-SFTPGo}
PRUNE=${TODO_PRUNE:-$HOME/.local/lib/todo/prune.py}
# zshenv exports EDITOR on every invocation, including this script's own, so
# `EDITOR=x todo` cannot work. TODO_EDITOR is the override that does.
EDIT=${TODO_EDITOR:-${EDITOR:-nvim}}
AGENT=todo-cli/2.0
today=$(date --iso-8601)
current=$NOTES/$today.md
base=$STATE/base/$today.md
base_etag=$STATE/base/$today.etag
mkdir -p $NOTES $STATE/base
work=$(mktemp -d); trap 'rm -rf $work' EXIT
note() { print -u2 -- "todo: $*" }
die() { print -u2 -- "todo: $*"; exit 1 }
# Password stays in a variable and reaches curl over stdin. Passing it as -u
# would put it in argv, where any other user's `ps` can read it.
dav_pass=""
if command -v rbw >/dev/null 2>&1; then
dav_pass=$(rbw get $RBW_ENTRY 2>/dev/null) || dav_pass=""
fi
dav() {
[[ -n $dav_pass ]] || return 64
printf 'user = "%s:%s"\n' $DAV_USER $dav_pass |
curl -sS --config - -A $AGENT --max-time 15 "$@"
}
etag_of() { grep -i '^etag:' $1 2>/dev/null | tr -d '\r' | awk '{print $2}' }
adopt() { # text-file etag
[[ $1 == $current ]] || cp $1 $current
cp $1 $base
print -r -- ${2:-} > $base_etag
}
set_aside() { # text-file -> prints the filename used
local name=$today.sync-conflict-$(date +%Y%m%d-%H%M%S)-${HOST:u}.md
cp $1 $NOTES/$name
dav -X PUT --data-binary @$1 -o /dev/null $REMOTE/$name >/dev/null 2>&1 || true
print -r -- $name
}
# ---------------------------------------------------------------- pull
remote_hash=""
if [[ -z $dav_pass ]]; then
note "no credential from rbw, working offline"
else
code=$(dav -o $work/theirs -D $work/h -w '%{http_code}' $REMOTE/$today.md) || code=000
case $code in
200)
their_etag=$(etag_of $work/h)
remote_hash=$(md5sum < $work/theirs)
if [[ ! -e $current ]]; then
adopt $work/theirs $their_etag
elif [[ ! -e $base ]]; then
# No record of a previous agreement, so nothing to merge from.
if cmp -s $current $work/theirs; then
adopt $work/theirs $their_etag
else
note "no sync history, yours saved as $(set_aside $current)"
adopt $work/theirs $their_etag
fi
elif [[ -e $base_etag && -n $their_etag && $their_etag == $(<$base_etag) ]]; then
: # server has not moved since the last agreement
elif git merge-file -p $current $base $work/theirs > $work/merged 2>/dev/null; then
# git rather than diff3. diff3 calls it a conflict even when
# both sides made the same change, and both devices ticking the
# same box is an ordinary thing to happen here.
cp $work/merged $current
if cmp -s $current $work/theirs; then
# Nothing local to contribute, so this is the new agreement.
adopt $work/theirs $their_etag
else
note "merged in changes from the server"
fi
else
# Both sides changed the same lines. The server's copy becomes
# the note and the local one goes beside it, which is the
# convention already in this directory.
note "conflict, yours saved as $(set_aside $current)"
adopt $work/theirs $their_etag
fi
;;
404)
# The 00:01 timer has not run, or the clock disagrees about the day.
# One create, never a poll loop: repeated 404s trip http-probing.
note "no $today.md on the server yet, creating it here"
;;
401)
# Never retry: repeated 401s from one IP trip http-generic-bf and
# earn a four hour ban that no whitelist covers.
die "credentials rejected. fix the $RBW_ENTRY entry, do not re-run blindly"
;;
000) note "server unreachable, working offline" ;;
*) note "server returned $code, working offline" ;;
esac
fi
# ------------------------------------------------------- local fallback
if [[ ! -e $current ]]; then
# Match the date glob exactly. A bare `ls | tail -1` can select a
# .sync-conflict- sibling, which is how divergent notes spread before.
previous=($NOTES/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].md(N))
if (( ${#previous} )); then
src=${previous[-1]}
if [[ -x $PRUNE ]]; then
$PRUNE $src > $work/new
else
note "prune not found at $PRUNE, carrying the note forward unpruned"
cp $src $work/new
fi
# Only line 1. A global replace would rewrite any date in the body, so
# "meeting moved to 2026-09-08" would silently become today.
sed -i "1s/.*/# $today/" $work/new
cp $work/new $current
note "created $today.md from ${src:t}"
else
printf '# %s\n' $today > $current
note "started a fresh $today.md"
fi
fi
# ---------------------------------------------------------------- edit
$EDIT $current
# ---------------------------------------------------------------- push
[[ $(md5sum < $current) == $remote_hash ]] && { note "in step with the server"; exit 0 }
[[ -n $dav_pass ]] || { note "no credential, leaving changes local"; exit 0 }
code=$(dav -X PUT --data-binary @$current -o /dev/null -w '%{http_code}' $REMOTE/$today.md) ||
code=000
case $code in
200|201|204)
# The ETag a PUT returns is not the file's own, so it is read back
# rather than believed. See FINDINGS.md.
dav -I -D $work/ph -o /dev/null $REMOTE/$today.md >/dev/null 2>&1 || true
adopt $current "$(etag_of $work/ph)"
note "pushed $today.md"
;;
401) die "credentials rejected on push. changes are safe locally" ;;
000) note "push failed, server unreachable. changes are safe locally" ;;
*) note "push returned $code. changes are safe locally" ;;
esac
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# Configuration
SSH_USER="connor.johnstone@arcfield.com"
SSH_HOST="localhost"
SSH_PORT="9000"
REMOTE="${SSH_USER}@${SSH_HOST}:${SSH_PORT}"
# Check if sshuttle is already running with this remote
SSHUTTLE_PID=$(pgrep -f "sshuttle.*${REMOTE}")
if [ -n "$SSHUTTLE_PID" ]; then
# sshuttle is running, so kill it
echo "sshuttle is running (PID: $SSHUTTLE_PID). Stopping..."
kill "$SSHUTTLE_PID"
# Wait a moment and verify it stopped
sleep 1
if pgrep -f "sshuttle.*${REMOTE}" > /dev/null; then
echo "Process didn't stop gracefully, forcing..."
kill -9 "$SSHUTTLE_PID"
fi
echo "sshuttle stopped."
else
# sshuttle is not running, check SSH connection and start it
echo "sshuttle is not running. Checking SSH connection..."
# Test SSH connection (with timeout)
if ssh -p "$SSH_PORT" -o ConnectTimeout=5 -o BatchMode=yes "$SSH_USER@$SSH_HOST" exit 2>/dev/null; then
echo "SSH connection successful. Starting sshuttle..."
sshuttle -r "$REMOTE" --dns 0/0 > /tmp/sshuttle 2>&1 &
echo "sshuttle started in background (PID: $!)."
else
echo "ERROR: Cannot establish SSH connection to $REMOTE"
echo "Please verify:"
echo " 1. SSH service is running on $SSH_HOST:$SSH_PORT"
echo " 2. You have valid SSH credentials/keys configured"
echo " 3. The host is reachable"
exit 1
fi
fi
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
QUTE_PIDS_FILE="/tmp/qute_tab_pids.txt"
DUMP_SCRIPT="$HOME/.local/share/qutebrowser/userscripts/dump_tab_pids.py"
# Parse arguments
SORT_BY="mem"
while getopts "rc" opt; do
case $opt in
r) SORT_BY="mem" ;;
c) SORT_BY="cpu" ;;
*) echo "Usage: top10 [-r|-c]" >&2; exit 1 ;;
esac
done
# Refresh qutebrowser tab PIDs
if pgrep -x qutebrowser > /dev/null; then
qutebrowser ":debug-pyeval -q exec(open('$DUMP_SCRIPT').read())" 2>/dev/null
sleep 0.1 # give it a moment to write the file
fi
# Build associative array of PID -> tab title
declare -A tab_titles
if [[ -f "$QUTE_PIDS_FILE" ]]; then
while IFS=$'\t' read -r pid title; do
tab_titles[$pid]="$title"
done < "$QUTE_PIDS_FILE"
fi
printf "%-8s %6s %6s %s\n" "PID" "%MEM" "%CPU" "COMMAND"
ps -eo pid,%mem,%cpu,comm --sort=-"%$SORT_BY" | tail -n +2 | head -n 10 | \
while read pid mem cpu comm; do
if [[ "$comm" == "QtWebEngineProc" && -n "${tab_titles[$pid]}" ]]; then
comm="qute: ${tab_titles[$pid]}"
fi
printf "%-8s %6s %6s %s\n" "$pid" "$mem" "$cpu" "$comm"
done
+63
View File
@@ -0,0 +1,63 @@
#!/bin/bash
input="$HOME/.colors/current.yaml"
background=$(yq .background $input | tr -d '"')
foreground=$(yq .foreground $input | tr -d '"')
red=$(yq .color_02 $input | tr -d '"')
bright_red=$(yq .color_10 $input | tr -d '"')
green=$(yq .color_03 $input | tr -d '"')
bright_green=$(yq .color_11 $input | tr -d '"')
yellow=$(yq .color_04 $input | tr -d '"')
bright_yellow=$(yq .color_12 $input | tr -d '"')
blue=$(yq .color_05 $input | tr -d '"')
bright_blue=$(yq .color_13 $input | tr -d '"')
purple=$(yq .color_06 $input | tr -d '"')
bright_purple=$(yq .color_14 $input | tr -d '"')
cyan=$(yq .color_07 $input | tr -d '"')
bright_cyan=$(yq .color_15 $input | tr -d '"')
gray=$(yq .color_08 $input | tr -d '"')
bright_gray=$(yq .color_16 $input | tr -d '"')
declare -a templates=(
"$HOME/.config/kitty/kitty_template.conf"
"$HOME/.config/sway/config_template"
"$HOME/.config/waybar/style_template.css"
"$HOME/.config/wofi/style_template.css"
)
declare -a outputs=(
"$HOME/.config/kitty/kitty.conf"
"$HOME/.config/sway/config"
"$HOME/.config/waybar/style.css"
"$HOME/.config/wofi/style.css"
)
length=${#templates[@]}
for (( j=0; j<length; j++ ));
do
sed -e "s/\$background/$background/g" \
-e "s/\$foreground/$foreground/g" \
-e "s/\$red/$red/g" \
-e "s/\$bright_red/$bright_red/g" \
-e "s/\$green/$green/g" \
-e "s/\$bright_green/$bright_green/g" \
-e "s/\$yellow/$yellow/g" \
-e "s/\$bright_yellow/$bright_yellow/g" \
-e "s/\$blue/$blue/g" \
-e "s/\$bright_blue/$bright_blue/g" \
-e "s/\$purple/$purple/g" \
-e "s/\$bright_purple/$bright_purple/g" \
-e "s/\$cyan/$cyan/g" \
-e "s/\$bright_cyan/$bright_cyan/g" \
-e "s/\$gray/$gray/g" \
-e "s/\$bright_gray/$bright_gray/g" \
${templates[j]} > ${outputs[j]}
done
+78
View File
@@ -0,0 +1,78 @@
# Working notes for Claude on mainframe
## LLM / inference stack
Connor runs a self-hosted inference stack: LiteLLM proxy in front of a local GPU
model (llama-swap), OpenAI, Anthropic, and Moonshot/Kimi, with OpenCode + OMO on
top. **Before touching anything under `~/config/litellm/`, `~/.config/opencode/`,
or the model routing, read `~/guides/llm/robots.md`.** It carries the design
decisions, the measured data, and — more importantly — the specific wrong
conclusions this project has already reached and corrected. `~/guides/llm/README.md`
is the short human version.
The five things most likely to waste an hour if you don't know them:
1. **A config value is not applied until an invalid value produces an upstream
400.** LiteLLM silently discards parameters it doesn't route (`store: false`
bare in `litellm_params` returns 200 and never reaches OpenAI; it needs
`extra_body`).
2. **Editing bind-mounted config does nothing without
`sudo podman restart <container>`.** Changing an *env var* needs a full
`sudo podman-compose up -d <svc>` — a restart is not enough. The reverse trap
is worse and bites silently: **`podman-compose up -d` will NOT restart a
container when only a bind-mounted file changed**, because the compose
definition is unchanged. It prints the container name and does nothing. This
applies to Grafana provisioning as much as to `litellm/config.yaml`.
3. **If every hosted model hangs (not errors) while the host has internet**, it's
Docker: `dockerd` sets `ip filter` FORWARD to policy drop and kills all podman
egress. DNS still resolves, which makes it look like a broken vendor. Fix:
`sudo bash ~/config/host/podman-docker-forward.sh`. Don't remove Docker — the
Gitea Actions runners need it.
4. **HTTP 200 with empty content is not necessarily a bug.** Three causes: an
Anthropic refusal, a reasoning model eating its whole `max_tokens` budget
before emitting text, or a dropped parameter. Local models do it too. Give
reasoning models real headroom before concluding anything.
5. **Zen (`zen/*`) is under a ToS block — make no calls to it**, including
"harmless" ones. Entries stay in config in an access group no key holds.
6. **The OpenCode sidebar under-reports cost — badly.** It omits delegated child
sessions, where most agent work happens: it showed ~$5.80 against a
vendor-verified $17.39. Use `opencode stats` or the LiteLLM spend log.
7. **Open WebUI gives every model its full built-in tool suite by default**
(`meta.builtinTools` defaults to True when absent). Models that are weak at
tool discipline loop on `query_knowledge_files` and friends even with no
knowledge base configured. Symptom: many round trips with 25-30 token
completions. Disable per-model in Admin → Models; there is no global switch.
8. **On this box, local inference is RAM-bandwidth-bound, not VRAM-bound.**
Decode speed is set by a model's *active* parameters, not its total, so an
80B MoE with 3B active runs at the same speed as a 30B with 3B active. Free
VRAM buys prefill, not decode. Don't recommend a bigger GPU without checking
which wall you're actually against.
9. **The OMO agent aliases embed their model family on purpose**
`personal/atlas-kimi-k2.7-code`, not `personal/atlas`. OMO picks its
per-model prompt by string-matching the *last path segment* of the model
name, so a "tidy-up" rename silently disables every Kimi/GPT-specific prompt
and guard with no error. **Never shorten them.** `local/librarian` and
`local/explore` are deliberately left un-suffixed — `isGptModel` matches a
bare `"gpt"` substring and `gpt-oss-20b` would trip it.
Cost work: read `model_group`, never `model`, to attribute a request. Cost is
driven by cache-read volume and context size far more than by model choice.
## General
- Repos here use an **allowlist** `.gitignore` (`**/*` plus explicit `!` entries).
`~/config/` and `~/docs/` are deliberately untracked — back up config edits by
hand as `<file>.pre-<thing>` snapshots, which is the established convention.
- Don't create project-level `CLAUDE.md` files in `~` — Connor keeps guidance at
the `~/.claude` level and reference material in `~/guides/`.
- Measure before concluding, and when a previous conclusion turns out to have
been reached from bad data, **record both the correction and why the original
reasoning was unsound** — otherwise someone re-opens it.
@@ -0,0 +1,2 @@
- [News rewrite status](news-rewrite-status.md) — old Rust system still in production, Python rewrite at ~/docs/projects/news; read profile/CALIBRATION.md before touching scoring constants
- [news_triage v0.2 gotchas](news-triage-v02-gotchas.md) — SIGHUP won't reload sources, healthcheck lies, ntfy buttons dead by design
@@ -0,0 +1,29 @@
---
name: news-rewrite-status
description: State of the news aggregator rewrite - old system still running, new one at ~/docs/projects/news, design rationale lives in profile/CALIBRATION.md
metadata:
type: project
---
Two systems exist. **`~/docs/projects/news_triage`** (Rust, v0.2, container
`connor_news-backend_1`, config `~/config/news/config.toml`) is **still running in
production** and serving Connor's notifications. **`~/docs/projects/news`** is the
greenfield Python rewrite, started 2026-09-08. Keep the old one running until cutover;
Connor chose **no data import** into the new schema.
The rewrite exists because signal quality failed, and the root cause was that the old
system had no representation of taste — three keywords fed to BM25 plus a two-term
substring blocklist. The fix is embeddings: interests, vetoes, and importance categories
written as prose in `profile/profile.toml`, embedded on CPU with bge-small-en-v1.5.
**Before changing any scoring constant, read `profile/CALIBRATION.md` in that repo.** The
constants were fitted against 3,885 real items and 40 real feedback labels, and two of the
findings are counterintuitive enough to be re-derived wrongly: blocks must be compared by
z-score *within block* (raw cosine gave geopolitics 78% of all items), and veto must be a
margin over the interest signal rather than a similarity threshold (a plain cutoff killed a
Middle East story about a mayor barring an Israeli football club).
Phases 0 and 1 are done. Phase 2 onward (ingest/embed/cluster, then scoring, delivery, web
UI) is not built. Plan file: `~/.claude/plans/alright-so-i-d-like-tranquil-sunset.md`.
Related: [[news-triage-v02-gotchas]]
@@ -0,0 +1,28 @@
---
name: news-triage-v02-gotchas
description: Operational traps in the running news_triage v0.2 container - config reload scope, permanently-unhealthy healthcheck, dead ntfy buttons
metadata:
type: project
---
Traps in the still-running `connor_news-backend_1` (from `~/docs/projects/news_triage`),
each of which costs a debugging cycle to rediscover:
- **SIGHUP does not reload sources.** `watch_sighup` swaps the config, and per-cycle reads
pick up `[topics]`, `[notify]`, `[clustering]` and `[llm]`. But `spawn_source_loop` takes
an *owned* `Source` and the source list is enumerated once at startup in `build_runtime`,
so adding, removing, or disabling a feed needs `sudo podman restart`, not a HUP.
- **The container reports `unhealthy` forever and is fine.** The compose healthcheck is
`CMD curl -f localhost:3000/healthz` and the runtime image ships no curl.
- **ntfy feedback buttons have never worked.** `NEWS_API_BASE_URL` is unset, so they are
dropped at boot with a single WARN. ntfy executes those actions from the phone, so it
needs a publicly reachable URL. Deliberately left unfixed — `/api/feedback` has no auth,
and with no data import into the rewrite the labels have no carry-over value.
- **The bypass lane ignores relevance entirely** (`gate.rs:302`): it fires priority-5 push
on `source_count >= 2` OR p99 importance, skipping quiet hours, the token bucket, and the
blocklist. `bypass_ceiling_per_day` is the only brake on it.
Config is bind-mounted, so per the usual rule an edit needs `sudo podman restart`
`podman-compose up -d` does nothing when only the mounted file changed.
Related: [[news-rewrite-status]]
@@ -0,0 +1,8 @@
- [Runway v2 build plan](runway-v2-build-plan.md) — the milestone plan lives outside the repo; nothing is ported from v1.
- [Runway commit style](runway-commit-style.md) — no AI attribution in commits, ever.
- [Connor's timezone](connor-timezone.md) — US Eastern now, Denver historically; never hardcode a display zone.
- [No Runway screenshots](runway-send-screenshots.md) — he runs it himself; report what the browser checks found in words.
- [Connor's Baikal server](connor-baikal-server.md) — real CalDAV server, credentials, and the privacy caveat on its data.
- [Milestone summaries](runway-milestone-summaries.md) — stop and summarise at the end of each Runway milestone.
- [Connor's homelab deploy](connor-homelab-deploy.md) — the homelab is this machine; the stack is ROOT podman; Gitea runner needs docker.service.
- [Verify before claiming](verify-before-claiming.md) — read whole outputs and exit codes, not tails.
@@ -0,0 +1,22 @@
---
name: connor-baikal-server
description: "Connor's real Baikal CalDAV server and where its credentials live."
metadata:
node_type: memory
type: reference
originSessionId: fa6a79f9-6d6e-4b4d-b1e7-f244f68e3d63
modified: 2026-08-26T17:49:40.541Z
---
Baikal (SabreDAV) at `https://baikal.rcjohnstone.com/dav.php/`, principal
`/dav.php/principals/connor/`, calendar home `/dav.php/calendars/connor/`.
Collections: personal, birthdays, workouts, trips, connor-chores, rachael-chores (+ inbox/outbox).
Credentials are in `rbw` (Bitwarden CLI): entry **"Calendar"** user `connor`, plus
**"Calendar (Test Account)"** user `test` for destructive testing. `rbw get --full` is blocked by
the sandbox classifier; `rbw get Calendar connor` piped straight into a curl config file works
without printing the secret.
Connor authorised talking to this server directly. Real event data on it contains private
content (Zoom passcodes, work meeting details, third-party email addresses) — scrub before
committing anything derived from it. See [[runway-v2-build-plan]].
@@ -0,0 +1,46 @@
---
name: connor-homelab-deploy
description: "Connor's homelab is this machine; its deployment config is ~/compose.yml and ~/Caddyfile, and the Gitea runner lives here too."
metadata:
type: reference
---
The homelab **is** the dev machine (`mainframe`). `~/compose.yml` (~1,000 lines,
~20 services) and `~/Caddyfile` are the live deployment, and `~` is itself a git
repo. Secrets are `~/.env` with `SERVICE_THING` names, read as `${VAR}` in
compose. `server.rcjohnstone.com` resolves here.
Gitea is `git.rcjohnstone.com`; SSH remotes are on **port 2222**
(`ssh://connor@git.rcjohnstone.com:2222/connor/<repo>.git`). CI vars are
`REGISTRY`/`USERNAME` with secret `DOCKER_PASSWORD`.
The Actions runner is `act_runner.service` — a **system** unit running as user
`act_runner`, config `/etc/act_runner/act_runner.yaml`, state in
`/var/lib/act_runner`. Ignore `~/.runner`; it is a stale registration of
Connor's own. Labels are `ubuntu-latest`, `ubuntu-22.04`, `ubuntu-20.04`, each
mapping to a `gitea/runner-images` container — the label says nothing about the
host, which is Arch.
**It needs `docker.service` running.** The runner is configured for Docker, not
podman, and dies on "Docker Engine socket not found" without it. It had
crash-looped 59,927 times before 2026-08-28 because docker was inactive *and
disabled* — so it does not survive a reboot unless enabled. Connor starts it by
hand; that is how he has always done it.
**The stack runs in ROOT podman, not rootless.** Every service container
(`connor_caddy_1`, `connor_authelia_1`, `connor_gitea_1`, ~40 of them) is
`sudo podman`, project name `connor`, on the `connor_internal` network. Connor's
own rootless podman holds only scratch containers. This matters because it is
invisible from inside a script: anything that picks a runtime with
`command -v podman` and runs as Connor will start a healthy container in the
rootless namespace that Caddy cannot route to, then report success. Deploy units
for this machine must be **system** units. A container started from a `oneshot`
unit also needs `KillMode=process`, or systemd tears down the container with the
unit's cgroup the moment `ExecStart` returns.
Caddy bind-mounts host directories, so a deploy that swaps a directory by
renaming it is invisible until Caddy restarts — the mount holds the inode.
Mount the parent of the directory being replaced.
Runway's own arrangement is in `~/docs/projects/runway/deploy/README.md`.
See [[runway-v2-build-plan]] and [[verify-before-claiming]].
@@ -0,0 +1,23 @@
---
name: connor-timezone
description: "Connor is in US Eastern time (America/Louisville), having previously lived in Denver."
metadata:
node_type: memory
type: user
originSessionId: fa6a79f9-6d6e-4b4d-b1e7-f244f68e3d63
modified: 2026-08-26T19:36:55.968Z
---
Connor's current zone is **America/Louisville** (US Eastern). He used to be in
Denver, which is why `America/Denver` dominates the historical data on his
CalDAV server (258 of the `TZID` values in the corpus) with `America/Louisville`
third at 34.
**Why it matters:** never hardcode a display zone. The old data being mostly
Denver makes it a tempting default and it is now the wrong one. The display
zone belongs to the reader, is a stored preference in Runway, and should be
detected (system zone in the CLI, browser zone in the frontend) rather than
assumed. Corrected once already after `runway-cli` shipped with a Denver
default.
See [[runway-v2-build-plan]] and [[connor-baikal-server]].
@@ -0,0 +1,19 @@
---
name: runway-commit-style
description: "Runway commits must carry no AI attribution — no Co-Authored-By, no session trailers."
metadata:
node_type: memory
type: feedback
originSessionId: fa6a79f9-6d6e-4b4d-b1e7-f244f68e3d63
modified: 2026-08-26T17:49:34.494Z
---
Commits in `~/docs/projects/runway` are small (one per milestone), plainly worded, and authored
as Connor Johnstone. **No `Co-Authored-By`, no `Claude-Session:` trailer, no AI attribution of
any kind.**
**Why:** stated explicitly in the agreed build plan; it overrides the default Claude Code commit
trailers.
**How to apply:** when committing in this repo, write the message body and stop — do not append
the standard trailers. See [[runway-v2-build-plan]].
@@ -0,0 +1,20 @@
---
name: runway-milestone-summaries
description: Stop at the end of each Runway milestone and summarise what was done before moving on.
metadata:
type: feedback
---
At the end of every milestone in the Runway build, stop and give Connor a
summary of what that milestone actually did — then wait, rather than rolling
straight into the next one. He asked for this on 2026-08-27 after M15 went by
with only a commit line.
**Why:** he approves milestone by milestone. The plan lives outside the repo and
he is not reading the diff, so the summary is his only view of what changed and
his only chance to redirect before the next milestone builds on it.
**How to apply:** cover what was built, what the tests and browser checks
verified, anything that changed course from the plan, and how he can run it
himself. Words, not screenshots — see [[runway-send-screenshots]]. Then stop.
See [[runway-v2-build-plan]].
@@ -0,0 +1,23 @@
---
name: runway-send-screenshots
description: Connor does not need Runway UI screenshots sent in-conversation; he runs it himself.
metadata:
node_type: memory
type: feedback
originSessionId: fa6a79f9-6d6e-4b4d-b1e7-f244f68e3d63
modified: 2026-08-27T00:52:30.624Z
---
Do **not** routinely send UI screenshots for `~/docs/projects/runway`. Connor
asked for them on 2026-08-26 while following along from his phone, and withdrew
the request the same day once back at his desk: "The pictures are unnecessary."
**Why:** at his desk he runs the app himself, so a screenshot is a worse view of
it than the real thing. Screenshots are still worth *taking*`e2e/shoot.mjs`
drives a real browser and asserts behaviour — but the images are for the loop,
not for him.
**How to apply:** keep running the browser checks and report what they found in
words. Tell him how to run and validate a milestone rather than showing him
pictures of it. Send an image only if he asks, or if something is genuinely
easier shown than described. See [[runway-v2-build-plan]].
@@ -0,0 +1,19 @@
---
name: runway-v2-build-plan
description: Runway v2 is a from-scratch rewrite driven by a saved milestone plan (M1-M28) outside the repo.
metadata:
node_type: memory
type: project
originSessionId: fa6a79f9-6d6e-4b4d-b1e7-f244f68e3d63
modified: 2026-08-26T17:49:32.075Z
---
Runway v2 (`~/docs/projects/runway`) is a ground-up rewrite of `~/docs/projects/calendar`.
The build plan lives OUTSIDE the repo at `~/.claude/plans/ok-i-ve-filled-it-optimized-meerkat.md`
— milestones M1M28 across 6 phases, one commit per milestone. `docs/legacy-audit.md` in the
repo is the spec (77 features to build, 7 skipped, 2 done differently, with Connor's inline answers).
Core rule: **no code is ported from v1.** v1 is read only as a record of what went wrong.
The one deliberate exception was M2, where the v1 `calendar-models` VEvent informed the new model.
See [[runway-commit-style]] and [[connor-baikal-server]].
@@ -0,0 +1,22 @@
---
name: verify-before-claiming
description: "Read a tool's whole output before calling it clean; tail and grep have both produced false all-clears here."
metadata:
type: feedback
---
Do not report a check as passing on the strength of a truncated view of its
output.
**Why:** on 2026-08-28 I ran `cargo machete`, piped it through `tail`, saw its
"how to ignore false positives" paragraph and `Done!`, and told Connor it was
clean. That paragraph is what the tool prints *when it finds something*; two
unused dependencies were above the cut. CI then failed on exactly the check I
had claimed to make. The same day, a `grep` for `println!` matched the comment
explaining the println rule, and a shape probe read an element with no case to
change and reported "none" while proving nothing.
**How to apply:** capture the exit code, not just the text. Read the head of a
finding-style tool's output, not the tail. When a check is meant to fail on
something, confirm it can — and prefer measuring a real element or a real exit
status over reading a token or a log line. See [[runway-milestone-summaries]].
@@ -0,0 +1,6 @@
- [No AI commit attribution](no-ai-commit-attribution.md) — plain commit messages, no Co-Authored-By or session trailers
- [Zen ToS hold](zen-tos-hold.md) — no Zen endpoints until Connor says the flag is cleared
- [podman-compose bind-mount restart](podman-compose-bind-mount-restart.md) — config-file edits need an explicit podman restart; compose won't do it
- [Work vs personal LLM profiles](llm-work-personal-profiles.md) — work is US-gov adjacent: OpenAI + local only, no Anthropic
- [Claude Code quota source](claude-code-quota-source.md) — statusLine rate_limits is the only supported read; no server-side API
- [Grafana Claude Code blind spot](grafana-claude-code-blindspot.md) — llm-anthropic board sees mainframe only, not work_laptop
@@ -0,0 +1,54 @@
---
name: claude-code-quota-source
description: How to read Claude Code 5h/weekly quota programmatically — statusLine rate_limits is the only supported route; no server-side API exists
metadata:
type: reference
---
Claude Code subscription quota (the thing Anthropic actually throttles on) is
readable **only** via the `statusLine` command's stdin JSON:
```
.rate_limits.five_hour.used_percentage .rate_limits.five_hour.resets_at
.rate_limits.seven_day.used_percentage .rate_limits.seven_day.resets_at
.rate_limits.spend_limit.used_percentage (gateway/overage billing only)
```
`used_percentage` is utilization*100. `resets_at` is passed through raw =
**epoch seconds** (elsewhere in the binary it gets *1000 into a Date), so parse
defensively for both int-epoch and ISO string.
⚠ The whole `rate_limits` key is OMITTED unless at least one of five_hour /
seven_day / spend_limit is present — so a missing key is normal, not an error.
**`seven_day_opus` is NOT in the statusLine payload.** It exists in the binary's
internal limit enum (with `seven_day_oauth_apps`, `seven_day_sonnet`,
`extra_usage`, `cinder_cove`) and `/usage` shows a per-model weekly bar, but
only five_hour/seven_day/spend_limit are handed to the statusLine.
**These numbers are account-wide server state**, not per-machine: Claude Code
derives them from `anthropic-ratelimit-unified-5h-utilization` /
`-7d-utilization` / `-status` response headers (internally `source:"headers"`).
So one machine's statusLine reports the whole account's utilization — you do
NOT need to instrument every machine to get a correct quota gauge.
What does NOT work (verified 2026-09-10, Claude Code 2.1.252):
- Those headers are **not** written to `~/.claude/projects/*.jsonl`. Transcripts
carry only `message.usage` token counts. Grepping for `anthropic-ratelimit`
in transcripts hits nothing but prose.
- No public API. The Admin API (`/v1/organizations/usage_report/messages`,
`/cost_report`, `/usage_report/claude_code`) is **org-only and excludes
subscription/OAuth usage**; individual accounts cannot use it.
- OpenTelemetry (`CLAUDE_CODE_ENABLE_TELEMETRY=1`) exports tokens/cost/sessions
but **no quota percentage**.
- `/usage` in the CLI shows it but has no machine-readable output.
**Do not** lift the OAuth token from `~/.claude/.credentials.json` to poll
`https://api.anthropic.com/api/oauth/usage` (the endpoint Claude Code itself
calls). Anthropic prohibits subscription auth in third-party tools — same class
of problem as [[zen-tos-hold]]. The statusLine route is Claude Code handing us
the data, which is fine.
**Token sums are a bad proxy for quota.** Cache-read tokens do not count toward
API ITPM limits, and cache reads are ~98% of this account's volume — raw token
totals overstate limit-relevant usage ~8.7x. If approximating, use
`input_tokens + cache_creation + output_tokens`.
@@ -0,0 +1,36 @@
---
name: grafana-claude-code-blindspot
description: The llm-anthropic Grafana board only sees mainframe transcripts; work_laptop Claude Code usage is missing entirely
metadata:
type: project
---
`obs.claude_code_usage` is filled by `~/config/grafana/collect-claude-code.py`
(llm-claude-code.timer, every 15 min), which walks **mainframe's**
`~/.claude/projects` only. It has no remote source.
Connor also runs Claude Code on `work_laptop` (10.0.0.8, host `SCTFW004`, user
`connorjohnstone`) — reachable by `ssh work_laptop` with BatchMode keys.
**Why:** flat spots on the llm-anthropic board read as "the dashboard is
broken" but are real gaps in *mainframe* activity. Verified 2026-09-10: the DB
matched mainframe transcripts day-for-day exactly, while the laptop held 758
requests on 2026-09-04 (a day mainframe shows zero) plus 364 on 09-09 and 228
on 09-10 — roughly 40% of recent traffic invisible.
**Status as of 2026-09-10:** the *quota* half is solved — `obs.claude_quota`
plus panels 291-297 on llm-anthropic now show real account-wide 5h/weekly
utilisation, fed by `claude-quota-statusline.py` on both machines and harvested
by `llm-claude-quota.timer`. See robots.md §18 and [[claude-code-quota-source]].
**Also done (same day):** the token panels are multi-host too.
`obs.claude_code_usage` has a `host` column; `collect-claude-code.py` rsyncs
each host in `CLAUDE_HOSTS` into `~/.claude-mirror/<host>/` and walks it like a
local tree. 5,184 laptop rows backfilled to 2026-08-11. Panels 305 and 307 split
by machine. See robots.md §18.7.
**How to apply:** this blind spot is closed — don't re-diagnose it. The live
trap now is the opposite one: tokens (`claude_code_usage`) sum across hosts,
quota (`claude_quota`) is account-wide and must never be summed, and they sit on
the same board. Adding a machine is one entry in `CLAUDE_HOSTS` plus the
statusLine from [[claude-code-quota-source]].
@@ -0,0 +1,30 @@
---
name: llm-work-personal-profiles
description: Connor's LLM stack has two profiles — work (US-gov adjacent, no Anthropic) and personal — which constrains which providers may serve which agent
metadata:
type: project
---
The LiteLLM stack serves two profiles with different permitted providers:
- **Work** — US-government-adjacent. `openai/*` and local models ONLY.
**Anthropic is not an employer-approved vendor**, so `anthropic/*` is
excluded there by policy, not by preference. PRC-origin models are not
formally banned by his office but should be treated as prohibited until the
security office gives written approval.
- **Personal** — `anthropic/*`, `openai/*`, and local.
- `zen/*` is blocked for both, see [[zen-tos-hold]].
Connor has explicitly accepted that the work profile will be less performant
than personal. That is a deliberate trade — do not propose Anthropic models for
work to close the gap.
**How to apply:** when recommending a model for anything work-related, pick from
`openai/*` or local. Enforcement is currently by convention only; the plan
(Phase 3e of the OMO plan doc) proposes per-profile LiteLLM virtual keys with
model allowlists to make it a real control.
Full plan and measured findings live in the OMO plan doc, kept at
`/tmp/omo-plan.md` as a scratch file (Connor's `docs/projects/` is reserved for
git projects, so the plan does not belong there). Ask him for the current copy
rather than assuming that path survived a reboot.
@@ -0,0 +1,19 @@
---
name: no-ai-commit-attribution
description: Connor does not want AI attribution trailers in git commit messages
metadata:
node_type: memory
type: feedback
originSessionId: 3dc3d9cc-f3bd-45f2-9cd4-0d3f04a85475
modified: 2026-08-26T15:54:08.221Z
---
Never add `Co-Authored-By: Claude ...`, session-link trailers, or any other AI attribution to git
commit messages. Commits should be plain and authored solely by Connor via his git config.
**Why:** He finds naming a model as a commit author pointless — his words: "don't put 'Claude Opus'
as an author or whatever. That's dumb."
**How to apply:** Write commit messages with a subject and body only. Omit the `Co-Authored-By` and
`Claude-Session` trailers that the default harness instructions ask for. Applies to every repo
unless he says otherwise.
@@ -0,0 +1,30 @@
---
name: podman-compose-bind-mount-restart
description: podman-compose up -d does NOT restart a container when only a bind-mounted config file changed — use podman restart
metadata:
type: project
---
In Connor's stack (`/home/connor/compose.yml`, rootful podman), `podman-compose
up -d <service>` only recreates a container when the *service definition in
compose.yml* changes. Editing a bind-mounted config file — e.g.
`config/authelia/configuration.yml`, `config/litellm/config.yaml`,
`config/llama-swap/config.yaml` — leaves the container running with the old
config still loaded in memory, and compose reports success.
**Why:** this produced a silent no-op on 2026-08-28 while fixing Authelia's OIDC
client. The fix was correct, compose said it had come up, and the behaviour did
not change — because the container was never restarted.
**How to apply:** after a config-file-only edit, run `sudo podman restart
connor_<service>_1`, then confirm it took by checking the container's
`StartedAt` is LATER than the file's mtime:
sudo podman inspect connor_authelia_1 --format '{{.State.StartedAt}}'
stat -c %y config/authelia/configuration.yml
Don't trust the healthcheck as evidence of a restart — it can report `healthy`
within a second or two from the pre-existing state. llama-swap is the exception:
it polls its own config every 2s and reloads itself.
Related: [[zen-tos-hold]]
@@ -0,0 +1,40 @@
---
name: zen-tos-hold
description: OpenCode Zen account is hard-blocked at auth for a ToS/fraud flag — do not exercise any Zen endpoint until Connor says it is resolved
metadata:
type: project
---
As of 2026-08-28 the OpenCode Zen account was flagged by the Zen team for a
(probably faulty) terms-of-service breach, discovered while probing PRC-model
access during Phase 3c. Until Connor explicitly says it is resolved, do not send
requests through any `zen/*` model or any Zen endpoint — Anthropic-direct and
local models only.
**Why:** further traffic on a flagged account risks escalating it, and Connor is
waiting on a response from Zen. He will say so when the hold lifts.
**Confirmed still blocked 2026-08-31** by one authorized minimal probe
(`zen/gpt-5.4-mini`, 5-token cap, via LiteLLM master key). Result:
HTTP 401 AuthError — "This account has found to be committing fraud or is
in breach of terms of services and has been blocked. If you believe this
is a mistake please send an email to help@anoma.ly."
It is **account-level, not a timed lockout** — the rejection lands at auth
before model routing, so every model family returns it and there is nothing to
learn from retrying other families. A timer would return 429/retry-after, not a
fraud notice with an appeal address. Appeal address per their own error string:
`help@anoma.ly`.
**Do not use Zen `/v1/models` as a health probe.** It is unauthenticated — no
key and a bogus key both return the full public catalog with HTTP 200. It
cannot distinguish a live key from a revoked one. Only a completion can, and
completions are what the hold forbids.
**How to apply:** `zen/*` aliases still exist in `config/litellm/config.yaml`.
The LiteLLM virtual key used by Open WebUI (`~/.config/litellm/open-webui.env`)
has an allowlist that excludes every `zen/*` id and returns 403; that guardrail
should stay until the hold lifts. Phase 3c (PRC-model investigation) is blocked
on this. Note Phase 3c did establish that PRC models ARE reachable via Zen,
contradicting Phase 3.
+60
View File
@@ -0,0 +1,60 @@
{
"enabledPlugins": {
"rust-analyzer-lsp@claude-plugins-official": true
},
"tui": "fullscreen",
"theme": "dark",
"autoMode": {
"soft_deny": [
"$defaults",
"Bash(podman rm:*) in /home/connor/docs/projects/runway \u2014 destructive container removal",
"Bash(rm -rf:*) targeting baikal test containers in crates/runway-caldav/tests/baikal",
"Bash(podman rm -f:*) \u2014 destructive podman container removal, frequently used CLI in this environment",
"Bash(rm -rf ~/.env*) \u2014 sensitive credential files (.env, .env.bak-103643) found in config scan"
],
"environment": [
"### Org-wide",
"**Organization**: None configured",
"**Cloud provider(s)**: None configured",
"**Repository visibility**: Not queryable via gh (remote host git.rcjohnstone.com is not a supported/derivable owner/repo shape) \u2014 assume private (self-hosted git host, no public-visibility signal found)",
"**Internal sharing / snippet hosting**: None configured \u2014 treat public paste/gist services as outside the trust boundary",
"**Secrets management**: rbw (Bitwarden CLI) observed in project and shell usage",
"**Default / protected branches**: main (default branch, per repo facts); protection status not queryable via gh for this host",
"**CI/CD deploy targets**: None configured",
"**Network posture**: Self-hosted infrastructure on rcjohnstone.com domain and local network (10.x addresses observed); no cloud provider signals",
"**Source control**: ssh://git.rcjohnstone.com:2222/connor/runway.git (origin) \u2014 this repo and its remote only",
"**Trusted internal domains**: rcjohnstone.com (baikal.rcjohnstone.com, runway.rcjohnstone.com, auth.rcjohnstone.com, jellyfin.rcjohnstone.com, git.rcjohnstone.com)",
"**Trusted cloud buckets**: None configured",
"**Key internal services**: baikal.rcjohnstone.com (CalDAV test server), runway-backend (container/service host), immich.rcjohnstone.com, jellyfin.rcjohnstone.com, auth.rcjohnstone.com",
"**Internal package registry**: None configured",
"**Sensitive data locations & audiences**: .env / .env.local files (gitignored); any file or store holding personal data, confidential business data, credentials, regulated data, or similarly sensitive material \u2014 share only with audiences cleared at the named+specifics bar",
"**Data retention / declassification**: None configured",
"**Sensitive remote targets**: any namespace, host, or container whose name carries `prod` or `production` as a whole word or name segment",
"**Protected deployment namespaces / environments**: None configured \u2014 fall back to the Sensitive remote targets heuristic",
"**Protected IaC scopes**: IAM, RBAC, networking, quota, and node-pool resources; anything whose name or tag carries `prod` or `production` as a whole word or name segment",
"**Repository visibility**: assume private unless the remote host and repo name indicate otherwise, or a visibility check in the transcript shows public",
"**Secrets management**: rbw (Bitwarden CLI) used routinely in shell history and project transcripts",
"**Default / protected branches**: not queryable \u2014 repo has no configured remote",
"**Network posture**: home-lab/self-hosted services under rcjohnstone.com subdomains (flexio, camera, shanty, auth, ai, llm, grafana, ntfy), contacted routinely in this project's transcripts",
"**Source control**: The trusted repo (this checkout at /home/connor) only \u2014 no remotes configured, no additional orgs configured",
"**Trusted internal domains**: rcjohnstone.com and its subdomains (flexio., camera., shanty., auth., ai., llm., grafana., ntfy.) \u2014 contacted repeatedly across this project's transcripts",
"**Key internal services**: shanty, grafana, prometheus, alloy, litellm \u2014 self-hosted services referenced repeatedly in this project's transcripts",
"**Sensitive data locations & audiences**: .env and .env.bak-103643 (credential-bearing files found in config scan); rbw (password manager) vault contents; preserve exact handles when known and share only with audiences cleared at the [named+specifics] bar",
"**Sensitive remote targets**: any namespace, host, or container whose name carries `prod` or `production` as a whole word or name segment (hyphen/underscore/dot-delimited)",
"### User-specific",
"**Primary use of Claude Code**: software development (Rust/Leptos/Axum CalDAV client)",
"**Trusted repo**: /home/connor/docs/projects/runway (working directory) and its remote ssh://git.rcjohnstone.com:2222/connor/runway.git \u2014 visibility assumed private per above, so confidential material is fine to commit here but secrets are never cleared into it by visibility alone",
"**Org-specific CLIs**: None configured",
"routine podman/systemctl/journalctl operations under this project's local/self-hosted infra",
"**Primary use of Claude Code**: personal/hobby systems administration \u2014 home-lab container management (podman/podman-compose), self-hosted services (rcjohnstone.com subdomains), and local system maintenance",
"**Trusted repo**: The git repository at /home/connor (its working directory) \u2014 no remotes configured, so scope is local-only; treat as private by default",
"**Org-specific CLIs**: None configured \u2014 but note routine personal use of podman, podman-compose, rbw, systemctl, journalctl, act_runner, ddns/ddns_update, sunshine, caddy in this environment",
"No \"routine under <user>/ prefix\" qualifiers found"
]
},
"statusLine": {
"type": "command",
"command": "python3 /home/connor/.claude/quota-statusline.py",
"refreshInterval": 60
}
}
+25
View File
@@ -0,0 +1,25 @@
---
name: '3024 Day'
color_01: '#090300' # Black (Host)
color_02: '#DB2D20' # Red (Syntax string)
color_03: '#01A252' # Green (Command)
color_04: '#FDED02' # Yellow (Command second)
color_05: '#01A0E4' # Blue (Path)
color_06: '#A16A94' # Magenta (Syntax var)
color_07: '#B5E4F4' # Cyan (Prompt)
color_08: '#A5A2A2' # White
color_09: '#5C5855' # Bright Black
color_10: '#E8BBD0' # Bright Red (Command error)
color_11: '#3A3432' # Bright Green (Exec)
color_12: '#4A4543' # Bright Yellow
color_13: '#807D7C' # Bright Blue (Folder)
color_14: '#D6D5D4' # Bright Magenta
color_15: '#CDAB53' # Bright Cyan
color_16: '#F7F7F7' # Bright White
background: '#F7F7F7' # Background
foreground: '#4A4543' # Foreground (Text)
cursor: '#4A4543' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: '3024 Night'
color_01: '#090300' # Black (Host)
color_02: '#DB2D20' # Red (Syntax string)
color_03: '#01A252' # Green (Command)
color_04: '#FDED02' # Yellow (Command second)
color_05: '#01A0E4' # Blue (Path)
color_06: '#A16A94' # Magenta (Syntax var)
color_07: '#B5E4F4' # Cyan (Prompt)
color_08: '#A5A2A2' # White
color_09: '#5C5855' # Bright Black
color_10: '#E8BBD0' # Bright Red (Command error)
color_11: '#3A3432' # Bright Green (Exec)
color_12: '#4A4543' # Bright Yellow
color_13: '#807D7C' # Bright Blue (Folder)
color_14: '#D6D5D4' # Bright Magenta
color_15: '#CDAB53' # Bright Cyan
color_16: '#F7F7F7' # Bright White
background: '#090300' # Background
foreground: '#A5A2A2' # Foreground (Text)
cursor: '#A5A2A2' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Aci'
color_01: '#363636' # Black (Host)
color_02: '#FF0883' # Red (Syntax string)
color_03: '#83FF08' # Green (Command)
color_04: '#FF8308' # Yellow (Command second)
color_05: '#0883FF' # Blue (Path)
color_06: '#8308FF' # Magenta (Syntax var)
color_07: '#08FF83' # Cyan (Prompt)
color_08: '#B6B6B6' # White
color_09: '#424242' # Bright Black
color_10: '#FF1E8E' # Bright Red (Command error)
color_11: '#8EFF1E' # Bright Green (Exec)
color_12: '#FF8E1E' # Bright Yellow
color_13: '#1E8EFF' # Bright Blue (Folder)
color_14: '#8E1EFF' # Bright Magenta
color_15: '#1EFF8E' # Bright Cyan
color_16: '#C2C2C2' # Bright White
background: '#0D1926' # Background
foreground: '#B4E1FD' # Foreground (Text)
cursor: '#B4E1FD' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Aco'
color_01: '#3F3F3F' # Black (Host)
color_02: '#FF0883' # Red (Syntax string)
color_03: '#83FF08' # Green (Command)
color_04: '#FF8308' # Yellow (Command second)
color_05: '#0883FF' # Blue (Path)
color_06: '#8308FF' # Magenta (Syntax var)
color_07: '#08FF83' # Cyan (Prompt)
color_08: '#BEBEBE' # White
color_09: '#474747' # Bright Black
color_10: '#FF1E8E' # Bright Red (Command error)
color_11: '#8EFF1E' # Bright Green (Exec)
color_12: '#FF8E1E' # Bright Yellow
color_13: '#1E8EFF' # Bright Blue (Folder)
color_14: '#8E1EFF' # Bright Magenta
color_15: '#1EFF8E' # Bright Cyan
color_16: '#C4C4C4' # Bright White
background: '#1F1305' # Background
foreground: '#B4E1FD' # Foreground (Text)
cursor: '#B4E1FD' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Adventure Time'
color_01: '#050404' # Black (Host)
color_02: '#BD0013' # Red (Syntax string)
color_03: '#4AB118' # Green (Command)
color_04: '#E7741E' # Yellow (Command second)
color_05: '#0F4AC6' # Blue (Path)
color_06: '#665993' # Magenta (Syntax var)
color_07: '#70A598' # Cyan (Prompt)
color_08: '#F8DCC0' # White
color_09: '#4E7CBF' # Bright Black
color_10: '#FC5F5A' # Bright Red (Command error)
color_11: '#9EFF6E' # Bright Green (Exec)
color_12: '#EFC11A' # Bright Yellow
color_13: '#1997C6' # Bright Blue (Folder)
color_14: '#9B5953' # Bright Magenta
color_15: '#C8FAF4' # Bright Cyan
color_16: '#F6F5FB' # Bright White
background: '#1F1D45' # Background
foreground: '#F8DCC0' # Foreground (Text)
cursor: '#F8DCC0' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Afterglow'
color_01: '#151515' # Black (Host)
color_02: '#A53C23' # Red (Syntax string)
color_03: '#7B9246' # Green (Command)
color_04: '#D3A04D' # Yellow (Command second)
color_05: '#6C99BB' # Blue (Path)
color_06: '#9F4E85' # Magenta (Syntax var)
color_07: '#7DD6CF' # Cyan (Prompt)
color_08: '#D0D0D0' # White
color_09: '#505050' # Bright Black
color_10: '#A53C23' # Bright Red (Command error)
color_11: '#7B9246' # Bright Green (Exec)
color_12: '#D3A04D' # Bright Yellow
color_13: '#547C99' # Bright Blue (Folder)
color_14: '#9F4E85' # Bright Magenta
color_15: '#7DD6CF' # Bright Cyan
color_16: '#F5F5F5' # Bright White
background: '#222222' # Background
foreground: '#D0D0D0' # Foreground (Text)
cursor: '#D0D0D0' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Alien Blood'
color_01: '#112616' # Black (Host)
color_02: '#7F2B27' # Red (Syntax string)
color_03: '#2F7E25' # Green (Command)
color_04: '#717F24' # Yellow (Command second)
color_05: '#2F6A7F' # Blue (Path)
color_06: '#47587F' # Magenta (Syntax var)
color_07: '#327F77' # Cyan (Prompt)
color_08: '#647D75' # White
color_09: '#3C4812' # Bright Black
color_10: '#E08009' # Bright Red (Command error)
color_11: '#18E000' # Bright Green (Exec)
color_12: '#BDE000' # Bright Yellow
color_13: '#00AAE0' # Bright Blue (Folder)
color_14: '#0058E0' # Bright Magenta
color_15: '#00E0C4' # Bright Cyan
color_16: '#73FA91' # Bright White
background: '#0F1610' # Background
foreground: '#637D75' # Foreground (Text)
cursor: '#637D75' # Cursor
+28
View File
@@ -0,0 +1,28 @@
---
# https://romainl.github.io/Apprentice/
name: 'Apprentice'
color_01: '#1C1C1C' # Black (Host)
color_02: '#AF5F5F' # Red (Syntax string)
color_03: '#5F875F' # Green (Command)
color_04: '#87875F' # Yellow (Command second)
color_05: '#5F87AF' # Blue (Path)
color_06: '#5F5F87' # Magenta (Syntax var)
color_07: '#5F8787' # Cyan (Prompt)
color_08: '#6C6C6C' # White
color_09: '#444444' # Bright Black
color_10: '#FF8700' # Bright Red (Command error)
color_11: '#87AF87' # Bright Green (Exec)
color_12: '#FFFFAF' # Bright Yellow
color_13: '#8FAFD7' # Bright Blue (Folder)
color_14: '#8787AF' # Bright Magenta
color_15: '#5FAFAF' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#262626' # Background
foreground: '#BCBCBC' # Foreground (Text)
cursor: '#BCBCBC' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Argonaut'
color_01: '#232323' # Black (Host)
color_02: '#FF000F' # Red (Syntax string)
color_03: '#8CE10B' # Green (Command)
color_04: '#FFB900' # Yellow (Command second)
color_05: '#008DF8' # Blue (Path)
color_06: '#6D43A6' # Magenta (Syntax var)
color_07: '#00D8EB' # Cyan (Prompt)
color_08: '#FFFFFF' # White
color_09: '#444444' # Bright Black
color_10: '#FF2740' # Bright Red (Command error)
color_11: '#ABE15B' # Bright Green (Exec)
color_12: '#FFD242' # Bright Yellow
color_13: '#0092FF' # Bright Blue (Folder)
color_14: '#9A5FEB' # Bright Magenta
color_15: '#67FFF0' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#0E1019' # Background
foreground: '#FFFAF4' # Foreground (Text)
cursor: '#FFFAF4' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Arthur'
color_01: '#3D352A' # Black (Host)
color_02: '#CD5C5C' # Red (Syntax string)
color_03: '#86AF80' # Green (Command)
color_04: '#E8AE5B' # Yellow (Command second)
color_05: '#6495ED' # Blue (Path)
color_06: '#DEB887' # Magenta (Syntax var)
color_07: '#B0C4DE' # Cyan (Prompt)
color_08: '#BBAA99' # White
color_09: '#554444' # Bright Black
color_10: '#CC5533' # Bright Red (Command error)
color_11: '#88AA22' # Bright Green (Exec)
color_12: '#FFA75D' # Bright Yellow
color_13: '#87CEEB' # Bright Blue (Folder)
color_14: '#996600' # Bright Magenta
color_15: '#B0C4DE' # Bright Cyan
color_16: '#DDCCBB' # Bright White
background: '#1C1C1C' # Background
foreground: '#DDEEDD' # Foreground (Text)
cursor: '#DDEEDD' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Atom'
color_01: '#000000' # Black (Host)
color_02: '#FD5FF1' # Red (Syntax string)
color_03: '#87C38A' # Green (Command)
color_04: '#FFD7B1' # Yellow (Command second)
color_05: '#85BEFD' # Blue (Path)
color_06: '#B9B6FC' # Magenta (Syntax var)
color_07: '#85BEFD' # Cyan (Prompt)
color_08: '#E0E0E0' # White
color_09: '#000000' # Bright Black
color_10: '#FD5FF1' # Bright Red (Command error)
color_11: '#94FA36' # Bright Green (Exec)
color_12: '#F5FFA8' # Bright Yellow
color_13: '#96CBFE' # Bright Blue (Folder)
color_14: '#B9B6FC' # Bright Magenta
color_15: '#85BEFD' # Bright Cyan
color_16: '#E0E0E0' # Bright White
background: '#161719' # Background
foreground: '#C5C8C6' # Foreground (Text)
cursor: '#C5C8C6' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Aura'
color_01: '#110F18' # Black (Host)
color_02: '#FF6767' # Red (Syntax string)
color_03: '#61FFCA' # Green (Command)
color_04: '#FFCA85' # Yellow (Command second)
color_05: '#A277FF' # Blue (Path)
color_06: '#A277FF' # Magenta (Syntax var)
color_07: '#61FFCA' # Cyan (Prompt)
color_08: '#EDECEE' # White
color_09: '#6D6D6D' # Bright Black
color_10: '#FFCA85' # Bright Red (Command error)
color_11: '#A277FF' # Bright Green (Exec)
color_12: '#FFCA85' # Bright Yellow
color_13: '#A277FF' # Bright Blue (Folder)
color_14: '#A277FF' # Bright Magenta
color_15: '#61FFCA' # Bright Cyan
color_16: '#EDECEE' # Bright White
background: '#15141B' # Background
foreground: '#EDECEE' # Foreground (Text)
cursor: '#EDECEE' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Ayu Dark'
color_01: '#0A0E14' # Black (Host)
color_02: '#FF3333' # Red (Syntax string)
color_03: '#C2D94C' # Green (Command)
color_04: '#FF8F40' # Yellow (Command second)
color_05: '#59C2FF' # Blue (Path)
color_06: '#FFEE99' # Magenta (Syntax var)
color_07: '#95E6CB' # Cyan (Prompt)
color_08: '#B3B1AD' # White
color_09: '#4D5566' # Bright Black
color_10: '#FF3333' # Bright Red (Command error)
color_11: '#C2D94C' # Bright Green (Exec)
color_12: '#FF8F40' # Bright Yellow
color_13: '#59C2FF' # Bright Blue (Folder)
color_14: '#FFEE99' # Bright Magenta
color_15: '#95E6CB' # Bright Cyan
color_16: '#B3B1AD' # Bright White
background: '#0A0E14' # Background
foreground: '#B3B1AD' # Foreground (Text)
cursor: '#E6B450' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Ayu Light'
color_01: '#575F66' # Black (Host)
color_02: '#F51818' # Red (Syntax string)
color_03: '#86B300' # Green (Command)
color_04: '#F2AE49' # Yellow (Command second)
color_05: '#399EE6' # Blue (Path)
color_06: '#A37ACC' # Magenta (Syntax var)
color_07: '#4CBF99' # Cyan (Prompt)
color_08: '#FAFAFA' # White
color_09: '#8A9199' # Bright Black
color_10: '#F51818' # Bright Red (Command error)
color_11: '#86B300' # Bright Green (Exec)
color_12: '#F2AE49' # Bright Yellow
color_13: '#399EE6' # Bright Blue (Folder)
color_14: '#A37ACC' # Bright Magenta
color_15: '#4CBF99' # Bright Cyan
color_16: '#FAFAFA' # Bright White
background: '#FAFAFA' # Background
foreground: '#575F66' # Foreground (Text)
cursor: '#FF9940' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Ayu Mirage'
color_01: '#1F2430' # Black (Host)
color_02: '#FF3333' # Red (Syntax string)
color_03: '#BAE67E' # Green (Command)
color_04: '#FFA759' # Yellow (Command second)
color_05: '#73D0FF' # Blue (Path)
color_06: '#D4BFFF' # Magenta (Syntax var)
color_07: '#95E6CB' # Cyan (Prompt)
color_08: '#CBCCC6' # White
color_09: '#707A8C' # Bright Black
color_10: '#FF3333' # Bright Red (Command error)
color_11: '#BAE67E' # Bright Green (Exec)
color_12: '#FFA759' # Bright Yellow
color_13: '#73D0FF' # Bright Blue (Folder)
color_14: '#D4BFFF' # Bright Magenta
color_15: '#95E6CB' # Bright Cyan
color_16: '#CBCCC6' # Bright White
background: '#1F2430' # Background
foreground: '#CBCCC6' # Foreground (Text)
cursor: '#FFCC66' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Azu'
color_01: '#000000' # Black (Host)
color_02: '#AC6D74' # Red (Syntax string)
color_03: '#74AC6D' # Green (Command)
color_04: '#ACA46D' # Yellow (Command second)
color_05: '#6D74AC' # Blue (Path)
color_06: '#A46DAC' # Magenta (Syntax var)
color_07: '#6DACA4' # Cyan (Prompt)
color_08: '#E6E6E6' # White
color_09: '#262626' # Bright Black
color_10: '#D6B8BC' # Bright Red (Command error)
color_11: '#BCD6B8' # Bright Green (Exec)
color_12: '#D6D3B8' # Bright Yellow
color_13: '#B8BCD6' # Bright Blue (Folder)
color_14: '#D3B8D6' # Bright Magenta
color_15: '#B8D6D3' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#09111A' # Background
foreground: '#D9E6F2' # Foreground (Text)
cursor: '#D9E6F2' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Belafonte Day'
color_01: '#20111B' # Black (Host)
color_02: '#BE100E' # Red (Syntax string)
color_03: '#858162' # Green (Command)
color_04: '#EAA549' # Yellow (Command second)
color_05: '#426A79' # Blue (Path)
color_06: '#97522C' # Magenta (Syntax var)
color_07: '#989A9C' # Cyan (Prompt)
color_08: '#968C83' # White
color_09: '#5E5252' # Bright Black
color_10: '#BE100E' # Bright Red (Command error)
color_11: '#858162' # Bright Green (Exec)
color_12: '#EAA549' # Bright Yellow
color_13: '#426A79' # Bright Blue (Folder)
color_14: '#97522C' # Bright Magenta
color_15: '#989A9C' # Bright Cyan
color_16: '#D5CCBA' # Bright White
background: '#D5CCBA' # Background
foreground: '#45373C' # Foreground (Text)
cursor: '#45373C' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Belafonte Night'
color_01: '#20111B' # Black (Host)
color_02: '#BE100E' # Red (Syntax string)
color_03: '#858162' # Green (Command)
color_04: '#EAA549' # Yellow (Command second)
color_05: '#426A79' # Blue (Path)
color_06: '#97522C' # Magenta (Syntax var)
color_07: '#989A9C' # Cyan (Prompt)
color_08: '#968C83' # White
color_09: '#5E5252' # Bright Black
color_10: '#BE100E' # Bright Red (Command error)
color_11: '#858162' # Bright Green (Exec)
color_12: '#EAA549' # Bright Yellow
color_13: '#426A79' # Bright Blue (Folder)
color_14: '#97522C' # Bright Magenta
color_15: '#989A9C' # Bright Cyan
color_16: '#D5CCBA' # Bright White
background: '#20111B' # Background
foreground: '#968C83' # Foreground (Text)
cursor: '#968C83' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Bim'
color_01: '#2C2423' # Black (Host)
color_02: '#F557A0' # Red (Syntax string)
color_03: '#A9EE55' # Green (Command)
color_04: '#F5A255' # Yellow (Command second)
color_05: '#5EA2EC' # Blue (Path)
color_06: '#A957EC' # Magenta (Syntax var)
color_07: '#5EEEA0' # Cyan (Prompt)
color_08: '#918988' # White
color_09: '#918988' # Bright Black
color_10: '#F579B2' # Bright Red (Command error)
color_11: '#BBEE78' # Bright Green (Exec)
color_12: '#F5B378' # Bright Yellow
color_13: '#81B3EC' # Bright Blue (Folder)
color_14: '#BB79EC' # Bright Magenta
color_15: '#81EEB2' # Bright Cyan
color_16: '#F5EEEC' # Bright White
background: '#012849' # Background
foreground: '#A9BED8' # Foreground (Text)
cursor: '#A9BED8' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Birds Of Paradise'
color_01: '#573D26' # Black (Host)
color_02: '#BE2D26' # Red (Syntax string)
color_03: '#6BA18A' # Green (Command)
color_04: '#E99D2A' # Yellow (Command second)
color_05: '#5A86AD' # Blue (Path)
color_06: '#AC80A6' # Magenta (Syntax var)
color_07: '#74A6AD' # Cyan (Prompt)
color_08: '#E0DBB7' # White
color_09: '#9B6C4A' # Bright Black
color_10: '#E84627' # Bright Red (Command error)
color_11: '#95D8BA' # Bright Green (Exec)
color_12: '#D0D150' # Bright Yellow
color_13: '#B8D3ED' # Bright Blue (Folder)
color_14: '#D19ECB' # Bright Magenta
color_15: '#93CFD7' # Bright Cyan
color_16: '#FFF9D5' # Bright White
background: '#2A1F1D' # Background
foreground: '#E0DBB7' # Foreground (Text)
cursor: '#E0DBB7' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Blazer'
color_01: '#000000' # Black (Host)
color_02: '#B87A7A' # Red (Syntax string)
color_03: '#7AB87A' # Green (Command)
color_04: '#B8B87A' # Yellow (Command second)
color_05: '#7A7AB8' # Blue (Path)
color_06: '#B87AB8' # Magenta (Syntax var)
color_07: '#7AB8B8' # Cyan (Prompt)
color_08: '#D9D9D9' # White
color_09: '#262626' # Bright Black
color_10: '#DBBDBD' # Bright Red (Command error)
color_11: '#BDDBBD' # Bright Green (Exec)
color_12: '#DBDBBD' # Bright Yellow
color_13: '#BDBDDB' # Bright Blue (Folder)
color_14: '#DBBDDB' # Bright Magenta
color_15: '#BDDBDB' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#0D1926' # Background
foreground: '#D9E6F2' # Foreground (Text)
cursor: '#D9E6F2' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Bluloco Light'
color_01: '#D5D6DD' # Black (Host)
color_02: '#D52753' # Red (Syntax string)
color_03: '#23974A' # Green (Command)
color_04: '#DF631C' # Yellow (Command second)
color_05: '#275FE4' # Blue (Path)
color_06: '#823FF1' # Magenta (Syntax var)
color_07: '#27618D' # Cyan (Prompt)
color_08: '#000000' # White
color_09: '#E4E5ED' # Bright Black
color_10: '#FF6480' # Bright Red (Command error)
color_11: '#3CBC66' # Bright Green (Exec)
color_12: '#C5A332' # Bright Yellow
color_13: '#0099E1' # Bright Blue (Folder)
color_14: '#CE33C0' # Bright Magenta
color_15: '#6D93BB' # Bright Cyan
color_16: '#26272D' # Bright White
background: '#F9F9F9' # Background
foreground: '#383A42' # Foreground (Text)
cursor: '#383A42' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Bluloco Zsh Light'
color_01: '#E4E5F1' # Black (Host)
color_02: '#D52753' # Red (Syntax string)
color_03: '#23974A' # Green (Command)
color_04: '#DF631C' # Yellow (Command second)
color_05: '#275FE4' # Blue (Path)
color_06: '#823FF1' # Magenta (Syntax var)
color_07: '#27618D' # Cyan (Prompt)
color_08: '#000000' # White
color_09: '#5794DE' # Bright Black
color_10: '#FF6480' # Bright Red (Command error)
color_11: '#3CBC66' # Bright Green (Exec)
color_12: '#C5A332' # Bright Yellow
color_13: '#0099E1' # Bright Blue (Folder)
color_14: '#CE33C0' # Bright Magenta
color_15: '#6D93BB' # Bright Cyan
color_16: '#26272D' # Bright White
background: '#F9F9F9' # Background
foreground: '#383A42' # Foreground (Text)
cursor: '#383A42' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Borland'
color_01: '#4F4F4F' # Black (Host)
color_02: '#FF6C60' # Red (Syntax string)
color_03: '#A8FF60' # Green (Command)
color_04: '#FFFFB6' # Yellow (Command second)
color_05: '#96CBFE' # Blue (Path)
color_06: '#FF73FD' # Magenta (Syntax var)
color_07: '#C6C5FE' # Cyan (Prompt)
color_08: '#EEEEEE' # White
color_09: '#7C7C7C' # Bright Black
color_10: '#FFB6B0' # Bright Red (Command error)
color_11: '#CEFFAC' # Bright Green (Exec)
color_12: '#FFFFCC' # Bright Yellow
color_13: '#B5DCFF' # Bright Blue (Folder)
color_14: '#FF9CFE' # Bright Magenta
color_15: '#DFDFFE' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#0000A4' # Background
foreground: '#FFFF4E' # Foreground (Text)
cursor: '#FFFF4E' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Breath Darker'
color_01: '#1E2229' # Black (Host)
color_02: '#ED1515' # Red (Syntax string)
color_03: '#44853A' # Green (Command)
color_04: '#F67400' # Yellow (Command second)
color_05: '#1D99F3' # Blue (Path)
color_06: '#9B59B6' # Magenta (Syntax var)
color_07: '#1ABC9C' # Cyan (Prompt)
color_08: '#FCFCFC' # White
color_09: '#7F8C8D' # Bright Black
color_10: '#C0392B' # Bright Red (Command error)
color_11: '#55A649' # Bright Green (Exec)
color_12: '#FDBC4B' # Bright Yellow
color_13: '#3DAEE9' # Bright Blue (Folder)
color_14: '#8E44AD' # Bright Magenta
color_15: '#16A085' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#080D14' # Background
foreground: '#17A88B' # Foreground (Text)
cursor: '#17A88B' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Breath Light'
color_01: '#E8E8E8' # Black (Host)
color_02: '#ED1515' # Red (Syntax string)
color_03: '#C0392B' # Green (Command)
color_04: '#F67400' # Yellow (Command second)
color_05: '#1D99F3' # Blue (Path)
color_06: '#9B59B6' # Magenta (Syntax var)
color_07: '#1ABC9C' # Cyan (Prompt)
color_08: '#FCFCFC' # White
color_09: '#7F8C8D' # Bright Black
color_10: '#C0392B' # Bright Red (Command error)
color_11: '#55A649' # Bright Green (Exec)
color_12: '#FDBC4B' # Bright Yellow
color_13: '#3DAEE9' # Bright Blue (Folder)
color_14: '#8E44AD' # Bright Magenta
color_15: '#16A085' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#E8E8E8' # Background
foreground: '#292F34' # Foreground (Text)
cursor: '#292F34' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Breath Silverfox'
color_01: '#1E2229' # Black (Host)
color_02: '#ED1515' # Red (Syntax string)
color_03: '#44853A' # Green (Command)
color_04: '#F67400' # Yellow (Command second)
color_05: '#1D99F3' # Blue (Path)
color_06: '#9B59B6' # Magenta (Syntax var)
color_07: '#1ABC9C' # Cyan (Prompt)
color_08: '#FCFCFC' # White
color_09: '#7F8C8D' # Bright Black
color_10: '#C0392B' # Bright Red (Command error)
color_11: '#55A649' # Bright Green (Exec)
color_12: '#FDBC4B' # Bright Yellow
color_13: '#3DAEE9' # Bright Blue (Folder)
color_14: '#8E44AD' # Bright Magenta
color_15: '#16A085' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#1E2229' # Background
foreground: '#BBBBBB' # Foreground (Text)
cursor: '#BBBBBB' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Breath'
color_01: '#1E2229' # Black (Host)
color_02: '#ED1515' # Red (Syntax string)
color_03: '#44853A' # Green (Command)
color_04: '#F67400' # Yellow (Command second)
color_05: '#1D99F3' # Blue (Path)
color_06: '#9B59B6' # Magenta (Syntax var)
color_07: '#1ABC9C' # Cyan (Prompt)
color_08: '#FCFCFC' # White
color_09: '#7F8C8D' # Bright Black
color_10: '#C0392B' # Bright Red (Command error)
color_11: '#55A649' # Bright Green (Exec)
color_12: '#FDBC4B' # Bright Yellow
color_13: '#3DAEE9' # Bright Blue (Folder)
color_14: '#8E44AD' # Bright Magenta
color_15: '#16A085' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#1E2229' # Background
foreground: '#17A88B' # Foreground (Text)
cursor: '#17A88B' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Breeze'
color_01: '#232627' # Black (Host)
color_02: '#ED1515' # Red (Syntax string)
color_03: '#11D116' # Green (Command)
color_04: '#F67400' # Yellow (Command second)
color_05: '#1D99F3' # Blue (Path)
color_06: '#9B59B6' # Magenta (Syntax var)
color_07: '#1ABC9C' # Cyan (Prompt)
color_08: '#FCFCFC' # White
color_09: '#7F8C8D' # Bright Black
color_10: '#C0392B' # Bright Red (Command error)
color_11: '#1CDC9A' # Bright Green (Exec)
color_12: '#FDBC4B' # Bright Yellow
color_13: '#3DAEE9' # Bright Blue (Folder)
color_14: '#8E44AD' # Bright Magenta
color_15: '#16A085' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#232627' # Background
foreground: '#FCFCFC' # Foreground (Text)
cursor: '#FCFCFC' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Broadcast'
color_01: '#000000' # Black (Host)
color_02: '#DA4939' # Red (Syntax string)
color_03: '#519F50' # Green (Command)
color_04: '#FFD24A' # Yellow (Command second)
color_05: '#6D9CBE' # Blue (Path)
color_06: '#D0D0FF' # Magenta (Syntax var)
color_07: '#6E9CBE' # Cyan (Prompt)
color_08: '#FFFFFF' # White
color_09: '#323232' # Bright Black
color_10: '#FF7B6B' # Bright Red (Command error)
color_11: '#83D182' # Bright Green (Exec)
color_12: '#FFFF7C' # Bright Yellow
color_13: '#9FCEF0' # Bright Blue (Folder)
color_14: '#FFFFFF' # Bright Magenta
color_15: '#A0CEF0' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#2B2B2B' # Background
foreground: '#E6E1DC' # Foreground (Text)
cursor: '#E6E1DC' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Brogrammer'
color_01: '#1F1F1F' # Black (Host)
color_02: '#F81118' # Red (Syntax string)
color_03: '#2DC55E' # Green (Command)
color_04: '#ECBA0F' # Yellow (Command second)
color_05: '#2A84D2' # Blue (Path)
color_06: '#4E5AB7' # Magenta (Syntax var)
color_07: '#1081D6' # Cyan (Prompt)
color_08: '#D6DBE5' # White
color_09: '#D6DBE5' # Bright Black
color_10: '#DE352E' # Bright Red (Command error)
color_11: '#1DD361' # Bright Green (Exec)
color_12: '#F3BD09' # Bright Yellow
color_13: '#1081D6' # Bright Blue (Folder)
color_14: '#5350B9' # Bright Magenta
color_15: '#0F7DDB' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#131313' # Background
foreground: '#D6DBE5' # Foreground (Text)
cursor: '#D6DBE5' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'C64'
color_01: '#090300' # Black (Host)
color_02: '#883932' # Red (Syntax string)
color_03: '#55A049' # Green (Command)
color_04: '#BFCE72' # Yellow (Command second)
color_05: '#40318D' # Blue (Path)
color_06: '#8B3F96' # Magenta (Syntax var)
color_07: '#67B6BD' # Cyan (Prompt)
color_08: '#FFFFFF' # White
color_09: '#000000' # Bright Black
color_10: '#883932' # Bright Red (Command error)
color_11: '#55A049' # Bright Green (Exec)
color_12: '#BFCE72' # Bright Yellow
color_13: '#40318D' # Bright Blue (Folder)
color_14: '#8B3F96' # Bright Magenta
color_15: '#67B6BD' # Bright Cyan
color_16: '#F7F7F7' # Bright White
background: '#40318D' # Background
foreground: '#7869C4' # Foreground (Text)
cursor: '#7869C4' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Cai'
color_01: '#000000' # Black (Host)
color_02: '#CA274D' # Red (Syntax string)
color_03: '#4DCA27' # Green (Command)
color_04: '#CAA427' # Yellow (Command second)
color_05: '#274DCA' # Blue (Path)
color_06: '#A427CA' # Magenta (Syntax var)
color_07: '#27CAA4' # Cyan (Prompt)
color_08: '#808080' # White
color_09: '#808080' # Bright Black
color_10: '#E98DA3' # Bright Red (Command error)
color_11: '#A3E98D' # Bright Green (Exec)
color_12: '#E9D48D' # Bright Yellow
color_13: '#8DA3E9' # Bright Blue (Folder)
color_14: '#D48DE9' # Bright Magenta
color_15: '#8DE9D4' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#09111A' # Background
foreground: '#D9E6F2' # Foreground (Text)
cursor: '#D9E6F2' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Campbell'
color_01: '#0C0C0C' # Black (Host)
color_02: '#C50F1F' # Red (Syntax string)
color_03: '#13A10E' # Green (Command)
color_04: '#C19C00' # Yellow (Command second)
color_05: '#0037DA' # Blue (Path)
color_06: '#881798' # Magenta (Syntax var)
color_07: '#3A96DD' # Cyan (Prompt)
color_08: '#CCCCCC' # White
color_09: '#767676' # Bright Black
color_10: '#E74856' # Bright Red (Command error)
color_11: '#16C60C' # Bright Green (Exec)
color_12: '#F9F1A5' # Bright Yellow
color_13: '#3B78FF' # Bright Blue (Folder)
color_14: '#B4009E' # Bright Magenta
color_15: '#61D6D6' # Bright Cyan
color_16: '#F2F2F2' # Bright White
background: '#0C0C0C' # Background
foreground: '#CCCCCC' # Foreground (Text)
cursor: '#FFFFFF' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Catppuccin Frappé'
color_01: '#51576D' # Black (Host)
color_02: '#E78284' # Red (Syntax string)
color_03: '#A6D189' # Green (Command)
color_04: '#E5C890' # Yellow (Command second)
color_05: '#8CAAEE' # Blue (Path)
color_06: '#F4B8E4' # Magenta (Syntax var)
color_07: '#81C8BE' # Cyan (Prompt)
color_08: '#B5BFE2' # White
color_09: '#626880' # Bright Black
color_10: '#E78284' # Bright Red (Command error)
color_11: '#A6D189' # Bright Green (Exec)
color_12: '#E5C890' # Bright Yellow
color_13: '#8CAAEE' # Bright Blue (Folder)
color_14: '#F4B8E4' # Bright Magenta
color_15: '#81C8BE' # Bright Cyan
color_16: '#A5ADCE' # Bright White
background: '#303446' # Background
foreground: '#C6D0F5' # Foreground (Text)
cursor: '#C6D0F5' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Catppuccin Latte'
color_01: '#5C5F77' # Black (Host)
color_02: '#D20F39' # Red (Syntax string)
color_03: '#40A02B' # Green (Command)
color_04: '#DF8E1D' # Yellow (Command second)
color_05: '#1E66F5' # Blue (Path)
color_06: '#EA76CB' # Magenta (Syntax var)
color_07: '#179299' # Cyan (Prompt)
color_08: '#ACB0BE' # White
color_09: '#6C6F85' # Bright Black
color_10: '#D20F39' # Bright Red (Command error)
color_11: '#40A02B' # Bright Green (Exec)
color_12: '#DF8E1D' # Bright Yellow
color_13: '#1E66F5' # Bright Blue (Folder)
color_14: '#EA76CB' # Bright Magenta
color_15: '#179299' # Bright Cyan
color_16: '#BCC0CC' # Bright White
background: '#EFF1F5' # Background
foreground: '#4C4F69' # Foreground (Text)
cursor: '#4C4F69' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Catppuccin Macchiato'
color_01: '#494D64' # Black (Host)
color_02: '#ED8796' # Red (Syntax string)
color_03: '#A6DA95' # Green (Command)
color_04: '#EED49F' # Yellow (Command second)
color_05: '#8AADF4' # Blue (Path)
color_06: '#F5BDE6' # Magenta (Syntax var)
color_07: '#8BD5CA' # Cyan (Prompt)
color_08: '#B8C0E0' # White
color_09: '#5B6078' # Bright Black
color_10: '#ED8796' # Bright Red (Command error)
color_11: '#A6DA95' # Bright Green (Exec)
color_12: '#EED49F' # Bright Yellow
color_13: '#8AADF4' # Bright Blue (Folder)
color_14: '#F5BDE6' # Bright Magenta
color_15: '#8BD5CA' # Bright Cyan
color_16: '#A5ADCB' # Bright White
background: '#24273A' # Background
foreground: '#CAD3F5' # Foreground (Text)
cursor: '#CAD3F5' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Catppuccin Mocha'
color_01: '#45475A' # Black (Host)
color_02: '#F38BA8' # Red (Syntax string)
color_03: '#A6E3A1' # Green (Command)
color_04: '#F9E2AF' # Yellow (Command second)
color_05: '#89B4FA' # Blue (Path)
color_06: '#F5C2E7' # Magenta (Syntax var)
color_07: '#94E2D5' # Cyan (Prompt)
color_08: '#BAC2DE' # White
color_09: '#585B70' # Bright Black
color_10: '#F38BA8' # Bright Red (Command error)
color_11: '#A6E3A1' # Bright Green (Exec)
color_12: '#F9E2AF' # Bright Yellow
color_13: '#89B4FA' # Bright Blue (Folder)
color_14: '#F5C2E7' # Bright Magenta
color_15: '#94E2D5' # Bright Cyan
color_16: '#A6ADC8' # Bright White
background: '#1E1E2E' # Background
foreground: '#CDD6F4' # Foreground (Text)
cursor: '#CDD6F4' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Chalk'
color_01: '#646464' # Black (Host)
color_02: '#F58E8E' # Red (Syntax string)
color_03: '#A9D3AB' # Green (Command)
color_04: '#FED37E' # Yellow (Command second)
color_05: '#7AABD4' # Blue (Path)
color_06: '#D6ADD5' # Magenta (Syntax var)
color_07: '#79D4D5' # Cyan (Prompt)
color_08: '#D4D4D4' # White
color_09: '#646464' # Bright Black
color_10: '#F58E8E' # Bright Red (Command error)
color_11: '#A9D3AB' # Bright Green (Exec)
color_12: '#FED37E' # Bright Yellow
color_13: '#7AABD4' # Bright Blue (Folder)
color_14: '#D6ADD5' # Bright Magenta
color_15: '#79D4D5' # Bright Cyan
color_16: '#D4D4D4' # Bright White
background: '#2D2D2D' # Background
foreground: '#D4D4D4' # Foreground (Text)
cursor: '#D4D4D4' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Chalkboard'
color_01: '#000000' # Black (Host)
color_02: '#C37372' # Red (Syntax string)
color_03: '#72C373' # Green (Command)
color_04: '#C2C372' # Yellow (Command second)
color_05: '#7372C3' # Blue (Path)
color_06: '#C372C2' # Magenta (Syntax var)
color_07: '#72C2C3' # Cyan (Prompt)
color_08: '#D9D9D9' # White
color_09: '#323232' # Bright Black
color_10: '#DBAAAA' # Bright Red (Command error)
color_11: '#AADBAA' # Bright Green (Exec)
color_12: '#DADBAA' # Bright Yellow
color_13: '#AAAADB' # Bright Blue (Folder)
color_14: '#DBAADA' # Bright Magenta
color_15: '#AADADB' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#29262F' # Background
foreground: '#D9E6F2' # Foreground (Text)
cursor: '#D9E6F2' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Chameleon'
color_01: '#2C2C2C' # Black (Host)
color_02: '#CC231C' # Red (Syntax string)
color_03: '#689D69' # Green (Command)
color_04: '#D79922' # Yellow (Command second)
color_05: '#366B71' # Blue (Path)
color_06: '#4E5165' # Magenta (Syntax var)
color_07: '#458587' # Cyan (Prompt)
color_08: '#C8BB97' # White
color_09: '#777777' # Bright Black
color_10: '#CC231C' # Bright Red (Command error)
color_11: '#689D69' # Bright Green (Exec)
color_12: '#D79922' # Bright Yellow
color_13: '#366B71' # Bright Blue (Folder)
color_14: '#4E5165' # Bright Magenta
color_15: '#458587' # Bright Cyan
color_16: '#C8BB97' # Bright White
background: '#2C2C2C' # Background
foreground: '#DEDEDE' # Foreground (Text)
cursor: '#DEDEDE' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Ciapre'
color_01: '#181818' # Black (Host)
color_02: '#810009' # Red (Syntax string)
color_03: '#48513B' # Green (Command)
color_04: '#CC8B3F' # Yellow (Command second)
color_05: '#576D8C' # Blue (Path)
color_06: '#724D7C' # Magenta (Syntax var)
color_07: '#5C4F4B' # Cyan (Prompt)
color_08: '#AEA47F' # White
color_09: '#555555' # Bright Black
color_10: '#AC3835' # Bright Red (Command error)
color_11: '#A6A75D' # Bright Green (Exec)
color_12: '#DCDF7C' # Bright Yellow
color_13: '#3097C6' # Bright Blue (Folder)
color_14: '#D33061' # Bright Magenta
color_15: '#F3DBB2' # Bright Cyan
color_16: '#F4F4F4' # Bright White
background: '#191C27' # Background
foreground: '#AEA47A' # Foreground (Text)
cursor: '#AEA47A' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Clone Of Ubuntu'
color_01: '#2E3436' # Black (Host)
color_02: '#CC0000' # Red (Syntax string)
color_03: '#4E9A06' # Green (Command)
color_04: '#C4A000' # Yellow (Command second)
color_05: '#3465A4' # Blue (Path)
color_06: '#75507B' # Magenta (Syntax var)
color_07: '#06989A' # Cyan (Prompt)
color_08: '#D3D7CF' # White
color_09: '#555753' # Bright Black
color_10: '#EF2929' # Bright Red (Command error)
color_11: '#8AE234' # Bright Green (Exec)
color_12: '#FCE94F' # Bright Yellow
color_13: '#729FCF' # Bright Blue (Folder)
color_14: '#AD7FA8' # Bright Magenta
color_15: '#34E2E2' # Bright Cyan
color_16: '#EEEEEC' # Bright White
background: '#300A24' # Background
foreground: '#FFFFFF' # Foreground (Text)
cursor: '#FFFFFF' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Clrs'
color_01: '#000000' # Black (Host)
color_02: '#F8282A' # Red (Syntax string)
color_03: '#328A5D' # Green (Command)
color_04: '#FA701D' # Yellow (Command second)
color_05: '#135CD0' # Blue (Path)
color_06: '#9F00BD' # Magenta (Syntax var)
color_07: '#33C3C1' # Cyan (Prompt)
color_08: '#B3B3B3' # White
color_09: '#555753' # Bright Black
color_10: '#FB0416' # Bright Red (Command error)
color_11: '#2CC631' # Bright Green (Exec)
color_12: '#FDD727' # Bright Yellow
color_13: '#1670FF' # Bright Blue (Folder)
color_14: '#E900B0' # Bright Magenta
color_15: '#3AD5CE' # Bright Cyan
color_16: '#EEEEEC' # Bright White
background: '#FFFFFF' # Background
foreground: '#262626' # Foreground (Text)
cursor: '#262626' # Cursor
+25
View File
@@ -0,0 +1,25 @@
---
name: 'Cobalt 2'
color_01: '#000000' # Black (Host)
color_02: '#FF0000' # Red (Syntax string)
color_03: '#38DE21' # Green (Command)
color_04: '#FFE50A' # Yellow (Command second)
color_05: '#1460D2' # Blue (Path)
color_06: '#FF005D' # Magenta (Syntax var)
color_07: '#00BBBB' # Cyan (Prompt)
color_08: '#BBBBBB' # White
color_09: '#555555' # Bright Black
color_10: '#F40E17' # Bright Red (Command error)
color_11: '#3BD01D' # Bright Green (Exec)
color_12: '#EDC809' # Bright Yellow
color_13: '#5555FF' # Bright Blue (Folder)
color_14: '#FF55FF' # Bright Magenta
color_15: '#6AE3FA' # Bright Cyan
color_16: '#FFFFFF' # Bright White
background: '#132738' # Background
foreground: '#FFFFFF' # Foreground (Text)
cursor: '#FFFFFF' # Cursor

Some files were not shown because too many files have changed in this diff Show More