Personal dotfiles for macOS, Debian/Ubuntu, and Fedora, managed with Ansible and GNU Stow.
git clone https://github.com/avilabss/.dotfiles.git ~/dotfiles
cd ~/dotfiles
./bootstrap.sh./bootstrap.sh # Core setup
./bootstrap.sh --all # Everything (core + optional)
./bootstrap.sh --tags docker,ssh # Specific optional roles
./bootstrap.sh --tags zsh # Re-run a single role
./bootstrap.sh --check # Dry run| Tool | Description |
|---|---|
| Neovim | Editor with LSP, completion, debugging, Telescope |
| Zsh | Shell with Oh My Zsh framework |
| Tmux | Terminal multiplexer with vim navigation |
| Starship | Cross-shell prompt |
| Ghostty | Terminal emulator |
| Google Chrome | Browser |
| JetBrainsMono Nerd Font | Terminal font |
| fastfetch, ripgrep, flameshot | System info, search, screenshots |
| go, rust, node, python | Language runtimes |
| pipx, uv, poetry | Package managers |
| git, git-lfs | Version control |
| Tag | Description | Platforms |
|---|---|---|
opencode |
AI coding agent (config + agents + claude-auth plugin) | All |
opencode-serve |
OpenCode server as a persistent service | All |
claude-code |
Claude Code CLI (required for opencode-claude-auth plugin) | All |
docker |
Docker / OrbStack | All |
ssh |
OpenSSH server + firewall | Linux |
xrdp |
Remote desktop (RDP) | Linux |
sunshine |
Remote desktop (Moonlight/Sunshine) | All |
qemu |
QEMU guest agent (Proxmox/KVM) | Linux |
Edit the group_vars file for your platform:
- macOS:
ansible/group_vars/macos.yml - Debian/Ubuntu:
ansible/group_vars/debian.yml - Fedora:
ansible/group_vars/fedora.yml
Config and agents are managed via stow (opencode/.config/opencode/). The opencode role handles stow separately (not via the common role) using stow --adopt to safely merge any existing config.
Two providers are used:
- OpenAI (ChatGPT Pro sub) — powers architect, developer, repo-scouter, and reviewer-1
- Anthropic (Claude Max sub via opencode-claude-auth) — powers reviewer-2 (Opus)
# 1. Auth OpenAI (ChatGPT Plus/Pro subscription)
/connect # Select "OpenAI (ChatGPT Plus/Pro)", complete browser OAuth
# 2. Auth Claude (requires Claude Code installed and authenticated)
# The opencode-claude-auth plugin handles this automatically —
# just make sure `claude` CLI is installed and you've logged in once.Credentials are stored in ~/.local/share/opencode/auth.json (not managed by dotfiles).
| Agent | Model | Reasoning | Role |
|---|---|---|---|
architect |
openai/gpt-5.4 |
xhigh | Primary — plans and delegates tasks |
developer |
openai/gpt-5.3-codex |
xhigh | Implements tasks from architect |
repo-scouter |
openai/gpt-5.4 |
xhigh | Scans repos for stack/conventions |
code-reviewer-1 |
openai/gpt-5.4 |
xhigh | Code review (GPT) |
code-reviewer-2 |
anthropic/claude-opus-4-6 |
high | Code review (Opus, via Claude sub) |
Cross-model diversity: GPT builds, Opus reviews.
- You describe what you want to
@architect(the default agent) - Architect asks clarifying questions, then proposes a plan
- You say "approved" to greenlight
- Architect writes a Task Brief and delegates to
@developer - Developer implements, then sends to both
@code-reviewer-1and@code-reviewer-2in parallel - Reviewers approve or request changes — developer iterates until both approve
- Everyone reports back to architect, who decides: done or another round
- Architect summarizes and asks what's next
@repo-scouter can be called by any agent to scan the repo for stack, conventions, and commands.
Key rules: architect never writes code (only Task Briefs), developer never expands scope, reviewers can only read and request changes (no file edits).
The opencode-serve tag sets up the OpenCode server as a persistent service that survives reboots.
./bootstrap.sh --tags opencode-serveWhat it does:
- Linux: Creates a systemd user service (
opencode-serve) + opens the firewall port (UFW/firewalld) - macOS: Creates a launchd LaunchAgent (
com.opencode.serve) — macOS prompts on first connection
Configuration (in ansible/group_vars/all.yml):
| Variable | Default | Description |
|---|---|---|
opencode_serve_port |
4096 |
Port for the server (matches opencode.json server config) |
opencode_serve_hostname |
0.0.0.0 |
Bind address (0.0.0.0 = LAN accessible, 127.0.0.1 = local only) |
opencode_serve_password |
(empty) | Set OPENCODE_SERVER_PASSWORD for basic auth |
Service management:
# Linux
systemctl --user status opencode-serve
systemctl --user restart opencode-serve
journalctl --user -u opencode-serve -f
# macOS
launchctl list | grep opencode
launchctl kickstart -k gui/$(id -u)/com.opencode.serve # restart
tail -f ~/Library/Logs/opencode-serve.logNote: Requires opencode to be installed first (
--tags opencodeor install manually).
- Restart your terminal (or
source ~/.zshrc) - In tmux, press
Ctrl-a + Ito install plugins - Open neovim — Lazy will auto-install plugins
- Run
opencode, then/connectto authenticate OpenAI (ChatGPT Plus/Pro) - If using Claude models: run
claudeonce to authenticate, then the opencode-claude-auth plugin handles the rest
All tools use Catppuccin Mocha.