.oOo.

September 10, 2026 · View on GitHub

.oOo.

A decade of Linux & macOS dotfiles, still in daily use.

A personal collection of Linux and macOS configurations refined over more than a decade. Feel free to explore, borrow, and adapt.

Chinese


Philosophy

This repository is a single, self-contained $HOME: every file lives where it would in a home directory, so installation is little more than creating a set of symlinks.

Tools come and go, but muscle memory remains. Retired configurations are moved to archived/ rather than deleted, keeping the reasoning behind past choices legible.

Layout

PathDescription
.*Cross-platform dotfiles for zsh, tmux, screen, git, ctags, and editors
.zshrc.etc.d/Modular zsh snippets sourced as needed (Docker, Kubernetes, secrets, etc.)
mac/macOS-only files: Phoenix, Karabiner, LaunchAgents, and app support files
linux/Linux-only dotfiles
local/bin/Around 110 personal scripts; see Toolbox
archived/Retired configurations kept for reference

Configurations

Actively maintained: zsh · tmux / screen · git · IdeaVim · Obsidian Vim · fonts · Phoenix (a macOS tiling window manager) · Karabiner · xbar.

Browser keyboard customizations have converged on Surfingkeys. Earlier configurations for Vimperator, Pentadactyl, Vimium, cVim, and VimFx are now archived.

Split into separate repositories:

  • vimmiv
  • awesome (window manager) → awesome

Superseded and archived: Xmodmap (replaced by Ergodox), xmonad and xmobar (replaced by awesome), and mjolnir, slate, and amethyst (replaced by Phoenix).

Toolbox

local/bin/ contains more than a hundred small scripts that glue the workflow together. Here are a few highlights.

Markdown and clipboard conversion

These scripts make it easy to move rich text among editors, browsers, Feishu, and WeRead.

ScriptPurpose
paste-{md,html,rtf}-to-{md,html,rtf}Convert among clipboard formats; -copy variants write back to the clipboard
paste-weread-to-mdConvert WeRead highlights to Markdown
paste-simplemind-outline-to-mdConvert a SimpleMind outline to Markdown
image-from-clipboard-to-png-*Save a clipboard image as PNG and generate a Markdown reference
format-gfm · gh-md-tocFormat GitHub Flavored Markdown and generate a table of contents
remark · revealBuild remark or reveal.js slides from Markdown

Networking and proxies

ScriptPurpose
myip · myip-*Query the public IP through multiple sources (dig, ipinfo, ip.sb, ipip, etc.)
ddns-by-{cloudflare,dnspod}Update dynamic DNS; -wan variants use the public IP
shadowsocks_client_start_*Start regional Shadowsocks clients (HK, JP, or HA)
socks5proxywrapper · dig-httpWrap SOCKS5/HTTP proxies and provide an HTTP-based dig utility

Images and media

ScriptPurpose
tinypngCompress images through TinyPNG
resize-img · -800/1200/2000Batch-resize images to a target width
mov2gifConvert a .mov screen recording to GIF
svg2icnsConvert SVG to a macOS .icns icon set
qrdecodeDecode QR codes

Git and development

ScriptPurpose
git-archive-zipPackage a repository as xxx.git.zip
git-code-numbers-by-authorsCount lines of code by author
git-min-backupCreate a minimal Git backup
homebrew-using-mirrorSwitch Homebrew to a mirror
check-brew-cask-upgradeQuickly check for Homebrew cask upgrades
terminfo-remote-install · -{ghostty,kitty}Install the local terminal terminfo on ssh hosts, fixing TERM init errors in remote ncurses programs

Desktop glue

ScriptPurpose
fcitx-remote-osaSwitch the macOS input method with osascript
apple-music-playingPrint the track currently playing in Apple Music
bing-wallpaper.shDownload the Bing image of the day
trash-putImplement trash-put with the macOS trash command
iterm2-{recv,send}-zmodem.shUse rz and sz in iTerm2

The full inventory is one ls local/bin/ away. Each script is small and self-explanatory.

Installation

# 1. Prerequisites: zsh, Oh My Zsh, and zsh-autosuggestions
brew install zsh                # or: apt-get install zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
git clone https://github.com/zsh-users/zsh-autosuggestions \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"

# 2. Clone
cd YOUR_REPO_PARENT_PATH
git clone https://github.com/alswl/.oOo. && cd .oOo.

# 3. Symlink cross-platform dotfiles into $HOME
#    (.[!.]* skips . and ..; the case guard skips repository metadata and system files)
for f in .[!.]*; do
  case "$f" in .git|.gitignore|.DS_Store|.idea|.claude) continue ;; esac
  ln -sfn "$(pwd)/$f" "$HOME/$f"
done
cp "$(pwd)/_.gitconfig" "$HOME/.gitconfig"

# 4. Link personal scripts
mkdir -p "$HOME/.local/bin" "$HOME/.local/etc"
ln -s "$(pwd)"/local/bin/* "$HOME/.local/bin/"
ln -s "$(pwd)"/local/etc/* "$HOME/.local/etc/"
Additional macOS steps
cd YOUR_REPO_PATH
for f in mac/.[!.]*; do
  base=${f##*/}
  case "$base" in .DS_Store|*.swp) continue ;; esac
  ln -sfn "$(pwd)/$f" "$HOME/$base"
done
ln -s "$(pwd)/mac/phoenix/dist/phoenix.js" "$HOME/.phoenix.js"
ln -s "$(pwd)/mac/_Library/Application Support/Karabiner/private.xml" \
  "$HOME/Library/Application Support/Karabiner/private.xml"
ln -s "$(pwd)/mac/_config/karabiner/karabiner.json" "$HOME/.config/karabiner/karabiner.json"
Additional Linux steps
cd YOUR_REPO_PATH
for f in linux/.[!.]*; do
  ln -sfn "$(pwd)/$f" "$HOME/${f##*/}"
done

xbar menu bar utilities

The plugins in mac/Library/Application Support/xbar/plugins/ provide small, self-contained controls for macOS. Their filenames follow xbar's refresh-interval convention (5s, 1m).

launch-agents.1m.sh

Groups user (~/Library/LaunchAgents) and system-installed (/Library/LaunchAgents) jobs, shows their launchd state, and provides start, stop, restart, enable, disable, and Finder actions. LaunchDaemons are intentionally excluded because managing them requires administrator privileges. It uses the macOS-provided launchctl and plutil tools.

gost-local.1m.sh

Toggles a local GOST HTTP forwarding process and shows its PID, uptime, connection count, and latest log line. The defaults forward 127.0.0.1:1234 to 127.0.0.1:1235.

gost-claude.5s.sh

Toggles an authenticated GOST TLS proxy, listening on 127.0.0.1:1236, and reports runtime and connection details. The remote endpoint and credentials live in a separate local environment file.

From the repository root, install xbar and GOST, then link the plugins:

brew install --cask xbar
brew install gost

REPO_ROOT="$(pwd)"
PLUGIN_SOURCE="$REPO_ROOT/mac/Library/Application Support/xbar/plugins"
PLUGIN_TARGET="$HOME/Library/Application Support/xbar/plugins"
mkdir -p "$PLUGIN_TARGET"

for plugin in gost-local.1m.sh gost-claude.5s.sh launch-agents.1m.sh; do
  ln -sfn "$PLUGIN_SOURCE/$plugin" "$PLUGIN_TARGET/$plugin"
done

For gost-claude, create its local configuration beside the plugin:

cp "$PLUGIN_SOURCE/gost-claude.env.template" "$PLUGIN_SOURCE/gost-claude.env"
chmod 600 "$PLUGIN_SOURCE/gost-claude.env"

Set GOST_USER, GOST_PASSWORD, and GOST_REMOTE in that file. gost-claude.env is gitignored; keep real credentials out of version control. The ports and forwarding defaults are constants near the top of each GOST plugin and can be adapted to another local setup.

Phoenix: tiling window management for macOS

Phoenix provides keyboard-driven, JavaScript-scriptable window management. See the blog post Windows management for hacker for more details.

Application launchWindow switchWindow movement
  • miv — Vim configuration
  • awesome — Awesome window manager configuration