101 Commits

Author SHA1 Message Date
74973c1449 chore: initial commit for draft MR 2025-12-18 15:56:51 +01:00
545a5927e5 chore(nvim): add commented formatter.nvim config
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:54:13 +01:00
c6b2743cf6 chore(nvim): reorder plugins, remove claude-code from paq-setup
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:53:59 +01:00
430bec1708 style(lsp): fix formatting and indentation
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:53:56 +01:00
d9e25eec77 chore: remove taskdeps script
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:53:04 +01:00
a588604d91 chore(nvim): comment out image.nvim config
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:53:01 +01:00
d9911dd2ce style(cmp): reformat sources list
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:57 +01:00
b397fab3f2 feat(ftplugin): add dotenv filetype support
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:54 +01:00
1246f42638 feat(nvim): add skeleton module to init
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:50 +01:00
06fb7dd4b8 fix(wiki): disable auto lcd on VimEnter
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:47 +01:00
4b2d24e1f4 feat(fzf): add resume to live_grep, use complete_file
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:42 +01:00
f57d227203 feat(lint): enable eslint for js/ts, disable systemdlint/yamllint
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:31 +01:00
82f904c9dc feat(format): enable lsp_fallback, disable json formatters
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:52:24 +01:00
26b5f00643 fix(lsp): update helm_ls, yamlls, disable emmet
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:51:36 +01:00
31f604f8f6 feat(lsp): add terraformls, rust_analyzer, configure nixd
Add support for Terraform and Rust language servers, and configure nixd
with home-manager options for better Nix completions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:51:17 +01:00
8632e7a1bc feat(lsp): switch from ts_ls to vtsls
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:51:02 +01:00
0a9405ffd6 chore(nvim): disable codecompanion plugin config
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:50:40 +01:00
eceaab3caf chore(nvim): disable mcphub plugin config
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:50:36 +01:00
1dbb9c1e5d chore(nvim): disable nvimkit, normalize paq-setup formatting
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:50:16 +01:00
b3e1e4e939 chore(nvim): disable image.nvim plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:45:36 +01:00
14e1f01784 feat(nvim): add vim-markdown-composer plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:45:12 +01:00
e1e300bee2 feat(nvim): add blink.download plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:44:58 +01:00
1418407e63 feat(nvim): add obsidian plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:44:41 +01:00
1e3a5d291f feat(nvim): add nvim-early-retirement plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:44:18 +01:00
a8100cf3e2 feat(nvim): add kubectl plugin
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 15:40:18 +01:00
6c738b78e7 feat: set up 'claude-code.nvim' plugin 2025-12-18 15:34:49 +01:00
0233c339aa chore: add TODO for unique 'networking.hostId' 2025-12-18 13:40:26 +01:00
57706b7292 refactor: use username variable consistently
Replaced hardcoded "h" username references with variables:
- hosts/vm: use username variable for secrets.username
- home configs: use username variable in bash initExtra paths
- keepassxc: update comment to use $HOME instead of /home/h

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 13:39:43 +01:00
7ce3609579 fix(firefox): merge duplicate policies declarations
Second policies declaration was overwriting the first, causing
DefaultDownloadDirectory setting to be lost. Merged both into single
policies block.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 13:39:43 +01:00
51d0399f21 fix: format rust using 'rustfmt' 2025-12-15 18:18:20 +01:00
d232d8fad6 refactor: decouple 'andromache' home config from 'astyanax' 2025-12-15 12:19:38 +01:00
413c6a4a63 chore: update neovim flake (and main flake) 2025-12-15 12:01:19 +01:00
af20454965 refactor: import shikane 'desktop/niri' instead of directly 2025-12-15 11:57:22 +01:00
ae17c411d4 feat: add plain 'mako' service for notifications 2025-12-14 23:45:58 +01:00
f8bac5414b feat: declare anki config 2025-12-14 22:44:45 +01:00
b8b7f6bce7 fix: migrate 'r5rs' script to neovim 2025-12-14 22:11:14 +01:00
eb0b192b5e fix: ignore directories that contain '.nobackup' in 'save-home' 2025-12-14 22:11:14 +01:00
f60b26c676 chore: format using 'black' 2025-12-14 22:11:14 +01:00
67dcddb55c chore: clean up 'astyanax' packages 2025-12-09 23:43:56 +01:00
ce732af957 feat: add 'fail2ban' to 'hecuba' host 2025-12-09 23:10:24 +01:00
098bbbb5d2 refactor: use environment variable for zettelkasten path 2025-12-09 12:43:07 +01:00
61a5ef7714 feat: add 'rustfmt' for rust formatting 2025-12-08 20:16:18 +01:00
1020a0ea2a chore: relock flake 2025-12-07 23:04:06 +01:00
32e3ee40e1 feat: add 'figet.nvim' to 'nvim' flake 2025-12-07 22:59:05 +01:00
8295557eb4 test(nvim): try out 'm_taskwarrior_d.nvim' plugin 2025-12-07 19:16:07 +01:00
1c71b8c9fc fix: resolve 'nix flake check' errors 2025-12-07 17:42:18 +01:00
debd25f8f8 feat: use 'rustaceanvim' instead for rust development 2025-12-07 17:36:33 +01:00
43f1023449 feat: add 'wl-clipboard' to niri desktop 2025-12-07 14:32:33 +01:00
2b035eb415 fix: work around throttled error 2025-12-07 00:13:59 +01:00
ec595c6f52 fix: declare graphics config for 'astyanax' host 2025-12-07 00:06:22 +01:00
2326ac1e78 fix: resolve treesitter errors on NixOS 2025-12-07 00:05:46 +01:00
14abad0b98 chore: ignore breaking changes warning for 'codecompanion.nvim' 2025-12-07 00:04:56 +01:00
f5ffa8b9d1 enable 'shikane' on 'astyanax' (and add 'wdisplays') 2025-12-06 23:51:50 +01:00
7b9eac546b feat(nvim): set up rust lsp config 2025-12-06 23:49:29 +01:00
36cdaac5ad refactor: enable firewall explicitely for 'hecuba' host 2025-12-04 12:48:55 +01:00
126671ffc7 fix: remove common '.nix' suffix 2025-12-04 12:48:55 +01:00
a1263d8bf1 fix: update waybar to match polybar config (for the most part) 2025-12-04 12:48:55 +01:00
50b2f38f21 refactor: move 'wlsunset' package into home manager module 2025-12-04 12:48:55 +01:00
Hektor Misplon
c335534278 chore: update 'nvim' flake 2025-12-04 02:24:28 +01:00
Hektor Misplon
88d5657cf8 fix: don't autoinstall treesitter grammars when using 'nixCats' 2025-12-04 02:21:30 +01:00
d2a4e35417 fix: declare 'fuzzel' config and add it to 'niri' desktop 2025-12-03 23:49:58 +01:00
7e58bb7bc2 feat: track (currently unused) k3s module 2025-12-03 23:45:55 +01:00
4d6ba61f52 refactor: use 'default.nix' for all modules 2025-12-03 23:43:43 +01:00
683e6e4d10 fix: declare 'waybar' config and add it to 'niri' desktop 2025-12-03 23:36:33 +01:00
dbad023043 fix: declare niri config 2025-12-03 23:36:33 +01:00
355cad6574 fix: try 'writeShellApplication' for 'astyanax' WOL script 2025-12-03 22:35:21 +01:00
c9f69530d8 fix: declare 'andromache' 'eno1' interface MAC address 2025-12-03 21:40:44 +01:00
0197e99b8f feat: add 'hecuba' host config 2025-12-03 19:28:03 +01:00
0bad5c492c fix: further harden 'hardened-openssh' module 2025-12-03 17:14:08 +01:00
1cba6c968a fix: replace 'gnome' desktop with 'niri' 2025-12-03 15:56:09 +01:00
8ae482d846 fix: declare KeePassXC browser integration 2025-12-03 15:56:06 +01:00
8c3e762a46 chore(pkgs): add 'signal-desktop' package 2025-12-03 15:54:33 +01:00
43832361ea fix: disable kitty tab shortcut for now 2025-12-03 15:54:33 +01:00
166d904735 update bluetooth config 2025-12-03 15:54:33 +01:00
67d0733bbd refactor: move bootloader into 'modules/boot' 2025-12-03 15:54:33 +01:00
ae55782bf2 refactor: move 'disko' modules into 'modules/disko' 2025-12-03 15:54:33 +01:00
e10923f74d resolve NixOS build warnings 2025-12-03 15:54:33 +01:00
6b5ac0c370 Merge pull request 'update' (#1) from claude-code-test into main
Reviewed-on: #1
2025-12-03 15:53:43 +01:00
0652389078 refactor(home/work): improve configuration structure
- Add nixpkgs.config.allowUnfree setting
- Fix nixGL configuration path to targets.genericLinux.nixGL
- Remove redundant anki program import (now in modules)
- Enable gh and kubecolor programs
- Pass inputs to packages.nix for flake package access

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 15:53:22 +01:00
2913e9578e feat(home): add GNOME desktop configuration
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 15:53:22 +01:00
b72c1d5e86 chore(home): add commented experimental anki sync config
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 15:53:22 +01:00
1c844adf91 refactor(work): set up 'packages.local.nix' approach 2025-12-03 15:53:22 +01:00
fdbe4366e1 feat(home): add git config with example configuration for non-NixOS 2025-12-03 15:53:22 +01:00
a9ffcc12ee refactor: move common hosts config into 'modules/common.nix' 2025-12-03 15:53:22 +01:00
9765d93f9f chore: formatting and cleanup
- Format shell.nix skeleton to single line
- Complete ts-node removal from astyanax packages
- Format andromache hardware config
2025-12-03 15:53:22 +01:00
42dbe5ade2 chore: update flake to 'nixos-unstable'
- Switch from 'nixos-25.05' to 'nixos-unstable'
- Update home-manager to follow main branch
2025-12-03 15:53:22 +01:00
bab2c35bff fix(astyanax): correct hostname typo from astynanax to astyanax 2025-12-03 15:53:22 +01:00
ce26b1c206 Add neovim 'typescriptreact' snippets 2025-12-03 15:53:22 +01:00
2d26d6ebd8 don't use rootless docker on 'andromache', but keep it as an option 2025-11-28 20:57:04 +01:00
e0a1ec77ed enable wake on lan on 'andromache' host 2025-11-27 10:37:05 +01:00
68bf971992 declare rootless docker for 'andromache' host 2025-11-26 18:37:11 +01:00
80e74d3283 enable recurrence only on one hosts per 'man task-sync' 2025-11-24 18:47:10 +01:00
f93eecfcb1 refactor 'nixosConfigurations' 2025-11-23 23:29:46 +01:00
6d5e6add02 move 'nixos-hardware' from 'vm' to 'astyanax' host 2025-11-23 22:06:25 +01:00
cdf5127071 modularize NixOS secrets config 2025-11-23 22:06:25 +01:00
1a57e8a424 refactor 2025-11-23 19:49:49 +01:00
cf27fdedde use neovim dark mode 2025-11-23 19:48:48 +01:00
92226fff95 declare taskwarrior for all NixOS hosts 2025-11-23 19:37:15 +01:00
2e81d28cc8 split up taskwarrior config to facilitate coexisting NixOS and Arch configs 2025-11-23 19:02:21 +01:00
f5e31ff825 Add (unused) 'printing' module 2025-11-23 16:12:55 +01:00
fdd4c13d34 Refactor 'home/hosts/work' 2025-11-23 16:10:30 +01:00
89 changed files with 1714 additions and 513 deletions

2
.gitignore vendored
View File

@@ -4,3 +4,5 @@ result
result-*
nixos-efi-vars.fd
home/hosts/work/packages.local.nix

View File

@@ -8,19 +8,24 @@ Pomodoro timer
- Notification on break finish
"""
import os
import atexit
import os
from argparse import ArgumentParser
from time import sleep
from plyer import notification
POMO_PATH = os.path.join(os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share")), "pomo")
POMO_PATH = os.path.join(
os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share")), "pomo"
)
@atexit.register
def clear():
if os.path.exists(POMO_PATH):
os.remove(POMO_PATH)
def format_mins_secs(mins, secs):
return f"{mins:02d}:{secs:02d}"
@@ -34,6 +39,7 @@ def make_countdown():
os.system(f'echo -n "{time_str}" > {POMO_PATH}')
sleep(1)
duration -= 1
return countdown
@@ -58,21 +64,23 @@ def main(args):
def handle_signal(signal, frame):
# Wait for clear to finish
clear()
print('Exiting')
print("Exiting")
exit(0)
if __name__ == '__main__':
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument('-w', '--work-duration', type=int,
help='Session duration', default=25)
parser.add_argument('-b', '--break-duration', type=int,
help='Break duration', default=5)
parser.add_argument('-r', '--repeats', type=int,
help='Numer of sessions', default=1)
parser.add_argument('-c', '--clear', action='store_true',
help='Clear timer')
parser.add_argument(
"-w", "--work-duration", type=int, help="Session duration", default=25
)
parser.add_argument(
"-b", "--break-duration", type=int, help="Break duration", default=5
)
parser.add_argument(
"-r", "--repeats", type=int, help="Numer of sessions", default=1
)
parser.add_argument("-c", "--clear", action="store_true", help="Clear timer")
args = parser.parse_args()

View File

@@ -2,8 +2,8 @@
session="r5rs"
tmux attach-session -t $session || tmux new-session -s $session \; \
tmux attach-session -t "$session" || tmux new-session -s "$session" \; \
split-window -h -t $session \; \
send-keys -t 0 "vim" C-m \; \
send-keys -t 1 "plt-r5rs --no-prim" C-m \; \
select-pane -t 0
send-keys -t 1 "nvim -c \"set ft=scheme\"" C-m \; \
send-keys -t 2 "plt-r5rs --no-prim" C-m \; \
select-pane -t 1

View File

@@ -22,4 +22,5 @@ restic -r "$RESTIC_REPOSITORY:$HOSTNAME" backup \
--one-file-system \
--files-from="$HOME/.resticinclude" \
--exclude-file="$HOME/.resticexclude" \
--exclude-if-present=".nobackup" \
--verbose=3

View File

@@ -1,12 +1,12 @@
#!/usr/bin/env python
import sys
import subprocess
import sys
DEFAULT_TEMPERATURE = 3500
try:
with open('/tmp/temperature', 'r') as temp_file:
with open("/tmp/temperature", "r") as temp_file:
current_temperature = int(temp_file.read())
except FileNotFoundError:
current_temperature = DEFAULT_TEMPERATURE
@@ -16,7 +16,8 @@ if len(sys.argv) == 1:
print(current_temperature)
sys.exit(0)
elif len(sys.argv) != 2:
print("""
print(
"""
Usage:
screen-temperature
@@ -27,7 +28,8 @@ Usage:
screen-temperature <+|-><temperature>
increase or decrease screen temperature by <temperature>
""")
"""
)
sys.exit(1)
temperature_change = sys.argv[1]
@@ -41,11 +43,10 @@ else:
try:
subprocess.run(["redshift", "-O", str(new_temperature), "-P"], check=True)
with open('/tmp/temperature', 'w') as temp_file:
temp_file.write(str(new_temperature) + '\n')
with open("/tmp/temperature", "w") as temp_file:
temp_file.write(str(new_temperature) + "\n")
# Send notification
subprocess.run(
["notify-send", str(new_temperature) + "K"])
subprocess.run(["notify-send", str(new_temperature) + "K"])
except subprocess.CalledProcessError:
print("Error: could not set screen temperature.")
sys.exit(1)

View File

@@ -1,144 +0,0 @@
#!/usr/bin/python
import argparse
import json
import subprocess
from collections import defaultdict
def get_task_data():
command = (
"task +PENDING or +WAITING -COMPLETED -DELETED export | "
"jq '[.[] | {uuid: .uuid, id, depends: .depends, description: .description, status: .status }]'"
)
output = subprocess.check_output(command, shell=True)
return json.loads(output)
def parse_task_data(data):
dependency_graph = defaultdict(list)
task_details = {}
dependent_tasks = set()
for task in data:
task_id = task["uuid"]
task_details[task_id] = {
"id": task.get("id", "?"),
"description": task.get("description", "No description"),
"status": task.get("status", "Unknown status"),
}
if task["depends"]:
for dependency in task["depends"]:
dependency_graph[dependency].append(task_id)
dependent_tasks.add(task_id)
root_tasks = set(task_details.keys()) - dependent_tasks
return task_details, dependency_graph, root_tasks
def get_all_parents(task_id, dependency_graph):
return [
parent for parent, children in dependency_graph.items() if task_id in children
]
def build_ascii_dag(
task_id,
task_details,
dependency_graph,
prefix="",
is_last=True,
show_id=True,
visited=None,
):
if visited is None:
visited = set()
if task_id in visited:
return [f"{prefix}{'└── ' if is_last else '├── '}... (cycle detected)"]
visited.add(task_id)
task_info = task_details[task_id]
task_line = f"{prefix}{'└── ' if is_last else '├── '}{task_info['id'] + ': ' if show_id else ''}{task_info['description']} ({task_info['status']})"
lines = [task_line]
children = dependency_graph.get(task_id, [])
for idx, child in enumerate(children):
child_is_last = idx == len(children) - 1
child_prefix = prefix + (" " if is_last else "│ ")
lines.extend(
build_ascii_dag(
child,
task_details,
dependency_graph,
child_prefix,
child_is_last,
show_id,
visited.copy(),
)
)
return lines
def render_dependency_dag(task_details, dependency_graph, root_tasks, show_id):
dag_lines = []
global_visited = set()
def dfs(task_id, prefix="", is_last=True, visited=None):
if visited is None:
visited = set()
if task_id in visited:
return
visited.add(task_id)
global_visited.add(task_id)
task_info = task_details[task_id]
task_line = f"{prefix}{'└── ' if is_last else '├── '}{str(task_info['id']) + ': ' if show_id else ''}{task_info['description']} ({task_info['status']})"
dag_lines.append(task_line)
children = dependency_graph.get(task_id, [])
for idx, child in enumerate(children):
child_is_last = idx == len(children) - 1
child_prefix = prefix + (" " if is_last else "│ ")
dfs(child, child_prefix, child_is_last, visited.copy())
root_tasks_with_children = [
root for root in root_tasks if dependency_graph.get(root, [])
]
for root in sorted(
root_tasks_with_children,
key=lambda x: len(dependency_graph.get(x, [])),
reverse=True,
):
if root not in global_visited:
dfs(root)
dag_lines.append("")
return "\n".join(dag_lines).rstrip()
def main(args):
data = get_task_data()
task_details, dependency_graph, root_tasks = parse_task_data(data)
ascii_dag = render_dependency_dag(
task_details, dependency_graph, root_tasks, show_id=args.show_id
)
print(ascii_dag)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Generates a task dependency DAG for Taskwarrior tasks."
)
parser.add_argument(
"--show-id",
action="store_true",
default=False,
help="Include task IDs in the output.",
)
args = parser.parse_args()
main(args)

View File

@@ -1,7 +1,9 @@
#!/usr/bin/env bash
current_zettel_path="$ZK_PATH/$(cat "$ZK_PATH/current-zettel.txt")"
if [ "$TERM_PROGRAM" = tmux ]; then
cd ~/.zk && $EDITOR "$(cat ~/.zk/current-zettel.txt)"
cd "$ZK_PATH" && $EDITOR "$current_zettel_path"
else
echo 'Not in tmux'
echo 'Choose an option:'
@@ -18,12 +20,12 @@ else
else
# Create session with a window named 'zk' and start nvim
tmux new-session -s zk -n zk -d
tmux send-keys -t zk:zk "cd ~/.zk && $EDITOR \"\$(cat ~/.zk/current-zettel.txt)\"" Enter
tmux send-keys -t zk:zk "cd $ZK_PATH && $EDITOR $current_zettel_path" Enter
tmux attach -t zk
fi
;;
2)
cd ~/.zk && $EDITOR "$(cat ~/.zk/current-zettel.txt)"
cd "$ZK_PATH" && $EDITOR "$current_zettel_path"
;;
*)
echo 'Not opening Zettelkasten'

View File

@@ -136,7 +136,7 @@ map f5 goto_tab 5
map f6 goto_tab 6
map f7 goto_tab 7
map f8 goto_tab 8
map kitty_mod+c new_tab
# map kitty_mod+c new_tab # FIXME: conflict with 'copy'
map cmd+t
map kitty_mod+q
map cmd+w

View File

@@ -0,0 +1 @@
require("claude-code").setup()

View File

@@ -1,16 +1,16 @@
require("codecompanion").setup({
extensions = {
mcphub = {
callback = "mcphub.extensions.codecompanion",
opts = {
make_vars = true,
make_slash_commands = true,
show_result_in_chat = true
}
}
},
strategies = {
chat = { adapter = "openai" },
inline = { adapter = "openai" },
},
})
-- require("codecompanion").setup({
-- extensions = {
-- mcphub = {
-- callback = "mcphub.extensions.codecompanion",
-- opts = {
-- make_vars = true,
-- make_slash_commands = true,
-- show_result_in_chat = true
-- }
-- }
-- },
-- strategies = {
-- chat = { adapter = "openai" },
-- inline = { adapter = "openai" },
-- },
-- })

View File

@@ -1,6 +1,6 @@
require("conform").setup({
format_after_save = {
lsp_fallback = false,
lsp_fallback = true,
async = false,
timeout_ms = 500,
},
@@ -18,8 +18,8 @@ require("conform").setup({
nix = { "nixfmt" },
javascript = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
javascriptreact = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
json = { "prettierd", "prettier", stop_after_first = true },
jsonc = { "prettierd", "prettier", stop_after_first = true },
-- json = { "prettierd", "prettier", stop_after_first = true },
-- jsonc = { "prettierd", "prettier", stop_after_first = true },
python = { "isort", "black" },
svelte = { "eslint_d", "prettierd", "prettier", stop_after_first = true },
typescript = { "eslint_d", "prettierd", "prettier", stop_after_first = true },

View File

@@ -0,0 +1 @@
require("fidget").setup()

View File

@@ -0,0 +1,78 @@
-- require("formatter").setup({
-- logging = true,
-- filetype = {
-- typescriptreact = {
-- -- prettier
-- function()
-- return {
-- exe = "prettier",
-- args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0) },
-- stdin = true,
-- }
-- end,
-- },
-- typescript = {
-- -- prettier
-- function()
-- return {
-- exe = "prettier",
-- args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0) },
-- stdin = true,
-- }
-- end,
-- -- linter
-- -- function()
-- -- return {
-- -- exe = "eslint",
-- -- args = {
-- -- "--stdin-filename",
-- -- vim.api.nvim_buf_get_name(0),
-- -- "--fix",
-- -- "--cache"
-- -- },
-- -- stdin = false
-- -- }
-- -- end
-- },
-- javascript = {
-- -- prettier
-- function()
-- return {
-- exe = "prettier",
-- args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0) },
-- stdin = true,
-- }
-- end,
-- },
-- javascriptreact = {
-- -- prettier
-- function()
-- return {
-- exe = "prettier",
-- args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0) },
-- stdin = true,
-- }
-- end,
-- },
-- json = {
-- -- prettier
-- function()
-- return {
-- exe = "prettier",
-- args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0) },
-- stdin = true,
-- }
-- end,
-- },
-- lua = {
-- -- luafmt
-- function()
-- return {
-- exe = "luafmt",
-- args = { "--indent-count", 2, "--stdin" },
-- stdin = true,
-- }
-- end,
-- },
-- },
-- })

View File

@@ -5,7 +5,9 @@ fzf.setup({ "max-perf" })
vim.keymap.set("n", "<leader>f<leader>", fzf.builtin) -- Help
vim.keymap.set("n", "<leader>fc", fzf.commands)
vim.keymap.set("n", "<leader>ff", fzf.files)
vim.keymap.set("n", "<leader>fg", fzf.live_grep_native)
vim.keymap.set("n", "<leader>fg", function()
fzf.live_grep_native({ resume = true })
end)
vim.keymap.set("n", "<leader>fb", fzf.buffers)
vim.keymap.set("n", "<leader>fd", fzf.diagnostics_workspace)
vim.keymap.set("n", "<leader>fhe", fzf.help_tags)
@@ -13,4 +15,4 @@ vim.keymap.set("n", "<leader>fhi", fzf.search_history)
vim.keymap.set("n", "<leader>fma", fzf.marks)
vim.keymap.set("n", "<leader>fma", fzf.man_pages)
vim.keymap.set("i", "<c-f>", fzf.complete_path)
vim.keymap.set("i", "<c-f>", fzf.complete_file)

View File

@@ -1,10 +1,10 @@
require("image").setup({
backend = "kitty",
kitty_method = "normal",
processor = "magick_cli",
integrations = {
markdown = {
filetypes = { "markdown", "pandoc" },
},
},
})
-- require("image").setup({
-- backend = "kitty",
-- kitty_method = "normal",
-- processor = "magick_cli",
-- integrations = {
-- markdown = {
-- filetypes = { "markdown", "pandoc" },
-- },
-- },
-- })

View File

@@ -0,0 +1 @@
require("kubectl").setup()

View File

@@ -17,11 +17,9 @@ local servers = {
format = false,
},
},
emmet_language_server = {},
-- emmet_language_server = {},
gdscript = {},
helm_ls = {
filetypes = { "yaml", "helm", "yaml.helm-values" },
},
helm_ls = { filetypes = { "helm", "yaml.helm-values" } },
hls = { filetypes = { "haskell", "lhaskell", "cabal" } },
html = {},
jsonls = {
@@ -65,8 +63,26 @@ local servers = {
},
},
-- marksman = {},
nixd = {},
-- TODO: This completion ain't working yet
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
},
formatting = {
command = { "nixfmt" },
},
options = {
home_manager = {
expr = '(builtins.getFlake "/home/hektor/.config/home-manager").homeConfigurations.work.options',
},
},
},
pyright = {},
rust_analyzer = {
settings = {
["rust-analyzer"] = {},
},
},
-- tsserver = {},
svelte = {
plugin = {
@@ -76,48 +92,43 @@ local servers = {
},
},
tailwindcss = {},
-- vtsls = {},
ts_ls = {},
-- vtsls = {
-- maxTsServerMemory = 16384,
-- filetypes = {
-- "javascript",
-- "javascriptreact",
-- "javascript.jsx",
-- "typescript",
-- "typescriptreact",
-- "typescript.tsx",
-- },
-- settings = {
-- complete_function_calls = true,
-- vtsls = {
-- enableMoveToFileCodeAction = true,
-- autoUseWorkspaceTsdk = true,
-- experimental = {
-- completion = {
-- enableServerSideFuzzyMatch = true,
-- },
-- },
-- },
-- typescript = {
-- updateImportsOnFileMove = { enabled = "always" },
-- suggest = {
-- completeFunctionCalls = true,
-- },
-- inlayHints = {
-- enumMemberValues = { enabled = true },
-- functionLikeReturnTypes = { enabled = true },
-- parameterNames = { enabled = "literals" },
-- parameterTypes = { enabled = true },
-- propertyDeclarationTypes = { enabled = true },
-- variableTypes = { enabled = false },
-- },
-- },
-- },
-- },
terraformls = {},
-- ts_ls = {},
vtsls = {
maxTsServerMemory = 16384,
filetypes = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
settings = {
complete_function_calls = true,
vtsls = {
enableMoveToFileCodeAction = true,
autoUseWorkspaceTsdk = true,
experimental = { completion = { enableServerSideFuzzyMatch = true } },
},
typescript = {
updateImportsOnFileMove = { enabled = "always" },
suggest = { completeFunctionCalls = true },
inlayHints = {
enumMemberValues = { enabled = true },
functionLikeReturnTypes = { enabled = true },
parameterNames = { enabled = "literals" },
parameterTypes = { enabled = true },
propertyDeclarationTypes = { enabled = true },
variableTypes = { enabled = false },
},
},
},
},
yamlls = {
settings = {
yaml = {
validate = true,
schemaStore = {
-- You must disable built-in schemaStore support if you want to use
-- this plugin and its advanced options like `ignore`.

View File

@@ -0,0 +1,9 @@
require("m_taskwarrior_d").setup()
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, {
group = vim.api.nvim_create_augroup("TWTask", { clear = true }),
pattern = "*.md",
callback = function()
vim.cmd("TWSyncTasks")
end,
})

View File

@@ -1 +1 @@
require("mcphub").setup({})
-- require("mcphub").setup({})

View File

@@ -62,12 +62,12 @@ cmp.setup({
["<CR>"] = c_l,
}),
sources = {
{ name = "copilot", group_index = 2 },
{ name = "zk" },
{ name = "copilot", group_index = 2 },
{ name = "nvim_lsp", keyword_length = 8 },
{ name = "luasnip", max_item_count = 16 },
{ name = "luasnip", max_item_count = 16 },
{ name = "path" },
{ name = "buffer", max_item_count = 8 },
{ name = "buffer", max_item_count = 8 },
},
window = {
completion = cmp.config.window.bordered({ border = { "", "", "", "", "", "", "", "" } }),

View File

@@ -12,8 +12,8 @@ require("lint").linters_by_ft = {
editorconfig = { "editorconfig-checker" },
haskell = { "hlint" },
-- html = { "htmlhint" },
-- javascript = { eslint_linter },
-- javascriptreact = { eslint_linter },
javascript = { eslint_linter },
javascriptreact = { eslint_linter },
gdscript = { "gdlint" },
latex = { "chktex" },
-- lua = { "luacheck", "selene" },
@@ -22,10 +22,9 @@ require("lint").linters_by_ft = {
-- python = { "pylint" },
sh = { "shellcheck" },
svelte = { eslint_linter },
systemd = { "systemdlint" },
-- typescript = { eslint_linter },
-- typescriptreact = { eslint_linter },
yaml = { "yamllint" },
typescript = { eslint_linter },
typescriptreact = { eslint_linter },
-- yaml = { "yamllint" },
}
-- TODO: Wouldn't it be possible / nice to only try to load the linters when they are

View File

@@ -0,0 +1,9 @@
require("obsidian").setup({
legacy_commands = false,
workspaces = {
{
name = "test",
path = "~/zk/work",
},
},
})

View File

@@ -4,10 +4,13 @@ local keymap = vim.keymap
local opt = vim.opt
local treesitter_configs = require("nvim-treesitter.configs")
local nixCatsUtils = require("nixCatsUtils")
local is_nix = nixCatsUtils.isNixCats
treesitter_configs.setup({
-- Basically added what I might need from the docs
-- <https://github.com/nvim-treesitter/nvim-treesitter?tab=readme-ov-file#supported-languages>
ensure_installed = {
ensure_installed = is_nix and {} or {
"awk",
"bash",
"bibtex",
@@ -86,7 +89,7 @@ treesitter_configs.setup({
enable = true,
},
sync_install = false,
auto_install = true,
auto_install = not is_nix,
ignore_install = {},
modules = {},
textobjects = {

View File

@@ -1,6 +1,6 @@
vim.cmd([[
" Change local buffer to directory of current file after the plugin has loaded
autocmd VimEnter * lcd %:p:h
" " Change local buffer to directory of current file after the plugin has loaded
" autocmd VimEnter * lcd %:p:h
" " Override wiki index mapping to also cd into the wiki
nm <leader>ww <plug>(wiki-index)

View File

@@ -2,11 +2,11 @@
"nodes": {
"nixCats": {
"locked": {
"lastModified": 1763330129,
"narHash": "sha256-KbOeWIF52SV53BOeETGO2C5ewaV2Ex9iaXH7G72gOr8=",
"lastModified": 1765766809,
"narHash": "sha256-3Xp41+Sb1zIzASa1Uu1k1RMUoJ9CGyYb0GtvvpRPBqg=",
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"rev": "c81551ed87db2aefab30a12cf7425ff94dc0ad64",
"rev": "fe157e3ed69ed14b55ca81f597eac282caed58a2",
"type": "github"
},
"original": {
@@ -17,11 +17,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1763464769,
"narHash": "sha256-AJHrsT7VoeQzErpBRlLJM1SODcaayp0joAoEA35yiwM=",
"lastModified": 1765934234,
"narHash": "sha256-pJjWUzNnjbIAMIc5gRFUuKCDQ9S1cuh3b2hKgA7Mc4A=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "6f374686605df381de8541c072038472a5ea2e2d",
"rev": "af84f9d270d404c17699522fab95bbf928a2d92f",
"type": "github"
},
"original": {
@@ -79,14 +79,30 @@
"type": "github"
}
},
"plugins-m-taskwarrior-d-nvim": {
"flake": false,
"locked": {
"lastModified": 1764933759,
"narHash": "sha256-4lN/ZQTQ7uMcpjePbf2k913Bs9AYYS6da3iZbckA6oI=",
"owner": "huantrinh1802",
"repo": "m_taskwarrior_d.nvim",
"rev": "279d2c8bcd2779500c1bea71fb9249c97cdb503b",
"type": "github"
},
"original": {
"owner": "huantrinh1802",
"repo": "m_taskwarrior_d.nvim",
"type": "github"
}
},
"plugins-mcphub-nvim": {
"flake": false,
"locked": {
"lastModified": 1759035242,
"narHash": "sha256-I6EbgY/2sAdtrxtmH0qbAAQvMCHhOsfolJfblV0fXOk=",
"lastModified": 1765628564,
"narHash": "sha256-nvWqCGRKhbUHsAM/zd+cwFdcoXXxf6EmcCkpN4mElf4=",
"owner": "ravitemer",
"repo": "mcphub.nvim",
"rev": "8ff40b5edc649959bb7e89d25ae18e055554859a",
"rev": "5193329d510a68f1f5bf189960642c925c177a3a",
"type": "github"
},
"original": {
@@ -150,6 +166,7 @@
"plugins-beancount-nvim": "plugins-beancount-nvim",
"plugins-crazy-node-movement": "plugins-crazy-node-movement",
"plugins-helm-ls-nvim": "plugins-helm-ls-nvim",
"plugins-m-taskwarrior-d-nvim": "plugins-m-taskwarrior-d-nvim",
"plugins-mcphub-nvim": "plugins-mcphub-nvim",
"plugins-nvimkit-nvim": "plugins-nvimkit-nvim",
"plugins-shipwright-nvim": "plugins-shipwright-nvim",

View File

@@ -7,6 +7,10 @@
url = "github:rktjmp/shipwright.nvim";
flake = false;
};
plugins-m-taskwarrior-d-nvim = {
url = "github:huantrinh1802/m_taskwarrior_d.nvim";
flake = false;
};
plugins-crazy-node-movement = {
url = "github:theHamsta/crazy-node-movement";
flake = false;
@@ -65,14 +69,15 @@
gawk
gdtoolkit_4
isort
tree-sitter
ormolu
nodePackages.prettier
nixd
nixfmt
nodePackages.prettier
ormolu
prettierd
rustfmt
shellcheck-minimal
stylua
tree-sitter
vscode-langservers-extracted
];
};
@@ -143,7 +148,11 @@
copilot-lua
copilot-cmp
pkgs.neovimPlugins.helm-ls-nvim
pkgs.vimPlugins.kitty-scrollback-nvim
kitty-scrollback-nvim
fidget-nvim
rustaceanvim
pkgs.neovimPlugins.m-taskwarrior-d-nvim
claude-code-nvim
];
};

View File

@@ -0,0 +1 @@
vim.opt_local.filetype = "sh"

View File

@@ -20,10 +20,10 @@ require("statusline")
require("diagnostic")
require("utils")
require("zk")
require("skeleton")
require("reload")
require("paq-setup") -- when not on nixCats
-- vim.opt.background = "dark"
-- vim.opt.laststatus = 3
vim.opt.background = "dark"
vim.opt.laststatus = 3

View File

@@ -34,13 +34,17 @@ require("nixCatsUtils.catPacker").setup({
{ "razak17/tailwind-fold.nvim" },
{ "rmagatti/auto-session" },
{ "kndndrj/nvim-dbee" },
{ "3rd/image.nvim", build = false },
-- { "3rd/image.nvim", build = false },
{ "polarmutex/beancount.nvim" },
{ "jamesblckwell/nvimkit.nvim" },
{ 'olimorris/codecompanion.nvim' },
{ "ravitemer/mcphub.nvim", build = "pnpm install -g mcp-hub@latest" },
-- { "jamesblckwell/nvimkit.nvim" },
{ "olimorris/codecompanion.nvim" },
{ "ravitemer/mcphub.nvim", build = "pnpm install -g mcp-hub@latest" },
{ "zbirenbaum/copilot.lua" },
{ "zbirenbaum/copilot-cmp" },
{ "qvalentin/helm-ls.nvim", ft = "helm" },
{ "saghen/blink.download" },
{ "ramilito/kubectl.nvim" },
{ "mikesmithgh/kitty-scrollback.nvim" },
{ "chrisgrieser/nvim-early-retirement" },
{ "euclio/vim-markdown-composer" },
})

View File

@@ -1,6 +1,4 @@
{
pkgs ? import <nixpkgs> { },
}:
pkgs.mkShell {
nativeBuildInputs = with pkgs.buildPackages; [ ];
}
pkgs.mkShell { nativeBuildInputs = with pkgs.buildPackages; [ ]; }

View File

@@ -0,0 +1,12 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s("preJ", {
t("<pre>{JSON.stringify("),
i(1, "object"), -- first tab stop
t(", null, 2)}</pre>"),
}),
}

View File

@@ -1,10 +1,5 @@
data.location=$XDG_DATA_HOME/task/
hooks.location=$XDG_DATA_HOME/task/hooks
include /usr/share/doc/task/rc/light-256.theme
include ./taskrc.d/$HOSTNAME
include ./taskrc.d/aliases
include ./taskrc.d/sync
include ./taskrc.d/urgency
include ./taskrc.d/reports
include ./taskrc.d/contexts
@@ -16,3 +11,5 @@ search.case.sensitive=no
rc.json.array=on
rc.verbose=nothing
news.version=3.1.0
recurrence=off

View File

@@ -1 +1,4 @@
recurrence=off
include /usr/share/doc/task/rc/light-256.theme
include ./locations
include ./sync

View File

@@ -0,0 +1,2 @@
data.location=$XDG_DATA_HOME/task/
hooks.location=$XDG_DATA_HOME/task/hooks

View File

@@ -1 +0,0 @@
recurrence=off

View File

@@ -1,9 +1,11 @@
[include]
path = ~/.gitconfig.email
[core]
editor = nvim
excludesfile = ~/.gitignore
[user]
email = hektor.misplon@pm.me
name = Hektor Misplon
username = hektor
signingKey = AEB98353B8D72E465C4236435151AF79E723F21C
@@ -76,8 +78,6 @@
[merge]
tool = nvimdiff
conflictstyle = diff3
[pull]
rebase = true
[diff]
colorMoved = zebra
[commit]
@@ -85,3 +85,11 @@
[interactive]
singleKey = true
[pull]
rebase = true
[rerere]
enabled = true
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig.work

View File

@@ -0,0 +1,2 @@
[user]
email = your.email@example.com

13
dots/.gitconfig.work Normal file
View File

@@ -0,0 +1,13 @@
[include]
path = ~/.gitconfig.work.email
[core]
longpaths = true
[user]
name = Hektor Misplon
username = hektor.misplon
signingKey = 1C88BE828184CEE6
[commit]
gpgsign = false

View File

@@ -0,0 +1,2 @@
[user]
email = your.work.email@example.com

68
flake.lock generated
View File

@@ -29,11 +29,11 @@
},
"locked": {
"dir": "pkgs/firefox-addons",
"lastModified": 1763438658,
"narHash": "sha256-ojDdZbQG9wJyEkAQSpGUvgJ4edDnY13HXdf0dHaYKJw=",
"lastModified": 1765771449,
"narHash": "sha256-ZoHRPmTzwC1ndX3NQB/b/WKtU1WduAJdLI4j8eW/QFM=",
"owner": "rycee",
"repo": "nur-expressions",
"rev": "095dd41814f14586166d8c1fd9012d5e8dad0a44",
"rev": "5bcf9a2aeb4d361c2ff918a146b3fcc1e136b9ca",
"type": "gitlab"
},
"original": {
@@ -68,16 +68,15 @@
]
},
"locked": {
"lastModified": 1758463745,
"narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=",
"lastModified": 1765682243,
"narHash": "sha256-yeCxFV/905Wr91yKt5zrVvK6O2CVXWRMSrxqlAZnLp0=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3",
"rev": "58bf3ecb2d0bba7bdf363fc8a6c4d49b4d509d03",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-25.05",
"repo": "home-manager",
"type": "github"
}
@@ -85,10 +84,10 @@
"nix-secrets": {
"flake": false,
"locked": {
"lastModified": 1762546290,
"narHash": "sha256-a0mXF68to0eJQiIq1vCBMcGCX1UA1lBpwHgCinKfORA=",
"lastModified": 1765747965,
"narHash": "sha256-EHZRRC3piD6vKd4hXiqC+CcDUQCOzrH/CNAF9zBqpDQ=",
"ref": "main",
"rev": "b0473511f3718fb95f01e6c8bad6da3eb582974c",
"rev": "a8e8d953f579939bd72b5f5c6ed332910b598554",
"shallow": true,
"type": "git",
"url": "ssh://git@github.com/hektor/nix-secrets"
@@ -102,11 +101,11 @@
},
"nixCats": {
"locked": {
"lastModified": 1763330129,
"narHash": "sha256-KbOeWIF52SV53BOeETGO2C5ewaV2Ex9iaXH7G72gOr8=",
"lastModified": 1765766809,
"narHash": "sha256-3Xp41+Sb1zIzASa1Uu1k1RMUoJ9CGyYb0GtvvpRPBqg=",
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"rev": "c81551ed87db2aefab30a12cf7425ff94dc0ad64",
"rev": "fe157e3ed69ed14b55ca81f597eac282caed58a2",
"type": "github"
},
"original": {
@@ -138,11 +137,11 @@
},
"nixos-hardware": {
"locked": {
"lastModified": 1762847253,
"narHash": "sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR+ZdLX8IbrU=",
"lastModified": 1764440730,
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9",
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"type": "github"
},
"original": {
@@ -154,16 +153,16 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1763334038,
"narHash": "sha256-LBVOyaH6NFzQ3X/c6vfMZ9k4SV2ofhpxeL9YnhHNJQQ=",
"lastModified": 1765472234,
"narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "4c8cdd5b1a630e8f72c9dd9bf582b1afb3127d2c",
"rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.05",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
@@ -177,6 +176,7 @@
"plugins-beancount-nvim": "plugins-beancount-nvim",
"plugins-crazy-node-movement": "plugins-crazy-node-movement",
"plugins-helm-ls-nvim": "plugins-helm-ls-nvim",
"plugins-m-taskwarrior-d-nvim": "plugins-m-taskwarrior-d-nvim",
"plugins-mcphub-nvim": "plugins-mcphub-nvim",
"plugins-nvimkit-nvim": "plugins-nvimkit-nvim",
"plugins-shipwright-nvim": "plugins-shipwright-nvim",
@@ -240,14 +240,30 @@
"type": "github"
}
},
"plugins-m-taskwarrior-d-nvim": {
"flake": false,
"locked": {
"lastModified": 1764933759,
"narHash": "sha256-4lN/ZQTQ7uMcpjePbf2k913Bs9AYYS6da3iZbckA6oI=",
"owner": "huantrinh1802",
"repo": "m_taskwarrior_d.nvim",
"rev": "279d2c8bcd2779500c1bea71fb9249c97cdb503b",
"type": "github"
},
"original": {
"owner": "huantrinh1802",
"repo": "m_taskwarrior_d.nvim",
"type": "github"
}
},
"plugins-mcphub-nvim": {
"flake": false,
"locked": {
"lastModified": 1759035242,
"narHash": "sha256-I6EbgY/2sAdtrxtmH0qbAAQvMCHhOsfolJfblV0fXOk=",
"lastModified": 1765628564,
"narHash": "sha256-nvWqCGRKhbUHsAM/zd+cwFdcoXXxf6EmcCkpN4mElf4=",
"owner": "ravitemer",
"repo": "mcphub.nvim",
"rev": "8ff40b5edc649959bb7e89d25ae18e055554859a",
"rev": "5193329d510a68f1f5bf189960642c925c177a3a",
"type": "github"
},
"original": {
@@ -324,11 +340,11 @@
]
},
"locked": {
"lastModified": 1763417348,
"narHash": "sha256-n5xDOeNN+smocQp3EMIc11IzBlR9wvvTIJZeL0g33Fs=",
"lastModified": 1765684837,
"narHash": "sha256-fJCnsYcpQxxy/wit9EBOK33c0Z9U4D3Tvo3gf2mvHos=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "3f66a7fb9626a9a9c077612ef10a0ce396286c7d",
"rev": "94d8af61d8a603d33d1ed3500a33fcf35ae7d3bc",
"type": "github"
},
"original": {

View File

@@ -1,11 +1,10 @@
{
inputs = {
nixpkgs = {
url = "github:nixos/nixpkgs?ref=nixos-25.05";
url = "github:nixos/nixpkgs/nixos-unstable";
};
nixos-hardware = {
url = "github:NixOS/nixos-hardware/master";
inputs.nixpkgs.follows = "nixpkgs";
};
disko = {
url = "github:nix-community/disko/latest";
@@ -20,7 +19,7 @@
flake = false;
};
home-manager = {
url = "github:nix-community/home-manager/release-25.05";
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
nixgl = {
@@ -51,6 +50,9 @@
nvim,
}@inputs:
let
lib = inputs.nixpkgs.lib;
utils = import ./utils { inherit lib; };
hostDirNames = utils.dirNames ./hosts;
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
@@ -58,28 +60,21 @@
};
in
{
nix.nixPath = [ "nixpkgs=${inputs.nixpkgs}" ]; # <https://github.com/nix-community/nixd/blob/main/nixd/docs/configuration.md>
nixosConfigurations = {
vm = nixpkgs.lib.nixosSystem {
modules = [ ./hosts/vm ];
nix.nixPath = [
"nixpkgs=${inputs.nixpkgs}"
]; # <https://github.com/nix-community/nixd/blob/main/nixd/docs/configuration.md>
nixosConfigurations = lib.genAttrs hostDirNames (
host:
nixpkgs.lib.nixosSystem {
modules = [ ./hosts/${host} ];
specialArgs = { inherit inputs; };
};
andromache = nixpkgs.lib.nixosSystem {
modules = [ ./hosts/andromache ];
specialArgs = { inherit inputs; };
};
astyanax = nixpkgs.lib.nixosSystem {
modules = [ ./hosts/astyanax ];
specialArgs = { inherit inputs; };
};
};
}
);
homeConfigurations = {
work = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [ ./home/hosts/work ];
extraSpecialArgs = {
inherit inputs;
};
extraSpecialArgs = { inherit inputs; };
};
};
};

View File

@@ -1 +1,83 @@
import ../astyanax
{
lib,
inputs,
config,
pkgs,
...
}:
let
username = "h";
in
{
imports = [
../../modules/desktop/niri
../../modules/git.nix
../../modules/k9s.nix
(import ../../modules/taskwarrior.nix {
inherit config;
inherit pkgs;
})
(import ../../modules/keepassxc.nix { inherit pkgs; })
(import ../../modules/anki.nix {
inherit config;
inherit pkgs;
})
];
home.stateVersion = "25.05";
home.username = username;
home.homeDirectory = "/home/${username}";
xdg.userDirs.createDirectories = false;
xdg.userDirs.download = "${config.home.homeDirectory}/dl";
programs = {
bash = {
enable = true;
enableCompletion = true;
initExtra = ''
for f in /home/${username}/.bashrc.d/*; do
[ -f "$f" ] && source "$f"
done
source /home/${username}/.bash_aliases/all
source /home/${username}/.bash_aliases/lang-js
# host-specific config goes here
# ...
export PATH=${../../../dots/.bin}:$PATH
'';
};
firefox = import ../../modules/firefox.nix {
inherit inputs;
inherit pkgs;
inherit config;
};
fzf = {
enable = true;
enableBashIntegration = true;
};
home-manager.enable = true;
taskwarrior.config.recurrence = lib.mkForce "on";
};
home.packages = import ../packages.nix {
inherit pkgs;
inherit config;
};
home.file = {
".inputrc".source = ../../../dots/.inputrc;
".bashrc.d/prompt".source = ../../../dots/.bashrc.d/prompt;
".bashrc.d/editor".source = ../../../dots/.bashrc.d/editor;
".bash_aliases/all".source = ../../../dots/.bash_aliases/all;
".bash_aliases/lang-js".source = ../../../dots/.bash_aliases/lang-js;
".config/kitty/kitty.conf".source = ../../../dots/.config/kitty/kitty.conf;
".config/kitty/themes/zenwritten_light.conf".source =
../../../dots/.config/kitty/themes/zenwritten_light.conf;
".config/kitty/themes/zenwritten_dark.conf".source =
../../../dots/.config/kitty/themes/zenwritten_dark.conf;
};
}

View File

@@ -5,15 +5,24 @@
...
}:
let
username = "h";
in
{
imports = [
../../modules/dconf.nix # TODO: Only enable when on Gnome?
../../modules/desktop/niri
../../modules/git.nix
../../modules/k9s.nix
(import ../../modules/taskwarrior.nix {
inherit config;
inherit pkgs;
})
(import ../../modules/keepassxc.nix { inherit pkgs; })
];
home.stateVersion = "25.05";
home.username = "h";
home.homeDirectory = "/home/h";
home.username = username;
home.homeDirectory = "/home/${username}";
xdg.userDirs.createDirectories = false;
xdg.userDirs.download = "${config.home.homeDirectory}/dl";
@@ -23,12 +32,12 @@
enable = true;
enableCompletion = true;
initExtra = ''
for f in /home/h/.bashrc.d/*; do
for f in /home/${username}/.bashrc.d/*; do
[ -f "$f" ] && source "$f"
done
source /home/h/.bash_aliases/all
source /home/h/.bash_aliases/lang-js
source /home/${username}/.bash_aliases/all
source /home/${username}/.bash_aliases/lang-js
# host-specific config goes here
# ...
@@ -46,10 +55,9 @@
enableBashIntegration = true;
};
home-manager.enable = true;
keepassxc = import ../../modules/keepassxc.nix;
};
home.packages = import ./packages.nix {
home.packages = import ../packages.nix {
inherit pkgs;
inherit config;
};

View File

@@ -1,53 +0,0 @@
{ pkgs, ... }:
with pkgs;
[
bash-completion
bash-language-server
bat
brightnessctl
entr
eslint_d
feh
fzf
gh
git
haskell-language-server
haskellPackages.pandoc-crossref
haskellPackages.hadolint
htop
jq
kitty
lua-language-server
nixfmt-rfc-style
nmap
nodejs_24
nodePackages.ts-node
nvimpager
ormolu
pandoc
parallel
pass
pnpm
ripgrep
silver-searcher
sshfs
stylelint
svelte-language-server
tailwindcss-language-server
taskwarrior3
tldr
tmux
tmuxp
tree
tree-sitter
typescript-language-server
unzip
vim-language-server
vimPlugins.vim-plug
vtsls
wget
xbanish
xclip
yaml-language-server
]

36
home/hosts/packages.nix Normal file
View File

@@ -0,0 +1,36 @@
{ pkgs, ... }:
with pkgs;
[
bash-completion
bat
entr
feh
fzf
gh
git
haskellPackages.pandoc-crossref
htop
jq
kitty
nixfmt-rfc-style
nmap
nodejs_24
nvimpager
pandoc
parallel
pass
pnpm
ripgrep
signal-desktop
silver-searcher
sops
sshfs
tldr
tmux
tmuxp
tree
unzip
vimPlugins.vim-plug
wget
]

View File

@@ -5,39 +5,42 @@
...
}:
let
username = "hektor";
in
{
imports = [
inputs.sops-nix.homeManagerModules.sops
../../modules/dconf.nix # TODO: Only enable when on Gnome?
../../modules/dconf.nix
../../modules/git.nix
../../modules/k9s.nix
(import ../../modules/keepassxc.nix { inherit pkgs; })
];
nixpkgs.config.allowUnfree = true;
home.stateVersion = "25.05";
home.username = "hektor";
home.homeDirectory = "/home/hektor";
home.username = username;
home.homeDirectory = "/home/${username}";
sops = {
defaultSopsFile = "${builtins.toString inputs.nix-secrets}/secrets.yaml";
defaultSopsFormat = "yaml";
age.keyFile = "/home/hektor/.config/sops/age/keys.txt";
secrets."test" = { };
};
nixGL = {
targets.genericLinux.nixGL = {
packages = inputs.nixgl.packages;
defaultWrapper = "mesa";
};
programs.anki = import ../../modules/anki.nix;
programs.firefox = import ../../modules/firefox.nix {
inherit inputs;
inherit pkgs;
inherit config;
programs = {
# editorconfig.enable = true;
firefox = import ../../modules/firefox.nix {
inherit inputs;
inherit pkgs;
inherit config;
};
gh.enable = true;
kubecolor.enable = true;
};
programs.git = import ../../modules/git.nix;
programs.keepassxc = import ../../modules/keepassxc.nix;
home.packages = import ./packages.nix {
inherit pkgs;
inherit inputs;
inherit config;
inherit pkgs;
};
}

View File

@@ -0,0 +1,98 @@
{
inputs,
config,
pkgs,
...
}:
with pkgs;
[
age
aider-chat
argocd
azure-cli
bat
biome
(config.lib.nixGL.wrap bruno)
chromium
clang
claude-code
(config.lib.nixGL.wrap code-cursor)
curl
dconf2nix
dive
emmet-language-server
eslint_d
flameshot
fluxcd
fzf
fzf-git-sh
git-machete
github-copilot-cli
glab
go
hadolint
hello
helm-ls
htop
input-leap
jira-cli-go
jq
k3d
(config.lib.nixGL.wrap kitty)
kubectl
kubernetes
kubernetes-helm
kustomize
lua
lua-language-server
minikube
ncspot
nil
nixd
nixfmt-rfc-style
# nodejs
nodejs_24
nvimpager
(config.lib.nixGL.wrap obsidian)
pavucontrol
# pgadmin4
prettierd
responder
ripgrep
rust-analyzer
rustlings
shellcheck
(config.lib.nixGL.wrap signal-desktop)
silver-searcher
sleuthkit
spotify
starship
stylua
taskopen
taskwarrior3
(config.lib.nixGL.wrap teams-for-linux)
opentofu
sops
tldr
tmux
tree
tree-sitter
tsx
upbound
vault-bin
(config.lib.nixGL.wrap vscode)
vscode-langservers-extracted
vtsls
yaml-language-server
xclip
xmage
yamllint
yarn
(python311.withPackages (ppkgs: [
ppkgs.plyer
ppkgs.dbus-python
]))
# flakes
inputs.nvim.packages.x86_64-linux.nvim
]

View File

@@ -1,4 +1,19 @@
{ pkgs, config, ... }:
{
inputs,
config,
pkgs,
...
}:
with pkgs;
[ ]
let
localPackages =
if builtins.pathExists ./packages.local.nix then
import ./packages.local.nix { inherit inputs config pkgs; }
else
[ ];
in
(with pkgs; [
inputs.nvim.packages.x86_64-linux.nvim
])
++ localPackages

View File

@@ -1,3 +1,16 @@
{ config, pkgs, ... }:
{
enable = true;
programs.anki = {
enable = true;
addons = with pkgs.ankiAddons; [
anki-connect
puppy-reinforcement
review-heatmap
];
sync = {
usernameFile = "${config.sops.secrets."anki_sync_user".path}";
keyFile = "${config.sops.secrets."anki_sync_key".path}";
};
};
}

View File

@@ -7,5 +7,107 @@
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
};
"org/gnome/desktop/applications/terminal" = {
exec = "kitty";
exec-arg = "";
};
"org/gnome/desktop/background" = {
color-shading-type = "solid";
picture-opacity = 100;
picture-options = "zoom";
picture-uri = "none";
picture-uri-dark = "none";
primary-color = "#555555";
secondary-color = "#555555";
show-desktop-icons = false;
};
# "org/gnome/desktop/input-sources" = {
# sources = [
# (mkTuple [
# "xkb"
# "us"
# ])
# ];
# xkb-options = [ "caps:none" ];
# };
"org/gnome/desktop/wm/keybindings" = {
close = [ "<Shift><Super>Delete" ];
cycle-group = [ ];
cycle-group-backward = [ ];
cycle-panels = [ ];
cycle-panels-backward = [ ];
cycle-windows = [ ];
cycle-windows-backward = [ ];
maximize = [ "<Super> " ];
minimize = [ ];
move-to-workspace-1 = [ "<Super><Shift>a" ];
move-to-workspace-2 = [ "<Super><Shift>s" ];
move-to-workspace-3 = [ "<Super><Shift>d" ];
move-to-workspace-4 = [ "<Super><Shift>f" ];
move-to-workspace-5 = [ "<Super><Shift>g" ];
move-to-workspace-last = [ ];
move-to-workspace-left = [ "<Super><Shift>h" ];
move-to-workspace-right = [ "<Super><Shift>l" ];
panel-run-dialog = [ ];
switch-applications = [ "<Super>j" ];
switch-applications-backward = [ "<Super>k" ];
switch-group = [ ];
switch-group-backward = [ ];
switch-input-source = [ ];
switch-input-source-backward = [ ];
switch-panels = [ ];
switch-panels-backward = [ ];
switch-to-workspace-1 = [ "<Super>a" ];
switch-to-workspace-2 = [ "<Super>s" ];
switch-to-workspace-3 = [ "<Super>d" ];
switch-to-workspace-4 = [ "<Super>f" ];
switch-to-workspace-5 = [ "<Super>g" ];
switch-to-workspace-last = [ ];
switch-to-workspace-left = [ "<Super>h" ];
switch-to-workspace-right = [ "<Super>l" ];
switch-windows = [ ];
switch-windows-backward = [ ];
toggle-maximized = [ "<Super>space" ];
unmaximize = [ ];
};
"org/gnome/desktop/wm/preferences" = {
num-workspaces = 5;
workspace-names = [
"sh"
"www"
"dev"
"info"
"etc"
];
};
"org/gnome/settings-daemon/plugins/media-keys" = {
custom-keybindings = [
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/"
];
};
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
binding = "Print";
command = "flameshot gui";
name = "flameshot";
};
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = {
binding = "<Super>Return";
command = "kitty";
name = "Kitty";
};
"org/gnome/shell/keybindings" = {
screenshot = [ "Print" ];
toggle-application-view = [ "<Super>p" ];
toggle-quick-settings = [ ];
};
};
}

View File

@@ -0,0 +1,183 @@
input {
touchpad {
tap
natural-scroll
}
mouse {
accel-profile "flat"
}
}
// NOTE: monitors are managed using `shikane` instead, as I assume this to be
// too limited for multiple multimonitor configurations. Below is an example
// for a simple, fixed, vertical dual monitor setup
// output "eDP-1" {
// position x=0 y=1440
// }
//
// output "DP-5" {
// position x=0 y=0
// }
layout {
gaps 4
struts {}
center-focused-column "never"
preset-column-widths {
proportion 0.382
proportion 0.618
proportion 1.0
}
default-column-width { }
focus-ring {
off
}
border {
width 2
active-color "#555555"
inactive-color "#55555511"
urgent-color "#ff0000"
}
shadow {
on
softness 32
spread 4
offset x=0 y=0
color "#0007"
}
}
spawn-at-startup "wlsunset -l 51.05 -L 3.72"
spawn-at-startup "waybar"
hotkey-overlay {
skip-at-startup
}
prefer-no-csd
screenshot-path "~/doc/screenshots/%Y-%m-%d %H-%M-%S.png"
// https://yalter.github.io/niri/Configuration:-Animations
animations {
slowdown 0.66
}
window-rule {
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
open-floating true
}
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
block-out-from "screen-capture"
}
window-rule {
geometry-corner-radius 0
clip-to-geometry true
}
gestures {
hot-corners {
off
}
}
binds {
Mod+Slash { show-hotkey-overlay; }
Mod+Return hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
Mod+P hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
Mod+Shift+XF86Display { power-off-monitors; }
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
Mod+O repeat=false { toggle-overview; }
Mod+Delete repeat=false { close-window; }
Mod+H { focus-column-left; }
Mod+J { focus-window-or-workspace-down; }
Mod+K { focus-window-or-workspace-up; }
Mod+L { focus-column-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+J { move-window-down-or-to-workspace-down; }
Mod+Shift+K { move-window-up-or-to-workspace-up; }
Mod+Shift+L { move-column-right; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Left { focus-monitor-left; }
Mod+Down { focus-monitor-down; }
Mod+Up { focus-monitor-up; }
Mod+Right { focus-monitor-right; }
Mod+Shift+Left { move-column-to-monitor-left; }
Mod+Shift+Down { move-column-to-monitor-down; }
Mod+Shift+Up { move-column-to-monitor-up; }
Mod+Shift+Right { move-column-to-monitor-right; }
Mod+Ctrl+Up { move-workspace-down; }
Mod+Ctrl+Down { move-workspace-up; }
// Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
// Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
// Mod+Shift+WheelScrollDown cooldown-ms=150 { move-window-down-or-to-workspace-down; }
// Mod+Shift+WheelScrollUp cooldown-ms=150 { move-window-up-or-to-workspace-up; }
// Mod+A { focus-workspace 1; }
// Mod+S { focus-workspace 2; }
// Mod+D { focus-workspace 3; }
// Mod+F { focus-workspace 4; }
// Mod+Shift+A { move-column-to-workspace 1; }
// Mod+Shift+S { move-column-to-workspace 2; }
// Mod+Shift+D { move-column-to-workspace 3; }
// Mod+Shift+F { move-column-to-workspace 4; }
Mod+Tab { focus-workspace-previous; }
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
Mod+Comma { consume-window-into-column; }
Mod+Period { expel-window-from-column; }
Mod+N { switch-preset-column-width; }
Mod+Shift+N { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+Space { maximize-column; }
Mod+Shift+Space { fullscreen-window; }
Mod+Escape { toggle-window-floating; }
Mod+Shift+Escape { switch-focus-between-floating-and-tiling; }
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
Mod+Ctrl+C { center-visible-columns; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
Mod+W { toggle-column-tabbed-display; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
Mod+Shift+Delete { quit; }
}

View File

@@ -0,0 +1,18 @@
{ pkgs, ... }:
{
imports = [
../../fuzzel
../../mako
../../shikane
../../waybar
];
home = {
file.".config/niri/config.kdl".source = ./config.kdl;
packages = with pkgs; [
wl-clipboard
wlsunset
];
};
}

View File

@@ -5,9 +5,6 @@
nativeMessagingHosts = with pkgs; [
tridactyl-native
];
policies = {
DefaultDownloadDirectory = "\${home}/dl";
};
profiles = {
default = {
settings = {
@@ -57,6 +54,7 @@
};
};
policies = {
DefaultDownloadDirectory = "\${home}/dl";
ExtensionSettings = {
"jid1-ZAdIEUB7XOzOJw@jetpack" = {
default_area = "navbar";

View File

@@ -0,0 +1,28 @@
{
programs.fuzzel = {
enable = true;
settings = {
main = {
font = "Iosevka Term SS08";
horizontal-pad = 0;
vertical-pad = 0;
};
colors = {
background = "ccccccff";
text = "111111ff";
prompt = "ccccccff";
placeholder = "aaaaaaff";
input = "111111ff";
selection = "eeeeeeff";
selection-text = "111111ff";
selection-match = "333333ff";
counter = "111111ff";
border = "111111ff";
};
border = {
width = 2;
radius = 0;
};
};
};
}

View File

@@ -2,6 +2,7 @@
programs.git.enable = true;
home.file = {
".gitconfig".source = ../../dots/.gitconfig;
".gitconfig.work".source = ../../dots/.gitconfig.work;
".gitignore".source = ../../dots/.gitignore;
};
}

11
home/modules/k9s.nix Normal file
View File

@@ -0,0 +1,11 @@
{
programs.k9s = {
enable = true;
settings.k9s = {
ui = {
logoless = true;
reactive = true;
};
};
};
}

View File

@@ -1,4 +1,11 @@
{ pkgs, ... }:
{
enable = true;
# TODO: https://mynixos.com/home-manager/option/programs.keepassxc.settings
programs.keepassxc = {
enable = true;
settings = {
Browser.Enabled = true;
};
};
# programs.firefox.nativeMessagingHosts = [ pkgs.keepassxc ]; # FIXME: Resolve 'Access error for config file $HOME/.config/keepassxc/keepassxc.ini' error
}

View File

@@ -0,0 +1,5 @@
{
services.mako = {
enable = true;
};
}

View File

@@ -0,0 +1,6 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [ wdisplays ];
services.shikane.enable = true;
}

View File

@@ -0,0 +1,51 @@
{
config,
pkgs,
...
}:
{
home.packages = with pkgs; [
python314
libnotify
];
home.file = {
".config/task/taskrc" = {
force = true; # overwrite when present
source = ../../dots/.config/task/taskrc;
};
".config/task/taskrc.d/aliases".source = ../../dots/.config/task/taskrc.d/aliases;
".config/task/taskrc.d/colors".source = ../../dots/.config/task/taskrc.d/colors;
".config/task/taskrc.d/contexts".source = ../../dots/.config/task/taskrc.d/contexts;
".config/task/taskrc.d/reports".source = ../../dots/.config/task/taskrc.d/reports;
".config/task/taskrc.d/udas".source = ../../dots/.config/task/taskrc.d/udas;
".config/task/taskrc.d/urgency".source = ../../dots/.config/task/taskrc.d/urgency;
".local/share/task/hooks/on-exit.sync.py" = {
source = ../../dots/.local/share/task/hooks/on-exit.sync.py;
};
".local/share/task/scripts/sync-and-notify.sh" = {
source = ../../dots/.local/share/task/scripts/sync-and-notify.sh;
executable = true;
};
};
programs.taskwarrior = with pkgs; {
enable = true;
package = taskwarrior3;
colorTheme = "dark-256";
config = {
# sync = {
# server.url = "${builtins.readFile config.sops.secrets."taskwarrior_sync_server_url".path}";
# server.client_id = "${builtins.readFile
# config.sops.secrets."taskwarrior_sync_server_client_id".path
# }";
# encryption_secret = "${builtins.readFile
# config.sops.secrets."taskwarrior_sync_encryption_secret".path
# }";
# };
recurrence = "off";
};
extraConfig = "include ${config.sops.templates."taskrc.d/sync".path}";
};
}

View File

@@ -0,0 +1,57 @@
[
{
"height": 16,
"spacing": 4,
"modules-left": ["niri/workspaces"],
"modules-right": [
"pulseaudio",
"memory",
"cpu",
"network",
"clock",
"battery",
],
"clock": {
"format": "W{:%V %d %b %H:%M}",
"tooltip-format": "{calendar}",
"format-alt": "{:%Y-%m-%d %H:%M:%S}",
},
"battery": {
"bat": "BAT0",
"adapter": "ADP1",
"interval": 5,
"full-at": 99,
"states": {
"good": 80,
"warning": 20,
"critical": 10,
},
"format": "{capacity}%--",
"format-charging": "{capacity}%++",
"format-plugged": "{capacity}%",
"format-alt": "{time} {power}W",
},
"pulseaudio": {
"format": "VOL {volume}%",
"format-muted": "muted",
"on-click": "pavucontrol",
},
"memory": {
"interval": 2,
"format": "RAM {percentage}%",
"format-alt": "RAM {used:0.1f}G/{total:0.1f}G",
},
"cpu": {
"interval": 2,
"format": "CPU {usage}%",
"format-alt": "CPU {avg_frequency}GHz",
},
"network": {
"interval": 5,
"format-wifi": "{ifname} {ipaddr} {essid}",
"format-ethernet": "{ifname} {ipaddr}",
"format-disconnected": "{ifname} disconnected",
"tooltip-format": "{ifname}: {ipaddr}/{cidr}",
},
},
]

View File

@@ -0,0 +1,8 @@
{
programs.waybar = {
enable = true;
};
home.file.".config/waybar/config.jsonc".source = ./config.jsonc;
home.file.".config/waybar/style.css".source = ./style.css;
}

View File

@@ -0,0 +1,56 @@
* {
font-family:
Iosevka Term SS08,
monospace;
font-size: 12px;
border-radius: 0px;
}
.modules-left,
.modules-center,
.modules-right {
margin: 4px;
margin-bottom: 0;
}
window#waybar {
background-color: transparent;
}
window#waybar.hidden {
opacity: 0.2;
}
#workspaces button {
padding: 0;
background-color: transparent;
}
#workspaces button:hover {
background: #000000;
}
#workspaces button.focused,
#workspaces button.active {
background-color: #111111;
}
#workspaces button.urgent {
background-color: #eb4d4b;
}
#clock,
#battery,
#pulseaudio,
#memory,
#cpu,
#network {
padding: 0 4px;
color: #ffffff;
background-color: #111111;
}
#window,
#workspaces {
margin: 0;
}

View File

@@ -6,31 +6,43 @@
...
}:
let
username = "h";
wolInterfaces = import ./wol-interfaces.nix;
in
{
system.stateVersion = "25.05";
imports = [
../../modules/common
inputs.disko.nixosModules.disko
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.default
./hard.nix
../../modules/bootloader.nix
(import ../../modules/disko.zfs-encrypted-root.nix {
../../modules/boot/bootloader.nix
(import ../../modules/disko/zfs-encrypted-root.nix {
device = "/dev/nvme1n1";
inherit lib;
inherit config;
})
../../modules/gnome.nix
../../modules/bluetooth.nix
../../modules/desktops/niri
../../modules/bluetooth
../../modules/keyboard
(import ../../modules/networking.nix { hostName = "andromache"; })
../../modules/users.nix
../../modules/audio.nix
../../modules/printing.nix
../../modules/localization.nix
(import ../../modules/networking { hostName = "andromache"; })
../../modules/users
../../modules/audio
../../modules/localization
../../modules/fonts
../../modules/ssh/hardened-openssh.nix
(import ../../modules/secrets {
inherit lib;
inherit inputs;
inherit config;
})
../../modules/docker
];
secrets.username = username;
docker.user = username;
disko.devices = {
disk.data = {
type = "disk";
@@ -66,27 +78,17 @@
environment.systemPackages = [ inputs.nvim.packages.x86_64-linux.nvim ];
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.h = import ../../home/hosts/andromache {
users.${username} = import ../../home/hosts/andromache {
inherit lib;
inherit inputs;
inherit config;
inherit pkgs;
};
};
networking = {
hostId = "80eef97e";
};
services.xserver = {
videoDrivers = [ "nvidia" ];
};
@@ -99,16 +101,18 @@
services.syncthing = {
enable = true;
openDefaultPorts = true;
folders = {
"/home/h/sync" = {
id = "sync";
devices = [ ];
settings = {
devices = {
# "device1" = {
# id = "DEVICE-ID-GOES-HERE";
# };
};
folders = {
"/home/${username}/sync" = {
id = "sync";
devices = [ ];
};
};
};
devices = {
# "device1" = {
# id = "DEVICE-ID-GOES-HERE";
# };
};
};
@@ -116,4 +120,18 @@
enable = true;
package = pkgs.plocate;
};
networking = {
# TODO: generate unique hostId on actual host with: head -c 8 /etc/machine-id
hostId = "80eef97e";
interfaces = {
eno1 = {
wakeOnLan.enable = true;
macAddress = wolInterfaces.eno1.macAddress;
};
};
firewall = {
allowedUDPPorts = [ 9 ];
};
};
}

View File

@@ -1,14 +1,29 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
config,
lib,
pkgs,
modulesPath,
...
}:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "vmd" "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "uas" "sd_mod" ];
boot.initrd.availableKernelModules = [
"vmd"
"xhci_pci"
"ahci"
"nvme"
"usbhid"
"usb_storage"
"uas"
"sd_mod"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];

View File

@@ -0,0 +1,3 @@
{
eno1.macAddress = "02:68:b3:29:da:98";
}

View File

@@ -6,44 +6,76 @@
...
}:
let
username = "h";
hostName = "astyanax";
wolInterfaces = import ../andromache/wol-interfaces.nix;
in
{
system.stateVersion = "25.05";
imports = [
../../modules/common
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-e14-intel
inputs.disko.nixosModules.disko
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.default
./hard.nix
../../modules/bootloader.nix
(import ../../modules/disko.zfs-encrypted-root.nix {
../../modules/boot/bootloader.nix
(import ../../modules/disko/zfs-encrypted-root.nix {
inherit lib;
inherit config;
device = "/dev/nvme0n1";
})
../../modules/gnome.nix
../../modules/bluetooth.nix
../../modules/desktops/niri
../../modules/bluetooth
../../modules/keyboard
(import ../../modules/networking.nix { hostName = "astyanax"; })
../../modules/users.nix
../../modules/audio.nix
../../modules/printing.nix
../../modules/localization.nix
(import ../../modules/networking { hostName = hostName; })
../../modules/users
../../modules/audio
../../modules/localization
../../modules/fonts
../../modules/ssh/hardened-openssh.nix
(import ../../modules/secrets {
inherit lib;
inherit inputs;
inherit config;
inherit username;
})
];
environment.systemPackages = [ inputs.nvim.packages.x86_64-linux.nvim ];
hardware = {
cpu.intel.updateMicrocode = true;
# https://wiki.nixos.org/wiki/Intel_Graphics
graphics = {
enable = true;
extraPackages = with pkgs; [
intel-media-driver
vpl-gpu-rt
];
};
};
nix.settings.experimental-features = [
"nix-command"
"flakes"
# https://wiki.nixos.org/wiki/Intel_Graphics
environment.sessionVariables = {
LIBVA_DRIVER_NAME = "iHD";
};
secrets.username = username;
environment.systemPackages = [
inputs.nvim.packages.x86_64-linux.nvim
(pkgs.writeShellApplication {
name = "wol-andromache";
runtimeInputs = [ pkgs.wakeonlan ];
text = ''
wakeonlan ${wolInterfaces.eno1.macAddress}
'';
})
];
nixpkgs.config.allowUnfree = true;
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.h = import ../../home/hosts/astyanax {
users.${username} = import ../../home/hosts/astyanax {
inherit inputs;
inherit config;
inherit pkgs;
@@ -51,9 +83,12 @@
};
networking = {
# TODO: generate unique hostId on actual host with: head -c 8 /etc/machine-id
hostId = "80eef97e";
};
services.throttled.enable = false;
services.openssh = {
enable = true;
harden = true;

60
hosts/hecuba/default.nix Normal file
View File

@@ -0,0 +1,60 @@
{ pkgs, ... }:
# Also see <https://wiki.nixos.org/wiki/Install_NixOS_on_Hetzner_Cloud>
{
imports = [
./hard.nix
../../modules/common
../../modules/ssh/hardened-openssh.nix
];
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-label/boot";
fsType = "ext4";
};
swapDevices = [
{
device = "/dev/disk/by-label/swap";
}
];
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/sda";
users.users = {
root.hashedPassword = "!";
username = {
isNormalUser = true;
extraGroups = [ "wheel" ];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOOXPEhdKOVnb6mkeLLUcFGt+mnUR5pMie17JtjrxwgO h@andromache"
];
};
};
security.sudo.wheelNeedsPassword = false;
networking = {
firewall.enable = true;
};
environment.systemPackages = with pkgs; [
vim
git
];
services.fail2ban = {
enable = true;
maxretry = 5;
};
services.openssh = {
enable = true;
harden = true;
};
}

37
hosts/hecuba/hard.nix Normal file
View File

@@ -0,0 +1,37 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{
config,
lib,
pkgs,
modulesPath,
...
}:
{
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = [
"ahci"
"xhci_pci"
"virtio_pci"
"virtio_scsi"
"sd_mod"
"sr_mod"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

View File

@@ -1,40 +1,42 @@
{
lib,
inputs,
config,
pkgs,
...
}:
let
username = "h";
in
{
system.stateVersion = "25.05";
imports = [
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-e14-intel
../../modules/common
inputs.disko.nixosModules.disko
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.default
./hard.nix
./disk.nix
../../modules/bootloader.nix
../../modules/boot/bootloader.nix
../../modules/keyboard
(import ../../modules/networking.nix { hostName = "vm"; })
../../modules/users.nix
../../modules/audio.nix
../../modules/printing.nix
../../modules/localization.nix
../../modules/x.nix
(import ../../modules/networking { hostName = "vm"; })
../../modules/users
../../modules/audio
../../modules/localization
../../modules/x
../../modules/fonts
../../modules/ssh/hardened-openssh.nix
(import ../../modules/secrets {
inherit lib;
inherit inputs;
inherit config;
})
];
secrets.username = username;
environment.systemPackages = [ inputs.nvim.packages.x86_64-linux.nvim ];
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
disko = {
devices.disk.main.device = "/dev/vda";
devices.disk.main.imageName = "nixos-vm";
@@ -56,7 +58,7 @@
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.h = import ../../home/hosts/vm {
users.${username} = import ../../home/hosts/vm {
inherit inputs;
inherit config;
inherit pkgs;

View File

@@ -9,4 +9,5 @@
alsa.support32Bit = true;
pulse.enable = true;
};
services.pulseaudio.extraConfig = "load-module module-switch-on-connect";
}

View File

@@ -1,3 +0,0 @@
{
hardware.bluetooth.enable = true;
}

View File

@@ -0,0 +1,15 @@
{
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Experimental = true;
FastConnectable = true;
};
Policy = {
AutoEnable = true;
};
};
};
}

View File

@@ -0,0 +1,10 @@
{
system.stateVersion = "25.05";
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
}

View File

@@ -0,0 +1,8 @@
{
programs.niri.enable = true;
services.dbus.enable = true;
xdg = {
portal.enable = true;
};
}

View File

@@ -0,0 +1,44 @@
{ config, lib, ... }:
let
cfg = config.docker;
in
{
options.docker = {
rootless = lib.mkOption {
type = lib.types.bool;
default = false;
};
user = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
};
};
config = lib.mkMerge [
{
warnings = lib.flatten [
(lib.optional (
cfg.rootless && cfg.user != null
) "'virtualisation.docker.user' is ignored when rootless mode is enabled")
(lib.optional (
!cfg.rootless && cfg.user == null
) "'virtualisation.docker.user' is not set (no user is added to the docker group)")
];
}
(lib.mkIf cfg.rootless {
virtualisation.docker = {
enable = false;
rootless = {
enable = true;
setSocketVariable = true;
};
};
})
(lib.mkIf (!cfg.rootless && cfg.user != null) {
virtualisation.docker = {
enable = true;
};
users.users.${cfg.user}.extraGroups = [ "docker" ];
})
];
}

79
modules/k3s/default.nix Normal file
View File

@@ -0,0 +1,79 @@
{ pkgs, ... }:
{
# TODO: see if this works with podman
# TODO: check if docker/podman is enabled
# Rootless K3S
# FIXME
environment.systemPackages = with pkgs; [
k3s
rootlesskit
slirp4netns
];
# running K3S on rootless docker was causing the following error: "failed to find cpuset cgroup (v2)" (in `docker logs k3d-lab-server-0` output)
#
# see <https://docs.k3s.io/advanced#known-issues-with-rootless-mode>
# see <https://rootlesscontaine.rs/getting-started/common/cgroup2/>
# see <https://discourse.nixos.org/t/declarative-rootless-k3s/49839>
systemd.services."user@".serviceConfig.Delegate = "cpu cpuset io memory pids";
# taken from <https://github.com/k3s-io/k3s/blob/main/k3s-rootless.service> as described in <https://docs.k3s.io/advanced#known-issues-with-rootless-mode#Rootless>
systemd.user.services."k3s-rootless" = with pkgs; {
path = with pkgs; [
"${rootlesskit}"
"${slirp4netns}"
"${fuse-overlayfs}"
"${fuse3}"
"/run/wrappers"
];
# systemd unit file for k3s (rootless)
#
# Usage:
# - [Optional] Enable cgroup v2 delegation, see https://rootlesscontaine.rs/getting-started/common/cgroup2/ .
# This step is optional, but highly recommended for enabling CPU and memory resource limtitation.
#
# - Copy this file as `~/.config/systemd/user/k3s-rootless.service`.
# Installing this file as a system-wide service (`/etc/systemd/...`) is not supported.
# Depending on the path of `k3s` binary, you might need to modify the `ExecStart=/usr/local/bin/k3s ...` line of this file.
#
# - Run `systemctl --user daemon-reload`
#
# - Run `systemctl --user enable --now k3s-rootless`
#
# - Run `KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -A`, and make sure the pods are running.
#
# Troubleshooting:
# - See `systemctl --user status k3s-rootless` to check the daemon status
# - See `journalctl --user -f -u k3s-rootless` to see the daemon log
# - See also https://rootlesscontaine.rs/
enable = true;
description = "k3s (Rootless)";
serviceConfig = {
# NOTE: Don't try to run `k3s server --rootless` on a terminal, as it doesn't enable cgroup v2 delegation.
# If you really need to try it on a terminal, prepend `systemd-run --user -p Delegate=yes --tty` to create a systemd scope.
ExecStart = "${k3s}/bin/k3s server --rootless --snapshotter=fuse-overlayfs";
ExecReload = "/run/current-system/sw/bin/kill -s HUP $MAINPID";
TimeoutSec = 0;
RestartSec = 2;
Restart = "always";
StartLimitBurst = 3;
StartLimitInterval = "60s";
LimitNOFILE = "infinity";
LimitNPROC = "infinity";
LimitCORE = "infinity";
TasksMax = "infinity";
Delegate = "yes";
Type = "simple";
KillMode = "mixed";
};
wantedBy = [ "default.target" ];
};
boot.kernel.sysctl = {
"net.ipv4.ip_forward" = 1;
};
}

View File

@@ -1,5 +0,0 @@
{ ... }:
{
services.printing.enable = true;
}

View File

@@ -0,0 +1,17 @@
{ pkgs, ... }:
{
# services.avahi = {
# enable = true;
# nssmdns4 = true;
# openFirewall = true;
# };
services.printing = {
enable = true;
# drivers = with pkgs; [
# cups-filters
# cups-browsed
# ];
};
}

View File

@@ -0,0 +1,62 @@
{
lib,
inputs,
config,
...
}:
let
cfg = config.secrets;
in
{
options = {
secrets.username = lib.mkOption {
type = lib.types.str;
};
};
config = {
sops = {
validateSopsFiles = false;
defaultSopsFile = "${builtins.toString inputs.nix-secrets}/secrets.yaml";
defaultSopsFormat = "yaml";
age.keyFile = "/home/${cfg.username}/.config/sops/age/keys.txt";
secrets = {
"taskwarrior_sync_server_url".owner = config.users.users.${cfg.username}.name;
"taskwarrior_sync_server_client_id".owner = config.users.users.${cfg.username}.name;
"taskwarrior_sync_encryption_secret".owner = config.users.users.${cfg.username}.name;
"email_personal".owner = config.users.users.${cfg.username}.name;
"email_work".owner = config.users.users.${cfg.username}.name;
"anki_sync_user".owner = config.users.users.${cfg.username}.name;
"anki_sync_key".owner = config.users.users.${cfg.username}.name;
};
templates."taskrc.d/sync" = {
owner = config.users.users.${cfg.username}.name;
content = ''
sync.server.url=${config.sops.placeholder."taskwarrior_sync_server_url"}
sync.server.client_id=${config.sops.placeholder."taskwarrior_sync_server_client_id"}
sync.encryption_secret=${config.sops.placeholder."taskwarrior_sync_encryption_secret"}
'';
};
templates.".gitconfig.email" = {
owner = config.users.users.${cfg.username}.name;
path = "/home/${cfg.username}/.gitconfig.email";
content = ''
[user]
email = ${config.sops.placeholder."email_personal"}
'';
};
templates.".gitconfig.work.email" = {
owner = config.users.users.${cfg.username}.name;
path = "/home/${cfg.username}/.gitconfig.work.email";
content = ''
[user]
email = ${config.sops.placeholder."email_work"}
'';
};
};
};
}

View File

@@ -10,6 +10,7 @@ in
services.openssh.settings = optionalAttrs cfg.harden {
PermitRootLogin = "no";
PasswordAuthentication = false;
KbdInteractiveAuthentication = false;
ChallengeResponseAuthentication = false;
X11Forwarding = false;
AllowAgentForwarding = false;

View File

@@ -4,7 +4,7 @@
services.xserver.windowManager.xmonad = {
enable = true;
enableContribAndExtras = true;
config = builtins.readFile ../dots/.xmonad/xmonad.hs;
config = builtins.readFile ../../dots/.xmonad/xmonad.hs;
};
services.xserver = {

7
utils/default.nix Normal file
View File

@@ -0,0 +1,7 @@
{ lib }:
{
dirNames =
path:
builtins.attrNames (lib.filterAttrs (name: type: type == "directory") (builtins.readDir path));
}