Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .zsh/configs/virtual/go.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Go configuration has been moved to dev container environments
2 changes: 2 additions & 0 deletions .zsh/configs/virtual/php.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export LDFLAGS="-L/opt/homebrew/opt/php@7.4/lib"
export CPPFLAGS="-I/opt/homebrew/opt/php@7.4/include"
1 change: 1 addition & 0 deletions .zsh/configs/virtual/python.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Python/pyenv configuration has been moved to dev container environments
51 changes: 51 additions & 0 deletions docs/adr/0014-manage-cmux-karabiner-with-home-manager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# ADR 0014: Manage cmux and Karabiner Configuration with Home Manager

## Status

Accepted

## Context

cmux and Karabiner are part of the local macOS development environment. They
affect terminal input behavior, especially Google Japanese Input shortcuts in
cmux and the Caps Lock to Control mapping.

These settings were previously applied directly under `~/.config/`, which made
them easy to lose during a machine rebuild and hard to review. ADR 0012 already
defines `nix/` as the source of truth for macOS packages and local environment
configuration.

## Decision

Manage cmux and Karabiner user configuration through home-manager modules under
`nix/home/`.

- Install cmux through the nix-darwin Homebrew cask list.
- Keep Karabiner Elements and Google Japanese Input in the Homebrew cask list.
- Generate `~/.config/cmux/config` from home-manager and keep legacy terminal
keybind overrides empty so input-method shortcuts are not consumed by cmux.
- Generate `~/.config/cmux/cmux.json` from home-manager for app, automation,
notification, browser, sidebar, and terminal behavior that should be stable
across rebuilds.
- Generate `~/.config/ghostty/config` from home-manager for the terminal
rendering settings that cmux reads through Ghostty.
- Generate `~/.config/karabiner/karabiner.json` from home-manager.
- Keep the Karabiner virtual keyboard type as `jis` so Japanese-specific virtual
keys work.
- Explicitly map Caps Lock to left Control.
- Scope the cmux IME shortcut workaround to `com.cmuxterm.app` only:
- `Ctrl+Shift+J` sends the virtual Kana key.
- `Ctrl+Shift+;` and `Ctrl+Shift+'` send the virtual Eisuu key.

## Consequences

`darwin-rebuild switch --flake ~/develop/github.com/keito4/config/nix` becomes
the source of truth for these local input settings.

Manual changes to `~/.config/cmux/config`, `~/.config/cmux/cmux.json`,
`~/.config/ghostty/config`, and `~/.config/karabiner/karabiner.json` will be
overwritten by home-manager. This is intentional so shortcut behavior and cmux
runtime behavior stay reproducible across machines.

The Karabiner workaround is app-scoped to avoid changing the same shortcuts in
other applications.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# ADR 0015: Manage Portable User Dotfiles with Home Manager

## Status

Accepted

## Context

The macOS environment should be reproducible without using Apple's default
machine migration flow. ADR 0012 defines `nix/` as the source of truth for
macOS packages and local environment configuration, and ADR 0014 adds cmux and
Karabiner settings.

Several portable text configuration files still lived only in the user home
directory. These files affect daily shell behavior, local workflow tools, and
window management, so losing them during a rebuild would make a new machine feel
incomplete even if packages were installed.

Some home-directory files are not safe to manage in git because they contain
credentials, tokens, session state, app databases, histories, or
machine-specific runtime data.

## Decision

Manage portable, non-secret user dotfiles through `nix/home/dotfiles.nix`.

- Source reusable zsh config fragments and functions from the repository.
- Source AeroSpace configuration from `dot/aerospace.toml`.
- Source small workflow-tool configs for act, Agent Deck, Graphite aliases, and
Codespaces secret repository selection.
- Source global git ignore and peco configuration from the repository.
- Use `force = true` for these files so home-manager can take ownership of
existing files during a rebuild.

Do not manage secret or stateful files in git. Specifically keep the following
outside this repository:

- SSH keys and `~/.ssh/config`
- cloud auth files under `~/.aws`, `~/.azure`, and `~/.config/gcloud`
- GitHub auth files such as `~/.config/gh/hosts.yml`
- token-bearing CLI configs such as Graphite `user_config` and npm auth config
- Claude/Codex auth, session, history, cache, and SQLite state
- application databases, browser profiles, and update caches

## Consequences

`darwin-rebuild switch --flake ~/develop/github.com/keito4/config/nix` can
restore a larger portion of the user environment on a new machine without
copying the old machine's home directory.

Manual edits to managed dotfiles will be overwritten on the next home-manager
activation. Changes should be made in this repository first, then applied with
the Nix switch command.

Authentication and app state still require explicit sign-in or a separate
secrets/bootstrap process. This keeps the repository reviewable and avoids
encoding machine-specific runtime state as configuration.
206 changes: 206 additions & 0 deletions dot/aerospace.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
# Place a copy of this config to ~/.aerospace.toml
# After that, you can edit ~/.aerospace.toml to your liking
Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the header comments to match Home Manager ownership.

Line 1 and Line 2 currently tell users to copy/edit ~/.aerospace.toml manually, but this file is declaratively managed and force-overwritten by Home Manager (nix/home/dotfiles.nix Line 4-Line 7 and Line 11). Please replace this guidance to prevent confusing, non-persistent manual edits.

Suggested edit
-# Place a copy of this config to ~/.aerospace.toml
-# After that, you can edit ~/.aerospace.toml to your liking
+# Managed by Home Manager via nix/home/dotfiles.nix
+# Edit this repository file and apply with darwin-rebuild/home-manager switch
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Place a copy of this config to ~/.aerospace.toml
# After that, you can edit ~/.aerospace.toml to your liking
# Managed by Home Manager via nix/home/dotfiles.nix
# Edit this repository file and apply with darwin-rebuild/home-manager switch
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dot/aerospace.toml` around lines 1 - 2, The header comments on lines 1-2 of
aerospace.toml incorrectly instruct users to manually copy and edit the file at
~/.aerospace.toml, but this file is actually declaratively managed and
force-overwritten by Home Manager configuration in nix/home/dotfiles.nix.
Replace these misleading comments with new header text that clearly states the
file is managed by Home Manager and directs users to modify their configuration
through the Home Manager nix files instead of editing the dotfile manually.


# You can use it to add commands that run after AeroSpace startup.
# Available commands : https://nikitabobko.github.io/AeroSpace/commands
after-startup-command = []

# Start AeroSpace at login
start-at-login = false

# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true

# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
accordion-padding = 30

# Possible values: tiles|accordion
default-root-container-layout = 'tiles'

# Possible values: horizontal|vertical|auto
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
# tall monitor (anything higher than wide) gets vertical orientation
default-root-container-orientation = 'auto'

# Mouse follows focus when focused monitor changes
# Drop it from your config, if you don't like this behavior
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
# Fallback value (if you omit the key): on-focused-monitor-changed = []
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']

# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag
# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key
# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app
automatically-unhide-macos-hidden-apps = false

# Possible values: (qwerty|dvorak|colemak)
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
[key-mapping]
preset = 'qwerty'

# Gaps between windows (inner-*) and between monitor edges (outer-*).
# Possible values:
# - Constant: gaps.outer.top = 8
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
# In this example, 24 is a default value when there is no match.
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
# See:
# https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
[gaps]
inner.horizontal = 0
inner.vertical = 0
outer.left = 0
outer.bottom = 0
outer.top = 0
outer.right = 0

# 'main' binding mode declaration
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# 'main' binding mode must be always presented
# Fallback value (if you omit the key): mode.main.binding = {}
[mode.main.binding]

# All possible keys:
# - Letters. a, b, c, ..., z
# - Numbers. 0, 1, 2, ..., 9
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
# - F-keys. f1, f2, ..., f20
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon,
# backtick, leftSquareBracket, rightSquareBracket, space, enter, esc,
# backspace, tab, pageUp, pageDown, home, end, forwardDelete,
# sectionSign (ISO keyboards only, european keyboards only)
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
# keypadMinus, keypadMultiply, keypadPlus
# - Arrows. left, down, up, right

# All possible modifiers: cmd, alt, ctrl, shift

# All possible commands: https://nikitabobko.github.io/AeroSpace/commands

# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
# You can uncomment the following lines to open up terminal with alt + enter shortcut
# (like in i3)
# alt-enter = '''exec-and-forget osascript -e '
# tell application "Terminal"
# do script
# activate
# end tell'
# '''

# See: https://nikitabobko.github.io/AeroSpace/commands#layout
alt-slash = 'layout tiles horizontal vertical'
alt-comma = 'layout accordion horizontal vertical'

# See: https://nikitabobko.github.io/AeroSpace/commands#focus
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'

# See: https://nikitabobko.github.io/AeroSpace/commands#move
alt-shift-h = 'move left'
alt-shift-j = 'move down'
alt-shift-k = 'move up'
alt-shift-l = 'move right'

# See: https://nikitabobko.github.io/AeroSpace/commands#resize
alt-minus = 'resize smart -50'
alt-equal = 'resize smart +50'

# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-4 = 'workspace 4'
alt-5 = 'workspace 5'
alt-6 = 'workspace 6'
alt-7 = 'workspace 7'
alt-8 = 'workspace 8'
alt-9 = 'workspace 9'
alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need
alt-b = 'workspace B'
alt-c = 'workspace C'
alt-d = 'workspace D'
alt-e = 'workspace E'
alt-f = 'workspace F'
alt-g = 'workspace G'
alt-i = 'workspace I'
alt-m = 'workspace M'
alt-n = 'workspace N'
alt-o = 'workspace O'
alt-p = 'workspace P'
alt-q = 'workspace Q'
alt-r = 'workspace R'
alt-s = 'workspace S'
alt-t = 'workspace T'
alt-u = 'workspace U'
alt-v = 'workspace V'
alt-w = 'workspace W'
alt-x = 'workspace X'
alt-y = 'workspace Y'
alt-z = 'workspace Z'

# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
alt-shift-1 = 'move-node-to-workspace 1'
alt-shift-2 = 'move-node-to-workspace 2'
alt-shift-3 = 'move-node-to-workspace 3'
alt-shift-4 = 'move-node-to-workspace 4'
alt-shift-5 = 'move-node-to-workspace 5'
alt-shift-6 = 'move-node-to-workspace 6'
alt-shift-7 = 'move-node-to-workspace 7'
alt-shift-8 = 'move-node-to-workspace 8'
alt-shift-9 = 'move-node-to-workspace 9'
alt-shift-a = 'move-node-to-workspace A'
alt-shift-b = 'move-node-to-workspace B'
alt-shift-c = 'move-node-to-workspace C'
alt-shift-d = 'move-node-to-workspace D'
alt-shift-e = 'move-node-to-workspace E'
alt-shift-f = 'move-node-to-workspace F'
alt-shift-g = 'move-node-to-workspace G'
alt-shift-i = 'move-node-to-workspace I'
alt-shift-m = 'move-node-to-workspace M'
alt-shift-n = 'move-node-to-workspace N'
alt-shift-o = 'move-node-to-workspace O'
alt-shift-p = 'move-node-to-workspace P'
alt-shift-q = 'move-node-to-workspace Q'
alt-shift-r = 'move-node-to-workspace R'
alt-shift-s = 'move-node-to-workspace S'
alt-shift-t = 'move-node-to-workspace T'
alt-shift-u = 'move-node-to-workspace U'
alt-shift-v = 'move-node-to-workspace V'
alt-shift-w = 'move-node-to-workspace W'
alt-shift-x = 'move-node-to-workspace X'
alt-shift-y = 'move-node-to-workspace Y'
alt-shift-z = 'move-node-to-workspace Z'

# See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
alt-tab = 'workspace-back-and-forth'
# See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor
alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'

# See: https://nikitabobko.github.io/AeroSpace/commands#mode
alt-shift-semicolon = 'mode service'

# 'service' binding mode declaration.
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
[mode.service.binding]
esc = ['reload-config', 'mode main']
r = ['flatten-workspace-tree', 'mode main'] # reset layout
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
backspace = ['close-all-windows-but-current', 'mode main']

# sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2
#s = ['layout sticky tiling', 'mode main']

alt-shift-h = ['join-with left', 'mode main']
alt-shift-j = ['join-with down', 'mode main']
alt-shift-k = ['join-with up', 'mode main']
alt-shift-l = ['join-with right', 'mode main']

down = 'volume down'
up = 'volume up'
shift-down = ['volume set 0', 'mode main']
4 changes: 4 additions & 0 deletions dot/config/act/actrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-P ubuntu-latest=catthehacker/ubuntu:act-latest
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04
-P ubuntu-20.04=catthehacker/ubuntu:act-20.04
-P ubuntu-18.04=catthehacker/ubuntu:act-18.04
20 changes: 20 additions & 0 deletions dot/config/agent-deck/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Agent Deck Configuration
# All options: https://github.com/asheshgoplani/agent-deck/blob/main/skills/agent-deck/references/config-reference.md

default_tool = "claude"
theme = "dark"

[claude]
dangerous_mode = false

[global_search]
enabled = true
tier = "auto"
recent_days = 90

[logs]
max_size_mb = 10
max_lines = 10000

[instances]
allow_multiple = true
2 changes: 2 additions & 0 deletions dot/config/codespaces-secrets/repos.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
OYKOT-jp/nomad_japan
keito4/effectuation
11 changes: 11 additions & 0 deletions dot/config/graphite/aliases
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Edit this file to configure aliases for Graphite commands.
# If you delete this file, it will be recreated with the default aliases.
# The first word of each line is the alias, and the rest is the command.
# Lines starting with # are ignored.

# The aliases for ss, ls, and ll are defined by default and must be overridden to be disabled.
# They are shown below to demonstrate the formatting.

ls log short
ll log long
ss submit --stack
Loading
Loading