Compare commits

5 Commits

Author SHA1 Message Date
doloro e79146364c meow 2026-08-05 02:57:59 +01:00
doloro a93ff98461 meow 2 2026-08-03 11:19:58 +01:00
doloro cce3c78ae5 a lot of meow 2026-08-03 11:04:49 +01:00
doloro 47c31cc539 things 2026-08-02 01:38:50 +01:00
doloro b8c6862880 meow 2026-07-25 16:10:00 +01:00
22 changed files with 807 additions and 496 deletions
+33
View File
@@ -95,6 +95,39 @@ nix run .#sops-encrypt <file>
nix develop
```
## Validating Config Changes
Standard validation sequence before relying on any edit to a `.nix` module (used for opencode, ai, and other module changes):
1. **Parse check** (fast, catches syntax/brace errors):
```bash
nix-instantiate --parse config/modules/ai/ai.nix >/dev/null && echo "PARSE OK"
```
2. **Hash verification** for any downloaded file pinned via `pkgs.fetchurl` — compute the sha256 locally and confirm it matches the `sha256` in the module:
```bash
nix hash file token-tracker.tsx # or: sha256sum token-tracker.tsx
```
3. **Flake evaluation** — full `nix flake check` may fail on unrelated pre-existing issues (e.g. `<den/primary-user>` not on NIX_PATH in pure mode). Distinguish pre-existing failures from edit-induced ones before touching the code. `nix flake show --impure` lists the configuration names (`nixosConfigurations: desktop, doloro-bootable, laptop, rpi5, wsl`).
4. **Runtime output check** — the generated config is a home-manager symlink into `/nix/store`. After a rebuild, confirm the live files actually contain the change:
```bash
readlink -f ~/.config/opencode/opencode.json # → /nix/store/...-opencode.json
rg -n "my-change" "$(readlink -f ~/.config/opencode/opencode.json)"
```
Also verify supporting files that the change depends on (plugins dir, extra packages, etc.):
```bash
ls -la ~/.config/opencode/plugins/ && readlink -f ~/.config/opencode/plugins/*.tsx
```
5. **Cache check** for npm-resolved opencode plugins — confirm opencode actually downloaded the package into its plugin cache:
```bash
ls ~/.cache/opencode/packages/ | rg "plugin-name"
```
If the package is absent or an old version, the plugin won't load regardless of config.
6. **Log check** — search opencode's log for plugin-load errors, filtering out your own tool-call noise:
```bash
rg -i "plugin" ~/.local/share/opencode/log/opencode.log | rg -v "evaluated permission" | tail -30
```
7. **Config is loaded once at startup** — a running opencode session keeps the config it loaded at launch. After changing any config file, restart opencode (and run a home-manager rebuild first) before expecting the change to take effect.
## Important Notes
- `allowUnfree = true` globally for proprietary packages (Steam, Spotify, etc.)
+26 -25
View File
@@ -38,10 +38,12 @@
modules.spotify
# modules.easyeffects
# modules.lavd
modules.ai
modules.pi-coding
<modules/ai/secrets>
# modules.ai
modules.pi-coding # inactive: swapped to opencode
# modules.omp
modules.podman
modules.wivrn
# <modules/ai/ollama-cuda>
];
nixos =
@@ -76,23 +78,23 @@
...
}:
{
wayland.windowManager.hyprland.settings = {
monitor = [
"HDMI-A-1, 1920x1080@60, 0x0, 1"
"DP-2, 1920x1080@120, 1920x0, 1"
];
exec-once = [
"hyprctl dispatch workspace 2" # shit solution to get quickshell on the right monitor
];
workspace = [
"name:2, monitor:DP-2"
];
input = {
kb_layout = "gb";
follow_mouse = 2;
sensitivity = -0.5;
};
};
xdg.configFile."hypr/hyprland-local.lua" = {
text = ''
-- Host overrides (desktop): pin workspaces to monitors.
-- HDMI-A-1 (left) shows workspace 1, DP-2 (right) shows workspace 2.
hl.workspace_rule({ workspace = "name:1", monitor = "HDMI-A-1" })
hl.workspace_rule({ workspace = "name:2", monitor = "DP-2" })
-- Autostart (workspace placement applies only to these spawned windows)
hl.on("hyprland.start", function()
hl.exec_cmd("steam", { workspace = "6 silent" })
hl.exec_cmd("telegram-desktop", { workspace = "8 silent" })
hl.exec_cmd("equibop", { workspace = "8 silent" })
hl.exec_cmd("spotify", { workspace = "9 silent" })
hl.exec_cmd("obs", { workspace = "10 silent" })
end)
'';
};
home.packages = with pkgs; [
equibop
telegram-desktop
@@ -109,7 +111,6 @@
krita
# (tetrio-desktop.override { withTetrioPlus = true; })
# bottles
# pi-coding-agent
# orca-slicer's wrapGAppsHook does not actually wrap the installed
# binary, so neither the GSettings schema path nor the NVIDIA/zink
# workaround env from `withNvidiaGLWorkaround` reach the process.
@@ -136,11 +137,11 @@
nixpkgs.overlays = [
# Skipping tests while upstream sorts it out, revert once
# Hydra consistently builds openldap green.
(final: prev: {
openldap = prev.openldap.overrideAttrs (_: {
doCheck = false;
});
})
# (final: prev: {
# openldap = prev.openldap.overrideAttrs (_: {
# doCheck = false;
# });
# })
];
nixpkgs.config.allowUnfree = true;
nixpkgs.config.problems.handlers = {
+7 -17
View File
@@ -37,23 +37,13 @@
homeManager =
{ pkgs, ... }:
{
wayland.windowManager.hyprland.settings = {
# monitor = [
# "eDP-1, 2880x1800@120, 0x0, 2"
# ];
input = {
kb_layout = "gb";
follow_mouse = 2;
sensitivity = 0;
};
decoration = {
blur = lib.mkForce {
enabled = false;
passes = 1;
new_optimizations = true;
ignore_opacity = false;
};
};
xdg.configFile."hypr/hyprland-local.lua" = {
text = ''
-- Host overrides (laptop)
hl.config({ ["decoration.blur.enabled"] = false })
hl.config({ ["input.sensitivity"] = 0 })
hl.device({ name = "default", sensitivity = 0 })
'';
};
home.packages = with pkgs; [
telegram-desktop
+2 -1
View File
@@ -30,7 +30,8 @@
};
programs.home-manager.enable = true;
};
nixos = {lib, ...}: {
nixos = { lib, ... }: {
boot.kernelModules = [ "ntsync" ];
};
};
}
+26 -16
View File
@@ -15,22 +15,8 @@
{
home.packages = [
pkgs.claude-code
pkgs.snip
];
sops = {
secrets.scug-io-ai-key = {
# sopsFile = ./secrets.yaml;
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/scug_io_api_key";
sopsFile = ../secrets/content/secrets.yaml;
};
};
programs.fish = {
shellInit = ''
if test -f "$HOME/.secrets/scug_io_api_key"
set -x SCUG_IO_API_KEY (cat "$HOME/.secrets/scug_io_api_key")
end
'';
};
programs.opencode = {
enable = true;
@@ -54,9 +40,16 @@
"@xberg-io/opencode-xberg"
"@xberg-io/opencode-crawlberg"
"@xberg-io/opencode-html-to-markdown"
# "@xberg-io/opencode-liter-llm"
"@xberg-io/opencode-liter-llm"
"opencode-plugin-litellm@latest"
"@xberg-io/opencode-tree-sitter-language-pack"
# Token slimming: filters shell command output via snip CLI
# (https://github.com/VincentHardouin/opencode-snip)
"opencode-snip@latest"
# Replace/extend the per-model system prompt via
# ~/.config/opencode/system-prompts.json
# (https://github.com/kmcquade/opencode-sysprompt-override-plugin)
"opencode-sysprompt-override@latest"
];
provider.litellm = {
npm = "@ai-sdk/openai-compatible";
@@ -66,6 +59,23 @@
apiKey = "{env:SCUG_IO_API_KEY}";
};
};
# Built-in OpenCode Go provider (https://opencode.ai/zen/go) —
# key from sops secret opencode-go-zen-key via $OPENCODE_GO_API_KEY
provider.opencode-go = {
options = {
apiKey = "{env:OPENCODE_GO_API_KEY}";
};
};
};
# TUI plugin: token-tracker (https://github.com/eserete/opencode-token-tracker)
tui = {
plugin = [ "./plugins/token-tracker.tsx" ];
};
};
xdg.configFile."opencode/plugins/token-tracker.tsx" = {
source = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/eserete/opencode-token-tracker/main/token-tracker.tsx";
sha256 = "a1d56f6d86f512ca2e81653a57ff372c2ea0a3398bcdbebda6de9f9ed89ee45a";
};
};
};
+61
View File
@@ -0,0 +1,61 @@
/**
* Model cost display extension - shows cost info in status bar.
*
* Format: "$X.XX (Y.YY) in" where Y.YY is cache write cost if present.
*
* Usage: pi -e ./model-cost.ts
*/
import type {
ExtensionAPI,
ModelSelectEvent,
UIContext,
} from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const modelSelectHandler = async (
event: ModelSelectEvent,
ctx: UIContext,
) => {
const { model } = event;
// Get cost data from model config
const cost = getModelCost(model);
if (cost) {
ctx.ui.setStatus("model", cost);
} else {
ctx.ui.setStatus("model", "");
}
};
pi.on("model_select", modelSelectHandler);
}
function getModelCost(model: any): string {
if (!model?.cost) return "";
const { input, output, cacheRead, cacheWrite } = model.cost;
// Only show if there's actual cost data
const hasCost =
input !== 0 || output !== 0 || cacheRead !== 0 || cacheWrite !== 0;
if (!hasCost) return "";
// Format: "$X.XX (Y.YY) in"
const parts: string[] = [];
if (input !== 0) {
const cachePrefix = cacheRead > 0 ? ` (↙${cacheRead}) ` : "";
parts.push(`$${input}${cachePrefix}in`);
}
if (output !== 0) {
const cachePrefix = cacheWrite > 0 ? ` (↗${cacheWrite}) ` : "";
parts.push(`$${output}${cachePrefix}out`);
}
if (parts.length === 0) return "";
return parts.join(" / ");
}
+74
View File
@@ -0,0 +1,74 @@
// @ts-nocheck — jiti-loaded pi extension: package imports resolve via pi's
// extension loader aliases at runtime, not from this directory. No typecheck.
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { getBuiltinModels } from "@earendil-works/pi-ai/providers/all";
import type { Model } from "@earendil-works/pi-ai";
interface ProviderFilter {
/** Keep only models whose cost is all zero (free). */
freeOnly?: boolean;
/** Keep only these model ids. */
keep?: string[];
/** Drop these model ids. */
drop?: string[];
/** Keep only models whose id contains any of these substrings. */
keepIdContaining?: string[];
}
const isFree = (m: Model): boolean => {
const c = m.cost;
const baseFree =
c.input === 0 && c.output === 0 && c.cacheRead === 0 && c.cacheWrite === 0;
// A model with cost tiers is not free: tiers kick in above a token threshold.
return baseFree && !(c.tiers && c.tiers.length > 0);
};
const matches = (m: Model, f: ProviderFilter): boolean => {
if (f.freeOnly && !isFree(m)) return false;
if (f.keep && f.keep.length > 0 && !f.keep.includes(m.id)) return false;
if (f.drop && f.drop.includes(m.id)) return false;
if (f.keepIdContaining && f.keepIdContaining.length > 0) {
if (!f.keepIdContaining.some((s) => m.id.includes(s))) return false;
}
return true;
};
export default function (pi: ExtensionAPI): void {
const configPath = path.join(
os.homedir(),
".pi",
"agent",
"model-filters.json",
);
let config: { providers?: Record<string, ProviderFilter> };
try {
config = JSON.parse(fs.readFileSync(configPath, "utf8"));
} catch {
return; // no config, no-op
}
for (const [providerId, filter] of Object.entries(config.providers ?? {})) {
const all = getBuiltinModels(providerId);
if (all.length === 0) {
console.warn(
"[model-filter] no built-in catalog for provider: " + providerId,
);
continue;
}
const models = all.filter((m) => matches(m, filter));
// registerProvider with `models` replaces the provider's full model list;
// auth and streaming are inherited from the built-in provider.
pi.registerProvider(providerId, { models });
console.log(
"[model-filter] " +
providerId +
": " +
all.length +
" -> " +
models.length +
" models",
);
}
}
+108 -86
View File
@@ -7,7 +7,7 @@
{
modules.pi-coding = {
homeManager =
{ pkgs, ... }:
{ pkgs, config, ... }:
{
programs.pi-coding-agent = {
enable = true;
@@ -15,102 +15,77 @@
pkgs.nodejs
# pkgs.lean-lsp-mcp
];
package = pkgs.pi-coding-agent.overrideAttrs (
new: old: {
version = "0.81.1";
src = pkgs.fetchFromGitHub {
owner = "earendil-works";
repo = "pi";
tag = "v${new.version}";
hash = "sha256-xo3uoR7HceOCL3wqoMcacOe8WXP1o7ReAXne5t6Hgao=";
};
npmDepsHash = "sha256-lzKQZbnITzgV9koucsMno6f61ubBLYUcwQEXtak1r1s=";
# npmDepsHash = pkgs.lib.fakeHash;
# npmDepsHash = "sha256-lDoj/94tjJd4ZGU9WgrMOqNSmdpeCljU4c6jGX+TSDY=";
npmDeps = pkgs.fetchNpmDeps {
inherit (new) src;
name = "pi-coding-agent-0.81.1-npm-deps";
hash = new.npmDepsHash;
};
modelData = pkgs.fetchurl {
url = "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-${new.version}.tgz";
hash = "sha256-x53MD5DU370ZdNoz36P+OWZjGVpoM5sfVcEU2/ckDy8=";
# hash = pkgs.lib.fakeHash;
};
preConfigure = ''
mkdir -p packages/ai/src/providers/data
tar --extract --gzip --file=${new.modelData} \
--directory=packages/ai/src/providers/data \
--strip-components=4 \
package/dist/providers/data
'';
passthru.updateScript = pkgs.nix-update-script {
extraArgs = [
"--custom-dep"
"modelData"
];
};
}
);
settings = {
"litellm" = {
"providers" = {
"litellm" = {
"providers" = {
"litellm" = {
"displayName" = "scuggo";
"baseUrl" = "https://9f5db439.fwds.scug.io";
"apiKey" = "$SCUG_IO_API_KEY";
"compat" = {
"sendSessionAffinityHeaders" = true;
};
};
};
"skills" = {
"enabled" = true;
};
"displayName" = "scuggo";
"baseUrl" = "https://ai-proxy.fwds.scug.io";
"apiKey" = "$SCUG_IO_API_KEY";
"compat" = {
"sendSessionAffinityHeaders" = true;
};
"mcp" = {
"enabled" = true;
};
"showCacheMissNotices" = true;
"qol" = {
"permissionGate" = {
"enabled" = true;
"commands" = "rm -Rf,rm -rf,sudo,chmod,chown,mkfs,dd,shutdown,reboot,poweroff";
"previewLines" = 12;
"previewChars" = 1200;
};
};
};
"skills" = {
"enabled" = true;
};
"compat" = {
"sendSessionAffinityHeaders" = true;
};
};
"mcp" = {
"enabled" = true;
};
"uiMode" = "fullscreen";
"showCacheMissNotices" = true;
"vstack" = {
"extensionManager" = {
"config" = { };
};
};
packages = [
# "npm:@odinlayer/pi-provider-litellm"
# "npm:pi-provider-litellm"
"npm:@juanibiapina/pi-extension-settings"
"git:github.com/balcsida/pi-provider-litellm"
# "npm:pi-web-access"
"npm:pi-provider-litellm"
# Web search / content extraction (opencode-crawlberg + opencode-html-to-markdown equivalent)
"npm:pi-web-access"
# Local document parsing / OCR (opencode-xberg equivalent)
"npm:pi-docparser"
# "npm:@gotgenes/pi-permission-system"
"npm:@vanillagreen/pi-qol"
"npm:@vanillagreen/pi-extension-manager"
# "npm:@vanillagreen/pi-qol"
"npm:pi-vitals"
"npm:pi-spark"
"npm:@zhushanwen/pi-context-engineering"
"npm:pi-caveman"
# "npm:pi-caveman"
"npm:@tmustier/pi-usage-extension"
"npm:@heyhuynhgiabuu/pi-pretty"
"npm:pi-lens"
# "npm:pi-lean-ctx"
# "npm:@rohaquinlop/pi-deepseek-cache"
"npm:pi-cache-optimizer"
"npm:pi-opencode-go-cache"
"npm:@pi-vault/pi-dcp"
"git:github.com/DietrichGebert/ponytail"
];
};
context = "Heavily prefer to use any appropriate tools instead of raw cmd";
context = ''
Core Directive: precise execution, strict safety, long-term solutions.
1. Standards: hard fail unless overridden; files <=300 lines (refactor if exceeded); no hardcoding config/env/consts only; no defaults fail on missing config; no legacy/shims/auto-migrations, assume clean state; root fixes only, no cosmetic patches (report unrelated bugs).
2. Safety: never run destructive ops (rm, reset --hard, deletions) without explicit prior approval; respect sandbox mode (ro/write), request approval if blocked; new code = creative, existing code = minimal deltas (no style/rename drift).
3. Tools: todowrite for multi-step exactly one in_progress, update on completion; rg for search; outputs truncated (~256 lines/10KB), read large files in chunks (<250 lines); edit = trust tool, no re-read, no added headers/comments; build/test/lint before yielding, yield only after todowrite done.
4. Communication: AGENTS.md governs deepest file wins, user prompt overrides; 1-sentence next-action preamble before any tool call; final output GFM with clickable file refs (src/main.ts:50), no file://, technical/dense/impersonal.
[CORE TOOLING DOCTRINE]
- Files: read truncates at 2000 lines/50KB (use offset/limit); write creates/overwrites/auto-parents; edit = smallest unique oldText, merge nearby, never include huge unchanged regions. Never cat/echo/tee/sed -i/head/tail for file content.
- Search: rg -n for text; grep tool (glob filter) for content; find tool for glob discovery only.
- Navigation: symbol_search module_report read_symbol/read_enclosing; never find + manual parsing.
- Diagnostics: lens_diagnostics (delta=this turn, all=session, full=project-wide before done); lsp_diagnostics before builds.
- Context: recall_context(id) to recover compressed/expired/truncated content.
- bash: only for git/nix/builds/scripts/network/system mgmt; set timeout for long ops.
- CRITICAL: never find on /nix/store unpruned walk locks up execution; ls known paths, ask user for unknown paths. ABSOLUTE.
- You have a web-search tool. Use it sparingly but reach for it in situations where info isnt directly known. (i.e, "common problem" -> get from memory, think hard if needed, "hard problem that isnt in your training data or request for you to read docs for a lib or program" -> search online)
- Searching for anything (including with wildcards ("/nix/store/*/**" or others)) isnt permitted at all. You must find paths inside the project, such a result/
'';
};
# pi-vitals config
@@ -135,6 +110,7 @@
rightSegments = [
"separator"
"cost"
"model_cost"
"context_pct"
];
icons = {
@@ -151,6 +127,7 @@
cacheWrite = "";
contextPct = "";
cost = "$";
modelCost = "(in/out)";
separator = "";
};
colors = {
@@ -165,6 +142,7 @@
contextWarn = "warning";
contextError = "error";
cost = "text";
modelCost = "text";
tokens = "muted";
separator = "dim";
};
@@ -184,6 +162,61 @@
};
};
};
home.file.".pi/agent/auth.json" = {
text = builtins.toJSON {
"opencode-go" = {
"type" = "api_key";
"key" = "$OPENCODE_GO_API_KEY";
};
"opencode" = {
"type" = "api_key";
"key" = "$OPENCODE_GO_API_KEY";
};
};
};
# Cache/routing compat overrides (provider-level minimal)
home.file.".pi/agent/models.json" = {
text = builtins.toJSON {
providers = {
"opencode-go" = {
compat = {
supportsLongCacheRetention = true;
};
};
};
};
};
# Restrict providers to a subset of their built-in models.
# Filter config: ~/.pi/agent/model-filters.json (see below).
home.file.".pi/agent/extensions/model-filter.ts" = {
source = ./model-filter.ts;
};
# Show model cost in status bar
home.file.".pi/agent/extensions/model-cost.ts" = {
source = ./model-cost.ts;
};
# Model filter config: per-provider filters applied by model-filter.ts
home.file.".pi/agent/model-filters.json" = {
text = builtins.toJSON {
providers = {
# opencode: only free models (all cost zero)
opencode = {
freeOnly = true;
};
};
};
};
# pi-web-access config: raw results, no curator / no AI summarising
home.file.".pi/web-search.json" = {
text = builtins.toJSON {
workflow = "none";
};
};
# pi-spark config
home.file.".pi/agent/spark.json" = {
@@ -195,7 +228,7 @@
presets = {
"scuggo" = {
provider = "litellm";
model = "meow";
model = "Ornith-1.0-9B";
thinkingLevel = "medium";
};
"claude" = {
@@ -209,17 +242,6 @@
thinkingLevel = "medium";
};
};
recap = {
idle = "5m";
provider = "openai-codex";
model = "gpt-5.4-mini";
thinkingLevel = "off";
};
title = {
provider = "openai-codex";
model = "gpt-5.4-mini";
thinkingLevel = "off";
};
};
};
};
+35
View File
@@ -0,0 +1,35 @@
{ modules, ... }:
{
modules.ai = {
provides = {
secrets = {
homeManager =
{ config, ... }:
{
sops = {
secrets.scug-io-ai-key = {
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/scug_io_api_key";
sopsFile = ../secrets/content/secrets.yaml;
};
secrets.opencode-go-zen-key = {
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/opencode-go-zen-key";
sopsFile = ../secrets/content/secrets.yaml;
};
};
programs.fish = {
shellInit = ''
if test -f "$HOME/.secrets/scug_io_api_key"
set -x SCUG_IO_API_KEY (cat "$HOME/.secrets/scug_io_api_key")
end
if test -f "$HOME/.secrets/opencode-go-zen-key"
set -x OPENCODE_GO_API_KEY (cat "$HOME/.secrets/opencode-go-zen-key")
end
'';
};
};
};
};
};
}
+1
View File
@@ -4,6 +4,7 @@
homeManager = {
services.dunst = {
enable = true;
# systemd.enable = true;
settings = {
global = {
font = "Noto Nerd Font 8";
+9 -5
View File
@@ -54,11 +54,15 @@
xdg.configFile."net.imput.helium/WidevineCdm/latest-component-updated-widevine-cdm" = {
text = ''{"Path":"${pkgs.widevine-cdm}/share/google/chrome/WidevineCdm"}'';
};
wayland.windowManager.hyprland.settings = lib.mkIf settings.default {
binds = [
"$mainMod, E, exec, helium"
];
};
wayland.windowManager.hyprland.extraLuaFiles = lib.mkIf settings.default {
"helium-bind.lua" = {
autoLoad = true;
content = ''
-- Helium launcher bind (lua config: settings.bind cannot express dispatchers)
hl.bind("SUPER + E", hl.dsp.exec_cmd("helium"))
'';
};
};
};
};
}
+192 -171
View File
@@ -12,6 +12,187 @@
home,
...
}:
let
tofiCfg = pkgs.writeTextFile {
name = "hyprland-tofi-config";
text = ''
width = 100%
height = 100%
border-width = 0
outline-width = 0
padding-left = 35%
padding-top = 35%
result-spacing = 25
num-results = 5
font = monospace
background-color = #000A
'';
};
meowScript = pkgs.writeShellScript "meow" ''
fish -c 'grim -g $(slurp) -t png - &| wl-copy -t image/png; killall wayfreeze'
'';
mreowScript = pkgs.writeShellScript "mreow" ''
exec $(tofi-drun -c ${tofiCfg})
'';
mainMod = "SUPER";
hlBind = key: dispatcher: "hl.bind(\"${key}\", ${dispatcher})";
workspaceLines = pkgs.lib.concatLists (
builtins.genList (
i:
let
ws = toString (i + 1);
in
[
(hlBind "${mainMod} + ${ws}" "hl.dsp.focus({ workspace = ${ws} })")
(hlBind "${mainMod} + SHIFT + ${ws}" "hl.dsp.window.move({ workspace = ${ws} })")
]
) 9
);
hlBindCode = pkgs.lib.concatStringsSep "\n" (
[
"-- Hyprland configuration"
""
"local mainMod = \"${mainMod}\""
""
"-- Config"
"hl.config({"
" general = {"
" gaps_in = 1,"
" gaps_out = 1,"
" border_size = 1,"
" resize_on_border = false,"
" allow_tearing = true,"
" layout = \"dwindle\","
" },"
" input = {"
" follow_mouse = 2,"
" kb_layout = \"gb\","
" },"
" decoration = {"
" rounding = 4,"
" rounding_power = 1,"
" active_opacity = 1.0,"
" inactive_opacity = 1.0,"
" shadow = {"
" enabled = false,"
" },"
" blur = {"
" enabled = true,"
" passes = 1,"
" new_optimizations = true,"
" ignore_opacity = false,"
" },"
" },"
" cursor = {"
" no_hardware_cursors = false,"
" },"
" dwindle = {"
" preserve_split = true,"
" },"
" misc = {"
" force_default_wallpaper = -1,"
" disable_hyprland_logo = false,"
" enable_anr_dialog = false,"
" },"
"})"
""
"-- Monitors"
"hl.monitor({ output = \"HDMI-A-1\", mode = \"1920x1080@60\", position = \"0x0\", scale = \"1\" })"
"hl.monitor({ output = \"DP-2\", mode = \"1920x1080@120\", position = \"1920x0\", scale = \"1\" })"
""
"-- Input"
"hl.device({ name = \"default\", kb_layout = \"gb\", sensitivity = -0.5 })"
""
"-- Curves"
"hl.curve(\"easeOutQuint\", { type = \"bezier\", points = { {0.23, 1}, {0.32, 1} } })"
"hl.curve(\"easeInOutCubic\", { type = \"bezier\", points = { {0.65, 0.05}, {0.36, 1} } })"
"hl.curve(\"linear\", { type = \"bezier\", points = { {0, 0}, {1, 1} } })"
"hl.curve(\"almostLinear\", { type = \"bezier\", points = { {0.5, 0.5}, {0.75, 1} } })"
"hl.curve(\"quick\", { type = \"bezier\", points = { {0.15, 0}, {0.1, 1} } })"
""
"-- Animations"
"hl.animation({ leaf = \"global\", enabled = true, speed = 10, bezier = \"default\" })"
"hl.animation({ leaf = \"border\", enabled = true, speed = 5.39, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"windows\", enabled = true, speed = 2.79, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"windowsIn\", enabled = true, speed = 1, bezier = \"easeOutQuint\", style = \"popin 87%\" })"
"hl.animation({ leaf = \"windowsOut\", enabled = true, speed = 1, bezier = \"linear\", style = \"popin 87%\" })"
"hl.animation({ leaf = \"windowsMove\", enabled = true, speed = 1, bezier = \"easeInOutCubic\" })"
"hl.animation({ leaf = \"fadeIn\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fadeOut\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fade\", enabled = true, speed = 1, bezier = \"quick\" })"
"hl.animation({ leaf = \"layers\", enabled = true, speed = 3.81, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"layersIn\", enabled = true, speed = 4, bezier = \"easeOutQuint\", style = \"fade\" })"
"hl.animation({ leaf = \"layersOut\", enabled = true, speed = 1.5, bezier = \"linear\", style = \"fade\" })"
"hl.animation({ leaf = \"fadeLayersIn\", enabled = true, speed = 1.79, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fadeLayersOut\", enabled = true, speed = 1.39, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"workspaces\", enabled = true, speed = 1, bezier = \"almostLinear\", style = \"slide\" })"
"hl.animation({ leaf = \"workspacesIn\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })"
"hl.animation({ leaf = \"workspacesOut\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })"
"hl.animation({ leaf = \"zoomFactor\", enabled = true, speed = 7, bezier = \"quick\" })"
""
"-- Binds"
(hlBind "${mainMod} + R" "hl.dsp.exec_cmd(\"${mreowScript}\")")
(hlBind "${mainMod} + C" "hl.dsp.window.close()")
(hlBind "${mainMod} + M" "hl.dsp.exec_cmd(\"uwsm stop\")")
(hlBind "${mainMod} + Q" "hl.dsp.exec_cmd(\"kitty\")")
(hlBind "${mainMod} + V" "hl.dsp.window.float({ action = \"toggle\" })")
(hlBind "${mainMod} + left" "hl.dsp.focus({ direction = \"left\" })")
(hlBind "${mainMod} + right" "hl.dsp.focus({ direction = \"right\" })")
(hlBind "${mainMod} + up" "hl.dsp.focus({ direction = \"up\" })")
(hlBind "${mainMod} + down" "hl.dsp.focus({ direction = \"down\" })")
(hlBind "${mainMod} + L" "hl.dsp.exec_cmd(\"wlogout\")")
(hlBind "${mainMod} + S" "hl.dsp.exec_cmd(\"wayfreeze --after-freeze-cmd '${meowScript}'\")")
(hlBind "${mainMod} + F" "hl.dsp.window.fullscreen({ action = \"toggle\" })")
(hlBind "${mainMod} + SHIFT + Q" "hl.dsp.window.close()")
(hlBind "${mainMod} + mouse_down" "hl.dsp.focus({ workspace = \"e+1\" })")
(hlBind "${mainMod} + mouse_up" "hl.dsp.focus({ workspace = \"e-1\" })")
""
"-- Mouse binds"
(hlBind "${mainMod} + mouse:272" "hl.dsp.window.drag()")
(hlBind "${mainMod} + mouse:273" "hl.dsp.window.resize()")
""
"-- Media keys"
(hlBind "XF86AudioLowerVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-\")")
(hlBind "XF86AudioRaiseVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+\")")
(hlBind "XF86AudioMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")")
(hlBind "XF86AudioPlay" "hl.dsp.exec_cmd(\"playerctl play-pause\")")
(hlBind "XF86AudioNext" "hl.dsp.exec_cmd(\"playerctl next\")")
(hlBind "XF86AudioPrev" "hl.dsp.exec_cmd(\"playerctl previous\")")
(hlBind "XF86AudioMicMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")")
(hlBind "home" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")")
(hlBind "end" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")")
(hlBind "F8" "hl.dsp.pass({ window = [[match:class:^(com.obsproject.Studio)$]] })")
""
"-- Workspaces"
(hlBind "${mainMod} + 0" "hl.dsp.focus({ workspace = 10 })")
(hlBind "${mainMod} + SHIFT + 0" "hl.dsp.window.move({ workspace = 10 })")
]
++ workspaceLines
++ [
""
"-- Window rules"
"hl.window_rule({ suppress_event = \"maximize\" })"
"hl.window_rule({ match = { class = \"gamescope\" }, workspace = \"5\", immediate = true, confine_pointer = true })"
"hl.window_rule({ match = { initial_title = \"OBS Studio Crash Detected\" }, pin = true })"
"hl.window_rule({ match = { initial_title = \"Discord Popout\" }, workspace = \"1 silent\" })"
""
"-- Layer rules"
"hl.layer_rule({ match = { namespace = \"notifications\" }, no_screen_share = true })"
""
"-- Host-specific overrides: load ~/.config/hypr/hyprland-local.lua if present (must be valid Lua)"
"local home = os.getenv(\"HOME\")"
"if home then"
" local localPath = home .. '/.config/hypr/hyprland-local.lua'"
" local f = io.open(localPath, 'r')"
" if f then"
" f:close()"
" local chunk, err = loadfile(localPath)"
" if chunk then chunk() else io.stderr:write('hyprland-local.lua error: ' .. err .. '\\n') end"
" end"
"end"
]
);
in
{
home.packages = [
pkgs.hyprcursor
@@ -44,177 +225,17 @@
];
};
};
wayland.windowManager.hyprland.settings = {
env = [
"XCURSOR_THEME,BreezeX-RosePine-Linux"
"XCURSOR_SIZE,24"
"HYPRCURSOR_SIZE,24"
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
"WEBKIT_DISABLE_DMABUF_RENDERER,1" # maybe disable if nixos fixes alcom
];
general = {
gaps_in = 1;
gaps_out = 1;
border_size = 1;
# "col.active_border" =
# "rgb(${toString base16.rgb."base06".r},${toString base16.rgb."base06".g},${toString base16.rgb."base06".b})";
# "col.inactive_border" =
# "rgb(${toString base16.rgb."base03".r},${toString base16.rgb."base03".g},${toString base16.rgb."base03".b})";
resize_on_border = false;
allow_tearing = true;
layout = "dwindle";
};
decoration = {
rounding = 4;
rounding_power = 1;
active_opacity = 1.0;
inactive_opacity = 1.0;
shadow = {
enabled = false;
};
blur = {
enabled = true;
passes = 1;
new_optimizations = true;
ignore_opacity = false;
};
};
cursor = {
no_hardware_cursors = false;
};
animations = {
enabled = true;
bezier = [
"easeOutQuint,0.23,1,0.32,1"
"easeInOutCubic,0.65,0.05,0.36,1"
"linear,0,0,1,1"
"almostLinear,0.5,0.5,0.75,1.0"
"quick,0.15,0,0.1,1"
];
animation = [
"global, 1, 10, default"
"border, 1, 5.39, easeOutQuint"
"windows, 1, 2.79, easeOutQuint"
"windowsIn, 1, 1, easeOutQuint, popin 87%"
"windowsOut, 1, 1, linear, popin 87%"
"windowsMove, 1, 1, easeInOutCubic"
"fadeIn, 1, 0.5, almostLinear"
"fadeOut, 1, 0.5, almostLinear"
"fade, 1, 1, quick"
"layers, 1, 3.81, easeOutQuint"
"layersIn, 1, 4, easeOutQuint, fade"
"layersOut, 1, 1.5, linear, fade"
"fadeLayersIn, 1, 1.79, almostLinear"
"fadeLayersOut, 1, 1.39, almostLinear"
"workspaces, 1, 1, almostLinear, slide"
"workspacesIn, 1, 1, easeInOutCubic, slide"
"workspacesOut, 1, 1, easeInOutCubic, slide"
"zoomFactor, 1, 7, quick"
];
};
dwindle = {
# pseudotile = true;
preserve_split = true;
};
# master = {
# new_status = master;
# };
misc = {
force_default_wallpaper = -1;
disable_hyprland_logo = false;
enable_anr_dialog = false;
# vfr = true;
};
"$mainMod" = "SUPER";
bind = [
(
let
config = pkgs.writeTextFile {
name = "config";
text = ''
width = 100%
height = 100%
border-width = 0
outline-width = 0
padding-left = 35%
padding-top = 35%
result-spacing = 25
num-results = 5
font = monospace
background-color = #000A
'';
};
script = pkgs.writeShellScript "mreow" ''
exec $(tofi-drun -c ${config})
'';
in
"$mainMod, R, exec, ${script}"
)
"$mainMod, C, killactive"
"$mainMod, M, exec, uwsm stop"
"$mainMod, Q, exec, kitty"
"$mainMod, V, togglefloating,"
# "$mainMod, P, pseudo, # dwindle"
# "$mainMod, J, togglesplit, # dwindle"
"$mainMod, left, movefocus, l"
"$mainMod, right, movefocus, r"
"$mainMod, up, movefocus, u"
"$mainMod, down, movefocus, d"
"$mainMod, L, exec, wlogout"
(
let
script = pkgs.writeShellScript "meow" ''
fish -c 'grim -g $(slurp) -t png - &| wl-copy -t image/png; killall wayfreeze'
'';
in
"$mainMod, S, exec, " + "wayfreeze --after-freeze-cmd '${script}'"
)
"$mainMod, F, fullscreen"
"$mainMod, mouse_down, workspace, e+1"
"$mainMod, mouse_up, workspace, e-1"
", home, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
", end, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
", F8, pass, class:^(com\.obsproject\.Studio)$"
"$mainMod, 0, workspace, 10"
"$mainMod SHIFT, 0, movetoworkspace, 10"
]
++ (builtins.concatLists (
builtins.genList (
i:
let
ws = i + 1;
in
[
"$mainMod, ${toString ws}, workspace, ${toString ws}"
"$mainMod SHIFT, ${toString ws}, movetoworkspace, ${toString ws}"
]
) 9
));
bindm = [
"$mainMod, mouse:272, movewindow"
"$mainMod, mouse:273, resizewindow"
];
windowrule = [
"match:class .*, suppress_event maximize"
"match:class ^(gamescope)$, workspace 5"
"match:class ^(gamescope)$, immediate true"
"match:class ^(gamescope)$, confine_pointer true"
"match:class ^(steam)$, workspace 6 silent"
"match:class ^(vesktop)$, workspace 8 silent"
"match:class ^(org.telegram.desktop)$, workspace 8 silent"
"match:class ^(com.obsproject.Studio)$, workspace 10 silent"
"match:initial_title ^(OBS Studio Crash Detected)$, pin true"
"match:initial_title ^(Discord Popout)$, workspace 1 silent"
];
layerrule = [
"match:namespace ^(notifications)$, no_screen_share true"
# "match:namespace ^(quickshell)$, blur true"
];
# exec-once = [
# ];
# we need to auto launch: quickshell, steam, ar_rpc (maybe), vesktop, telegram, qbit, and obs
# systemd.user.services.hyprpaper = {
# partOf = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# };
# Hand-written config as extraLuaFile so Home Manager still
# generates hypr/hyprland.lua itself, including the systemd
# session activation hooks (hyprland-session.target start/stop
# + dbus-update-activation-environment --systemd --all).
wayland.windowManager.hyprland.extraLuaFiles."hl-main.lua" = {
autoLoad = true;
content = hlBindCode;
};
};
};
+49 -43
View File
@@ -3,56 +3,62 @@
inputs,
lib,
...
}: {
}:
{
flake-file.inputs = {
hyprland.url = "github:hyprwm/Hyprland";
};
modules.hyprland = {
nixos = {pkgs, ...}: {
imports = [inputs.hyprland.nixosModules.default];
environment.systemPackages = with pkgs; [
wayfreeze
grim
slurp
wlogout
ranger
];
programs.xwayland.enable = true;
programs.hyprland = {
enable = true;
# withUWSM = true;
# set the flake package
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# make sure to also set the portal package, so that they are in sync
portalPackage =
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
# gtk.enable = lib.mkForce false;
xdg.portal = {
enable = true;
extraPortals = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland
nixos =
{ pkgs, ... }:
{
imports = [ inputs.hyprland.nixosModules.default ];
environment.systemPackages = with pkgs; [
wayfreeze
grim
slurp
wlogout
ranger
];
};
environment.sessionVariables.NIXOS_OZONE_WL = "1";
hardware.graphics = {
# package = pkgs-unstable.mesa;
programs.xwayland.enable = true;
programs.hyprland = {
enable = true;
# withUWSM = true;
# set the flake package
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# make sure to also set the portal package, so that they are in sync
portalPackage =
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
# gtk.enable = lib.mkForce false;
xdg.portal = {
enable = true;
extraPortals = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland
];
};
environment.sessionVariables.NIXOS_OZONE_WL = "1";
hardware.graphics = {
# package = pkgs-unstable.mesa;
# if you also want 32-bit support (e.g for Steam)
# enable32Bit = true;
# package32 = pkgs-unstable.pkgsi686Linux.mesa;
# if you also want 32-bit support (e.g for Steam)
# enable32Bit = true;
# package32 = pkgs-unstable.pkgsi686Linux.mesa;
};
};
};
homeManager = {pkgs, ...}: {
gtk = {
enable = true;
homeManager =
{ pkgs, ... }:
{
gtk = {
enable = true;
};
# backupFileExtension = "backupHM";
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = true;
systemd.variables = [ "--all" ];
configType = "lua";
};
};
# backupFileExtension = "backupHM";
wayland.windowManager.hyprland = {
enable = true;
systemd.variables = ["--all"];
configType = "lua";
};
};
};
}
+5 -1
View File
@@ -2,7 +2,8 @@
den,
modules,
...
}: {
}:
{
modules.kitty = {
homeManager = {
programs.kitty = {
@@ -16,6 +17,9 @@
background_opacity = 0.6;
cursor_trail = 1;
auto_reload_config = -1;
input_delay = 1;
repaint_delay = 2;
wayland_enable_ime = "no";
};
};
};
+1 -2
View File
@@ -10,7 +10,6 @@
flake-file.inputs = {
nixvim = {
url = "github:nix-community/nixvim";
inputs.nixpkgs.follows = "nixpkgs";
};
};
modules = {
@@ -44,7 +43,7 @@
config = {
allowUnfree = true;
};
# source = inputs.nixpkgs;
source = inputs.nixpkgs;
};
colorschemes.gruvbox-material.enable = true;
# colorschemes.melange = {
+5
View File
@@ -11,12 +11,17 @@
{
programs.quickshell = {
systemd.enable = true;
systemd.target = "hyprland-session.target";
enable = true;
activeConfig = "main";
configs = {
main = config.lib.file.mkOutOfStoreSymlink "/home/doloro/dotfiles/config/modules/quickshell/quickshell";
};
};
# systemd.user.services.quickshell = {
# partOf = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# };
};
};
}
+4 -3
View File
@@ -4,6 +4,7 @@ wakatime-scug-io-api-key: ENC[AES256_GCM,data:XQUccNW4210U8ZpHSGVcsdbAirzyTvmcy4
meow: ENC[AES256_GCM,data:JVzenw==,iv:oCOo9//r5s2K4pSeH5UNEj0LL+9h2yq0G0DPOfwjmyQ=,tag:0gu9FNOrjQ8fpB+B+RbGSg==,type:str]
meoww: ENC[AES256_GCM,data:WPeszDfMWxY=,iv:JJMOror5wj7cTNKfrUj2LDXlO3WCKzb7jk4AeZ0oD+Q=,tag:qs3oyM7K1FGy5cXvS6OHpQ==,type:str]
scug-io-ai-key: ENC[AES256_GCM,data:b2AT2+A5eoGa1eZsCYKDFg449sOgffDcQA==,iv:NDIS3x1unq6/UtjtsyBTHx5v12utagDA3BbNzs5v3L0=,tag:MhbJGATIDWyOZUqXqRAeVA==,type:str]
opencode-go-zen-key: ENC[AES256_GCM,data:fwgV/QK+4tpizC6J3evbGxD57BQCWn5Eyex7iIeNYCQHk6ZD8eTukqhUbLcfXyO4RQot3B1B2xbQVVBsuOWWcQYQKA==,iv:aKwQM8d0gP+MyuqWFk2VfOWDgKPcE/HAvL0I0r6o1nU=,tag:/AeSgscy0mxUMwoP8LaCXg==,type:str]
sops:
age:
- enc: |
@@ -69,7 +70,7 @@ sops:
61QsSqCuJyEwSPpOzeWa5NChcCjitOUG1jEMsSHlpIslKA1P7g/P9g==
-----END AGE ENCRYPTED FILE-----
recipient: age1kc0xu0ue2nrrr7w4gam7wlzackv8jv243rxwwndgxjqklgtnp5csdtpgzp
lastmodified: "2026-07-22T22:45:05Z"
mac: ENC[AES256_GCM,data:jfbsnWcZ6yJSUbRn8VbONhj3oin1+DsHzJ590BbdPtikZwjD/0f06NQ86b0DI5/M+LKP4Dy5Cyf7xyJ99iWuOKbF9y12qK17IqMaNZCmPkw8Y+v7q38ESsW/Iizr3hfQ2L2GwJNTWsoifCeQphxGby7s2lKjMPYGKhYrgicZ5Fs=,iv:bbL+59d0S1fdfDInLS5z9Vx+AVW6nb0z2BNgZ+5PbUM=,tag:jJYnLsORyEuClRm/t4mwcA==,type:str]
lastmodified: "2026-08-01T18:33:13Z"
mac: ENC[AES256_GCM,data:sTTpvCTBPsY4OABqIvgujUT2+Yye+H44mxN3G3ybhoj05omgFajYN86sc3zL9vbiTl7SNxCWMkGCerCvS4QrtRZ0vRTNuYNkFPNHDKniSybbxKzjHqyXWGCOoNYqHW211ktB9vmiXQd+zYart87kUU6d6p2FrVDBLU03eQwJO6k=,iv:8zT8W34A8f/EXRYxFeK2PC2Ko6UrjFrPL5+lwNXpb4Q=,tag:WugeYbmrVcUZ9xVC+r3c7w==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.2
version: 3.13.3
+7 -6
View File
@@ -15,12 +15,13 @@
minimal-tmux-status
];
extraConfig = ''
set-option -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
set -g status-bg black
set -g status-fg white
set -g mouse on
set -g extended-keys on
set-option -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
set -g status-bg black
set -g status-fg white
set -g mouse on
set -g extended-keys on
set -g allow-passthrough on
'';
};
};
+61
View File
@@ -0,0 +1,61 @@
{ den, modules, ... }:
{
modules.wivrn = {
homeManager =
{ pkgs, ... }:
{
home.packages = with pkgs; [
wivrn
wayvr
];
};
nixos =
{ pkgs, lib, ... }:
{
services.wivrn = {
enable = true;
openFirewall = true;
autoStart = true;
highPriority = true;
# Low-latency encoder config
extraServerFlags = [ ];
monadoEnvironment = {
# Monado OpenXR runtime env vars
};
steam = {
enable = true;
importOXRRuntimes = true;
};
# Optimal config for low latency:
# - Vulkan encoder (newer kernels) or vaapi (AMD/Intel)
# - H265 codec (3ms overhead, better quality than H264)
# - 90Hz refresh rate (balance quality/battery)
# - 140% render resolution with quality supersampling
# - Up to 200Mbit/s bitrate on good networks
config.enable = true;
config.json = {
encoder = {
encoder = "nvenc";
codec = "h265";
};
# Enable mDNS discovery
"publish-service" = "avahi";
# High priority for async reprojection
highPriority = true;
};
};
# Include monado-vulkan-layers for VR rendering
environment.systemPackages = with pkgs; [
monado-vulkan-layers
];
};
};
}
+9 -5
View File
@@ -42,11 +42,15 @@
];
in
{
wayland.windowManager.hyprland.settings = lib.mkIf settings.default {
bind = [
"$mainMod, E, exec, zen"
];
};
wayland.windowManager.hyprland.extraLuaFiles = lib.mkIf settings.default {
"zen-browser-bind.lua" = {
autoLoad = true;
content = ''
-- Zen launcher bind (lua config: settings.bind cannot express dispatchers)
hl.bind("SUPER + E", hl.dsp.exec_cmd("zen"))
'';
};
};
home.packages = [
(pkgs.wrapFirefox
inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.zen-browser-unwrapped
Generated
+91 -111
View File
@@ -117,38 +117,6 @@
"type": "github"
}
},
"cachyos-kernel": {
"flake": false,
"locked": {
"lastModified": 1784569577,
"narHash": "sha256-pmwdKRPSavZ98QJv/Xlbj2U60AZ/+P4aevLBZ71jDaA=",
"owner": "CachyOS",
"repo": "linux-cachyos",
"rev": "5ca2493c51b1cadec102c9c549345b43f669960b",
"type": "github"
},
"original": {
"owner": "CachyOS",
"repo": "linux-cachyos",
"type": "github"
}
},
"cachyos-kernel-patches": {
"flake": false,
"locked": {
"lastModified": 1783974915,
"narHash": "sha256-kReDG2emoGxaG0Lr8tt9jUuu1kQu07yAJZhVWfbwxYc=",
"owner": "CachyOS",
"repo": "kernel-patches",
"rev": "ea739d734ec179864b21446856315bc49f7c52fa",
"type": "github"
},
"original": {
"owner": "CachyOS",
"repo": "kernel-patches",
"type": "github"
}
},
"den": {
"locked": {
"lastModified": 1775551420,
@@ -172,11 +140,11 @@
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1784874452,
"narHash": "sha256-tY44xXG2zeAXAEbxcLfspV0sr54aLQk334rHU+erlqw=",
"lastModified": 1785395241,
"narHash": "sha256-33LyV3D5zCpFXeh6L7QBe+Syb2zWPfeEFgaJb9E8ucU=",
"owner": "Mic92",
"repo": "direnv-instant",
"rev": "2d6dab5941c8472e6a14b641bde9d64bea1be1f5",
"rev": "c4231a4244dde9b85fa6ee39535f28f525596cd3",
"type": "github"
},
"original": {
@@ -284,11 +252,11 @@
},
"flake-file": {
"locked": {
"lastModified": 1784255282,
"narHash": "sha256-srM+PTqxfyvbQ0BevsOtP8vQv/Ox6OMtY4DktoDxLKg=",
"lastModified": 1785282747,
"narHash": "sha256-ZwdMXUu0Udb4yzI65+psyJeUF+wexByNEvTUSx1xjVs=",
"owner": "vic",
"repo": "flake-file",
"rev": "66ddd2f69a5c4677f0095c6f70eea1217dc45749",
"rev": "56c46842d70754345c4a4581b8cbebe87b8fc067",
"type": "github"
},
"original": {
@@ -478,11 +446,11 @@
"utils": "utils"
},
"locked": {
"lastModified": 1784863038,
"narHash": "sha256-mWZeP4v2Fpx7EFyL2KnQKDt8JF5GokF/XtgA9RIEfMU=",
"lastModified": 1785004096,
"narHash": "sha256-8stbyRwnEwPMmni/U6iHGGBbi3uebfq60qlKXPgYwWI=",
"owner": "vikingnope",
"repo": "helium-browser-nix-flake",
"rev": "b282f9f276c6593e1e7f575d653e4ff2b4f71256",
"rev": "b356d11eff33ec730a51f9c88d258fdd72efe587",
"type": "github"
},
"original": {
@@ -498,11 +466,11 @@
]
},
"locked": {
"lastModified": 1784877405,
"narHash": "sha256-W649GocILahx7Vb/JMx834217+OLKBrq014VmC/8+NM=",
"lastModified": 1785496534,
"narHash": "sha256-EASdusMYLuPhOCrE3LmsAGOvGhX3vnKBLxFvj9lI8tU=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "32de400b6ac9f43042bca706f4a64f6ad08117e8",
"rev": "e8827fbbb12015a8dd9f66285aec79d655bcb9f6",
"type": "github"
},
"original": {
@@ -586,11 +554,11 @@
"xdph": "xdph"
},
"locked": {
"lastModified": 1784887189,
"narHash": "sha256-EcnF0oQE0QSL524UsCvvAtXU3GWd6QNyhMMldDT407g=",
"lastModified": 1785434837,
"narHash": "sha256-5xgKSbsFzLC9XvMH3iRhYuVBn4w0eo6LzuxY21uRIVw=",
"owner": "hyprwm",
"repo": "Hyprland",
"rev": "e820db90cf9a87db53690fd92ec328c2bd2f486d",
"rev": "8668a5392179f99fb9ab3699ede233484bee0b51",
"type": "github"
},
"original": {
@@ -835,11 +803,11 @@
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1784109236,
"narHash": "sha256-2scKSCd++nRhdi4WhPw7h8HqYraM1wvR/SvT+rBBV90=",
"lastModified": 1785342502,
"narHash": "sha256-qu4abwEmOHOzpdBUigpLfmHObkRgJp5sRjbnnyEKzSo=",
"owner": "JPyke3",
"repo": "hytale-launcher-nix",
"rev": "1e3c190d0297fb0c28fee17a7204d41f4416f84e",
"rev": "2bc2d0dd6fcd4c4a61d9ab33b2149b21286e79d1",
"type": "github"
},
"original": {
@@ -905,11 +873,11 @@
]
},
"locked": {
"lastModified": 1784576541,
"narHash": "sha256-rYziS/48KX8dhQtoLwUJxbMQb7rDiRm27zaxE72rhWw=",
"lastModified": 1785501161,
"narHash": "sha256-7RfISc8VQOaA3U85FIE6zYqkTAaF+b6RLnQvPAlAmts=",
"ref": "main",
"rev": "10568239ced64ba5d249f4c85f1c9f7dda81d137",
"revCount": 79,
"rev": "3fee7b017c11b03421768580e201bbb94f6bd3e5",
"revCount": 80,
"type": "git",
"url": "https://git.scug.io/nikkuss/pkgs.git"
},
@@ -931,11 +899,11 @@
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
},
"locked": {
"lastModified": 1784874881,
"narHash": "sha256-u4jhSIf/Un0qZB+Cn3hTTaHSI20XeAxYbA5o4faqdJs=",
"lastModified": 1785494453,
"narHash": "sha256-nK6DCmFpPgaHweU2Y8BMxutfTihwXJ2XkxaoMZPBpMQ=",
"owner": "sodiboo",
"repo": "niri-flake",
"rev": "ef7a2a3d719af46b906c22a3ebfb7d65627b2cd2",
"rev": "68414146fbe13d8fce7748cf2f4e9e46e4834e2e",
"type": "github"
},
"original": {
@@ -979,18 +947,16 @@
},
"nix-cachyos-kernel": {
"inputs": {
"cachyos-kernel": "cachyos-kernel",
"cachyos-kernel-patches": "cachyos-kernel-patches",
"flake-compat": "flake-compat_2",
"flake-parts": "flake-parts_3",
"nixpkgs": "nixpkgs_6"
},
"locked": {
"lastModified": 1784832578,
"narHash": "sha256-3gkkqfiKHxqqnfKuzmqgpb7atWcdxoYrpTrfNCQAWxY=",
"lastModified": 1785437982,
"narHash": "sha256-m0mLVZc4RmzlBMjPOFh+rnALT92jMXJqQtLBMP9jo90=",
"owner": "xddxdd",
"repo": "nix-cachyos-kernel",
"rev": "7c0ff5c1e38d6e3b63c003ce5e600cd3df3e48dd",
"rev": "8dfc5b3a553819ba50f601d804a3df64360bd5d8",
"type": "github"
},
"original": {
@@ -1021,11 +987,11 @@
"nixpkgs": "nixpkgs_7"
},
"locked": {
"lastModified": 1784723954,
"narHash": "sha256-1CfD8ZUjCkTgjsneLZ/lxCHhgDfqxxE7/GX0MmsgiqA=",
"lastModified": 1785232496,
"narHash": "sha256-65EQYIRRpTdpH8lUiB6Mvo5uBkG60aBIzAJuALfx+O0=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "a017f5b72210026af5b3ac5949f08d94380a6fbd",
"rev": "2e790b0a6be8ec2b76174ac0931b8ff11919ec98",
"type": "github"
},
"original": {
@@ -1104,11 +1070,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1784497964,
"narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=",
"lastModified": 1785318670,
"narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163",
"rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5",
"type": "github"
},
"original": {
@@ -1120,11 +1086,11 @@
},
"nixpkgs-darwin": {
"locked": {
"lastModified": 1784755387,
"narHash": "sha256-uxq8JKEE6bjRst96QKwH5snLXC5QkrqoY+CYuhGqGQg=",
"lastModified": 1784834831,
"narHash": "sha256-yj0LPLnsmYoLmA3FGANjeTEwej0/DHjZBXWnDQDUuIs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2b7a84e696b76759b60bea1eafd62fa34fb96a6e",
"rev": "51fe96f9107566e6b8eeb7fc4ba696c01e548b04",
"type": "github"
},
"original": {
@@ -1151,11 +1117,11 @@
},
"nixpkgs-master": {
"locked": {
"lastModified": 1784887191,
"narHash": "sha256-WMq80/S9JZoTOn7Cm61fx/dQeJU/l26xUGUX4EU+d0I=",
"lastModified": 1785500885,
"narHash": "sha256-iNwmTIXImHMnlXNG4EuTZOuvwt9qZAUM6GnRakZ5fc0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "dae023c3459276c9c615b2f0f6448f2ef8365fe2",
"rev": "24692924db907f18d3b4cf3ef52e7909b02ce40c",
"type": "github"
},
"original": {
@@ -1183,11 +1149,11 @@
},
"nixpkgs_10": {
"locked": {
"lastModified": 1784796856,
"narHash": "sha256-wWFrV5/Qbm+lyt5x20E/bSbfJiGKMo4RCxZV8cl/WZI=",
"lastModified": 1785454630,
"narHash": "sha256-LQy14TZp77TwbQf40gg1V3jo8FwJG0jGDkAH+zRHqg8=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e2587caef70cea85dd97d7daab492899902dbf5d",
"rev": "1559d3daa3ecc813a650b79375ea61b6741b8746",
"type": "github"
},
"original": {
@@ -1198,6 +1164,22 @@
}
},
"nixpkgs_11": {
"locked": {
"lastModified": 1784555310,
"narHash": "sha256-/FCliTPgiuV1owejZFNx3Ch9irdvkOfOFl+HHZ+DrtM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "421eebfd0ec7bccd4abe826ce62d7e6e83129493",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_12": {
"locked": {
"lastModified": 1774709303,
"narHash": "sha256-D3Q07BbIA2KnTcSXIqqu9P586uWxN74zNoCH3h2ESHg=",
@@ -1213,7 +1195,7 @@
"type": "github"
}
},
"nixpkgs_12": {
"nixpkgs_13": {
"locked": {
"lastModified": 1745279238,
"narHash": "sha256-AQ7M9wTa/Pa/kK5pcGTgX/DGqMHyzsyINfN7ktsI7Fo=",
@@ -1229,13 +1211,13 @@
"type": "github"
}
},
"nixpkgs_13": {
"nixpkgs_14": {
"locked": {
"lastModified": 1784356753,
"narHash": "sha256-zupdTm41be2fY8cexroEOGjopl3F2Gqs3gk7ieqaM3s=",
"rev": "61b7c44c4073f0b827768aff0049561b5110ea5a",
"lastModified": 1784796856,
"narHash": "sha256-vwxWgF+Gj276WznzGb1LxGsK/39HaQwgQXiU3EkC844=",
"rev": "e2587caef70cea85dd97d7daab492899902dbf5d",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1036777.61b7c44c4073/nixexprs.tar.xz"
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1040357.e2587caef70c/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
@@ -1289,11 +1271,11 @@
},
"nixpkgs_5": {
"locked": {
"lastModified": 1783224372,
"narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=",
"lastModified": 1785090369,
"narHash": "sha256-m0pDuRJG7EDo9ri+4Ksu83VsI+PlxNC9lNBfydejce4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d407951447dcd00442e97087bf374aad70c04cea",
"rev": "624af665418d3c65d544145b4d34ad696439570e",
"type": "github"
},
"original": {
@@ -1305,11 +1287,11 @@
},
"nixpkgs_6": {
"locked": {
"lastModified": 1784800284,
"narHash": "sha256-aegW1E+2ZJbIWTi6lRGfUD77qclmKARWJvRolEWmY9s=",
"lastModified": 1785382966,
"narHash": "sha256-TzNPxZZV/qnV8U5fEtrvcMF/GppHnlWm16RDHddPOyE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e77b9866887df0d9759099cef8e2de0845e70451",
"rev": "ba889d5db7c07eaf5cb8f37835d447d935c51b21",
"type": "github"
},
"original": {
@@ -1367,17 +1349,15 @@
"nixvim": {
"inputs": {
"flake-parts": "flake-parts_4",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs": "nixpkgs_11",
"systems": "systems_4"
},
"locked": {
"lastModified": 1784814601,
"narHash": "sha256-T32JXjZ7kIbhBn8/Har171yGg6IBdl97cxAWameqZDE=",
"lastModified": 1785364321,
"narHash": "sha256-BLuHl+nZKb+FDq3GAM6L+UBEiyVepXANA31fT1F56pw=",
"owner": "nix-community",
"repo": "nixvim",
"rev": "f316e949e0ed9df0e1e0bf645c6dce721d4e230e",
"rev": "acd69cc15d57004e8cb4495034320263a3d362ea",
"type": "github"
},
"original": {
@@ -1413,14 +1393,14 @@
},
"omp-nix": {
"inputs": {
"nixpkgs": "nixpkgs_11"
"nixpkgs": "nixpkgs_12"
},
"locked": {
"lastModified": 1784883841,
"narHash": "sha256-BNUmV5FQJKIjEwSK2SnwTGLBo+aadSA4Nouu0OZ6qzs=",
"lastModified": 1785431079,
"narHash": "sha256-qeUK5296t82+fZR9cWWNLK/u1+ZEuBYmhJFWDtWzzc0=",
"ref": "main",
"rev": "772a34e7b07bc2e10f290783a3a6f5f053888d08",
"revCount": 304,
"rev": "fef8579df5738a03eeac3b7ee0ac76a248903d7e",
"revCount": 331,
"type": "git",
"url": "https://git.molez.org/mandlm/omp-nix"
},
@@ -1456,7 +1436,7 @@
"inputs": {
"libcamera-src": "libcamera-src",
"libpisp-src": "libpisp-src",
"nixpkgs": "nixpkgs_12",
"nixpkgs": "nixpkgs_13",
"rpi-bluez-firmware-src": "rpi-bluez-firmware-src",
"rpi-firmware-nonfree-src": "rpi-firmware-nonfree-src",
"rpi-firmware-src": "rpi-firmware-src",
@@ -1616,15 +1596,15 @@
},
"spicetify-nix": {
"inputs": {
"nixpkgs": "nixpkgs_13",
"nixpkgs": "nixpkgs_14",
"systems": "systems_5"
},
"locked": {
"lastModified": 1784481035,
"narHash": "sha256-nC0QN+GPTnA5i+WBx8S2rG8+VFh+EeBnEe5mU3hlAcQ=",
"lastModified": 1785048222,
"narHash": "sha256-LjFVfwxensz76SjnvofF1Jsw+xTLd8Qp31W0J6nh2XI=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
"rev": "a6baa7464f9b21a106dcfabb0bdcfe96fb434409",
"rev": "17e524f330c282d31c32dfe076222d4a12277886",
"type": "github"
},
"original": {
@@ -1829,11 +1809,11 @@
]
},
"locked": {
"lastModified": 1784369104,
"narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=",
"lastModified": 1785360170,
"narHash": "sha256-XE1lKgQ3eIO3E7zWryqcRsax+mYXod/5RHBn4YaR9YE=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "df3c0640565d04a0261253cdd89fce78ec50168a",
"rev": "d1187f8bc71fb8aab02395869ec3f5c1920f75c0",
"type": "github"
},
"original": {
@@ -1956,11 +1936,11 @@
]
},
"locked": {
"lastModified": 1784354557,
"narHash": "sha256-z2XthIV/68GNghbqmaPVrShPIfMPwpZKTA47REKC5bA=",
"lastModified": 1785480078,
"narHash": "sha256-wWRW/Teo+58EMeTpVVEAqYid1qLzpB/PViQJCv7Xxvc=",
"owner": "youwen5",
"repo": "zen-browser-flake",
"rev": "239dc504b56eabcfc1dce945e7e22ca99694be89",
"rev": "b7d4cc2778143a228675cd8bb7efdfa111638ac8",
"type": "github"
},
"original": {
+1 -4
View File
@@ -38,10 +38,7 @@
nixos-wsl.url = "github:nix-community/NixOS-WSL";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
nixvim = {
url = "github:nix-community/nixvim";
inputs.nixpkgs.follows = "nixpkgs";
};
nixvim.url = "github:nix-community/nixvim";
omp-nix.url = "git+https://git.molez.org/mandlm/omp-nix?ref=main";
raspberry-pi-nix.url = "github:cmyk/raspberry-pi-nix";
sops-nix = {