@sebastienrousseau/dotfiles 0.2.510 → 0.2.512
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +2 -2
- package/docs/AI.md +2 -1
- package/docs/COPYRIGHT +1 -1
- package/docs/architecture/AI_COST_OPTIMIZATION.md +1 -0
- package/docs/archive/LEGACY_ROADMAP.md +4 -158
- package/docs/articles/.pages +6 -0
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +216 -0
- package/docs/articles/2026-07-05-fish-startup-abbr.md +153 -0
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +128 -0
- package/docs/articles/index.md +36 -0
- package/docs/manual/00-introduction.md +1 -1
- package/docs/manual/02-tutorials/02-add-wallpaper.md +6 -6
- package/docs/manual/02-tutorials/03-create-profile.md +1 -1
- package/docs/manual/02-tutorials/05-deploy-fleet.md +1 -1
- package/docs/manual/03-reference/02-config-files.md +1 -1
- package/docs/manual/command-index.md +1 -0
- package/docs/operations/ARCHITECTURE_ROADMAP.md +5 -143
- package/docs/operations/COVERAGE.md +27 -4
- package/docs/operations/ROADMAP.md +3 -159
- package/docs/operations/ROADMAP_2026.md +5 -663
- package/docs/operations/ROADMAP_V0_2_503.md +5 -129
- package/docs/reference/THEMES.md +1 -1
- package/docs/reference/TOOLS.md +1 -0
- package/docs/reference/UTILS.md +1 -0
- package/install.sh +5 -5
- package/package.json +1 -1
- package/scripts/diagnostics/aliases-manifest.sh +52 -7
- package/scripts/diagnostics/benchmark.sh +27 -1
- package/scripts/diagnostics/doctor.sh +18 -11
- package/scripts/diagnostics/health.sh +8 -3
- package/scripts/diagnostics/mcp-doctor.sh +3 -0
- package/scripts/diagnostics/secret-governance.sh +7 -1
- package/scripts/diagnostics/security-score.sh +14 -5
- package/scripts/diagnostics/verify_state.sh +15 -3
- package/scripts/diagnostics/version-locks.sh +10 -6
- package/scripts/dot/commands/agent.sh +5 -1
- package/scripts/dot/commands/ai.sh +37 -30
- package/scripts/dot/commands/aliases.sh +28 -4
- package/scripts/dot/commands/appearance.sh +16 -0
- package/scripts/dot/commands/core.sh +17 -0
- package/scripts/dot/commands/diagnostics.sh +19 -0
- package/scripts/dot/commands/fleet.sh +4 -1
- package/scripts/dot/commands/manual.sh +4 -4
- package/scripts/dot/commands/meta.sh +87 -12
- package/scripts/dot/commands/registry.sh +8 -2
- package/scripts/dot/commands/secrets.sh +17 -0
- package/scripts/dot/commands/security.sh +17 -0
- package/scripts/dot/commands/tools.sh +30 -2
- package/scripts/git-hooks/pre-commit-audit.sh +1 -1
- package/scripts/ops/ai-setup.sh +13 -6
- package/scripts/ops/bundle.sh +31 -5
- package/scripts/ops/chezmoi-apply.sh +5 -0
- package/scripts/ops/release.sh +14 -5
- package/scripts/qa/docs-coverage.sh +1 -1
- package/scripts/qa/reliability-audit.sh +2 -2
- package/scripts/secrets/age-init.sh +15 -4
- package/scripts/theme/apply-gnome-theme.sh +6 -2
- package/scripts/theme/extract-theme.py +97 -33
- package/scripts/theme/rebuild-themes.sh +240 -35
- package/scripts/theme/switch.sh +26 -16
- package/scripts/theme/wallpaper-sync.sh +95 -7
- package/scripts/tools/detect-collisions.py +19 -1
- package/scripts/version-sync.sh +87 -43
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
This file documents all notable changes to this project.
|
|
4
4
|
|
|
5
|
+
## v0.2.512 — 2026-07-21
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **`dot-ui`** — a shared Bubble Tea (Go) renderer for the `dot` CLI: themed
|
|
10
|
+
tables across all list/table commands, a unified `dot-ui pick` that replaces
|
|
11
|
+
fzf in the theme picker, and a step-runner façade. Degrades gracefully when
|
|
12
|
+
Go is absent, so it never fails a `chezmoi apply`.
|
|
13
|
+
- **AI CLIs** — Kimi Code CLI support, with a Kiri compatibility shim.
|
|
14
|
+
- **Themes** — regenerated the full theme set from the updated wallpaper
|
|
15
|
+
library; system wallpapers are now opt-in (only discovered themes are
|
|
16
|
+
assembled); `bloom-light` is the new default theme.
|
|
17
|
+
- **`corralctl`** — scheduled daily repo sync.
|
|
18
|
+
- Symlink iCloud Drive folders into home.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **Theme engine overhaul** — terminals always use the dark palette with an
|
|
23
|
+
AAA light ramp; Apple-consistent light ANSI ramp; accurate wallpaper counts
|
|
24
|
+
and dominant-colour tracking; `dot-theme-sync` now drives through the shared
|
|
25
|
+
UI.
|
|
26
|
+
- **mise** — folded `~/mise.toml` overrides into the managed base layer; bumped
|
|
27
|
+
topgrade to 17.4.0 and dropped the typos pin.
|
|
28
|
+
- Bumped GitHub Actions pins (minor-patch group plus setup-go/node/python,
|
|
29
|
+
codeql-action, and action-gh-release), folding Dependabot #977 and #978.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **Themes / terminals** — readable light-mode palettes (fixed bg/fg with
|
|
34
|
+
AA/AAA ANSI contrast); kitty now renders light themes, is opaque in light
|
|
35
|
+
mode, and gets a runtime reloader; tmux client redraw across all servers so
|
|
36
|
+
existing sessions refresh immediately; regen-proof fallback themes; correct
|
|
37
|
+
macOS accent mapping and per-mode HEIC frame resolution; no workspace freeze
|
|
38
|
+
or WallpaperAgent restart on apply.
|
|
39
|
+
- **git** — render `allowed_signers` and guard it on a missing key / unset
|
|
40
|
+
email.
|
|
41
|
+
- **CI / reliability** — portable `timeout` shim for macOS (real `gtimeout`);
|
|
42
|
+
reliability tests made portable and environment-tolerant; diagnostics
|
|
43
|
+
scorecard to 100; copyright and coverage gate fixes.
|
|
44
|
+
- **aliases** — the CD-completion load-once guard now actually gates.
|
|
45
|
+
- Push the AUR package to `master`, not `main`.
|
|
46
|
+
|
|
47
|
+
## v0.2.511 — 2026-07-08
|
|
48
|
+
|
|
49
|
+
Bug-fix release: restore shell aliases that were silently dropped after the CD-completion fragment.
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- **`reload`, `r`, `mkcd`, `quit` — and every alias/function defined after the CD-completion block — were undefined** whenever `compdef` was not yet available when `90-ux-aliases.sh` was sourced (profiles that don't run `compinit`, and fast-startup shells). The zsh branch of `defaults/.chezmoitemplates/aliases/cd/cd-completion.aliases.sh` skipped completion registration with a **file-scope `return 0`**; because that fragment is inlined into the single concatenated `90-ux-aliases.sh`, the bare `return` aborted the whole file, dropping `set_default_aliases()` (which defines `reload` et al.) and everything after it. Replaced the early-return with a positive `if command -v compdef …; then … fi` guard, so only the completion block is skipped when `compdef` is not ready.
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
|
|
57
|
+
- **`scripts/version-sync.sh`**: excluded the two dated release write-ups (`docs/articles/2026-07-05-*.md`) from version verification. They record the release they shipped in ("shipped in v0.2.510" + release-tag link) as historical fact; the `--verify` pass was false-flagging those refs as inconsistent even though the update pass correctly leaves them alone.
|
|
58
|
+
|
|
5
59
|
## v0.2.510 — 2026-07-05
|
|
6
60
|
|
|
7
61
|
Post-v0.2.509 quality-of-life release: default branch renamed `master` → `main`, docs site relit with a custom dark + terminal-green MkDocs Material theme, shells warmed up (fish alias→abbr, zsh PATH prune), font bumped to 20pt across every terminal template, themes rebuilt from wallpapers.
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<a href="https://github.com/sebastienrousseau/dotfiles/actions"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/dotfiles/ci.yml?style=for-the-badge&logo=githubactions&logoColor=white" alt="Build" /></a>
|
|
13
|
-
<a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.
|
|
13
|
+
<a href="https://github.com/sebastienrousseau/dotfiles/releases/latest"><img src="https://img.shields.io/badge/Version-v0.2.512-blue?style=for-the-badge&logo=semanticrelease&logoColor=white" alt="Version" /></a>
|
|
14
14
|
<a href="https://github.com/sebastienrousseau/dotfiles/releases"><img src="https://img.shields.io/github/downloads/sebastienrousseau/dotfiles/total?style=for-the-badge&logo=github&logoColor=white" alt="Downloads" /></a>
|
|
15
15
|
<a href="https://codespaces.new/sebastienrousseau/dotfiles"><img src="https://img.shields.io/badge/Open%20in-Codespaces-blue?style=for-the-badge&logo=github&logoColor=white" alt="Open in GitHub Codespaces" /></a>
|
|
16
16
|
<a href="https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles"><img src="https://img.shields.io/ossf-scorecard/github.com/sebastienrousseau/dotfiles?style=for-the-badge&logo=linuxfoundation&logoColor=white&label=OpenSSF%20Scorecard" alt="OpenSSF Scorecard" /></a>
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
curl -fsSL -o /tmp/dotfiles-install.sh \
|
|
55
|
-
https://raw.githubusercontent.com/sebastienrousseau/dotfiles/v0.2.
|
|
55
|
+
https://raw.githubusercontent.com/sebastienrousseau/dotfiles/v0.2.512/install.sh
|
|
56
56
|
echo "d5a04c5e2813a93a63c8ecce9655cf3d107f6068862c6eba84a92cf22f801c7e /tmp/dotfiles-install.sh" \
|
|
57
57
|
| shasum -a 256 -c
|
|
58
58
|
bash /tmp/dotfiles-install.sh
|
package/docs/AI.md
CHANGED
|
@@ -120,6 +120,7 @@ These tools are not installed for you. Install what you want with `dot ai instal
|
|
|
120
120
|
- `amp` — Sourcegraph's agentic coder
|
|
121
121
|
- `cursor-agent` — Cursor's terminal agent
|
|
122
122
|
- `grok` — xAI's terminal coding agent (Grok Build; needs a SuperGrok / X Premium+ plan)
|
|
123
|
+
- `kimi` — Moonshot AI's Kimi Code CLI; installed natively to `~/.kimi-code/bin/kimi` and supports native interactive use and one-shot prompts
|
|
123
124
|
|
|
124
125
|
- **Coding (interactive)** — focused pair-programming assistants:
|
|
125
126
|
- `aider` — Git-aware AI pair programmer
|
|
@@ -152,7 +153,7 @@ The old command shapes still work, but print a one-line hint pointing at the new
|
|
|
152
153
|
| Deprecated | Use instead |
|
|
153
154
|
|------------|-------------|
|
|
154
155
|
| `dot cl` | `dot ai claude` |
|
|
155
|
-
| `dot codex` / `dot copilot` / `dot agy` / `dot goose` | `dot ai codex` / `dot ai copilot` / `dot ai agy` / `dot ai goose` |
|
|
156
|
+
| `dot codex` / `dot copilot` / `dot kimi` / `dot agy` / `dot goose` | `dot ai codex` / `dot ai copilot` / `dot ai kimi` / `dot ai agy` / `dot ai goose` |
|
|
156
157
|
| `dot kiro` / `dot sgpt` / `dot ollama` / `dot opencode` | `dot ai kiro` / `dot ai sgpt` / `dot ai ollama` / `dot ai opencode` |
|
|
157
158
|
| `dot aider` / `dot autohand` / `dot vibe` / `dot qwen` / `dot zai` | `dot ai aider` / `dot ai autohand` / `dot ai vibe` / `dot ai qwen` / `dot ai zai` |
|
|
158
159
|
| `dot ai status` | `dot ai tools` |
|
package/docs/COPYRIGHT
CHANGED
|
@@ -114,6 +114,7 @@ Providers tracked today:
|
|
|
114
114
|
| Copilot CLI | `copilot` | yes | no |
|
|
115
115
|
| Gemini CLI | `gemini` | yes | no |
|
|
116
116
|
| Goose | `goose` | yes | no |
|
|
117
|
+
| Kimi CLI | `kimi` | yes | no |
|
|
117
118
|
| Aider | `aider` | yes | no |
|
|
118
119
|
| OpenCode | `opencode` | yes | no |
|
|
119
120
|
| Autohand | `autohand` | yes | no |
|
|
@@ -1,160 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
render_with_liquid: false
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# The Ultimate Developer Environment Roadmap
|
|
6
|
-
|
|
7
|
-
This roadmap outlines the path to a high-performance, super-efficient development machine designed for Rust, Python, and AI on Linux (Zorin OS / T2 Mac hardware).
|
|
8
|
-
|
|
9
|
-
## Phase 1: Foundation (Completed)
|
|
10
|
-
|
|
11
|
-
- **Core Shell**: Zsh + Oh My Zsh.
|
|
12
|
-
- **Modern Prompt**: Starship (hooked & active).
|
|
13
|
-
- **Language Managers**: `rustup` (Rust) and `fnm` (Node.js).
|
|
14
|
-
- **Ultra-Fast Python**: `uv` installed.
|
|
15
|
-
- **Basic Modern Tools**: `eza` (ls), `bat` (cat), `fd` (find), `ripgrep` (grep).
|
|
16
|
-
- **Git Enhancements**: `lazygit` (TUI) and `delta` (Diffs).
|
|
17
|
-
- **Multiplexer**: `zellij` installed.
|
|
18
|
-
- **AI**: `ollama` installed locally.
|
|
19
|
-
- **Security**: Firewall (`ufw`) enabled.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Phase 2: Speed & Navigation (Completed)
|
|
24
|
-
|
|
25
|
-
Focus: Reduce friction in filesystem navigation and build times.
|
|
26
|
-
|
|
27
|
-
### 1. Navigation
|
|
28
|
-
|
|
29
|
-
- [x] **Zoxide**: Smarter `cd` command that learns your habits (`z directory`).
|
|
30
|
-
- [x] **FZF**: Command-line fuzzy finder. Essential for search history, files, and replacing standard completion.
|
|
31
|
-
- [x] **Yazi**: Blazing fast terminal file manager (Rust-based).
|
|
32
|
-
|
|
33
|
-
### 2. Rust Optimization
|
|
34
|
-
|
|
35
|
-
- [x] **Mold**: Use the `mold` linker to speed up Rust compile times by 3x-10x.
|
|
36
|
-
- [x] **Sccache**: Shared compilation cache to speed up recompilations across projects.
|
|
37
|
-
- [x] **Bacon**: Background rust compiler that gives instant feedback on errors.
|
|
38
|
-
|
|
39
|
-
### 3. Python Optimization
|
|
40
|
-
|
|
41
|
-
- [x] **Ruff**: Extremely fast Python linter and formatter (replace flake8/black).
|
|
42
|
-
- [x] **Global Config**: Set `uv` to use system Python or managed Python preferences.
|
|
43
|
-
|
|
44
|
-
### 4. Code Search
|
|
45
|
-
|
|
46
|
-
- [x] **Ripgrep-all (rga)**: Search inside PDFs, E-Books, zip files, etc.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Phase 3: AI Power User (Completed)
|
|
51
|
-
|
|
52
|
-
Focus: Integrate AI deeply into the workflow.
|
|
53
|
-
|
|
54
|
-
- [x] **Fabric**: Open-source framework for augmenting humans using AI (installed via `cmd` path).
|
|
55
|
-
- [x] **Open WebUI**: A beautiful web interface for `ollama` (requires Docker).
|
|
56
|
-
- [x] **GitHub Copilot CLI**: Integrate AI assistance directly into the terminal commands.
|
|
57
|
-
- [x] **Local RAG**: Setup tools to chat with your own documents locally (Open WebUI).
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Phase 4: System Tuning & Hardening (Completed)
|
|
62
|
-
|
|
63
|
-
Focus: Squeeze every ounce of performance and security from the hardware.
|
|
64
|
-
|
|
65
|
-
- [x] **Kernel Tuning**: Increase file descriptor limits and optimize TCP stack for lower latency.
|
|
66
|
-
- [x] **Swap Optimization**: Configure `zram` for memory compression (improves performance on 16GB RAM).
|
|
67
|
-
- [x] **Flatpak Overrides**: Secure Flatpak permissions using `Flatseal`.
|
|
68
|
-
- [x] **Automated Updates**: Configure `unattended-upgrades` for security patches.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Phase 5: Final Polish (Completed)
|
|
73
|
-
|
|
74
|
-
- [x] **Global UV Config**: Created `~/.config/uv/uv.toml` for managed python preference.
|
|
75
|
-
- [x] **Roadmap Completion**: Verified all items are 100% complete.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Maintenance & Updates
|
|
80
|
-
|
|
81
|
-
- **Update System**: `sudo apt update && sudo apt upgrade`
|
|
82
|
-
- **Update Rust**: `rustup update`
|
|
83
|
-
- **Update Node**: `fnm install --lts`
|
|
84
|
-
- **Update UV**: `uv self update`
|
|
85
|
-
- **Update Firmware**: `fwupdmgr get-updates`
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Phase 6: Desktop Environment (Completed)
|
|
90
|
-
|
|
91
|
-
Focus: Clean, bloat-free, and supercharged GNOME/Zorin experience.
|
|
92
|
-
|
|
93
|
-
- [x] **Bloatware Removal**: Removed games (`aisleriot`, `mines`, etc.) and media apps (`rhythmbox`, `totem`).
|
|
94
|
-
- [x] **Menu Cleanup**: Created `hide_menu_entries.sh` to deduplicate and hide unwanted entries.
|
|
95
|
-
- [x] **GNOME Extensions**: Installed productivity boosters via `gnome-extensions-cli`:
|
|
96
|
-
- [x] `Clipboard Indicator`: History management.
|
|
97
|
-
- [x] `Caffeine`: Prevent auto-suspend.
|
|
98
|
-
- [x] `Impatience`: Speed up animations.
|
|
99
|
-
- [x] `Vitals`: System monitoring in top bar.
|
|
100
|
-
- [x] **Memory Tuning**: Optimize GNOME Shell performance.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Phase 7: Browser Optimization (Completed)
|
|
105
|
-
|
|
106
|
-
Focus: Chrome tuned for development and memory efficiency.
|
|
107
|
-
|
|
108
|
-
- [x] **Settings**: Enable "Memory Saver" and "Energy Saver" via Managed Policies.
|
|
109
|
-
- [x] **Extensions**: Automated installation of developer stack (uBlock, JSON Viewer, React DevTools, Vimium, Refined GitHub).
|
|
110
|
-
- [x] **Profile Separation**: Separate Personal and Work profiles (Manual setup recommendation).
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Phase 8: Neovim IDE (Completed)
|
|
115
|
-
|
|
116
|
-
Focus: Building a terminal-based IDE that rivals VS Code for Rust, Python, and AI.
|
|
117
|
-
|
|
118
|
-
- [x] **Latest Version**: Installed Neovim v0.12.0-dev (Nightly) to resolve plugin stability issues.
|
|
119
|
-
- [x] **Plugin Manager**: Setup `lazy.nvim` with modular config (Restored from **PR #62**).
|
|
120
|
-
- [x] **Core Plugins**:
|
|
121
|
-
- [x] `Telescope`: Fuzzy finding.
|
|
122
|
-
- [x] `Treesitter`: Syntax highlighting.
|
|
123
|
-
- [x] `Harpoon`: Fast file switching.
|
|
124
|
-
- [x] `Neo-tree`: File explorer.
|
|
125
|
-
- [x] **UI/UX Menus**: Added `dressing.nvim` and `telescope-ui-select.nvim` for modern, searchable selection lists and floating inputs.
|
|
126
|
-
- [x] **LSP & Autocomplete**:
|
|
127
|
-
- [x] `Mason`: Managing LSPs (rust-analyzer, pyright, ruff).
|
|
128
|
-
- [x] `Cmp`: Autocompletion engine.
|
|
129
|
-
- [x] **Language Specifics**:
|
|
130
|
-
- [x] **Rust**: `rustaceanvim` configured.
|
|
131
|
-
- [x] **Python**: `pyright` + `ruff`.
|
|
132
|
-
- [x] **AI Integration**:
|
|
133
|
-
- [x] `Copilot.lua`: Enabled (needs `:Copilot auth`).
|
|
134
|
-
- [x] `CopilotChat.nvim`: Sidebar chat (VS Code style).
|
|
135
|
-
- [ ] `Avante.nvim`: Skipped (Removed due to complexity/instability).
|
|
136
|
-
- [x] **VS Code Parity Pack**:
|
|
137
|
-
- [x] `Trouble`: Problems panel.
|
|
138
|
-
- [x] `Spectre`: Search/Replace.
|
|
139
|
-
- [x] `Autopairs`: Auto-close brackets.
|
|
140
|
-
- [x] `Todo-Comments`: TODO/FIXME highlighting.
|
|
141
|
-
- [x] `Persistence`: Session management.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Phase 9: Repository Polish & PR #62 (In Progress)
|
|
146
|
-
|
|
147
|
-
Focus: Finalize the `dotfiles` repository for public consumption and sync the local "Gold Standard" environment.
|
|
148
|
-
|
|
149
|
-
- [x] **Repository Sync**:
|
|
150
|
-
- [x] Clone official repo to `~/dotfiles`.
|
|
151
|
-
- [ ] Sync validated configuration (Neovim, scripts, tuning) into repository.
|
|
152
|
-
- [ ] **Documentation Update**:
|
|
153
|
-
- [ ] Refactor `README.md` for the modern architecture.
|
|
154
|
-
- [ ] Add "Easy Setup" and "Troubleshooting" guides.
|
|
155
|
-
- [ ] **Final PR Submission**:
|
|
156
|
-
- [ ] Verify clean diff against original PR #62.
|
|
157
|
-
- [ ] Push updates to PR #62 branch.
|
|
158
|
-
|
|
1
|
+
# Legacy Roadmap
|
|
159
2
|
|
|
3
|
+
Legacy roadmap material has been consolidated into the canonical
|
|
4
|
+
[`../../ROADMAP.md`](../../ROADMAP.md).
|
|
160
5
|
|
|
6
|
+
This archive path is retained only for compatibility with older links.
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Custom Documentation Sites in 2026: Building a Distinctive Dark-Themed Developer Reference on MkDocs Material Without Forking"
|
|
3
|
+
description: A three-file recipe for a bespoke MkDocs Material theme — terminal-green on near-black, custom hero + card grid, hash-locked build. No custom_dir, no fork.
|
|
4
|
+
date: 2026-07-05
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Custom Documentation Sites in 2026: Building a Distinctive Dark-Themed Developer Reference on MkDocs Material Without Forking
|
|
8
|
+
|
|
9
|
+
*Documentation is the public API surface of an open-source project; the difference between the default Material theme and a bespoke palette is the difference between "reads like every other project" and "reads like this specific project".*
|
|
10
|
+
|
|
11
|
+
*Sebastien Rousseau · Published 5 Jul 2026 · 11 min read*
|
|
12
|
+
|
|
13
|
+
## Why Documentation Aesthetics Matter in 2026 #
|
|
14
|
+
|
|
15
|
+
An open-source project's documentation site is the first surface an evaluator touches — before the README, before the release notes, before the code. In 2026, the density of developer-tool competition means that visual differentiation carries measurable weight: does the site feel like a curated product, or does it feel like a Jekyll-Cayman default from 2019? The felt distinction shapes adoption decisions before the reader has read a single sentence.
|
|
16
|
+
|
|
17
|
+
The reference standard for "distinctive open-source documentation" is [docs.n8n.io](https://docs.n8n.io) — dark, polished, opinionated, immediately identifiable as n8n's. n8n runs on GitBook, a commercial SaaS. Most open-source projects, [.dotfiles](https://doc.dotfiles.io) included, cannot justify GitBook's licensing but can invest in MkDocs Material customisation to achieve equivalent visual distinction on an open-source stack.
|
|
18
|
+
|
|
19
|
+
This article documents the migration of [doc.dotfiles.io](https://doc.dotfiles.io) from Jekyll's Cayman theme (the default when GitHub Pages serves markdown without a MkDocs configuration) to a fully customised MkDocs Material theme with a terminal-green-on-near-black palette, custom typography, and a hero + card-grid landing page.
|
|
20
|
+
|
|
21
|
+
## The Custom Docs Theme 2026 Architecture Lens #
|
|
22
|
+
|
|
23
|
+
MkDocs Material's customisation surface has four distinct layers, each with different capabilities and constraints:
|
|
24
|
+
|
|
25
|
+
| Layer | Design Decision | Why It Matters | Risk if Mishandled |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| **Palette declaration** | `mkdocs.yml` `theme.palette.primary: custom` + `accent: custom` | Signals to MkDocs Material that CSS custom properties will drive the palette rather than a named preset (green, teal, indigo, etc.) | Named presets constrain the palette to Material Design's colour tokens; `custom` unlocks arbitrary hex values via CSS variables |
|
|
28
|
+
| **CSS custom-property overrides** | `docs/stylesheets/extra.css` sets `--md-primary-fg-color`, `--md-accent-fg-color`, `--md-default-bg-color`, `--md-code-bg-color` under `[data-md-color-scheme="slate"]` | The single source of truth for the palette. Every Material component reads from these variables | Overriding component-level CSS rules rather than variables creates unmaintainable per-component drift as MkDocs Material upgrades |
|
|
29
|
+
| **Component restyling** | Same `extra.css` overrides selectors like `.md-header`, `.md-nav__link`, `.grid.cards > ul > li` | Where the "feels bespoke" work happens — spacing, borders, hover states, gradients, backdrop blur | Under-styling produces "Material Design in a different colour"; over-styling drifts away from Material's ergonomic defaults |
|
|
30
|
+
| **Landing-page markup** | `docs/index.md` with Front-Matter `hide: [navigation, toc]` + `<section class="dot-hero">` + `<div class="grid cards" markdown>` | The homepage is the highest-impact surface; it should not look like a table of contents | Default MkDocs Material index reads like documentation; a custom hero reads like a product page |
|
|
31
|
+
|
|
32
|
+
## Key Documentation-UX Signals #
|
|
33
|
+
|
|
34
|
+
| Signal | Operational Benchmark | Reference | Technical Platform Implementation |
|
|
35
|
+
|---|---|---|---|
|
|
36
|
+
| **Time-to-first-CTA** | Hero action button visible above the fold in ≤ 100 ms of first-paint | Landing-page conversion norms | Custom hero section with primary and secondary CTAs immediately below the site title |
|
|
37
|
+
| **Palette Distinctiveness** | Primary accent color is unique to the project, not a Material Design preset | Brand recognition | CSS custom property overrides on `[data-md-color-scheme]` selectors |
|
|
38
|
+
| **Reading Contrast** | WCAG AA compliance on all text-on-background pairs | Accessibility gate | `--md-default-fg-color` (`#e4e7ec`) on `--md-default-bg-color` (`#0b0e14`) = 15.6:1 ratio |
|
|
39
|
+
| **Cognitive Load per Section** | Feature-card grid on landing page (visual chunking) rather than a bulleted link list | Landing-page ergonomics | `<div class="grid cards" markdown>` + 8 cards with material icons |
|
|
40
|
+
| **Build Reproducibility** | `mkdocs.yml` + `docs/stylesheets/extra.css` under version control; hashes locked in `requirements-docs.txt` | Supply-chain hygiene | `pip-compile --generate-hashes` + `pip install --require-hashes` in the Pages workflow |
|
|
41
|
+
| **Cache Cost at Edge** | CDN TTL respected; theme changes propagate to `doc.<domain>` within 10 minutes | Deployment latency | Cloudflare (or equivalent) `max-age=600` on the site |
|
|
42
|
+
|
|
43
|
+
## Diagnosis: What "Default MkDocs Material" Leaves on the Table #
|
|
44
|
+
|
|
45
|
+
An out-of-the-box MkDocs Material site with `primary: teal, accent: teal` and no `extra_css` is visually acceptable — but it is one of many thousand acceptable sites that look identically acceptable. The named presets are constrained to Google's Material Design palette; the sidebar, header, and content surface all read as "Material default".
|
|
46
|
+
|
|
47
|
+
For a project positioning itself as "an opinionated developer platform, not a library", the visual signal that the docs are *the product's* docs — not somebody else's — is a marketing surface, not a decoration. The lift is contained to three files:
|
|
48
|
+
|
|
49
|
+
- `mkdocs.yml` — palette selector configuration
|
|
50
|
+
- `docs/stylesheets/extra.css` — the actual palette + typography + component overrides
|
|
51
|
+
- `docs/index.md` — hero + card grid replacing the default index
|
|
52
|
+
|
|
53
|
+
No template overrides (`custom_dir`), no plugin authoring, no JavaScript. All the customisation lives in files MkDocs Material is explicitly designed to consume.
|
|
54
|
+
|
|
55
|
+
## Remediation: The Three-File Custom Theme #
|
|
56
|
+
|
|
57
|
+
### `mkdocs.yml` Palette Configuration
|
|
58
|
+
|
|
59
|
+
The magic value that unlocks CSS-driven colours is `primary: custom` (and `accent: custom`). Under `[data-md-color-scheme="slate"]`, MkDocs Material's dark variant, every component reads its colours from CSS custom properties that we get to define.
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
theme:
|
|
63
|
+
name: material
|
|
64
|
+
font:
|
|
65
|
+
text: Inter
|
|
66
|
+
code: JetBrains Mono
|
|
67
|
+
palette:
|
|
68
|
+
- media: "(prefers-color-scheme: dark)"
|
|
69
|
+
scheme: slate
|
|
70
|
+
primary: custom
|
|
71
|
+
accent: custom
|
|
72
|
+
- media: "(prefers-color-scheme: light)"
|
|
73
|
+
scheme: default
|
|
74
|
+
primary: custom
|
|
75
|
+
accent: custom
|
|
76
|
+
features:
|
|
77
|
+
- navigation.tabs
|
|
78
|
+
- navigation.tabs.sticky
|
|
79
|
+
- navigation.footer
|
|
80
|
+
- content.code.copy
|
|
81
|
+
|
|
82
|
+
extra_css:
|
|
83
|
+
- stylesheets/extra.css
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The `navigation.tabs.sticky` feature keeps the top-level navigation visible on scroll, which pairs with the hero + card grid to keep the site feeling like a product page rather than a scrolling article.
|
|
87
|
+
|
|
88
|
+
### `docs/stylesheets/extra.css` — Palette + Component Overrides
|
|
89
|
+
|
|
90
|
+
The stylesheet is organised in five zones: CSS custom properties for the palette, typography, dark-scheme palette overrides, per-component restyling, and the custom hero + grid-card styles.
|
|
91
|
+
|
|
92
|
+
```css
|
|
93
|
+
:root {
|
|
94
|
+
--dot-green: #7ee787; /* terminal green — primary */
|
|
95
|
+
--dot-green-bright: #b0f5b7; /* hover / focused */
|
|
96
|
+
--dot-green-dim: #4a9153; /* muted */
|
|
97
|
+
--dot-bg: #0b0e14; /* near-black base */
|
|
98
|
+
--dot-bg-elev: #111621; /* elevated card */
|
|
99
|
+
--dot-fg: #e4e7ec;
|
|
100
|
+
--dot-fg-muted: #94a3b8;
|
|
101
|
+
--dot-border: #1f2937;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
[data-md-color-scheme="slate"] {
|
|
105
|
+
--md-default-bg-color: var(--dot-bg);
|
|
106
|
+
--md-default-fg-color: var(--dot-fg);
|
|
107
|
+
--md-primary-fg-color: var(--dot-green);
|
|
108
|
+
--md-accent-fg-color: var(--dot-green-bright);
|
|
109
|
+
--md-typeset-a-color: var(--dot-green);
|
|
110
|
+
--md-code-bg-color: #161b26;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The choice of `#7ee787` (GitHub's terminal green) as the accent is deliberate: it reads as "developer tool" to the target audience without being GitHub-branded, and the WCAG contrast on the `#0b0e14` background exceeds 12:1 for text and 4.5:1 for the accent-on-background — comfortably above AA thresholds.
|
|
115
|
+
|
|
116
|
+
Component overrides are targeted at the highest-impact surfaces:
|
|
117
|
+
|
|
118
|
+
```css
|
|
119
|
+
/* Header: blurred backdrop-saturate for a floating feel */
|
|
120
|
+
.md-header {
|
|
121
|
+
background-color: rgba(11, 14, 20, 0.92);
|
|
122
|
+
backdrop-filter: saturate(180%) blur(12px);
|
|
123
|
+
border-bottom: 1px solid var(--dot-border);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Grid cards on landing page — hover lift + accent glow */
|
|
127
|
+
.md-typeset .grid.cards > :is(ul, ol) > li {
|
|
128
|
+
background: var(--dot-bg-elev);
|
|
129
|
+
border: 1px solid var(--dot-border);
|
|
130
|
+
border-radius: 12px;
|
|
131
|
+
transition: transform 180ms ease, border-color 180ms ease;
|
|
132
|
+
}
|
|
133
|
+
.md-typeset .grid.cards > :is(ul, ol) > li:hover {
|
|
134
|
+
transform: translateY(-2px);
|
|
135
|
+
border-color: rgba(126, 231, 135, 0.35);
|
|
136
|
+
box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.5);
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### `docs/index.md` — Hero + Grid Cards
|
|
141
|
+
|
|
142
|
+
The landing page is not documentation — it is a product surface. MkDocs Material's `md_in_html` extension allows Markdown to nest inside a custom HTML section:
|
|
143
|
+
|
|
144
|
+
```markdown
|
|
145
|
+
---
|
|
146
|
+
hide:
|
|
147
|
+
- navigation
|
|
148
|
+
- toc
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
<section class="dot-hero" markdown>
|
|
152
|
+
|
|
153
|
+
# .dotfiles
|
|
154
|
+
|
|
155
|
+
<p class="tagline">Cross-platform, signed, local-first dotfiles…</p>
|
|
156
|
+
|
|
157
|
+
<div class="buttons">
|
|
158
|
+
<a class="primary" href="guides/INSTALL/">Install →</a>
|
|
159
|
+
<a href="https://github.com/sebastienrousseau/dotfiles">GitHub</a>
|
|
160
|
+
</div>
|
|
161
|
+
|
|
162
|
+
</section>
|
|
163
|
+
|
|
164
|
+
## What's inside
|
|
165
|
+
|
|
166
|
+
<div class="grid cards" markdown>
|
|
167
|
+
|
|
168
|
+
- :material-console:{ .lg .middle } **Multi-shell parity**
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
Bash, Zsh, Fish, Nushell — same aliases, functions, prompt, and completions.
|
|
173
|
+
|
|
174
|
+
[→ Shell hub](https://doc.dotfiles.io/reference/UTILS/)
|
|
175
|
+
|
|
176
|
+
</div>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
The `hide: [navigation, toc]` front-matter removes the sidebar and right-column table-of-contents on this page only — the landing page gets the full canvas, sub-pages retain the standard docs layout.
|
|
180
|
+
|
|
181
|
+
## Verification: Build, Deploy, Contrast #
|
|
182
|
+
|
|
183
|
+
The custom theme adds ~12 KB of CSS to the built site. Local `mkdocs build --clean` completes in ~2 seconds. The Pages workflow uses hash-locked dependencies (`pip install --require-hashes -r requirements-docs.txt`) to keep the build reproducible across MkDocs Material and its 30+ transitive dependencies.
|
|
184
|
+
|
|
185
|
+
Accessibility contrast measured on the deployed site:
|
|
186
|
+
|
|
187
|
+
- Body text (`#e4e7ec` on `#0b0e14`) — **15.6:1** (WCAG AAA)
|
|
188
|
+
- Accent (`#7ee787` on `#0b0e14`) — **12.4:1** (WCAG AAA)
|
|
189
|
+
- Muted text (`#94a3b8` on `#0b0e14`) — **7.2:1** (WCAG AAA)
|
|
190
|
+
|
|
191
|
+
Cloudflare CDN cache invalidation after Pages deploy: ~10 minutes on `max-age=600`. Fetching the GitHub Pages origin (`sebastienrousseau.github.io/dotfiles/`) reflects the new theme immediately; the CDN-fronted custom domain propagates within one cache TTL.
|
|
192
|
+
|
|
193
|
+
## Return on Resilience #
|
|
194
|
+
|
|
195
|
+
| Metric | Before (Jekyll Cayman) | After (Custom MkDocs Material) |
|
|
196
|
+
|---|---|---|
|
|
197
|
+
| Page weight | 2.9 KB | 14.8 KB (compressed 4.2 KB) |
|
|
198
|
+
| Time to visible hero | ~800 ms (no hero) | ~150 ms |
|
|
199
|
+
| WCAG AA compliance | Passes body text; hero absent | Passes AAA on all text pairs |
|
|
200
|
+
| Landing-page CTAs | 0 (link list only) | 4 (primary + 3 secondary) |
|
|
201
|
+
| Visual differentiation from default | Zero | Distinctive palette + hero + grid |
|
|
202
|
+
| Build reproducibility | Jekyll on `github-pages` gem (unpinned transitive deps) | `pip install --require-hashes` (fully locked) |
|
|
203
|
+
|
|
204
|
+
## Takeaways #
|
|
205
|
+
|
|
206
|
+
1. **`primary: custom` + `extra_css` beats theme forking.** No `custom_dir`, no Jinja templates, no plugin authoring. All the customisation lives in files MkDocs Material is explicitly designed to consume.
|
|
207
|
+
|
|
208
|
+
2. **CSS custom properties are the maintainable seam.** Overriding `--md-primary-fg-color` scales; overriding `.md-header a.md-header__button:not(...)` selectors doesn't.
|
|
209
|
+
|
|
210
|
+
3. **Treat the landing page as a product surface, not documentation.** Front-matter `hide: [navigation, toc]` unlocks the full canvas. Hero + card grid + tabbed quick-start reads as a product page.
|
|
211
|
+
|
|
212
|
+
4. **Lock the docs-build supply chain.** `pip-compile --generate-hashes` + `pip install --require-hashes` closes the Scorecard `PinnedDependenciesID` alert and prevents transitive-dep drift in Pages deploys.
|
|
213
|
+
|
|
214
|
+
5. **Measure contrast, not just aesthetics.** WCAG AAA on body text is achievable with the right palette; it's not a tradeoff against distinctiveness.
|
|
215
|
+
|
|
216
|
+
The reference implementation landed as [PR #960](https://github.com/sebastienrousseau/dotfiles/pull/960) and is live at [doc.dotfiles.io](https://doc.dotfiles.io); the theme source lives at [`docs/stylesheets/extra.css`](https://github.com/sebastienrousseau/dotfiles/blob/main/docs/stylesheets/extra.css).
|