1015 Commits
Author SHA1 Message Date
Hermes Agent ecdc94eec1 feat(android-capture): emulateur AVD en service, installation des APK deposes
L'emulateur etait le maillon manquant : la capture tournait deja en service, mais la cible
avd ne vivait que si une session interactive la lancait.

- android-emulator : AVD headless avec -tcpdump vers pcap/avd/. JAVA_HOME force au JDK 17
  qu'androidenv utilise lui-meme, parce que le runner appelle la version non encapsulee du
  SDK, celle qui reclame JAVA_HOME et sans laquelle l'AVD n'est jamais cree.
- android-avd-install : timer qui installe au boot les APK deposes dans apks/.
- aucune unite bloquante : ni wantedBy sur une oneshot d'installation, ni ExecStartPost qui
  attend le boot Android. Une unite laissee en cours de demarrage bloque toute activation
  nixos-rebuild, qui sort en « unit already loaded ».
- le dossier apks/ est cree par le service, une regle tmpfiles ne suffisait pas.

Verifie sur tower : switch code 0, qemu actif sous le service, emu.pcap ecrit et croissant
sous l'utilisateur de capture, co.hinge.app installe dans l'AVD du service.
2026-11-03 10:32:23 -05:00
Hermes Agent 5d65f0ab81 fix(nix-on-droid): wake-lock detache (jamais attendu) + casseur de verrou fige >15min (fin des blocages silencieux d'up.lock) 2026-11-03 10:08:59 -05:00
Hermes Agent 4b98a6e013 fix(nix-on-droid): fiabilise l'auto-réparation (wake-lock borné, retries sshd, watchdog 2 min, precmd auto-réparation, alias up, phone-update) 2026-11-03 01:21:45 -05:00
Hermes Agent b8b657a366 feat(nix-on-droid): watchdog (rejoue phone-up toutes les 5 min) + allow-external-apps (automatisation boot future) 2026-11-03 01:02:01 -05:00
Hermes Agent 8870cafdf9 feat(android-capture): capture reseau isolee par instance Android ; pcaps qui tournent et digest par cible
Une cible = une instance Android, donc une interface et ses propres fichiers : c'est la
seule isolation franche du trafic par appli, et elle ne demande aucun root.

- waydroid : capture sur le bridge waydroid0.
- avd : alimentee par le -tcpdump de l'emulateur, qui sort par la pile reseau de l'hote.
- rotation de 10 min, 72 fichiers conserves (12 h), digest d'hotes par cible.

Pas de root : CAP_NET_RAW et CAP_NET_ADMIN en capacites ambiantes, donc NoNewPrivileges
reste a false (systemd refuse la combinaison). Utilisateur statique et non DynamicUser,
plusieurs unites partageant le meme arbre d'etat. marc et hermes sont ajoutes au groupe
pour lire les captures sans root.

Verifie sur tower : tcpdump a l'ecoute sur waydroid0, deux jeux de pcaps distincts, digests
ecrits par les timers (avd : connectivitycheck.gstatic.com ; waydroid : play.googleapis.com).
2026-11-03 00:58:45 -05:00
Hermes Agent bdd332897c feat(nix-on-droid): module hermes-access (sshd + tunnel inverse vers rack) ; accès SSH hermes au tel sans port ouvert 2026-11-03 00:54:50 -05:00
Hermes Agent b2878b05dd feat(macos): Firefox quotidien pilotable par Hermes (launchd + MCP connectExisting) 2026-11-02 21:38:13 -05:00
Hermes Agent 7128ce5dec feat(hermes): paquet anthropic dans le venv (provider natif claude)
Les lignes du sélecteur de modèle SANS suffixe [1m] (claude-opus-5-5, claude-opus-5, claude-sonnet-5) passent par le provider natif anthropic, pas par claude-subscription-directsdk. Sans le paquet python anthropic dans le venv scellé, une session ouverte sur une de ces lignes meurt en agent_init_failed : "The 'anthropic' package is required for the Anthropic provider" (lazy installs désactivés par le packaging nix).

Auth du provider natif : aucune clé API à poser, agent/anthropic_credentials.py prend l'OAuth de l'abonnement dans ~/.claude/.credentials.json (refresh et réécriture gérés par Hermes), ou un grant Hermes via hermes auth add anthropic --type oauth.

Les lignes AVEC [1m] (provider claude-subscription-directsdk, CLI claude) ne changent pas. Supprime aussi la ligne commentée devenue doublon : extraDependencyGroups n'est défini qu'une fois.
2026-11-01 13:00:43 -05:00
Hermes Agent 2cab48297f chore(gitea-mcp): PAT réel dans sops (remplace le placeholder)
Token créé dans Gitea (compte mazex, son compte SSO Zitadel). Débloque le serveur MCP gitea (GITEA_ACCESS_TOKEN_FILE) et les opérations git/API sur git.marcpartensky.com, dont le miroir des repos GitHub.
2026-10-24 15:58:14 -04:00
Hermes Agent 59b41c48f0 feat(mcp): serveur MCP "mac" pour piloter le Mac (builds Winnie)
MCP stdio lancé par hermes-agent sur tower ; parle au Mac en ssh (alias
maclan puis mac, clé hermes). Tools : status (winnie-doctor + révisions),
sync, doctor_fix, xcode_fix (3 opérations root via la règle sudo
NOPASSWD xcode-select/xcodebuild/xcrun), runtime_install et les builds
(arrière-plan, suivi par log_tail) : ios_init, ios_build_sim,
macos_build.

Vérifié : pycodestyle/pyflakes, build de la dérivation, sonde stdio
(tools/list + appels réels sur le Mac), éval du toplevel avant commit.
2026-10-24 15:54:34 -04:00
Hermes Agent eb71f8ae64 fix(gitea): OIDC Zitadel réellement fonctionnel (source OAuth2, app Web)
L'ancien câblage ne pouvait pas marcher : client_id littéral "gitea"
(impossible, Zitadel génère les client_id) et oneshot qui échouait à chaque
boot sur --enabled (flag inexistant en Gitea 1.27.x), avalé par `|| true`.

- App Zitadel "Gitea" (projet marcpartensky) : appId 396570385799184684,
  clientId 396570385799250220, type Web, redirect
  https://git.marcpartensky.com/user/oauth2/zitadel/callback
- oneshot gitea-oidc-init : add-or-update (id de login_source via psql),
  secret lu depuis sops à chaque exécution, idempotent même en dérive
- [openid] d'app.ini : OpenID 2.0 legacy, désactivé (sans rapport avec OIDC,
  échouait en "rel=openid2.provider not found" avec une URL Zitadel)
- [oauth2_client] : ENABLE_AUTO_REGISTRATION, USERNAME=email,
  ACCOUNT_LINKING=login (page de liaison unique pour le compte local marc)
- ressource Pangolin : auth.sso-enabled=false (auth Gitea seule, une seule
  couche, clients git/API à token non bloqués par un redirect SSO)
- secrets/gitea-oidc.yml : vrai oidc_client_secret (chiffré, clé tower)
2026-10-24 15:44:57 -04:00
Hermes Agent dd7ed87ac2 feat(macos): sudo NOPASSWD Xcode pour l'agent
hermes@tower, connecté en ssh sur marc@mac, doit lancer les rares
opérations root du toolchain Xcode sans mot de passe : bascule de
xcode-select, acceptation de la licence, runtime du simulateur.

Fragment sudoers.d dédié (security.sudo.extraConfig est déjà posé par le
bloc terminfo de nix-darwin), scopé aux trois shims
/usr/bin/{xcode-select,xcodebuild,xcrun} ; le reste du sudo de marc reste
inchangé. Vérifié : visudo parsed OK, éval du fragment et du toplevel.
2026-10-24 15:24:06 -04:00
Hermes Agent 037c49265e fix(winnie): reinit. unique du layout Garage et ingest en Type=exec
Le premier bootstrap avait laisse un layout Garage a zero noeud (quorum de 0, inapplicable) : purge unique de meta/data avant le demarrage du service, winnie-bucket reprovisionne bucket, cle et s3.env. L'ingest passe de Type=oneshot a Type=exec pour que RuntimeMaxSec s'applique, et S3_ENV_FILE force le redemarrage du backend quand Garage est provisionne apres son premier demarrage.
2026-10-24 15:08:22 -04:00
Hermes Agent ffee0792c1 fix(vaultwarden): initialiser le mot de passe apres postgresql
postgresql.service est Type=notify : sans after et requires, le oneshot qui pose le mot de passe de la base partait en parallele et mourait sur « connection to server on socket /run/postgresql/.s.PGSQL.5432 failed » (boots du 22/10 20:29 et du 23/10 09:37).
2026-10-24 15:08:22 -04:00
Hermes Agent 68a5c3fb55 fix(hermes): refus explicite de la telemetrie shared_metrics
enabled=false, send=false et offer_version=2 ecrits dans config.yaml : la question de partage des stats ne revient plus a chaque session (le defaut ne compte pas comme reponse) et rien n'est collecte.
2026-10-24 15:08:22 -04:00
Hermes Agent bcb7eb43d5 feat(hermes-guests): agents anna et yves pour l'appli mobile
Deux agents separes au niveau OS (utilisateurs anna et yves, HERMES_HOME dedie, tmpfiles + ExecStartPre qui recree le squelette du home en mode managed), outils dangereux desactives et /api/pty comme /api/files bloques par nginx. Exposes en hermes-anna et hermes-yves.marcpartensky.com ; identifiants hors store nix sous /var/lib/hermes/guests.
2026-10-24 15:08:22 -04:00
Hermes Agent f875aaf9de feat(hermes-mobile): backend de l'appli mobile sur le profil default
services/hermes-pocket devient services/hermes-mobile : le backend de l'appli F-Droid sert le profil default (meme historique, memoire, skills et modele que le gateway Matrix et le dashboard) au lieu du profil isole pocket, en gardant la porte d'auth native (mobile-serve.env). Le nom de ressource Pangolin reste hermes-pocket : le renommer recreerait une ressource sur un domaine deja pris.
2026-10-24 15:08:11 -04:00
Hermes Agent 6ee385ce93 feat(mac): tunnel SSH inverse autoreparant et cle du Mac acceptee
ExitOnForwardFailure=yes sur l'autossh du Mac : un forward rate (port deja pris, sshd pas encore pret au boot) ne laisse plus une session inutile, launchd reessaie. La cle du Mac (marc@Air-de-Marc) est autorisee sur tower et sur le deck : ssh tower et ssh deck passent par rack en ProxyJump.
2026-10-24 15:08:11 -04:00
Hermes Agent b9b165b2c3 fix(deck): lancement de MK8DX robuste (base / update / DLC)
mk8dx selectionne le dump de base (Title ID 0100152000022000, sinon un fichier hors update/DLC, sinon le premier .nsp/.xci) au lieu du MK8DX.xci code en dur : Eden applique seul l'update pose a cote du jeu, mais lancer le NSP d'update comme s'il etait le jeu echoue. La tuile Gaming Mode passe par ce script.
2026-10-24 15:08:11 -04:00
Hermes Agent 030332d4a3 feat(tower): route le LAN dans wg1 (routeur + NAT)
tower fait routeur pour son LAN : ip_forward et NAT wg1 -> wlan0 (sortie avec l'IP LAN 192.168.1.44), et le pair tower cote VPS declare desormais 192.168.1.0/24 dans ses allowedIPs. Le Steam Deck et le reste du LAN deviennent joignables depuis rack sans dependre d'un forward de la box.
2026-10-24 15:08:11 -04:00
Hermes Agent 69dd5cae6c feat(pangolin): garde runtime de wg0 (adresse + exception pare-feu)
Timer de 5 minutes qui remet 100.89.128.1/24 et la route du 100.89.128.0/24 sur wg0, et reinsere l'exception iptables INPUT pour 100.89.128.0/24 : tailscaled jette cette source recue sur une interface autre que tailscale0, ce qui avait coupe le tunnel Pangolin 6h40 le 23/10. Complement de gerbil-wg0-ensure.nix, qui ne couvre que le demarrage de gerbil.
2026-10-24 15:08:03 -04:00
Hermes Agent 932e3bc83d feat(mesh): headscale durci (DERP embarque) et noeuds tailscale
Le controleur headscale du VPS passe en mode durci : flotte DERP de Tailscale retiree (derp.urls vide), DERP embarque sur le VPS (region 900, verify_clients) et STUN en UDP 3478 ; route Traefik headscale.marcpartensky.com -> 127.0.0.1:8090. Cote clients, services/tailscale remplace l'ancien secret tailscale/auth_key (absent) par headscale/preauth_key, coupe l'envoi de logs vers Tailscale Inc (disableUpstreamLogging) et est importe sur tower, le deck et anywhere.
2026-10-24 15:08:03 -04:00
Hermes Agent 10058770c4 feat(secrets): cles Switch (deck) et cle de pre-auth du mesh headscale
secrets/switch-keys.yml (prod.keys d'Eden sur le deck, posees dans le home de marc) et secrets/headscale.yml (preauth_key reutilisable, consommee par services/tailscale sur tower, le deck et le VPS). Regles de creation sops associees dans .sops.yaml.
2026-10-24 15:07:55 -04:00
Hermes Agent a9cd5f6045 chore(deps): bump hermes-agent et uv2nix
hermes-agent 04ea129b -> cb757fac ; uv2nix 5a836d39 -> 7aba73a3 (backend uv du build Python).
2026-10-24 15:07:55 -04:00
Hermes Agent feab54082e feat(ssh): alias mac et maclan pour joindre le Mac depuis tower
Le Mac expose deja son sshd (services.openssh dans profiles/macos) et son
tunnel inverse autossh (rack:2223), il manquait les alias cote marc.

- maclan = marc@192.168.1.48 (LAN, IP DHCP)
- mac = marc@localhost:2223 via rack (tunnel inverse, hors LAN)

Verifie en construisant le fichier genere (hm_.sshconfig) : les deux entrees
sortent avec le bon HostName/Port/ProxyJump.
2026-10-24 15:00:10 -04:00
Hermes Agent 7498ea4971 feat(macos): setup nix-darwin pour builder l'app Winnie
L'app se build sur le Mac en trois commandes, le toolchain restant dans le
devShell du flake winnie (jamais installé sur le Mac) :
  cd ~/git/nixos && just mac   # déploie ce setup
  winnie-sync                  # attrape ~/git/winnie depuis tower (rsync ssh)
  winnie-ios                   # simulateur ; npm ci + tauri ios init au besoin

- modules/home-mac/winnie : winnie-doctor [--fix], winnie-sync [--delete],
  winnie-shell, winnie-front, winnie-macos, winnie-build-macos, winnie-ios,
  winnie-build-ios, winnie-verify. Scripts en writeShellApplication (shellcheck
  au build) ; scripts.nix est séparé du module pour être constructible depuis
  tower avec les pkgs linux et testable sans Mac.
- profiles/macos : flakes + trusted-users dans nix.conf, et
  system.activationScripts.winnie-xcode (xcode-select -s, licence Xcode,
  -runFirstLaunch) pour que seule l'installation App Store reste manuelle.
- Embarque aussi le setup SSH entrant du Mac (sshd, clé hermes@tower, tunnel
  inverse autossh) qui était déjà dans l'arbre de travail.

Vérifié depuis tower : nix eval du darwinConfigurations.macos (toplevel et
home-manager-generation) + build des scripts en x86_64-linux (shellcheck) et
rsync de bout en bout depuis le dépôt de tower.
2026-10-24 14:33:35 -04:00
Hermes Agent 1435174674 feat(ygg-mesh): client macOS (nix-darwin)
Paquets yggdrasil + tor et deux launchd.daemons (tor SOCKS 127.0.0.1:9050,
yggdrasil sur /etc/yggdrasil.conf) pour faire entrer le Mac dans le mesh.
/etc/yggdrasil.conf (mot de passe partagé) reste hors du store, à créer
une fois à la main ; le torrc ne contient aucun secret.
2026-10-23 10:31:36 -04:00
Hermes Agent ab03b394a0 feat(ygg-mesh): réseau privé Yggdrasil entre tower, deck et anywhere
Module services/ygg-mesh : Yggdrasil en réseau privé (mot de passe partagé,
clés publiques épinglées), liens Tor via une instance tor dédiée (onion
service par machine) et lien direct multicast prioritaire sur le LAN.
Chaque machine garde une adresse IPv6 stable et un nom <host>.ygg.

Secret dans secrets/ygg-mesh.yml (règle .sops.yaml dédiée) ; config rendue
à chaud au démarrage (ExecStartPre + credential systemd), le mot de passe
ne touche jamais le store. Identités et clés dans la table `nodes`.
2026-10-23 10:31:36 -04:00
Hermes Agent 2f51bb8d49 chore(newt): 1.17.0 (unstable) pour le P2P 2026-10-23 10:24:12 -04:00
Hermes Agent dcc8ce342c feat(macos): client Pangolin (derivation dmg + activation) 2026-10-23 10:24:12 -04:00
Hermes Agent 1ca4f0b070 feat(nextcloud): domaine trusted cloud.p2p.marcpartensky.com 2026-10-23 10:24:12 -04:00
Hermes Agent c0002126b6 chore(sops): rotation du mdp postgres et cle API pangolin 2026-10-23 10:24:12 -04:00
Hermes Agent d73b7c5d7d feat(pangolin): API d'integration pilotable par MCP
enable_integration_api + route traefik int-api (127.0.0.1:3003).
MCP hermes: cle sops pangolin_api_key, binaire nix, outils
private-resource completes (domainId/subdomain/scheme).
Stub de licence patche localement (AdvancedPrivateResources).
2026-10-23 10:24:12 -04:00
Hermes Agent ce068684ef feat(deck): calendrier sg sur le mineur Monero 2026-10-19 02:40:58 -04:00
Hermes Agent c005dc21db chore(sops): cle age du deck dans les destinataires common 2026-10-19 02:40:07 -04:00
Hermes Agent 1bf853a56a fix(deck): secret monero dedie et planning sans CalDAV 2026-10-19 02:38:26 -04:00
Hermes Agent 58ace4257f feat(starship): affiche la branche et l'etat git dans le prompt
Le format n'incluait aucun module git et starship s'initialise apres
p10k : impossible de voir sur quelle branche on est.
2026-10-19 02:07:33 -04:00
Hermes Agent 08547e5cf8 fix(home): force .gtkrc-2.0 pour que l'activation passe
gtk.enable genere le fichier, mais l'ancien ~/.gtkrc-2.0 n'est pas un
lien vers le store : checkLinkTargets echouait sans force = true.
2026-10-19 02:07:33 -04:00
Hermes Agent 542969c86c fix(nvim): fond reellement transparent (onedark + lualine)
onedark.transparent couvre tous les groupes du theme, pas seulement
Normal ; les highlights Lualine sont nettoyes apres ColorScheme et
les ~ de fin de buffer deviennent des espaces.
2026-10-19 02:07:33 -04:00
Hermes Agent 7615d98b36 feat(stalwart-mcp): serveur MCP JMAP pour tower
stalwart-mcp (Rust) parle JMAP au Stalwart du VPS, patche pour l'URL
API et l'envoi depuis l'identite marc. Mot de passe dedie dans
secrets/stalwart-mcp.yml ; importe par tower seulement, pour eviter
le conflit de cle sops avec services/stalwart sur anywhere.
2026-10-19 02:07:33 -04:00
Hermes Agent 4f5acfaf61 feat(monero): minage planifie selon le calendrier Nextcloud
Le mineur ne tourne que 01:00-09:00, plus en semaine 09:00-18:00
quand un evenement du calendrier sg est actif. Le wallet vient de
secrets/monero.yml via LoadCredential (plus dans la ligne de
commande) ; meme planning sur le Deck.
2026-10-19 02:07:32 -04:00
Hermes Agent de94c3e4bf feat(wireguard): tower rejoint le wg1 du VPS en pair 10.100.0.3
Le forward de box 77.207.176.170:42070 est mort : tower devient pair
client du hub wg1 avec persistentKeepalive. L'alias ssh tower pointe
sur 10.100.0.3 et la cle root du VPS est autorisee sur tower. Cle
privee dans secrets/wireguard.yml (recipient tower).
2026-10-19 02:07:32 -04:00
Hermes Agent 8e604e3f8f fix(stalwart): cles de secrets explicites, allowed-ip, meetup
Renomme stalwart_mail_pw2/pw3, spam_pw, noreply_pw, admin_pw, bob_pw
et acme_secret en stalwart_*_password / stalwart_acme_secret, un
fichier sops par usage.
66.108.44.154 passe en allowed-ip : l'auto-ban persiste en base et
bloquait le domicile sur 25/465/993.
meetup@marcpartensky.com partage la boite de marc.

Les blobs common.yml et anywhere.yml sont re-chiffres dans le meme
commit (renommage des cles Stalwart, rotation, postgres_crt/key).
2026-10-19 02:07:32 -04:00
Hermes Agent 7655391102 feat(zitadel): secret SMTP + PAT admin lisible par hermes
secrets/zitadel-smtp.yml porte le mot de passe du compte d'envoi pour
le provisioning SMTP par API (v2 ignore la config runtime). Le PAT
admin est materialise en 0400 pour hermes et rotate.
2026-10-19 02:07:32 -04:00
Hermes Agent f859ddb8e5 fix(hermes-pocket): active la porte d'auth du serve headless
dashboard.public_url engage auth_required : la racine ne sert plus le
token de session en clair derriere Pangolin. Le flux client passe par
/auth/password-login puis un ws-ticket a usage unique. nginx annonce
https et la sonde devient /api/status.
2026-10-19 02:07:20 -04:00
Hermes Agent 25a4da39af fix(hermes-webui): OIDC Zitadel a la place du SSO Pangolin
App Zitadel publique en PKCE (client_id 395733475048620332), claim
preferred_username limite a marc@marcpartensky.com, redirect explicite
car nginx reecrit le Host. SSO Pangolin coupe pour eviter le double
login.
2026-10-19 02:07:20 -04:00
Hermes Agent 0d03aa3a83 feat(hermes): DeepSeek v4.1 Flash par defaut, MCP beeper declare
DeepSeek v4.1 Flash devient le modele par defaut ; chaine de secours
DeepSeek puis Nemotron 3 Ultra gratuit ; le salon de Zoe (Matrix) y
passe aussi.
Beeper est declare dans les mcpServers avec le token lu depuis
l'environnement (plus de token en dur dans config.yaml) et l'URL LAN
pour etre cliquable depuis Hermes Desktop. Le timeout du MCP gitea
est complete.
2026-10-19 02:07:19 -04:00
Hermes Agent dbf57bcb74 feat(mcp): Anki headless + acces LAN filtre aux MCP
anki-mcp : Anki sans bureau et addon AnkiMCP, HTTP MCP sur 3141,
connecte a la collection du serveur de sync.
mcp-lan-access republie sur l'adresse LAN de tower les endpoints
loopback (3141, 8710, 6060, 23373), firewall limite au Mac ; l'addon
Anki autorise ce Host (anti DNS-rebinding).
arr-mcp ne publie plus 6060 sur 0.0.0.0. Le module mcp-lan-access
est importe par services/default.nix avec anki-mcp, wise-mcp et
bank-mcp.
2026-10-19 02:07:19 -04:00
Hermes Agent c427110b4b feat(mcp): serveurs MCP Wise et Bank
wise-mcp passe par le CLI officiel, token dans secrets/wise.yml.
bank-mcp lit une config locale 0600 (pas de secret nix).
2026-10-19 02:07:19 -04:00
Hermes Agent 52ff370ea0 chore(sops): creation_rules des nouveaux secrets
Regles pour secrets/monero.yml (tower + deck), stalwart-mcp.yml,
wireguard.yml, zitadel-smtp.yml et wise.yml (recipient tower).
2026-10-19 02:07:19 -04:00
Hermes Agent 161cd8e4d9 feat(hermes-skins): pack Hermes Menagerie pour le Mac
Input brut hermes-menagerie (github:ZakiChair/hermes-catppuccin),
module home-mac/hermes-skins qui installe les palettes dans
~/.hermes/skins, active dans la home de marc@macos.
2026-10-19 02:07:18 -04:00
Hermes Agent 9abcab4e00 perf(deck): 6 threads XMRig et reprise thermique a 84 C 2026-10-19 01:40:11 -04:00
Hermes Agent ecb630ef06 fix(deck): conduit ecoute sur IPv4 loopback 2026-10-19 01:33:48 -04:00
Hermes Agent 76ac59eed0 fix(monero): pool Stratum MoneroOcean et seuil thermique du Deck 2026-10-19 01:31:22 -04:00
Hermes Agent 093cc8dd55 feat(deck): mineur Monero XMRig avec garde thermique 2026-10-19 01:24:50 -04:00
Hermes Agent e1a46621ea Merge remote-tracking branch 'origin/master' 2026-10-18 15:00:19 -04:00
Hermes Agent 0ef3a16fd9 fix(anywhere): upstream les correctifs faits en local sur le VPS
- gerbil-wg0-ensure.nix : supprime wg0 sans adresse avant le demarrage de gerbil, sinon plus aucun trafic ne passe dans le tunnel newt.
- vaultwarden-mcp commente : son secret vit dans secrets/tower.yml, illisible sur anywhere, ce qui cassait setupSecrets a chaque activation.
- zitadel/steps retire : le secret etait chiffre en type:int, refuse par sops-install-secrets ; l'instance est deja initialisee.
2026-10-18 15:00:14 -04:00
Hermes Agent aadebcc0fd feat(winnie): OIDC Zitadel en PKCE via un secret sops oidc_env
- secret oidc_env (secrets/winnie.yml, chiffre pour tower) materialise par le oneshot winnie-oidc-secret dans /var/lib/winnie/oidc.env, requis par winnie-backend (EnvironmentFile non optionnel)
- PKCE : pas de client_secret cote backend
- .sops.yaml : creation_rule pour secrets/winnie.yml
2026-10-17 16:56:17 -04:00
Hermes Agent 5cab1712a7 feat(newt): expose sonarr.marcpartensky.com derriere le SSO Pangolin
Ressource proxy-resources.sonarr -> 127.0.0.1:8006, healthcheck /ping, meme schema que radarr (proxy-resources + protocol, l'ancien schema que comprend le Pangolin du VPS). SSO actif et auth de l'appli coupee : sans SSO l'UI complete et l'API v3 seraient ouvertes a Internet.
2026-10-17 16:56:17 -04:00
Hermes Agent a41dd0b5ff fix(arr): supprime urlbase et coupe l'auth interne derriere le SSO Pangolin
- urlbase = "localhost" (recopie de l'exemple du module nixpkgs) faisait rediriger en 307 TOUT chemin hors base, /api/v3/... compris : les clients API locaux recevaient la page de login. Radarr, Sonarr et Readarr sont servis a la racine du domaine
- settings.auth.method = "External" : l'auth de l'appli ne filtre rien derriere le tunnel newt (les requetes distantes arrivent de 127.0.0.1, donc vues comme locales) et la porte reste le SSO Pangolin. Ni Radarr 6.x ni Sonarr 4.x n'ont d'OIDC natif (arrive dans Sonarr 5)
2026-10-17 16:56:17 -04:00
Hermes Agent 78e340cb91 fix(anywhere): saturation du disque du 12/10 (GC 14j + journald 500M)
Le 12/10/2026 le disque de 46 G est monte a 100 % : pangolin-pre-start a echoue en « No space left on device » et traefik/gerbil sont tombes en cascade (plus rien sur 80/443). --delete-older-than 30d laissait ~18 G de generations et journald montait a 4,1 G (10 % par defaut). 14 j et SystemMaxUse=500M laissent de la marge.
2026-10-17 16:56:17 -04:00
Hermes Agent 96d2e8f05a feat(anywhere): coupe le gateway hermes et cable home-manager marc
- services.hermes.enableAgent = false : le chat est inerte sur le VPS (aucun token Matrix/Discord, modele DirectSDK sans login claude) et tirait claude-code (unfree) dans le build. L'utilisateur hermes, sa cle SSH et le sudo nixos-rebuild restent : c'est par la que tower deploie en remote
- home-manager.users.marc : le profil marc (geminicommit, etc.) est installe sur le VPS
2026-10-17 16:56:17 -04:00
Hermes Agent 2363d673c0 chore(hermes): approbations de commandes en mode off (plus de validation humaine)
Politique du 13/10/2026 : le shell n'attend plus de validation avant d'executer. « off » est un bypass teste AVANT les branches cron / single_query / unattended, donc il coupe aussi les refus par defaut en contexte headless. Restent actifs malgre off : la blocklist hardline code-shippee et les regles approvals.deny (vides ici).
2026-10-17 16:56:15 -04:00
Hermes Agent a43e96d9b5 feat(hermes): option services.hermes.enableAgent (couper le gateway par hote)
Le module melangeait l'acces (utilisateur hermes, cle SSH, sudo nixos-rebuild, python3 systeme pour le probe SSH de Desktop, git safe.directory) et le gateway lui-meme : couper le chat sur un hote ou il est inerte retirait aussi le moyen de s'y connecter et d'y deployer. config passe en lib.mkMerge : le bloc acces s'applique toujours, le gateway (postgres, MCP, claude-code unfree, service hermes-agent) seulement si enableAgent.
2026-10-17 16:56:15 -04:00
Hermes Agent 2ece11d430 feat(llm-steamdeck): serveur llama.cpp Vulkan OpenAI-compatible (Steam Deck)
Module services.llm-steamdeck, desactive par defaut (enable a passer a true dans le profil deck, cf. README) : llama-server en Vulkan sur RADV, GGUF telecharge depuis Hugging Face au premier demarrage, web UI, limites memoire pour les 16 Go unifies. Importe par services/default.nix (donc inerte sur laptop/tower) et par profiles/deck.
2026-10-17 16:56:13 -04:00
Hermes Agent fac87cc291 feat(waydroid): conteneur cage-waydroid + client noVNC Android
- services/cage-waydroid : waydroid dans un cage HEADLESS, expose en VNC standard (wayvnc 5902, auth DES = le seul mode que macOS Screen Sharing negocie), plus un pont noVNC sur 127.0.0.1:6082
- root volontaire : waydroid-net.sh cree le bridge waydroid0 (CAP_NET_ADMIN) et la session waydroid est un SINGLETON global, c'est ce service qui la detient
- tower : virtualisation.waydroid.package = waydroid-nftables, le noyau n'a que nf_tables (le waydroid-net.sh standard sort en « iptables (legacy): can't initialize iptables table nat »)
- newt : ressource android.marcpartensky.com -> 127.0.0.1:6082 derriere le SSO Pangolin
2026-10-17 16:56:12 -04:00
Hermes Agent 8294a123a6 feat(kasmvnc): Chrome CDP visible pour Playwright MCP
- modules/nixos/kasmvnc-chrome-cdp.nix : lance un Chromium dans le desktop KasmVNC avec --remote-debugging-port=9222, profil persistant /home/marc/chrome-cdp-profile
- Le MCP Playwright s'y attache (--cdp-endpoint http://127.0.0.1:9222) : les actions d'automatisation se font dans CETTE fenetre, donc visibles en direct sur le bureau distant (8443 en LAN, kasm.marcpartensky.com)
- CDP reste sur 127.0.0.1 : un port CDP joignable donne le controle total du navigateur par quiconque l'atteint, donc jamais au LAN ni via Pangolin
- newt : healthcheck HTTP sur le vhost local 8288 (KasmVNC repond 200 sur "/" avec disableBasicAuth) ; sans lui la cible sortait du load-balancer
2026-10-17 16:56:10 -04:00
mazex 3e81a2b3b2 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-10-11 21:48:13 -04:00
mazex 038fa010bb feat(deck): add systemd timer for nightly Steam downloads
Wakes the system daily at 01:55 to inhibit sleep for 5h35m,
allowing Steam downloads to complete while the system is asleep.
2026-10-11 21:47:55 -04:00
Hermes Agent 50df23c53c fix(kasmvnc): ExecStartPre purge les instances Xvnc orphelines + ConditionUser=marc
- ExecStartPre tue toute Xvnc sur le display configure puis purge lock et socket avant de demarrer (une session precedente orpheline tenait :20 apres un switch : « A VNC server is already running », exit 29, crash-loop). Le display est passe en ARGUMENT dans la meme commande : en liste, systemd executerait chaque element comme une commande separee.
- ConditionUser=marc : l'unite est installee dans /etc/systemd/user et hermes demarre aussi un user manager linger avec default.target actif ; sans ca il lançait une deuxieme instance sur :20 et son activation utilisateur echouait au switch (rc=4).
2026-10-11 20:07:45 -04:00
Hermes Agent f3e600a471 chore(home): retire warnings d'éval (gtk4, catppuccin, zsh.dotDir, pkgs.system, proton-vpn)
gtk.gtk4.theme = config.gtk.theme;            # GTK4 suit Catppuccin
catppuccin.autoEnable = true;                 # valeur explicite = enable
programs.zsh.dotDir = config.home.homeDirectory; # .zshrc dans ~
pkgs.system -> pkgs.stdenv.hostPlatform.system  # backtest, portfolio-optimizer, option-pricer
protonvpn-gui -> proton-vpn                    # renommé dans nixpkgs
2026-10-11 19:40:55 -04:00
Hermes Agent ce2b91fae4 fix(services): anki healthcheck explicite /health (la cible sortait du load-balancer) 2026-10-11 19:38:42 -04:00
Hermes Agent 35d79ccde9 fix(users): anki + addon MCP via le flake ankimcp/anki-mcp-server-addon
ankiAddons.anki-mcp-server n'existe pas dans nixpkgs, et l'appel à
withAddons sans parenthèses insérait une fonction dans home.packages.
2026-10-11 19:36:40 -04:00
Hermes Agent ca72d76cbd feat(winnie,newt): front Svelte 5 sur 8888 + ressource dioxus-frontend
- winnie-frontend : build Vite (app/dist) servi par static-web-server sur 8888, aligne avec la ressource Pangolin winnie-frontend (un desaccord = 502, port en cache cote newt)
- newt : nouvelle ressource dioxus-frontend (dioxus.marcpartensky.com)
2026-10-11 19:33:30 -04:00
Hermes Agent 0fac189847 fix(hermes,openrouter-mcp): default_model nemotron meme famille partout
La chaine de secours hermes passait de inkling:free a nemotron (meme modele, pas de basculement vers un modele different). openrouter-mcp ecrit aussi le default_model nemotron dans sa config.toml.
2026-10-11 19:33:23 -04:00
Hermes Agent a4cc76163b feat(hinge-auto): auto-like Hinge web (Playwright + Chromium, profil persistant)
Trois binaires dans le profil systeme, patron de services/amazon-mcp :
- hinge-auto-login    chromium visible (telephone + SMS), session persistee dans /var/lib/hermes/hinge-auto/user-data
- hinge-auto-like     boucle de likes headless sur Discover (HINGE_MAX_LIKES defaut 40, detection de fin de flux)
- hinge-auto-calibrate dump des boutons pour affiner les selecteurs

Profil partage hermes <-> marc via ACL tmpfiles. Garde-fous : limite ~8 likes/jour gratuite Hinge, arret sur marqueur de fin.
2026-10-11 19:33:17 -04:00
Hermes Agent 0973d87f41 feat(gotify): OIDC Zitadel + exposition loopback via newt sans SSO Pangolin
- Variables sans underscore (GOTIFY_OIDC_CLIENTID, ...) : les formes snake_case sont ignorees en silence par Gotify 3.x
- LISTENADDR 127.0.0.1 (exposition via newt/Pangolin uniquement), SSO Pangolin desactive : les clients natifs (appli Android, gotify-cli, scripts /message) ne suivent pas de redirection navigateur
- OIDC_LINK_BY_USERNAME + AUTOREGISTER : rattache l'identite Zitadel au compte local renomme
- after/wants newt + StartLimitIntervalSec=0 : le discovery OIDC 503 au boot si le tunnel n'est pas monte
2026-10-11 19:33:07 -04:00
Hermes Agent 841013bbd4 feat(tower): waydroid Android LineageOS en conteneur (test)
Noyau 6.18.54 avec ANDROID_BINDER_IPC/BINDERFS/MEMFD_CREATE : pas de module out-of-tree ni reboot. waydroid-container echoue proprement tant que 'waydroid init' n'a pas ete lance une fois (root, ~1,2 Go d'images).
2026-10-11 19:32:49 -04:00
Hermes Agent d8a993274f feat(kasmvnc): bureau distant Plasma 6 en X11 (startplasma-x11 + look-and-feel, disableBasicAuth)
KasmVNC etant un serveur X, Plasma tourne en session X11 (startplasma-x11) avec une arborescence de donnees isolee (plasmaDataEnv + plasmaConfigDir) exportee uniquement dans l'unite, sans toucher a la session niri locale de marc.

- desktop = "plasma" : xstartup startplasma-x11, look-and-feel org.hermes.kasm.desktop (konsole + LibreWolf epingues)
- disableBasicAuth : le SSO Pangolin gate deja kasm.marcpartensky.com, fin du double login kasmvncpasswd
- setxkbmap ajoute au PATH (kded6 configure les claviers via ce binaire)
2026-10-11 19:32:46 -04:00
Hermes Agent 9ec071dd67 fix(services): anki page de statut + proxy nginx (interface navigateur sur le domaine) 2026-10-09 17:59:00 -04:00
Hermes Agent 917ebe40d3 feat(services): serveur de sync Anki auto-hébergé (anki.marcpartensky.com) 2026-10-09 17:38:38 -04:00
Hermes Agent 727dd5ad31 chore(zitadel-mcp): versionner package-lock.json (cp dans le build npm) 2026-10-06 23:04:32 -04:00
Hermes Agent a4fc37ee93 fix(tower): wg-quick conditionnel (mkIf false) + overlay ankimcp + port 8080 + hermes journal-access 2026-10-06 21:42:36 -04:00
Hermes Agent 2c660d8b5d feat(zitadel-mcp): upstream npm zitadel-mcp-server 34 tools ; nginx-matrix + matrix-conduit modules 2026-10-06 21:42:11 -04:00
Hermes Agent 1ecafcba6a feat(users): anki + ssh deck/tower-rack alias ; secrets tower rotation 2026-10-06 21:42:11 -04:00
Hermes Agent cd78889870 feat(hermes): claude-code 2.1.223 -> manifest 2.1.280, model mappings (opus-5-5 / deepseek-v4.1-flash) + bridge url 2026-10-06 21:42:11 -04:00
Hermes Agent 667a76799b feat(services): healthchecks + noms de ressources alignes (audiobookshelf, gotify, jellyfin, radarr, gitea, hermes-*) 2026-10-06 21:42:04 -04:00
Hermes Agent 8fa2497391 chore(services): import defaults (matrix-marc-agent, winnie, openrouter, reactive-resume ; desactivation temp discord-hermes-bridge + zitadel-mcp) 2026-10-06 21:42:04 -04:00
Hermes Agent 3fb37e9ca5 feat(winnie+openrouter+reactive-resume): nouveaux services et flake inputs (ankimcp, reactive-resume, openrouter-mcp) 2026-10-06 21:41:54 -04:00
Hermes Agent 10ceeb3310 feat(deck): conduit + nginx-matrix (conduit remplace synapse) 2026-10-06 21:41:54 -04:00
Hermes Agent 2edce1cd20 feat(tower): remote-desktop (rustguac, kasmvnc, rustdesk) + acl 777 access journal
Rustguac : guacd en loopback (tls=false) + vhost guac.marcpartensky.com
(sans ACME, TLS par Pangolin). KasmVNC : display :20 (pas :1, session X
existe deja), desktop lxqt (lxqt-wayland refuse), mot de passe regeneré
par empreinte sops, auth HTTP 200/401 testee. Rustdesk : ports reels 1.1.16,
hbbs/hbbr corriges; nginx guac/kasm en loopback. Vault/rustguac secrets
lues par le bon user (vault, rustguac, marc) au lieu de root. WireGuard
client sur wg1 (10.100.0.3/32, endpoint VPS 104.129.12.158:443) desactive
tant que le secret sops wireguard/tower_private_key n'existe pas (evite
le blocage sops-nix sur tout le build). hermes.extraGroups += systemd-journal.
2026-10-06 21:41:47 -04:00
Hermes Agent 1ea50aa6ab feat(matrix): appservice marc-agent pour un token E2EE sur @marc
Stub HTTP + registration synapse + login unique. Registration sous
/var/lib/matrix-marc-agent-as (StateDirectory) : sous /var/lib/hermes/.matrix
(0700) synapse ne pouvait pas la lire, et ReadWritePaths sur un dossier absent
faisait echouer l'unite en 226/NAMESPACE, ce qui bloquait le switch.
2026-10-06 21:39:48 -04:00
Hermes Agent 3d2c987b96 fix(secrets): régénérer discord-hermes-bridge.yml (fichier illisible, MAC cassé)
sops-install-secrets échouait sur ce fichier ('Could not decrypt with
AES_GCM: cipher: message authentication failed'), ce qui bloquait TOUT
nixos-rebuild switch sur tower (pas seulement les services concernés).
Recréé avec une nouvelle valeur aléatoire pour les deux clés partagées
(hermes_discord_bridge_env, discord_bot_hermes_bridge_env) : secret
purement interne (loopback 127.0.0.1, jamais exposé), la rotation ne
casse rien côté consommateurs (discord-bot, hermes-discord-bridge, API
server par défaut) puisqu'ils relisent tous la même valeur au prochain
switch.
2026-09-29 19:49:09 -04:00
Hermes Agent 9180562410 fix(nextcloud): retirer password.txt (mdp en clair, repo public) + rotation forcée
services/nextcloud/password.txt était committé en clair ("nextcloudpassword")
depuis le 25/11/2025, jamais référencé dans la config, exposé publiquement
sur github/codeberg depuis. Supprimé.

adminpassFile ne fixe le mot de passe QUE lors de l'install initiale (occ
maintenance:install) : sur une instance déjà installée il est ignoré, donc
juste changer le secret sops n'aurait pas suffi. Ajout d'un ExecStartPost
sur nextcloud-setup qui force le mot de passe du compte root à la valeur
sops à chaque activation (self-healing).

Vérifié sur tower : ancien mot de passe "nextcloudpassword" -> 401 après
le switch, hash oc_users.password changé.
2026-09-29 19:49:09 -04:00
Hermes Agent 605c355d3a wip(remote-desktop): scaffold gateway rustguac + kasmvnc + rustdesk + vault (dev)
Modules NixOS pour une gateway d'accès distant multi-protocole : rustguac
(remplacement Guacamole, OIDC, audit, enregistrement), kasmvnc (bureau
Wayland LXQt), rustdesk (relais P2P hbbs/hbbr), vault-rustguac (Vault en
mode dev pour stocker les identifiants de connexion des deux premiers),
plus les vhosts nginx associés.

Importés dans services/default.nix mais NON activés sur aucun profil
(enable reste false partout) : domaines (guac.example.com, auth.example.com),
token Vault dev et secret OIDC sont encore des placeholders TODO dans les
modules, à finir avant tout services.*.enable = true.
2026-09-27 23:59:36 -04:00
Hermes Agent 79032ac0ab docs(readme): traduire le README en anglais 2026-09-27 23:59:36 -04:00
Hermes Agent bfd1a3c865 fix(hermes): pointer hermes_api_server_env sur la clé réelle du secret (hermes_discord_bridge_env)
Le fichier secrets/discord-hermes-bridge.yml n'a pas (encore) été rekeyé côté
sops (hermes ne peut pas déchiffrer/réécrire un secret existant : pas de clé
age privée). Utilise key= pour lire la clé qui existe réellement, TODO pour
marc de renommer proprement plus tard.

Trouvé en testant le build réel (nixos-rebuild build) : sops-install-secrets
échouait avec 'the key hermes_api_server_env cannot be found'.
2026-09-27 21:27:18 -04:00
Hermes Agent a2e20bc376 chore(secrets): rotation admin_password gitea 2026-09-27 21:24:55 -04:00
Hermes Agent 97fe5aa462 chore(secrets): secret hermes-discord.yml (token bot Discord natif hermes) 2026-09-27 21:24:55 -04:00
Hermes Agent 40f0b407a8 feat(hermes): plugin desktop vim-bindings (déclaratif, désactivé)
tmpfiles crée le dossier /var/lib/hermes/.hermes/desktop-plugins/vim-bindings ;
le service qui l'active est commenté (heredoc JS mal géré par nix pour le moment).
2026-09-27 21:24:44 -04:00
Hermes Agent 3ab98797af feat(hermes): connexion mcpServers.gitea (gitea-mcp) + note vaultwarden désactivé 2026-09-27 21:24:27 -04:00
Hermes Agent 5b181bd840 refactor(hermes): API server OpenAI-compatible unifié, retrait du gateway discord-bridge dédié
Un seul listener par hôte (profil default) sert tous les profils sous
/p/<profil>/... au lieu d'un gateway séparé par profil. Le pont Discord
existant (services/discord-bot) appelle maintenant
http://127.0.0.1:8642/p/discord-bridge/v1/chat/completions et expose une
surface de test locale (HERMES_BRIDGE_ASK_PORT). services/discord-hermes-bridge
(gateway dédié, 71 lignes) est retiré ; la clé est réutilisée depuis
secrets/discord-hermes-bridge.yml (clé renommée hermes_api_server_env).
2026-09-27 21:23:34 -04:00
Hermes Agent af4ed70b6b feat(hermes): bot Discord natif dédié (voix + texte, profil discord-bridge)
- enableDiscordToken (option, même contrainte que enableMatrixToken : tower only)
- DISCORD_ALLOWED_USERS (@marc uniquement)
- plugin discord-auto-join : rejoint automatiquement le vocal quand un membre
  autorisé y entre (register_platform_handler + join_voice_channel)
- Opus (libopus) : LD_LIBRARY_PATH posé sur l'unité systemd dès le démarrage
  (dlopen lit sa valeur au lancement, pas via .env) ; binutils (ld/objdump)
  pour le repli find_library, ffmpeg pour la conversion PCM 48kHz TTS/réception
- secret hermes_discord_env (secrets/hermes-discord.yml)
2026-09-27 21:23:10 -04:00
Hermes Agent 3b6b531102 revert(home-manager): retour au profil standalone, herdr posé côté système
home-manager.useGlobalPkgs=true (test perf, évite d'évaluer nixpkgs 2x) est
revenu trop cher/instable en pratique. Retour à home-manager.users.marc
totalement désactivé côté système (profil standalone via `HM=marc just home`
uniquement). Conséquences :
- modules/home/gtk : catppuccin.autoEnable repasse à sa valeur par défaut
- modules/home/zen-browser : l'overlay nur revient dans son propre module
- profiles/common : commentaire nettoyé (n'a plus besoin d'expliquer le piège
  useGlobalPkgs, qui ne s'applique plus)
- herdr : posé côté système (modules/nixos/herdr, symlink store ->
  ~/.config/herdr/config.toml) puisque le home-manager systeme ne construit
  plus la conf de marc ; modules/home/herdr et son import dans
  users/marc/home.nix restent (profil standalone), mais ne sont plus le
  mécanisme actif sur tower.
2026-09-27 21:21:00 -04:00
Hermes Agent 3d0a16c93a feat(hermes): activer enableDiscordToken sur tower 2026-09-27 21:20:49 -04:00
Hermes Agent 20ca7263ea chore(services): activer gitea-mcp et ibkr-mcp ; marquer stalwart-mcp/vaultwarden-mcp WIP
gitea-mcp et ibkr-mcp sont fonctionnels et importés. stalwart-mcp (cargoHash à
corriger) et vaultwarden-mcp (input flake manquant) restent commentés.
2026-09-27 21:20:32 -04:00
Hermes Agent 327b66a21f chore(services): activer radarr, media, audiobookshelf, arr-mcp
radarr était commenté depuis une régression antérieure ; media/audiobookshelf/
arr-mcp sont les modules ajoutés dans les commits précédents.
2026-09-27 21:20:22 -04:00
Hermes Agent 667a072937 feat(media): migrer la bibliothèque partagée vers /srv/media (dataset ZFS dédié)
/home/marc/media posait deux problèmes : /home/marc est 0700 (chaque service
devait recevoir un droit de traversée) et systemd-tmpfiles refuse de créer
quoi que ce soit sous /home/marc (« unsafe path transition », exit 73).

- services/media (nouveau) : dataset nixos/media -> /srv/media, groupe media
  (setgid, dossiers 2775/2770), arborescence movies/tvshows/music/books/downloads
- disko.nix : dataset media à côté de marc/nix
- navidrome, jellyfin, kodi : bibliothèque -> /srv/media/{music,movies,tvshows}
- qbittorrent : téléchargements dans le même dataset que la bibliothèque
  (permet aux *arr d'importer par lien dur au lieu de copier)
- radarr : dataDir corrigé (pointait sur celui de sonarr par copier-coller),
  déplacé hors /home (impossible avec ProtectHome+tmpfiles du module)
- sonarr : dataDir dédié + migration depuis /home/marc/radarr (était figé
  depuis le 28/07, port 8006 muet) ; réparé le 27/09/2026
- readarr : bibliothèque -> /srv/media/books
2026-09-27 21:19:52 -04:00
Hermes Agent 138a6a2a3e docs: README décrivant les machines couvertes par le flake 2026-09-27 21:19:40 -04:00
Hermes Agent 0c6e1e833d fix(hermes-webui): le watchdog title-adoption ne doit pas empêcher le démarrage
core_title_adoption.start() peut lever une exception ; elle est maintenant
attrapée et loggée en warning au lieu de crasher le serveur au boot.
2026-09-27 21:19:36 -04:00
Hermes Agent d234f5f93f feat(arr-mcp): conteneur MCP couvrant Radarr/Sonarr/Jellyfin/Prowlarr/Bazarr
ghcr.io/bardesss/arr-mcp, transport HTTP loopback (port 6060). Config (URL +
clé API de chaque service) à faire dans l'interface web du conteneur.
2026-09-27 21:19:36 -04:00
Hermes Agent 819a34629f feat(audiobookshelf): serveur de livres audio et podcasts
Bibliothèque sous /srv/media (dataset partagé, cf services/media). Clé API
dans secrets/audiobookshelf.yml, pas encore consommée par un service. Exposé
publiquement via Pangolin (audiobookshelf.marcpartensky.com).
2026-09-27 21:19:35 -04:00
Hermes Agent 78c257a2a6 feat(ibkr-mcp): serveur MCP lecture seule Interactive Brokers (Flex Web Service)
Positions, soldes, NAV, transactions via Flex Web Service (HTTPS, sans session
IBKR, sans 2FA, sans gateway local). Le token Flex est indépendant du mot de
passe du compte et révocable depuis le portail : aucun pouvoir de passer un
ordre. Token + Query IDs encore des placeholders dans secrets/ibkr.yml.
2026-09-27 21:19:35 -04:00
Hermes Agent 01589109ab feat(vaultwarden-mcp): serveur MCP Vaultwarden (binaire téléchargé, désactivé en attendant l'input flake)
jr2804/vaultwarden-mcp, binaire Rust téléchargé depuis GitHub releases (plus
simple qu'un crate2nix). Mot de passe master dans secrets/tower.yml
(vaultwarden_mcp_password). Non importé (services/default.nix) : input flake
manquant, cf FIXME.
2026-09-27 21:19:35 -04:00
Hermes Agent 9d99233987 feat(gitea-mcp): serveur MCP Gitea officiel (gitea.com/gitea/gitea-mcp v1.6.0)
- buildGoModule, transport stdio, GITEA_ACCESS_TOKEN_FILE (secret jamais en clair)
- v1.6.0 (pas la dernière) : v1.7.0 exige go >= 1.27, non fourni par nixpkgs 26.05
- secret PAT dans secrets/gitea-mcp.yml (sops)
2026-09-27 21:19:20 -04:00
Hermes Agent cb365bdb2f feat(codeberg-mcp): token via sops template (plus de placeholder en clair)
Le token Codeberg (CODEBERG_ACCOUNTS) est désormais injecté via un .env généré
par sops.templates et sourcé par le wrapper, au lieu d'un placeholder en dur
dans l'option env= (visible dans le nix store).
2026-09-27 21:19:20 -04:00
Hermes Agent fb4afea17f feat(gitea): OIDC Zitadel pour l'authentification (auto-discover, registration externe uniquement)
- services.gitea.openid : ENABLE_OPENID_SIGNIN/SIGNUP, whitelist auth.marcpartensky.com
- service oneshot gitea-oidc-init : enregistre la source OAuth2 zitadel (idempotent)
- registration classique désactivée (ALLOW_ONLY_EXTERNAL_REGISTRATION)
- secret client OIDC dans secrets/gitea-oidc.yml (sops)
2026-09-27 21:18:46 -04:00
Hermes Agent 1f6a97c8b8 fix(stalwart): expose le secret ACME via /etc plutôt que credentials systemd
LoadCredential (%{file:/run/credentials/stalwart.service/acme-secret}%) ne
fonctionnait pas de façon fiable ; le secret est maintenant écrit dans
/etc/stalwart/acme-secret (environment.etc) et référencé par ce chemin.
2026-09-27 21:18:38 -04:00
Hermes Agent 4872cc27a9 feat(stalwart-mcp): serveur MCP Rust JMAP pour Stalwart Mail (désactivé, cargoHash à corriger)
- flake input stalwart-mcp (webpatser/stalwart-mcp, pin sur commit main)
- services/stalwart-mcp : buildRustPackage, config JMAP compte marc@marcpartensky.com
- non importé (services/default.nix) : cargoHash mismatch à corriger avant activation
2026-09-27 21:18:38 -04:00
Hermes Agent 6f7be6d701 feat(gotify): OIDC Zitadel et exposition Pangolin
Gotify 3.1.0 (paquet unstable, absent de 26.05) avec SSO OIDC Zitadel en
client public (PKCE, pas de secret) et ressource Pangolin
gotify.marcpartensky.com en SSO. Le module n'est pas encore importé dans
services/default.nix (ligne ./gotify toujours commentée).
2026-09-27 17:20:31 -04:00
Hermes Agent d27aa1927e feat(hermes-webui): WebUI sur hermes.marcpartensky.com
Le WebUI est l'interface principale, il prend donc le domaine court
hermes.marcpartensky.com (full-domain Pangolin + HERMES_WEBUI_ALLOWED_ORIGINS) ;
hermes-mobile.marcpartensky.com reste réservé à l'appli mobile.
2026-09-27 17:20:31 -04:00
Hermes Agent 5cc83416d0 feat(hermes-pocket): backend du profil pocket pour l'appli mobile
hermes serve --isolated sur le profil pocket (127.0.0.1:9119) derrière un
nginx loopback qui réécrit le Host (le serveur refuse tout Host non loopback),
exposé par Pangolin sur hermes-mobile.marcpartensky.com sans SSO : l'appli
native ne peut pas faire le flux navigateur, seul le token de session du profil
protège l'accès. Les deux ports restent fermés au firewall (assertions).
2026-09-27 17:20:31 -04:00
Hermes Agent 8ea0630bec feat(hermes): nemotron 3 ultra gratuit (high) par défaut
Politique marc du 27/09/2026 : nvidia/nemotron-3-ultra-550b-a55b:free en
high par défaut, puis inkling:free, puis DeepSeek V4.1 Flash en dernier
recours. Nemotron sort de la chaîne de secours puisqu'il devient primaire.
2026-09-27 17:20:30 -04:00
Hermes Agent 8484f09b36 fix(hermes): python3 systeme pour le probe SSH de Hermes Desktop 2026-09-27 16:02:28 -04:00
Hermes Agent 05d83955eb feat(hermes-webui): titre de session repris du moteur Hermes (patch local)
Le WebUI n'écrit le titre d'une session qu'à la fin d'un run (jamais si le run
est interrompu) : la sidebar affiche le premier message brut pendant tout le run.
Le moteur Hermes (hermes_state) connaît déjà le bon titre quelques secondes après
le premier message.

default.nix patche donc le paquet amont pour y installer core_title_adoption.py
(watchdog qui recopie ce titre dans le sidecar du WebUI, state.db ouvert en
lecture seule, désactivable par HERMES_WEBUI_CORE_TITLE_ADOPTION=0) et
api_init.py. À retirer quand le comportement existera en amont dans l'input.
2026-09-27 13:01:21 -04:00
Hermes Agent 88b09f08c8 chore(tailscale): désactiver l'import dans profiles/anywhere
Le service exige le secret sops tailscale/auth_key, absent de
secrets/anywhere.yml : l'éval échouait. À réactiver avec le mesh (headscale est
utilisé en attendant).
2026-09-27 13:00:56 -04:00
Hermes Agent 2fb2975b84 fix(stalwart): stateVersion 26.05 (données live dans /var/lib/stalwart/db)
Ce stateVersion sélectionne user/group/dataDir du module, pas la release système.
Vérifié le 27/09/2026 sur le VPS (fds ouverts du process + toml actif) : les
données vivantes sont dans /var/lib/stalwart/db ; celles de /var/lib/stalwart-mail
datent de juillet 2026. Ne pas redescendre sous 26.05.
2026-09-27 13:00:56 -04:00
Hermes Agent ada0fa88e3 fix(newt): proxy-resources/protocol, attendu par le Pangolin du VPS
Le Pangolin de ce VPS (schéma ancien) ignore silencieusement public-resources et
mode : la ressource noVNC n'était jamais créée et Traefik répondait 404 sur
vnc.marcpartensky.com. Vérifié le 26/09/2026.
2026-09-27 13:00:56 -04:00
Hermes Agent c7a4a6b862 fix(protonmail-mcp): import limité à tower (éval de laptop cassée)
L'option services.protonmail-mcp vient du input protonmail-mcp, importé par le
seul profile tower : l'import global dans services/default.nix cassait l'éval de
laptop/laptop-iso (option inexistante). L'import est commenté avec la raison, et
flake.nix ajoute ./services/protonmail-mcp aux modules de tower uniquement.
2026-09-27 13:00:56 -04:00
Hermes Agent ce6235d8f2 feat(vms): VM de dev microvm.nix (just vm, nix run .#dev)
vms/dev.nix décrit une VM de dev (autologin marc, console série) construite par
l'input microvm ; ses runners sont exposés dans flake.nix pour être lancés
directement (`nix run .#dev`) et le Justfile ajoute `just vm` / `just vm-build`,
qui gardent l'état de la VM (overlay du store, socket qmp) dans
~/.local/state/microvms/<nom> (supprimer le dossier pour repartir de zéro).

Le runner passe par `path:` volontairement : ça marche même quand vms/<nom>.nix
n'est pas encore commité.
2026-09-27 13:00:56 -04:00
Hermes Agent 2622780459 feat(discord-hermes-bridge): pont Discord vers un gateway Hermes dédié
Gateway hermes-agent dédié (profil discord-bridge) sur 127.0.0.1:8643, API Server
OpenAI-compatible consommée par le cog hermes.py du discord-bot. Unité systemd écrite à
la main (le module NixOS ne gère pas d'instances) et même paquet que le bot Matrix,
donc mêmes groupes de deps (edge-tts, stt-whisper).

Clé d'API dans secrets/discord-hermes-bridge.yml, port jamais ouvert au firewall
(assertion). Côté discord-bot, HERMES_BRIDGE_URL et le nom de rôle viennent d'un
EnvironmentFile, seule la clé est secrète.
2026-09-27 13:00:56 -04:00
Hermes Agent 0000584366 feat(meetup-mcp): serveur MCP Meetup (events et groupes publics)
API GraphQL de Meetup (gql-ext) en stdio, sans authentification pour ce périmètre
(vérifié : eventSearch, groupSearch, recommendedEvents répondent sans token). Les
requêtes nominatives exigent un OAuth consumer de compte Pro : le jour où le token
arrive, il se pose dans secrets/meetup.yml et le serveur le lit via MEETUP_TOKEN_FILE,
sans changement de code.
2026-09-27 13:00:56 -04:00
Hermes Agent 7175a1fe34 feat(mcp-nixos): serveur MCP NixOS
Paquets et options NixOS/home-manager réelles (mcp-nixos, transport stdio, API
publiques, aucun secret) au lieu de les inventer.

NOTE : pas encore câblé dans services/default.nix, à importer pour l'activer.
2026-09-27 13:00:56 -04:00
Hermes Agent 2974d1616b fix(hermes-dashboard): câbler l'import du service
Le service et son secret avaient été ajoutés sans l'import dans services/default.nix :
le dashboard n'était donc jamais activé.
2026-09-27 13:00:56 -04:00
Hermes Agent bc3791d88e feat(hermes-webui): UI web de chat (profil pocket isolé, Pangolin SSO)
Paquet communautaire github:nesquena/hermes-webui (input flake) en service, agent en
process sur le profil pocket, isolé du gateway Matrix.

Deux pièges vérifiés : sans HERMES_WEBUI_ISOLATED_PROFILE=1 le serveur retombe sur le
profil par défaut et écrit dans le state.db racine partagé avec le gateway, et il n'y
a aucune garde d'authentification sur une adresse loopback (le SSO Pangolin est la
seule protection, comme pour terminal.marcpartensky.com). Le PTY (/api/pty) et l'API
complète restent donc en loopback, jamais ouverts au firewall (assertions).
2026-09-27 13:00:56 -04:00
Hermes Agent e8ff562d78 feat(gitea): forge locale (postgres, admin, Pangolin SSO)
Instance gitea sur tower avec base postgres (rôle gitea en peer auth), compte admin
créé une seule fois par un oneshot idempotent avec le mot de passe de
secrets/gitea.yml (sops). Exposition gitea.marcpartensky.com via newt/Pangolin, et
assertion pour que le port HTTP local reste fermé.
2026-09-27 13:00:56 -04:00
Hermes Agent 8134f31174 feat(jellyfin): serveur média (Pangolin SSO)
Jellyfin sur tower, répertoires de médias créés par un oneshot, groupe users en
secondaire pour traverser /home/marc (piège classique NixOS). Exposition
jellyfin.marcpartensky.com via newt/Pangolin, port jamais ouvert au firewall.
2026-09-27 13:00:56 -04:00
Hermes Agent a45363870e refactor(hermes): option enableMatrixToken, secret Matrix limité à tower
secrets/hermes-matrix.yml n'a que tower comme destinataire : déclarer le secret là
où le module est importé (laptop, anywhere) ferait échouer l'activation (setupSecrets,
« 0 successful groups required »). Le fichier devient donc une option activée sur
tower seul, et le module est enveloppé dans un bloc config = { ... } pour pouvoir
déclarer `options`.
2026-09-27 13:00:56 -04:00
Hermes Agent 88af75b94b style(hermes): thème Catppuccin Mocha, accent Lavender
display.skin = catppuccin-dark-lavender. La palette vit dans
/var/lib/hermes/.hermes/skins et est écrite au runtime, pas gérée par nix.
2026-09-27 13:00:56 -04:00
Hermes Agent 9716d34d05 feat(hermes): plugin herdr-agent-state (session résumable côté herdr)
Le code produit par `herdr integration install hermes` est vendorisé dans
services/hermes/plugins/herdr-agent-state et branché déclarativement (extraPlugins,
symlink sous .hermes/plugins, plus plugins.enabled) : plus d'installation impérative.
Il rapporte l'ID de session du pane à herdr, qui peut alors relancer le pane dans sa
conversation (`hermes --resume <id>`).

LIMITE : le plugin sort si HERDR_ENV != 1, et le socket herdr est celui de marc
(~/.config/herdr/herdr.sock, 0600) : il n'agit que pour une session lancée dans un
pane herdr sous marc, inerte (sans effet de bord) sinon.
2026-09-27 13:00:56 -04:00
Hermes Agent 5480caf847 feat(hermes): transcription locale des vocaux (faster-whisper)
Groupe de deps « stt-whisper » (faster-whisper, CPU, gratuit) plus stt.enabled : le
gateway transcrit les vocaux entrants (Element/Matrix). language = "" et pas le
défaut "en", sinon Whisper décode du français comme de l'anglais (mesuré : fr
détecté à p=0.99 sur un vocal court). Modèle « base » (140 Mo, ~5 s pour 3 s d'audio).

numpy sort d'extraPythonPackages : onnxruntime, dépendance de stt-whisper, le
fournit déjà dans le venv scellé, et un doublon fait échouer le build du paquet
hermes (collision avec le venv).
2026-09-27 13:00:56 -04:00
Hermes Agent 353b320812 perf(home-manager): useGlobalPkgs sur tower, overlays et paquets insecure
Sans useGlobalPkgs, home-manager instancie un second nixpkgs (toute la distribution
réévaluée à chaque switch). Le partage change l'ordre de merge de
nixpkgs.config.permittedInsecurePackages, un attr « dernier gagne » que plusieurs
modules redéfinissent (matrix-whatsapp, pangolin, packages.nix) : on l'unionne
explicitement dans profiles/common. L'overlay nur de zen-browser passe au niveau
système, incompatible dans le home avec useGlobalPkgs. catppuccin.autoEnable=false
coupe le scan et l'activation auto de tous les programmes HM.
2026-09-27 13:00:56 -04:00
Hermes Agent 03353679a5 feat(hermes): accès SSH à tower depuis le Mac (Hermes Desktop)
La clé ed25519 du Mac est déclarée pour l'utilisateur hermes. Déclaratif exprès :
/var/lib/hermes est en 2770 (écriture groupe, requis par le partage hermes/marc) et
sshd (StrictModes) ignore alors ~/.ssh/authorized_keys ; l'option écrit
/etc/ssh/authorized_keys.d/hermes en root 444, qui passe le contrôle et survit aux
rebuilds.
2026-09-27 13:00:55 -04:00
Hermes Agent 4c0cdc14d9 feat(hermes): partager l'état avec les sessions hermes lancées par marc
Les sessions hermes ouvertes dans un pane herdr tournent sous marc, pas sous le
compte de service : HERMES_HOME=/var/lib/hermes/.hermes (users/marc/home.nix) pour
qu'elles lisent et écrivent le même état (sessions, mémoire, lazy-python) que le
service hermes-agent.

Accès : groupe secondaire hermes pour marc (users.nix) et ACL tmpfiles sur
/var/lib/hermes (traversée) puis .hermes et .hermes/plugins (rwx + défauts ACL),
pour que les fichiers créés par marc restent lisibles côté service. C'est ce qui
rend le plugin herdr-agent-state utilisable : il parle au socket herdr de marc.
2026-09-27 13:00:55 -04:00
Hermes Agent 3c05597360 refactor(herdr): config posée par home-manager, HM de marc activée sur tower
herdr n'a ni option NixOS ni module home-manager dans l'input épinglé : sa config
(sidebar qui affiche le modèle hermes de chaque pane) passe par xdg.configFile dans
modules/home/herdr, importé par users/marc/home.nix. force = true car le premier
switch remplace le symlink posé avant par systemd.tmpfiles, que check-link-targets
ne reconnaît pas comme un fichier home-manager-files (activation en status 1 sinon).

tower active home-manager.users.marc = users/marc/home.nix, le même profil que
`HM=marc just home` : herdr et le reste des dotfiles arrivent avec `just nixos`.
backupFileExtension = hm-backup pour la première bascule. Entre `just nixos` et
`just home`, c'est le dernier switch qui écrit les liens.
2026-09-27 13:00:55 -04:00
Hermes Agent c47f60a129 feat(ssh): add hermes host configuration 2026-09-26 19:40:04 -04:00
Hermes Agent bd835791dd fix(ssh): update towerlocal hostname IP 2026-09-26 19:33:20 -04:00
Hermes Agent b943ec7686 style(kitty): refine terminal visual settings
Set background opacity to 0.92 for slight transparency.
Increase window padding width to 12.
Enable hiding window decorations.
2026-09-26 18:51:20 -04:00
Hermes Agent a94571df8b feat(home): add kitty terminal module 2026-09-26 18:27:02 -04:00
Hermes Agent 0961bf4c7e chore(kitty): update font from JetBrainsMono to MesloLGS NF 2026-09-26 18:26:29 -04:00
Hermes Agent 58a0943ead feat(kitty): add catppuccin mocha theme
Updates the Kitty terminal configuration to use the Catppuccin Mocha color scheme.
This includes changes to background, foreground, cursor, selection, URL colors,
and adds the full set of ANSI color definitions.
2026-09-26 18:23:06 -04:00
Hermes Agent 308c52de7e fix(stalwart): corriger le mapping traefik stalwart (port 8390 JMAP, pas 8090 headscale) 2026-09-26 18:15:32 -04:00
Hermes Agent d5c60c576e fix(navidrome): ajouter groupe users pour traverser /home/marc 2026-09-26 18:15:32 -04:00
Hermes Agent c1c19aeb22 fix(gotify): aligner le rôle postgres gotify sur le secret sops (bug identique à vaultwarden) 2026-09-26 18:15:32 -04:00
Hermes Agent 6220fb68c5 fix(tower): reset hashedPassword root (marc ne pouvait plus se logger depuis 25/09) 2026-09-26 18:15:28 -04:00
Hermes Agent 67b4551b2d feat(hermes-dashboard): terminal web hermes (Pangolin SSO)
Backend hermes-agent en mode dashboard (9120) + nginx host-rewrite (9121),
ressource newt terminal.marcpartensky.com. Ports jamais ouverts au firewall :
/api/pty est un shell.
2026-09-26 18:14:41 -04:00
Hermes Agent 355ed8ee0a feat(hermes-files): partage HTTP LAN des artefacts de l'agent
nginx sur 0.0.0.0:8092, root /var/lib/hermes-files (répertoire dédié : le
stateDir /var/lib/hermes est en 0770, nginx ne peut pas le traverser).
Autoindex, aucune auth : rien de sensible dedans, jamais routé via Pangolin.
2026-09-26 18:14:41 -04:00
Hermes Agent 5c093e06fa feat(matrix): stack synapse + ponts (discord/meta/dumps) + accès admin agent
- services/matrix : synapse 1.160, listener 127.0.0.1:8008, DB postgres,
  registration_shared_secret généré (hermes ne peut pas poser de secret sops
  root-only)
- matrix-discord/matrix-meta : ponts mautrix ; fix matrix-meta : synapse
  rejoint le groupe mautrix-meta-registration (sinon il ne peut pas lire
  meta-registration.yaml, tout le homeserver refuse de démarrer)
- matrix-dumps : dump périodique + clés pickle des ponts (déchiffrement megolm)
- matrix-hermes (mxc) : compte admin @hermes-admin auto-provisionné depuis le
  registration_shared_secret, token utilisable par l'agent pour l'admin API
  Synapse (fabriquer un token pour n'importe quel compte local)
2026-09-26 18:14:41 -04:00
Hermes Agent d5459d760f feat(hermes): accès SSH direct multi-hôtes (tower/deck/anywhere)
Clé hermes@tower déclarée en authorizedKeys : sur hermes lui-même (accès aux
hôtes qui importent services/hermes), en root déclaratif sur anywhere (le
bloc était commenté), et compte système hermes complet + sudo NOPASSWD
nixos-rebuild sur deck (qui n'importe pas services/hermes).
2026-09-26 18:12:32 -04:00
Hermes Agent 2149e5f998 feat(hermes): bot Matrix @hermes (env, secret sops, allowlist)
Homeserver matrix.marcpartensky.com, @hermes:matrix.marcpartensky.com, E2EE
required (salles de pont chiffrées), pas de mention requise ni d'auto-thread
dans les salles de pont (3+ membres). Allowlist : @marc + son ghost Signal.
Token dans secrets/hermes-matrix.yml (règle .sops.yaml dédiée, sopsFile
explicite car hors de tower.yml).
2026-09-26 18:11:54 -04:00
Hermes Agent 8bba500743 fix(hermes): NoNewPrivileges bloquait sudo depuis les unités du service
commonServiceConfig posait NoNewPrivileges=true sur hermes-agent.service et
hermes-backend.service : le noyau ignore alors le bit setuid, donc sudo/su
refusaient net dans toute session lancée depuis Matrix ou le terminal web,
rendant la règle NOPASSWD nixos-rebuild inopérante. mkForce false sur les deux
unités ; sudo reste borné à la liste de commandes déjà déclarée.
2026-09-26 18:11:20 -04:00
Hermes Agent 06b3c92b0a feat(hermes): TTS Edge gratuit (voix fr-FR-DeniseNeural)
Provider edge (sans clé API), dépend du dependency-group edge-tts déjà ajouté.
À la demande (/voice tts), auto_tts reste false par défaut.
2026-09-26 18:11:00 -04:00
Hermes Agent 464ffb616c feat(hermes): politique modèle 26/09 (Sonnet 5 défaut, fallback ordonné, reasoning_overrides, channel_overrides)
- défaut : claude-sonnet-5 (DirectSDK, abonnement Pro/Max) au lieu de DeepSeek
  via OpenRouter ; consomme le quota à chaque message, surveiller l'usure
- fallback_providers réordonné : gratuits OpenRouter (inkling, nemotron ultra)
  puis DeepSeek Flash en tout dernier recours (payant mais bon marché)
- agent.reasoning_overrides : le niveau de reasoning suit le modèle actif
  (DeepSeek Flash/Sonnet 5 -> high, Opus 5 -> max)
- settings.platforms.matrix.channel_overrides : 3 salons épinglés sur Opus 5
  ou Sonnet 5 (abonnement), le reste reste sur le défaut
2026-09-26 18:10:41 -04:00
Hermes Agent eb048167fe feat(herdr): sidebar affiche le modèle hermes de chaque pane
- modules/nixos/herdr : config.toml posé par tmpfiles L+ (rows_by_agent hermes
  = state_icon/machine/tab + terminal_title_stripped + agent), importé par
  profiles/tower/configuration.nix
- services/hermes : display.interface = "tui" (seule interface qui publie un
  titre OSC lu par herdr) + plugins.enabled = [] (neutralise l'entrée
  herdr-agent-state, inerte sous sudo su -l hermes)
2026-09-26 18:09:58 -04:00
Hermes Agent c858558d08 chore(hermes): aligner extraPythonPackages sur le venv scellé + deps matrix/edge-tts
package.python.pkgs suit désormais la famille python du venv (nix/pythonLock.nix,
3.14) au lieu de la nixpkgs figée du flake hermes-agent (hermesPkgs, 3.12) qui
filtrait silencieusement les paquets. Ajoute extraDependencyGroups = matrix +
edge-tts (résolus par uv dans le venv scellé, préparant le bot Matrix et le TTS
Edge).
2026-09-26 18:09:33 -04:00
Hermes Agent 535d1c9892 feat(youtube-music): 4 clients TUI (ytm-player, yututui, yt-collate, youtube-music-cli)
- module par outil dans modules/home/, importés par users/marc/home.nix
- ytm-player: suit unstable (dbus-fast >= 5.0.0, absent de 26.05)
- yututui (ytt): doCheck = false, 11 tests FS échouent en sandbox nix
- yt-collate: buildPythonApplication python313, deps textual/ytmusicapi
- youtube-music-cli (ymc): binaire Bun standalone de la release
2026-09-26 18:08:25 -04:00
Hermes Agent ed4c50c557 feat(matrix): add new bridges and improve E2EE defaults
Add mautrix-linkedin, mautrix-meta (Instagram, Messenger), and mautrix-telegram (initial setup).
Enable E2EE by default for mautrix-discord and mautrix-signal, ensuring stable pickle_key generation.
Update matrix-synapse dependencies for new bridges.
2026-09-24 23:57:01 -04:00
Hermes Agent dc8e39c546 feat(cage-firefox): session VNC cage + firefox en plus de niri
Deuxième voie d'accès VNC, indépendante de la session niri :
backend headless de wlroots, donc aucun besoin de vkms ni d'écran branché,
et rien qui touche la session locale. Service system, démarre au boot sans
login. Exposé en noVNC sur 6081, wayvnc reste sur loopback 5901.

Points de mise au point validés au banc d'essai :
- la sortie headless n'annonce que 1280x720 mais accepte tout via
  wlr-randr --custom-mode, posé AVANT wayvnc qui fige la taille à sa connexion
- cage démarre son propre XWayland, une appli X11 marche aussi
- firefox exige que le dossier de profil existe déjà, sinon Profile Missing
- profil dédié dans /var/lib/cage-firefox/profile, séparé de celui de marc
2026-09-24 23:24:10 -04:00
Hermes Agent db098efdf5 feat(postgres): add music database service
Introduces a dedicated PostgreSQL database and schema for music data,
including playlists, tracks, and various analytical views. This service
is designed for importing Spotify playlists into YouTube Music.

Updates the codeberg-mcp dependency hash to SRI format. Refactors
home-manager package names for prettier and neovim-node-client.
2026-09-24 22:55:18 -04:00
Hermes Agent 9639f7ae35 feat(wayvnc): écran virtuel vkms en 1920x1080
VKMS expose une liste de modes dont 1920x1080, donc pas de mode custom :
on déclare le mode de la sortie Virtual-1 via programs.niri.settings.outputs.
Niri relit sa config à chaud, un just home suffit, pas de relogin.
Résolution paramétrable par virtualWidth / virtualHeight en tête du module.
2026-09-24 22:45:46 -04:00
Hermes Agent 4b6e9e8566 feat: add matrix signal and discord bridges
Update nixpkgs and nix-darwin to 26.05.

Enable vkms kernel module for the tower profile to provide a virtual display.

Configure mautrix-signal and mautrix-discord services.

Update matrix-synapse dependencies to wait for new bridges.
2026-09-24 22:37:25 -04:00
Hermes Agent 81f348e601 fix(hermes): extraPackages défini deux fois (claude-code + nodejs_22)
services.hermes-agent.extraPackages était défini une fois pour claude-code et une
seconde fois pour nodejs_22 (MCP GitHub), ce qui cassait l'évaluation de
nixosConfigurations.tower : "attribute 'services.hermes-agent.extraPackages'
already defined". Les deux paquets sont maintenant dans une seule liste.
2026-09-24 22:30:09 -04:00
Hermes Agent 274a392a2a fix(flake): plus d'input path: pour protonmail-mcp
Un input "path:" relatif laisse un noeud non verrouillé dans flake.lock, que les
nix anciens (<= 2.20) refusent ("lock file contains mutable lock") : c'est ce qui
cassait `just mac` sur le Mac. Le sous-flake ./protonmail-mcp est maintenant appelé
directement (import de son flake.nix, inputs passés explicitement) et sa dépendance
externe proton-mail-bridge-client devient un input github normal, donc verrouillé.
Même rev qu'avant (811be5d) : aucun changement de version du paquet.
2026-09-24 22:29:30 -04:00
Hermes Agent fbb0525254 feat: add Codeberg and GitHub MCP, improve wayvnc startup
Integrates new Model Context Protocol (MCP) servers for Codeberg and GitHub.
The Codeberg MCP server is a new service definition.
The GitHub MCP server is added to the Hermes agent configuration and requires
Node.js 22 as an extra package for `npx`.

Refactors the wayvnc startup mechanism. It is now launched directly by niri
using `spawn-at-startup` instead of a systemd user service. This change
resolves an issue where wayvnc could not find the Wayland display due to
missing `WAYLAND_DISPLAY` in the systemd service environment.
2026-09-24 22:28:54 -04:00
Hermes Agent 11347eed87 chore(hermes): set explicit OpenRouter base URL
Ensures the correct OpenRouter API base URL is always used, overriding
any potentially outdated values from config.yaml.
2026-09-24 22:11:52 -04:00
Hermes Agent fde44ec0a8 feat: enable wayvnc LAN access and update hermes model
Configure websockify to listen on 0.0.0.0:6080 and open port 6080 in the firewall,
allowing direct LAN access to the noVNC web client. Update access documentation.

Switch the default AI model for Hermes from Claude Sonnet to DeepSeek V4.1 Flash
(OpenRouter) and adjust the fallback provider chain.
2026-09-24 22:10:03 -04:00
Hermes Agent a1f24fd173 chore(protonmail-mcp): désactiver le Bridge (plan gratuit, refus API 10004) 2026-09-24 21:58:56 -04:00
Hermes Agent c09bee13de feat(newt): ressource publique Pangolin noVNC (vnc.marcpartensky.com -> 127.0.0.1:6080, SSO) 2026-09-24 21:58:56 -04:00
Hermes Agent 23adf1d042 fix(vaultwarden): port 8222 au lieu de 8083 (conflit nginx Nextcloud) + alignement du mot de passe du rôle postgres 2026-09-24 21:58:56 -04:00
Hermes Agent f691d98990 feat: add noVNC web client and headscale ACL
Integrates noVNC with websockify to provide a web-based VNC client
for wayvnc, accessible via SSH tunnel on port 6080.

Adds a new Headscale ACL policy for the personal tailnet, enabling
full mesh connectivity between all nodes on all ports.
2026-09-24 21:57:22 -04:00
Hermes Agent 546815e27e feat(modules): androidtv-mcp service 2026-09-24 21:31:23 -04:00
Hermes Agent 567c2a85e9 feat(services): nextcloud/zitadel/tailscale + sops 2026-09-24 21:31:20 -04:00
Hermes Agent 8ea118aeb7 feat(users): marc/mac home and packages 2026-09-24 21:31:17 -04:00
Hermes Agent 459f6ac9f4 feat(profiles): anywhere/deck/macos updates 2026-09-24 21:31:14 -04:00
Hermes Agent ed26a96aad feat(tower): tower profile + zfs + eternal-terminal 2026-09-24 21:31:12 -04:00
Hermes Agent 15427c48a9 feat(hermes): service config update 2026-09-24 21:31:09 -04:00
Hermes Agent f55067d0b7 feat(flake): lock updates and protonmail-mcp flake 2026-09-24 21:31:02 -04:00
mazex 355b8c443e feat(tower): configure system stability and enable Roku
Set kernel panic to reboot after 10 seconds.
Enable systemd watchdog for automatic reboot on freeze.
Add ZFS root key to initrd secrets.
Enable the Roku service.
2026-09-24 00:41:46 -04:00
mazex f83a0d194c feat(roku): add roku tv control service
This introduces a new `hermes-agent` MCP server for Roku TVs, allowing control over key presses, brightness, app launching, and status queries via the Roku ECP API.
2026-09-24 00:39:59 -04:00
mazex ef699918e5 chore(nextcloud): add ipv6 proxy, disable sso, set debug log 2026-09-22 18:30:06 -04:00
mazex e9c80ceceb feat(hermes): default to claude subscription provider, install claude-code
- input hermes-agent 0.21.2 -> 0.21.4 (requis par le plugin directsdk)
- claude-code 2.1.223 : extraPackages du service + systemPackages
- provider par défaut : claude-subscription-directsdk-experimental (claude-sonnet-5)
- vision auxiliaire épinglée sur kimi pour préserver le quota Claude Pro
2026-09-22 15:25:11 -04:00
mazex 2cacec63c0 chore(home-manager): pass inputs to modules 2026-09-22 14:35:56 -04:00
mazex ac0996c8c6 build(nextcloud): upgrade to version 33 2026-09-22 10:44:21 -04:00
mazex c87ef4fda3 feat(amazon-mcp): add amazon mcp service
Integrates the `duaragha/amazon-shopping-mcp` server.
Uses Playwright/Chromium for Amazon interactions.
Configured as a `hermes-agent` subprocess.
Includes `amazon-mcp-login` helper for manual session setup.
2026-09-22 10:27:30 -04:00
mazex 094a348497 feat(matrix): add homeserver and whatsapp bridge
Introduces the Matrix homeserver (Synapse) and the mautrix-whatsapp bridge.
Configures Synapse with PostgreSQL, including specific collation requirements.
Sets up secret generation for both services and manages their startup order.
2026-09-22 10:26:37 -04:00
mazex a7ee328388 feat(nextcloud-mcp): enable all apps by default
Remove explicit `--enable-app calendar` argument.
All Nextcloud apps are now exposed by default, providing full functionality.
2026-09-22 09:50:24 -04:00
mazex 8959a5a910 fix(nextcloud): ensure app migrations run after setup
The `nextcloud-setup` service now forces a re-run and executes `occ upgrade` to ensure all app tables are created. This resolves 500 errors for CalDAV due to missing calendar tables.

Also, temporarily disable the `kanidm` service and re-encrypt the `hermes_env` secret.
2026-09-22 09:37:05 -04:00
mazex 48aed99ce3 feat(kanidm): add kanidm identity management service 2026-09-22 01:12:09 -04:00
mazex a27e15f052 fix(nextcloud-mcp): use host network for container
The container needs to access Nextcloud on the host's 127.0.0.1.
Without host networking, 127.0.0.1 inside the container does not point
to the host, leading to Nextcloud 400 errors due to trusted_domains.
2026-09-22 00:54:45 -04:00
mazex 00b8247e53 feat(nextcloud): add mcp env secret
Adds the encrypted `nextcloud_mcp_env` secret to `tower.yml`.
2026-09-22 00:47:02 -04:00
mazex b0f8405a4a feat(nextcloud-mcp): enable and configure service
Configures Nextcloud MCP in single_user_basic mode, exposed on
127.0.0.1:8710 and integrated with Hermes.
Refactors Neovim config to use system nixpkgs input, preventing
duplicate evaluations and warnings.
Removes --upgrade flag from nixos-rebuild in Justfile.
2026-09-22 00:39:51 -04:00
hermes f4c946ac48 feat(hermes): add nix numpy for lazy-installed mem0ai
manylinux wheels break on NixOS (libstdc++.so.6 missing); compiled
deps of lazy installs must come from nixpkgs_6 via extraPythonPackages
2026-09-22 00:26:35 -04:00
mazex 5d708a0dbe feat(hosts): add macOS and Nix-on-Droid configurations
Introduce base configurations for macOS and Nix-on-Droid hosts.

The macOS configuration sets up Nix-darwin with home-manager, essential system packages, keyboard remapping, and disabled Homebrew.
The Nix-on-Droid configuration provides common environment packages, home-manager integration, and Nix flake support.
2026-09-22 00:16:15 -04:00
mazex a1eafc6c99 style(hermes): format nix configuration 2026-09-22 00:16:03 -04:00
hermes 0fc13aec60 feat(hermes): add ollama for mem0 local embeddings
nomic-embed-text (768 dims) via services.ollama.loadModels
2026-09-22 00:14:06 -04:00
hermes 0d1db65347 feat(hermes): prepare mem0 memory provider
- postgres: add pgvector extension package (postgresql_17.withPackages)
- hermes: HERMES_LAZY_INSTALL_TARGET for runtime mem0ai install (sealed nix venv)
- hermes: nix-built psycopg2 via extraPythonPackages
2026-09-22 00:06:07 -04:00
hermes 00bf59cb28 feat(hermes): prepare mem0 memory provider
- postgres: add pgvector extension package (postgresql_17.withPackages)
- hermes: HERMES_LAZY_INSTALL_TARGET for runtime mem0ai install (sealed nix venv)
- hermes: nix-built psycopg2 via extraPythonPackages
2026-09-21 23:41:10 -04:00
mazex 7209e8e1db feat(hermes): enable nixos-rebuild and cost display
Allow `marc` and `hermes` to run `nixos-rebuild` without password.
Configure `git` for root to access user's flake repository.
Set `tmpfiles` ACLs to grant `hermes` necessary permissions.
Prevent `createHome` for `marc` to avoid breaking `hermes` ACLs.
Temporarily disable `radarr` service.
2026-09-21 23:36:00 -04:00
mazex 1d4b7bf4b6 feat(hermes): configure custom kimi/moonshot provider
add custom provider `kimi-k3-global` for Moonshot API.
set default model to `kimi-k3` with vision and large context.
configure agent and auxiliary vision with max reasoning effort.
update hermes_env secret for new configuration.
2026-09-21 22:32:06 -04:00
mazex da78aea121 feat: add aichat kimi and spotify mcp services
Add Home Manager module for `aichat` CLI, integrating Moonshot/Kimi API.
Uses sops-nix for API key management.

Add `spotify-mcp-server` as a system service, integrated with Hermes.
Manages Spotify credentials via sops-nix.

Enable `nextcloud` OIDC app.
Configure `nextcloud-mcp` to restart on sops secret changes.

Enable `zitadel` service.
2026-09-21 21:42:43 -04:00
mazex 2ba5a019d7 feat(hermes): switch to moonshot kimi as default model
Configure the hermes agent to use moonshot kimi, replacing anthropic
claude sonnet. Update `hermes_env` secret. Comment out beeper mcp
server and add commented-out nextcloud mcp setup.
2026-09-21 21:42:22 -04:00
mazex b8a9c0ef87 feat(nextcloud-mcp): add nextcloud mcp service
Configure a NixOS service to run the Nextcloud MCP server as an OCI container.
Sets up environment variables and a sops secret for OAuth credentials.
2026-09-21 01:31:40 -04:00
mazex 6af189248e chore(deck): update nixpkgs for nixvim and add user tools
Pin nixvim to nixos-26.05 by updating its nixpkgs input.
Configure time zone and disable automatic-timezoned service for the deck profile.
Add numerous CLI and GUI tools for the deck user via home-manager modules.
Include direnv setup and a desktop shortcut for returning to Gaming Mode.
Update home.stateVersion and set EDITOR/VISUAL variables.
2026-09-20 23:18:34 -04:00
mazex d357a41f0d Merge branch 'master' of github.com:MarcPartensky/nixos 2026-09-21 03:08:49 +00:00
mazex 0fe311fe9d feat(switch-emu): add Nintendo Switch emulation module
Configures Eden (yuzu fork) and Ryubing (Ryujinx fork) emulators.
Includes a script and desktop entry for Mario Kart 8 Deluxe.
Sets up game directories, enables Bluetooth, and allows an optional firewall port.
2026-09-21 03:08:46 +00:00
mazex b29a9a33fb feat(eternal-terminal): enable eternal-terminal service
Opens port 2022 in the firewall and includes the service definition.
2026-09-20 22:41:05 -04:00
mazex 730c800124 eternal terminal 2026-09-21 04:37:18 +02:00
mazex 42cc0397dc zellij 2026-09-21 04:17:25 +02:00
mazex 322c08660f Merge branch 'master' of github.com:marcpartensky/nixos 2026-09-20 20:29:31 -04:00
mazex 87429e17b5 fix(nextcloud): improve reverse proxy config, disable app updates
Disable automatic app updates and the app store.
Add `overwritecondaddr` and `trusted_proxies` to ensure Nextcloud correctly handles requests when behind a reverse proxy.
2026-09-20 20:29:20 -04:00
mazex f001356e65 home: profil deck minimal 2026-09-18 01:44:06 +00:00
marc 42b78c580c feat(hermes): add hermes agent nixos module
Enable the hermes-agent service with a default model and sops secret.
Also update the `mac` recipe in `Justfile` to include `extra-experimental-features` for nix-darwin.
2026-09-17 21:20:58 -04:00
mazex 784c6c2459 feat(deck): add steam configuration
Integrates `steam-config-nix` for managing Steam settings.
Configures `jovian.devices.steamdeck` with auto-update and gyro DSU.
Sets up `programs.steam.config` for Proton GE and non-Steam apps.
Disables `jovian.decky-loader`.
2026-09-18 01:16:16 +00:00
mazex d055cb4561 deck friendly no auto_wallpaper 2026-09-17 12:39:35 +00:00
mazex 3c94c3f5f9 sops: add deck key 2026-09-17 02:57:41 +00:00
mazex b384aaaffc feat(systemd): disable system suspend and hibernate
This prevents the system from entering suspend, hibernation, hybrid-sleep,
and suspend-then-hibernate states.
2026-09-16 21:50:02 -04:00
mazex 0b452dfdc6 chore(sops): add deck as sops recipient
Adds a new age key for the 'deck' machine to the sops configuration.
Re-encrypts common secrets to include the new recipient.
Also updates .gitignore to ignore all 'result*' files.
2026-09-16 17:37:27 -04:00
mazex 2ab224cbe9 chore(deck): disable Steam Deck vendor drivers 2026-09-16 11:21:08 -04:00
mazex 29341b9145 chore(flake): update nixpkgs inputs and deck system config
update flake.lock for various inputs
switch deck to use jovian's nixpkgs input
fix experimental-features to list format
2026-09-16 10:14:06 -04:00
mazex a38fa9f7d7 feat(deck): add Plasma desktop and ISO build
Integrate Plasma 6 as the default desktop environment for the Steam Deck.
Introduce a new `deck-iso` system for generating an installable ISO.
Refactor `jovian` and `sddm` modules for better composability.
Include `disko`, `sops`, `users`, `networking`, `pipewire`, `xdg` modules.
Enable `zsh`, `openssh`, `rtkit`, and add `git`, `neovim`, `htop`.
2026-09-15 22:58:29 -04:00
mazex cd9b8391ab feat(deck): configure initial NixOS host for Steam Deck
Renames the 'steam' system to 'deck' in flake.nix and sets up the
initial NixOS profile for the Steam Deck. This includes disk
partitioning with disko, a basic hardware configuration, and
enables the Jovian module for Steam Deck specific optimizations.
The previous 'profiles/steam' configuration has been removed.
2026-09-15 21:41:54 -04:00
mazex 091e60b3e5 feat(steam): add system profile for Gamescope with Jovian
Introduces a dedicated NixOS system profile for Steam, integrating Jovian-NixOS for Gamescope.
This includes:
- New 'jovian' flake input and module.
- New 'steam' profile using 'jovian' as a specialisation.
- Opens port 8050 in the tower firewall.
- Sets Alacritty to open maximized in Niri.
2026-09-15 21:14:41 -04:00
mazex c689d33264 feat(niri): add output scaling for Technical Concepts monitor 2026-09-15 20:23:01 -04:00
mazex 275bb843e4 chore(nextcloud): disable bruteforce protection, add trusted IP 2026-09-15 20:08:53 -04:00
mazex 41319ffcc0 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-09-13 23:21:28 +02:00
mazex d42a32487b anywhere 2026-09-13 23:21:06 +02:00
mazex 755d78049b feat(nextcloud): enable service, update port and fix paths 2026-09-13 17:20:25 -04:00
mazex 2a6b79d53c feat(discord-bot): add discord bot service
Integrates the discord bot as a new NixOS service.
This includes adding the flake input, configuring the service,
and setting up its environment variables via sops.
2026-09-13 13:29:38 -04:00
mazex 612090820e feat(hermes): add beeper mcp server configuration
Configures Hermes to connect to a Beeper MCP server.
Updates the `hermes_env` secret to include necessary credentials.
2026-09-12 23:48:01 -04:00
mazex e8372ed9f1 refactor(ssh): use settings and PascalCase for config
Adjusts SSH configuration to use the `settings` option and updates all keys
to PascalCase for consistency with standard SSH config and home-manager.
2026-09-12 23:37:41 -04:00
mazex 802314cbfb feat(kitty): add kitty terminal configuration
Sets up basic kitty configuration, including font, colors, and window settings.
2026-09-12 23:32:31 -04:00
mazex 16b6287c8a feat(hermes): add and configure agent service
Enable the hermes-agent NixOS module and service.
Configure PostgreSQL database and user for Hermes.
Set up Anthropic model integration with dependencies and API URL.
Add hermes_env secret for agent environment variables.
2026-09-12 23:15:50 -04:00
mazex 0f68834e25 refactor(adguard): update service configuration
Restructure AdGuard Home settings by nesting DNS-related options under a `dns` key.
Add `mutableSettings = false` for better NixOS management.
Update upstream and bootstrap DNS servers to Cloudflare and Quad9.
Adjust system nameservers for testing.
2026-09-12 18:51:25 -04:00
mazex d302102e32 chore(config): update timezone and user packages 2026-09-12 18:51:18 -04:00
mazex b2f4f804b2 chore(deps): update nix flake inputs 2026-09-12 18:50:58 -04:00
mazex 478e41d80e fix(geminicommit): update config format and permissions
Adjusts the generated config file to use the `[api]` section and `key` field.
Adds `umask 077` for stricter file permissions and a check for secret readability.
2026-09-12 18:50:48 -04:00
mazex 4dd2dbc26b feat: add gotify service and update zitadel/services config 2026-07-30 14:43:38 +02:00
mazex 0a4fa11446 refactor: adjust bluetooth settings and enable rtkit 2026-07-30 14:43:28 +02:00
mazex 48cf873f42 chore: update flake.lock dependencies 2026-07-29 12:27:02 +02:00
mazex 284aa5686b chore: disable oxicloud service and add postgres setup for hermes 2026-07-28 22:49:39 +02:00
mazex b65f27ac99 chore: add hermes-agent flake input and configuration 2026-07-28 22:24:47 +02:00
mazex 8e9d8b967c chore: update flake inputs and stalwart configuration 2026-07-28 20:19:12 +02:00
mazex 0329abb91c fix: correct syntax error in ssh proxyJump configuration 2026-07-28 16:41:15 +02:00
mazex 846ff3f97c feat: add nil_ls lsp server and osc52 clipboard support 2026-07-28 16:41:05 +02:00
mazex c7574e87c1 fix: remove quote from proxyJump value 2026-07-28 16:27:35 +02:00
mazex 8318b625e2 chore: toggle wireguard and headscale service comments 2026-07-16 17:06:46 +02:00
mazex cbd0aa7a3e feat: add httpie to anywhere profile packages 2026-07-16 15:01:50 +02:00
mazex 1fd2225d7d chore: update flake.lock and add tmux package 2026-07-10 01:42:35 +02:00
marc 757d8a84f5 headscale 90 2026-07-07 18:11:51 +02:00
marc 1fd1363c55 headscale dns 2026-07-07 18:05:29 +02:00
marc ecdb237f6a headscale nameserver 2026-07-07 18:04:53 +02:00
marc 27ea2b8c10 headscale > tailscale 2026-07-07 17:57:54 +02:00
marc 36cf70501d tailscale > wireguard 2026-07-07 17:42:11 +02:00
marc 045a8c4d53 sslh, wireguard 2026-07-07 15:54:24 +02:00
mazex 685f1488b5 chore: rotate vaultwarden db password 2026-07-03 17:05:06 +02:00
mazex cd581e5ac5 feat: enable vaultwarden service with secrets management 2026-07-03 16:53:38 +02:00
mazex 922aa4af93 feat: add rename and delete functionality with improved ui 2026-05-24 21:23:13 +02:00
mazex 6c719452e7 refactor: redesign droplify ui and add file listing 2026-05-24 21:12:18 +02:00
mazex 7283d384e5 feat: add droplify service and remove gotify password 2026-05-24 21:06:16 +02:00
mazex a81e454065 feat: add droplify service for html file hosting 2026-05-24 21:06:01 +02:00
mazex 103ce12db5 chore: refactor configs and add services 2026-05-24 20:42:07 +02:00
mazex 548174e784 chore: add postgres ssl certificates and stalwart bob account 2026-05-24 20:41:10 +02:00
mazex 41bc06fa99 chore: add secrets and refactor vaultwarden config 2026-05-24 16:21:54 +02:00
mazex f8a43d67b9 refactor: reorganize jupyterhub python environments and config 2026-05-24 14:34:37 +02:00
mazex 8b170a42c5 feat: add image upscaling tools and set tower hostname 2026-05-24 14:19:21 +02:00
mazex 0a26c567ec chore: add zitadel and minio secrets to tower config 2026-05-24 14:19:18 +02:00
mazex bbb6067cfa style: format macos configuration.nix 2026-05-24 14:19:03 +02:00
marc f2dec33726 fix merge 2026-05-24 14:10:27 +02:00
mazex 64e89f7735 chore: add spam and noreply email accounts to stalwart 2026-05-22 00:53:39 +02:00
mazex 102ac2f21f feat: enable stalwart mail service with credentials and config 2026-05-22 00:28:25 +02:00
mazex 0f7b882415 style: format nextcloud and services configuration files 2026-05-21 23:26:30 +02:00
mazex 7bae98b5c0 refactor: restructure stalwart mail service configuration 2026-05-21 23:26:30 +02:00
mazex b32a256db6 feat: add minio service configuration with sops secrets 2026-05-21 23:26:30 +02:00
marc c0528ef035 feat: add wireguard configuration and tools for macos 2026-05-21 23:12:26 +02:00
marc c3ecd84d9a feat: add wireguard configuration and image processing tools 2026-05-21 23:12:26 +02:00
mazex 2fe858c2b7 fix: update zitadel admin user configuration 2026-05-21 22:39:30 +02:00
mazex 1f19306a12 feat: add wireguard vpn service with encrypted secrets 2026-05-21 22:39:27 +02:00
mazex f071a0ff57 feat: enable zitadel service with postgres configuration 2026-05-21 00:39:03 +02:00
mazex a8c0f106c5 chore: update anthropic api key path to use runtime secrets 2026-05-20 23:59:10 +02:00
mazex 8b92672ad0 zitadel 2026-05-20 23:50:11 +02:00
mazex 3ffd284256 refactor: switch from sopswarden to sops and adjust ssh config 2026-05-20 00:13:08 +02:00
mazex 38a356152e chore: update portfolio-optimizer flake lock 2026-05-20 00:13:05 +02:00
mazex 44e1ac6c7a refactor: clean up newt service config and add sops mode 2026-05-20 00:12:56 +02:00
mazex 9f4e4e7e77 fix: update run recipe to use RUN environment variable 2026-05-20 00:12:50 +02:00
mazex d3bb94919f style: remove extra spaces and fix formatting 2026-05-20 00:12:46 +02:00
mazex 7d25d23d7e chore: rotate tower age encryption key 2026-05-20 00:12:32 +02:00
marc f49aa580ca feat: add ptpython to python development tools 2026-05-19 18:26:53 +02:00
marc 0fc08f2125 chore: add python lsp ruff, keyboard config, nodejs package 2026-05-19 18:26:53 +02:00
marc 4da85889a4 refactor: deduplicate ssh config with wildcard match block 2026-05-19 18:26:53 +02:00
marc cc52458521 feat: add basedpyright to python home packages 2026-05-19 18:26:52 +02:00
marc f107653c57 feat: add run command to justfile 2026-05-19 18:26:52 +02:00
marc 1cdd87d34a feat: add tunnel ssh host configuration 2026-05-19 18:26:52 +02:00
marc 3541b154fe feat: add python module and update packages for mac home 2026-05-19 18:26:52 +02:00
marc cdda0f14a5 refactor: convert aerospace config to nix-based toml generation 2026-05-19 18:26:52 +02:00
marc f042994199 feat: add python home module with scientific packages 2026-05-19 18:26:52 +02:00
mazex f3d04a094e stolen laptop new sops.yaml 2026-05-19 18:21:05 +02:00
mazex 4be8942e1f fixing sops-nix common.yml 2026-05-19 18:20:13 +02:00
mazex 6c693f8570 chore(avante): switch provider to claude
Use the direct Claude API instead of the claude_code CLI tool.
2026-05-17 08:37:23 +02:00
mazex 5742e62d1f chore(zen-browser): disable enhancer for youtube extension 2026-05-17 08:37:15 +02:00
mazex b0061c6837 chore(gammastep): increase night brightness 2026-05-17 08:37:00 +02:00
mazex 057f569bd7 chore(tower): enable sops default file 2026-05-17 08:36:47 +02:00
mazex 67048b9926 feat(services): add wayvnc service 2026-05-17 08:36:36 +02:00
mazex fcd045f2b0 chore(systemd): update streamlit service configurations
Set `WorkingDirectory` for the backtest service.
Remove `STREAMLIT_BROWSER_GATHER_USAGE_STATS` env var from backtest.
Change `option-pricer` service port to 8503.
2026-05-17 08:36:27 +02:00
mazex d14ce19d22 feat(config): add financial tools and sops default
add modules for backtesting, portfolio optimization, and option pricing.
include `fjo` package.
set a default SOPS secrets file to `tower.yml`.
2026-05-17 08:36:08 +02:00
mazex 2c3f31a302 feat(zsh): add syu alias for user systemctl 2026-05-17 08:35:58 +02:00
mazex ff56b703f3 feat(flake): add new project flakes
Add `backtest`, `portfolio-optimizer`, and `option-pricer` as flake inputs.
Include `uv2nix` and `pyproject-nix` for Python project integration.
2026-05-17 08:35:41 +02:00
mazex 03dc6d9f54 feat(home-modules): add finance app modules
Adds home-manager modules for backtest, option-pricer, and portfolio-optimizer.
Each module configures the respective Streamlit dashboard as a systemd user service.
2026-05-17 08:35:26 +02:00
marc bb59444747 chore: simplify anthropic api key sops config 2026-05-02 18:26:30 +02:00
marc 2b2093f864 feat: add remote tower host and rename local tower host 2026-05-02 18:23:14 +02:00
marc bb4473a5e5 chore: disable zfs encryption and configure macos homebrew 2026-05-02 18:20:25 +02:00
marc 832aa91398 chore: update anthropic api key sops file path to mac.yml 2026-05-02 18:20:25 +02:00
marc 566a1341b9 feat: add lspsaga and avante configuration options 2026-05-02 18:20:25 +02:00
marc be64d37ac3 feat: add mac configuration to sops and home-manager setup 2026-05-02 18:20:24 +02:00
marc f0cf0beac3 chore: add encrypted secrets configuration for mac 2026-05-02 18:20:24 +02:00
mazex 49162b3ce0 sops: add mac key to common.yml recipients 2026-05-02 18:11:43 +02:00
marc 0f2ebbe8a6 fullscreen = alt+m 2026-05-02 16:47:04 +02:00
marc f842cd4efc home-mac + neovim 2026-05-02 16:46:26 +02:00
marc 817e1ec829 gpg-agent-mac 2026-04-28 04:09:58 +02:00
marc 38aa999490 fix-merge 2026-04-28 04:09:16 +02:00
mazex 13616517d5 chore: update sops key and configuration files 2026-04-23 15:36:58 +02:00
mazex bd6261a3c3 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-04-23 15:17:03 +02:00
mazex 6752115d95 pangolin that works 2026-04-23 15:16:58 +02:00
mazex 2581ed2278 chore: disable nixvim and neovim home modules in nix-on-droid 2026-04-23 04:13:57 +02:00
mazex e85fd40a2e chore: add qemu to nix-on-droid packages 2026-04-23 04:11:14 +02:00
mazex 2f42d2ab17 feat: enable eza, nixvim and neovim modules in nix-on-droid 2026-04-23 03:53:02 +02:00
mazex d636663be7 chore: uncomment packages in nix-on-droid configuration 2026-04-23 03:40:22 +02:00
mazex cd9c77e0d2 fix: use nix-on-droid's nixpkgs input for android config 2026-04-23 03:22:30 +02:00
mazex a3c5cbd531 chore: remove unused overlay and comment out packages 2026-04-23 03:20:11 +02:00
mazex 846643ebb8 chore: comment out gh package in nix-on-droid config 2026-04-23 03:04:55 +02:00
mazex e5e65d87ff chore: comment out nixvim package in nix-on-droid config 2026-04-23 02:56:27 +02:00
mazex 6f96de5e66 feat: add pinentry-curses overlay for aarch64-linux 2026-04-23 02:55:42 +02:00
mazex 2452206600 fix: remove pinentry overlay and correct state version 2026-04-23 02:46:09 +02:00
mazex 82c4fdfc2f chore: comment out home-manager.useUserPackages setting 2026-04-23 02:42:18 +02:00
mazex 855089bed4 chore: comment out home-manager.useGlobalPkgs option 2026-04-23 02:36:56 +02:00
mazex f986808d5b refactor: switch home-manager config to legacy approach for nix-on-droid 2026-04-23 02:35:48 +02:00
mazex 8dc1405b72 refactor: update home-manager config structure and nixvim setup 2026-04-23 02:33:34 +02:00
mazex 19af5c37a6 refactor: update nixvim configuration to use makeNixvimWithModule 2026-04-23 02:31:38 +02:00
mazex e51f2dd3a3 feat: add pinentry-curses overlay for nix-on-droid 2026-04-23 02:27:03 +02:00
mazex c9bc2b3052 chore: comment out gpg-agent pinentry configuration 2026-04-23 02:20:52 +02:00
mazex bffd326244 Merge branch 'master' of github.com:marcpartensky/nixos 2026-04-23 02:17:52 +02:00
mazex ef5be605aa nix-on-droid 2026-04-23 02:17:27 +02:00
mazex 9040111731 reducing size and adding pangolin support 2026-04-23 01:22:41 +02:00
mazex 9c5bfdbe3f zfs is too heavy 2026-04-23 01:22:22 +02:00
mazex daf2915b95 refactoring 2026-04-22 22:31:00 +02:00
mazex 1c89cc6b65 reduce anywhere size and flake refactoring 2026-04-22 22:29:41 +02:00
mazex 71d93060d3 feat: add autossh service configuration for rack tunnel 2026-04-22 04:22:58 +02:00
mazex adcb88f070 refactor: move anywhere modules to dedicated configuration file 2026-04-22 04:15:59 +02:00
mazex 0779764e34 chore: re-encrypt secrets with new tower age key 2026-04-22 04:09:15 +02:00
mazex 2b91c13883 vaultwarden 2026-04-22 03:40:45 +02:00
mazex d566e42635 chore: add newt_env secret and refactor service configs 2026-04-22 03:14:54 +02:00
mazex 9fde2bc9a5 feat: enable firewall with allowed tcp ports for tower 2026-04-22 03:07:34 +02:00
mazex 48f30b1fb0 chore: add encrypted nextcloud and wifi credentials 2026-04-22 03:07:23 +02:00
mazex 850befe5ed feat: add geminicommit module to marc's home configuration 2026-04-18 19:28:59 +02:00
mazex a228b5c178 chore: update encrypted secrets and age recipients 2026-04-18 19:28:54 +02:00
mazex 556b5ed50b chore: move sops default file to common profile 2026-04-18 19:28:48 +02:00
mazex f1ee4b0dae style: format nix files and consolidate linux-specific configs 2026-04-18 19:28:27 +02:00
marc 546f5588a5 macos and linux? 2026-04-18 18:46:27 +02:00
mazex d0647362e8 common.yml for secrets 2026-04-16 05:22:19 +02:00
mazex b2eb5dd03b wallpaper module doesnt bother with no wayland display available on home manager 2026-04-16 05:22:04 +02:00
mazex 39f815a616 watt-monitor has battery? 2026-04-16 04:52:44 +02:00
mazex 758bfb61c3 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-04-16 04:45:35 +02:00
mazex 53c3332a59 Merge branch 'master' of github.com:marcpartensky/nixos 2026-04-16 04:45:27 +02:00
mazex 7024f85688 clever batsignal module 2026-04-16 04:45:20 +02:00
mazex 4efdbcad80 home.nix for root 2026-04-16 04:44:49 +02:00
mazex 3316001bc6 feat(ssh): add tower host to ssh config 2026-04-16 04:31:14 +02:00
mazex 043cef29f3 refactor(zsh): use eza for ls aliases
Update `ls`, `ll`, and `la` aliases to utilize `eza`, a modern replacement for `ls`.
2026-04-16 04:24:35 +02:00
mazex 8b663580e5 eza 2026-04-16 04:22:07 +02:00
mazex efbdedda23 refactor(nixos): update profile imports and sops config 2026-04-16 04:18:37 +02:00
mazex fb32257645 refactor(config): introduce common NixOS profile
Move shared system modules and settings from host-specific
configurations into `profiles/common/default.nix`.
Rename `profiles/laptop/packages.nix` and `profiles/laptop/user.nix`
to `profiles/common/packages.nix` and `profiles/common/user.nix`.
Simplify host-specific configurations and extract root user's
home-manager setup to `users/root/default.nix`.
2026-04-16 04:11:20 +02:00
mazex f5caf063bf home manager only by one user not by machine and profiles/tower 2026-04-16 03:48:51 +02:00
mazex 98eac320ad inputs.modules.*** in user/marc/home.nix 2026-04-16 03:43:52 +02:00
mazex d1be955dde feat(zen-browser): add PWA creation helper and youtube PWA
Introduce `mkPWA` function to simplify creating Progressive Web App
desktop items using `firefoxpwa`.
Also adds `browser.tabs.unloadOnLowMemory` and
`browser.ctrlTab.sortByRecentlyUsed` preferences.
2026-04-16 03:03:29 +02:00
mazex 42691a6445 feat(home-manager): add marc@tower configuration
Adds a dedicated Home Manager configuration for user 'marc' on the 'tower' host, integrating various modules like nixvim, niri, and sops.
Also reorders the 'tower' system definition for better organization.
2026-04-16 02:55:23 +02:00
mazex d320009205 feat(laptop): add alacritty and fuzzel
Add new terminal emulator and application launcher.
Refactor package list formatting for improved readability.
2026-04-16 02:31:57 +02:00
mazex 5295ad4147 chore(install): comment out nix-shell command 2026-04-16 02:14:35 +02:00
mazex 1c6ca09fb2 chore(install): remove root and clone setup steps 2026-04-16 02:13:45 +02:00
mazex 4e41737c2f chore(install): set download buffer and simplify script
Adds `--option download-buffer-size` to `nixos-install` for more reliable package downloads.
Simplifies and translates comments from French to English for better clarity.
2026-04-16 02:11:08 +02:00
mazex 3ea637ab84 feat(install): add NixOS installation script
Automates the initial NixOS setup, including disk partitioning with disko, hardware config generation, and installation.
Increases /tmp and /run/nixos buffer size to prevent "No space left on device" errors during flake evaluation.
2026-04-16 02:08:39 +02:00
mazex cdb0c0938b chore(nixos): disable sops module 2026-04-16 01:31:38 +02:00
mazex 3814fe90d9 feat(nixos): add sopswarden module 2026-04-16 01:31:13 +02:00
mazex 55d744a2e5 feat(sops): add sops nixos module 2026-04-16 01:30:36 +02:00
mazex f8321af860 build(nixos): enable home-manager module
Uncomments and adds the home-manager module to both laptop and tower NixOS configurations.
2026-04-16 01:30:00 +02:00
mazex 185a1359f1 chore(flake): remove marc user config import 2026-04-16 01:28:38 +02:00
mazex 7805279c25 refactor(nixosConfig): update host configuration imports
Replaced tower's hardware configuration with a disko module.
Added the hardware configuration import for the laptop host.
2026-04-16 01:24:12 +02:00
mazex 88d1efca90 feat(tower): add disko configuration
Configures `/dev/nvme0n1` with GPT, ESP, encrypted swap, and a ZFS pool.
Sets up ZFS datasets for root (encrypted), nix, and user home directories.
2026-04-16 01:22:41 +02:00
mazex 0f3ae40b31 feat(nixos): add disko module 2026-04-16 01:19:06 +02:00
mazex b0f03a6d8f chore(flake): disable home-manager module 2026-04-14 20:13:43 +02:00
mazex f0baa001ed feat: add discord and signal-desktop to marc's home packages 2026-04-14 20:11:40 +02:00
mazex 91d0c247e9 feat(zsh): add la and clc aliases, update ll
Adds `la` for `ls -a` and `clc` for `claude-commit`.
Updates the `ll` alias to use `ls -la` to include hidden files.
2026-04-08 03:40:47 +02:00
mazex 2e816a288a feat: integrate anthropic api key with sops-nix encryption 2026-04-08 03:32:03 +02:00
mazex 4dc4e3cd6f feat: add claude-commit tool for ai-generated commit messages 2026-04-08 03:30:48 +02:00
mazex fe18ca87bf feat(home): add unzip package 2026-04-08 02:44:02 +02:00
mazex 5162a8848f nix develop -c zsh is too long 2026-04-07 22:40:31 +02:00
mazex f170d933a7 avante 2026-04-07 22:40:10 +02:00
mazex 6414e45649 fix(eww): prevent bar from shifting applications
The bar's `:exclusive` property is now set to `false`, allowing other windows to utilize the full screen height without being pushed down.
Increased bar height and horizontal padding to improve visual integration with this new behavior.
2026-04-02 04:06:37 +02:00
mazex ac0aa87ee1 feat(ironbar): add status bar module
Integrates the ironbar status bar with a comprehensive configuration,
custom styling for a hover-to-show effect, and a systemd user service
for automatic startup.
2026-04-02 03:55:14 +02:00
mazex c06e083551 feat(home): add invidious package 2026-04-02 02:10:53 +02:00
mazex c7885b4e38 feat(music): add music players and ytui-music module
Introduce a new Home Manager module for ytui-music, including its
configuration and a wrapper script. Also adds Spotube (Flatpak),
ytermusic, ncspot, and spotify-player to user packages.
2026-04-02 01:47:08 +02:00
mazex 70ebb0328f feat(home): add various packages and ventoy setup 2026-04-02 00:16:25 +02:00
mazex 957dbe9c86 feat(justfile): add ventoy recipe and enhance install command
The `install` recipe now accepts a `device` argument for `disko` and
includes the `nixos-install` step to complete the system setup.

A new `ventoy` recipe is added to prepare a Ventoy USB drive, install
Nix, and configure the disk using `disko`.
2026-04-02 00:16:13 +02:00
mazex 39b42ee387 chore(deps): update nix flake dependencies 2026-04-02 00:15:59 +02:00
mazex 24d0afb55f fix(justfile): quote disko command in install recipe 2026-03-19 16:46:53 +01:00
mazex 12c4318084 feat(justfile): add disko install recipe
Adds a new `install` recipe to the Justfile that uses `disko`
to partition and install the system based on the `.#laptop` config.
2026-03-19 16:42:50 +01:00
mazex 6cab0d2f7b feat(iso): add dedicated laptop ISO configuration
Introduce a dedicated `laptop-iso` NixOS configuration in `flake.nix` for building a bootable ISO image. The `Justfile` is updated to target this new configuration, and `*.iso` is added to `.gitignore`. Also adds `vm.overcommit_memory` to the ISO module.
2026-03-19 15:51:38 +01:00
mazex eb310b24d4 feat(nix): add automatic store optimization 2026-03-19 15:28:39 +01:00
mazex 406b18a68d feat(eternal-terminal): add eternal terminal service
Configures the Eternal Terminal server and opens the necessary port in the firewall.
2026-03-19 11:39:57 +01:00
mazex bdade5b8e0 feat(home): add joplin, eternal-terminal, and zellij 2026-03-19 11:38:57 +01:00
mazex bde897aced feat(chhoto): add url shortener service
Integrates the chhoto-url shortener as a new service.
This includes its NixOS module, SOPS secrets, and Traefik routing.
2026-03-19 11:29:43 +01:00
mazex dcb03c97c1 feat(rqbit): add user option and systemd config
Allows specifying the user for the rqbit service.
Includes commented-out systemd `RestrictAddressFamilies` for future use.
2026-03-16 22:05:33 +01:00
mazex 7b0426077b chore(users/marc): enable ib-tws, obsidian, and logseq 2026-03-12 19:24:20 +01:00
mazex b6923ff7fc feat(xdg): add desktop entry for Interactive Brokers TWS 2026-03-12 19:22:45 +01:00
mazex 61b77391ad feat(zsh): add wm alias for watt-monitor 2026-03-12 16:54:21 +01:00
mazex 0bcd429225 feat(steam): add steam-run and steam-unwrapped
Adds `steam-run` to home.packages and both `steam-run` and `steam-unwrapped` to
nixpkgs.config.permittedInsecurePackages to enable their installation.
2026-03-12 16:54:15 +01:00
mazex 2c7949335f feat(qbittorrent): enable webui subnet whitelist
Configure qBittorrent WebUI to use a subnet whitelist for authentication,
allowing access from localhost without requiring a password.
The hardcoded PBKDF2 password has been commented out.
2026-03-12 15:58:06 +01:00
mazex 84df542306 feat(tewi): add tewi torrent client
Introduces the tewi text-based torrent client.
Defines its Nix package, including the geoip2fast dependency,
and integrates it into the home-manager configuration for user marc.
2026-03-12 15:50:51 +01:00
mazex bc49c97b0f chore(packages): comment out librechat package 2026-03-12 15:07:32 +01:00
mazex 804af595fe chore(home-packages): replace oboete with librechat 2026-03-12 15:01:55 +01:00
mazex 355d583b1b feat(home): add oboete package 2026-03-11 15:46:52 +01:00
mazex 83c9a6e3cf refactor(networking): use declarative nm profiles
Switches to NetworkManager's 'ensureProfiles' for Wi-Fi configuration.
Generates a single .env file with all Wi-Fi PSKs, which NetworkManager reads.
This simplifies configuration and removes custom UUID generation.
Updates the 'sanitize' function to replace dots in SSIDs, requiring a secret name change.
2026-03-11 02:07:55 +01:00
mazex 28a69f6166 feat(services): add rqbit service 2026-03-11 02:07:30 +01:00
mazex 16c84f7a93 chore(home-manager): add memorado, disable stig 2026-03-11 02:07:09 +01:00
mazex 0f597c33fe feat(rqbit): configure download directory 2026-03-11 02:06:57 +01:00
mazex f6923d0566 chore(flake): update inputs and add rqbit service
Refreshes all flake inputs to their latest versions.
Introduces the rqbit torrent client as a new system service.
Temporarily disables catppuccin and clawdbot modules in flake.nix.
2026-03-11 02:06:33 +01:00
mazex 67b74275c9 feat(home-manager): add rqbit and stig, remove mochi and logseq
Remove mochi due to it being buggy.
2026-03-10 23:17:09 +01:00
mazex 62024ab1da refactor(deepfilter): use rustPlatform.buildRustPackage for deep-filter-cli
Switch from `overrideAttrs` to `pkgs.rustPlatform.buildRustPackage` for building `deep-filter-cli`. This provides a more idiomatic and robust way to package Rust applications in Nix, including proper `cargoHash` handling.
2026-03-05 14:48:28 +01:00
mazex 9df45b7fbf refactor(deepfilter): move configuration to module 2026-03-05 14:19:09 +01:00
mazex b6fd47567c feat(zen-browser): enable bitwarden firefox extension 2026-03-05 14:19:03 +01:00
mazex c5a2353e98 feat(niri): increase volume step to 2% 2026-03-05 14:18:54 +01:00
mazex 344a2a7c6e feat(deepfilter): add deep-filter-cli home-manager module
Provides a home-manager module for `deep-filter-cli`.
Overrides `deepfilternet` to disable failing tests and add
required build inputs for `hdf5` and `alsa-lib`.
2026-03-05 14:18:43 +01:00
mazex e4ef6de832 feat(home): add zathura plugins and new packages
Configure Zathura with PDF (Poppler, MuPDF) and PostScript plugins.
Enable recoloring with hue preservation.
Add deepfilternet and pdfarranger to user's home packages.
Remove zathura from direct home packages as it's now managed
via its dedicated module.
2026-03-04 01:14:48 +01:00
mazex 295c9e6cd1 style(niri): reformat Nix configuration for consistency
Adjust indentation and add newlines to improve readability and align with Nix formatting conventions.
2026-02-25 17:02:40 +01:00
mazex 6fd6ef42c7 chore(zen-browser): disable bitwarden extension 2026-02-24 11:12:10 +01:00
mazex 65e4b51216 feat(watt-monitor): add watt monitor module and service
Introduces a new Home Manager module for `watt-monitor`.
This module builds the Rust application, adds it to the user's packages,
and configures a systemd user service to run it as a background daemon.
2026-02-20 17:01:02 +01:00
mazex bf8acdda4e Merge branch 'master' of github.com:MarcPartensky/nixos 2026-02-18 17:38:59 +01:00
mazex 8eba18a78c chore(home): disable qbittorrent package
Redundant due to functionality provided by firefoxpwa.
2026-02-18 17:38:53 +01:00
mazex 29de740d0e feat(services): add flaresolverr import 2026-02-18 17:38:26 +01:00
mazex ff68c2fd7f chore(flaresolverr): use openFirewall option
Remove explicit port setting as `openFirewall` handles it.
2026-02-18 17:38:15 +01:00
mazex ff92e4f507 feat(flaresolverr): add initial service configuration 2026-02-18 17:38:00 +01:00
mazex 926581ea90 nextcloud apps 2026-02-13 18:04:24 +01:00
mazex 06aa456ec1 anywhere defaultSopsFile 2026-02-13 16:14:26 +01:00
mazex 1cb800966a Merge branch 'master' of github.com:MarcPartensky/nixos 2026-02-13 16:01:26 +01:00
mazex 7ba4ab8a71 trusted domains extra apps 2026-02-13 16:01:19 +01:00
mazex 305f483047 chore(deps): add playwright and adjust python env
Adds playwright to both python and cli packages.
Overrides weasel in python environment to skip runtime dependency checks.
Removes typer, piper, your_spotify, and kokoro packages.
2026-02-11 16:39:26 +01:00
mazex c250261689 feat(laptop): add nix-ld configuration
Enable nix-ld to allow running non-Nix binaries.
Includes minor formatting improvements.
2026-02-11 16:39:13 +01:00
mazex 5eef468e0f feat(zsh): add syrn alias for NetworkManager 2026-02-11 16:06:33 +01:00
mazex 5b970e9bf1 chore(anywhere): remove unused python packages 2026-02-09 23:32:53 +01:00
mazex 9807b61fc6 feat(python): add data science and edge-tts packages
Add a Python environment with common data science libraries (numpy, pandas, matplotlib, scipy, scikit-learn, jupyterlab, ipython, requests, pillow) and edge-tts.
2026-02-09 23:32:37 +01:00
mazex c2992ed8e3 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-02-05 06:07:37 +01:00
mazex 628fc4e682 refactor(networking): standardize wifi secret and connection naming
Introduces a 'getSecretName' helper for consistent naming of Wi-Fi
secrets and NetworkManager connection files. Updates existing
network definitions to use this new scheme.

Removes redundant 'wireless.iwd' configuration.
Adds "Wifi de Marc 2.4G" to the list of managed networks.

BREAKING CHANGE: Wi-Fi secret names have changed for some networks
(e.g., 'wifi_de_marc' is now 'wifi_wifi_de_marc'). Existing secrets
in 'secrets/laptop.yml' must be updated to reflect the new convention.
2026-02-05 06:07:30 +01:00
mazex d53f889c78 feat(networking): automate wifi network configuration
Define Wi-Fi networks in a list to automatically generate NetworkManager
connection profiles and sops secret placeholders. This simplifies
managing multiple Wi-Fi networks and their credentials.
2026-02-05 05:53:10 +01:00
mazex 1ed17c02d3 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-02-04 12:04:17 +01:00
mazex ecb78588b4 nextcloud untrusted 2026-02-04 12:04:12 +01:00
mazex fc453ab7ac feat(gtk): configure catppuccin and libreoffice theming
Explicitly configure Catppuccin GTK theme with rimless and black tweaks.
Extend Catppuccin theming to Zathura and Spotify Player.
Integrate Catppuccin themes for LibreOffice and update VCL plugin to GTK4.
Add `gnome-themes-extra`, `arc-theme`, and `dracula-theme` packages.
Include a desktop entry for LibreOffice Calc with Dracula theme.
2026-02-04 11:11:03 +01:00
mazex 233c53842a spicetify exts 2026-02-04 03:22:34 +01:00
mazex faff071d01 feat(spicetify): add spicetify integration
Integrates the `spicetify-nix` flake for Spotify customization.
Enables extensions like adblockify, hidePodcasts, and shuffle.
Sets the defaultDynamic theme and removes the old `spotify-adblock` package.
2026-02-04 03:00:42 +01:00
mazex 9a3c32e898 anywhere 2026-02-04 00:20:38 +01:00
mazex 3ef1cf83f0 anywheregp 2026-02-04 00:17:59 +01:00
mazex 373375aa09 sops 2026-02-04 00:11:37 +01:00
mazex b2c695baf7 sops anywhere 2026-02-04 00:09:19 +01:00
mazex 3d62d1af8a secrets 2026-02-04 00:04:21 +01:00
mazex a9eb56fd3a modules 2026-02-04 00:00:10 +01:00
mazex 489e302bd6 modules 2026-02-03 23:57:42 +01:00
mazex 63d6d97a19 modules 2026-02-03 23:57:09 +01:00
mazex 9d6d6af845 droid 25.11 2026-02-03 23:56:15 +01:00
mazex 3f671f60ad pinentry 2026-02-03 23:55:12 +01:00
mazex d512be6a36 droid 2026-02-03 23:52:37 +01:00
mazex 5181b0da8c anywhere 2026-02-03 23:50:30 +01:00
mazex 67c0858c50 nvim checkhealth dependencies 2026-02-03 23:39:41 +01:00
mazex 3adc50c1f7 no 24 2026-02-03 23:34:30 +01:00
mazex fac4371edc nix-on-droid-master-unstable 2026-02-03 23:21:29 +01:00
mazex b319228b14 hm 25.11 in droid 24.05 back 2026-02-03 23:17:13 +01:00
mazex ed8aaf2644 nvim 2026-02-03 23:15:21 +01:00
mazex 6f4a9e4938 zsh 2026-02-03 23:09:17 +01:00
mazex f0f3a2802e ripgrep 2026-02-03 23:08:51 +01:00
mazex 39ef6d14f0 gemini 2026-02-03 23:06:16 +01:00
mazex c45bfa4627 gemini 2026-02-03 23:05:54 +01:00
mazex be1d656e0e droid 2026-02-03 23:04:30 +01:00
mazex 6b8fd21935 droid 2026-02-03 23:02:29 +01:00
mazex a1bbc5c435 droid 2026-02-03 23:00:29 +01:00
mazex 320054c907 droid 2026-02-03 22:58:31 +01:00
mazex ff801f9891 droid 2026-02-03 22:57:06 +01:00
mazex a622c911bf 24.05 is back again 2026-02-03 22:53:19 +01:00
mazex f08a99c5e0 pinentry 2026-02-03 22:20:19 +01:00
mazex ae5c24fe4d pinentry 2026-02-03 22:13:59 +01:00
mazex 33e56ef840 24.05 is back 2026-02-03 22:12:16 +01:00
mazex e0354fdffc 24.05 is back 2026-02-03 22:11:44 +01:00
mazex 0af1c8316c 25.11 msater droid 2026-02-03 22:09:11 +01:00
mazex 2df60dfad6 25.11 droid 2026-02-03 22:06:36 +01:00
mazex 3b5342fb81 no zsh 2026-02-03 22:05:15 +01:00
mazex d4ef20c91b no ssh 2026-02-03 22:03:12 +01:00
mazex e7f39f2669 nogit 2026-02-03 22:02:39 +01:00
mazex c262d408a7 chore(nix-on-droid): comment out environment.pathsToLink 2026-02-03 22:01:15 +01:00
mazex da77e829e8 refactor(home-manager): update config for nix-on-droid
Switches to direct home-manager configuration using `home-manager.config`
instead of the `users.root` block. The global NixOS module is disabled.
2026-02-03 22:00:36 +01:00
mazex edccda75eb feat(nix-on-droid): add fastfetch and enable home manager
Integrates Home Manager by setting global and user package usage.
Also adds the fastfetch utility to system packages.
2026-02-03 21:58:30 +01:00
mazex ff10ed2724 chore(flake): make inputs available to nixos modules 2026-02-03 21:56:09 +01:00
mazex 10d773b69d refactor(flake): remove unused specialArgs from nix-on-droid config 2026-02-03 21:55:10 +01:00
mazex b7e7fc0157 chore(flake): pass inputs to nixos modules
Make flake inputs available as `specialArgs` to NixOS modules.
2026-02-03 21:54:39 +01:00
mazex 0307262df2 chore(nix-on-droid): link /share/applications and xdg-desktop-portal 2026-02-03 21:52:46 +01:00
mazex 2d85b3490a feat(nixos): add home-manager module 2026-02-03 21:51:38 +01:00
mazex bfecbb78d4 feat(zsh): add just nixos and droid aliases 2026-02-03 21:48:18 +01:00
mazex f053be25fc feat(nix-on-droid): configure root user home-manager
Adds home-manager setup for the root user, importing modules for Neovim, Zsh, Git, SSH, and GitHub CLI.
Also adds `bat` and `exa` to `environment.systemPackages`.
2026-02-03 21:47:01 +01:00
mazex 2c9827136a feat(nix-on-droid): add tmate to system packages 2026-02-03 21:34:36 +01:00
mazex 1e2123fe4b feat(nix-on-droid): add gemini-cli to system packages 2026-02-03 21:31:45 +01:00
mazex 2a2d5a6593 chore(nix-on-droid): disable pangolin package 2026-02-03 21:31:30 +01:00
mazex 8c524ea1de chore(nix-on-droid): disable postgres and nextcloud services 2026-02-03 21:30:47 +01:00
mazex 5941b982b6 feat(nextcloud): enable nextcloud service 2026-02-03 20:55:22 +01:00
mazex 00e8d37559 chore(nextcloud): update hostname to include port
Removes outdated and redundant comments from the configuration file.
2026-02-03 20:53:43 +01:00
mazex 87ed8846da feat(sops): add laptop key and integrate nextcloud secrets
Adds a new age key for the laptop to `.sops.yaml` and re-encrypts secrets.
Configures Nextcloud to retrieve credentials via SOPS and use a PostgreSQL Unix socket.
Removes Minio object storage configuration from Nextcloud.
Temporarily disables the dnscrypt service.
2026-02-03 20:51:42 +01:00
mazex b0fedf75e9 feat(secrets): add sops-encrypted environment secrets
Introduces `anywhere.yml` and `laptop.yml` containing encrypted credentials for services like Stalwart, Nextcloud, WiFi, and Vaultwarden.
These secrets are managed using SOPS with Age encryption.
2026-02-03 19:43:21 +01:00
mazex 2007a3e98b feat(users): add ydotool to user extra groups 2026-02-03 19:37:56 +01:00
mazex 80de3ce7f9 feat(geary): add required dependencies 2026-02-03 19:37:48 +01:00
mazex caf53fd009 chore(home): add img2pdf, set mpv default, disable modules 2026-01-30 13:39:50 +01:00
mazex c5404e235e feat(clawdbot): add home-manager module
Enables the clawdbot program and configures a default instance.
Most first-party modules are disabled by default.
2026-01-29 02:39:20 +01:00
mazex a8129e1a46 feat(nix): add clawdbot flake input and module
Integrates the `clawdbot/nix-clawdbot` flake as a new input.
This includes its overlay for packages and its home-manager module
for user configurations.
2026-01-29 02:39:02 +01:00
mazex 2d16ec3ba2 feat(ydotool): enable ydotool program 2026-01-29 02:37:58 +01:00
mazex c7488fe00f chore(zathura): disable explicit color options
Comment out recolor and default color settings.
2026-01-29 02:37:43 +01:00
mazex 9b338d95b1 chore(zsh): disable auto cd to nixos repo 2026-01-29 02:37:35 +01:00
mazex 7b56a31ac3 feat(neovim): add yuck filetype and python lsp support
Enables `yuck` filetype detection and Tree-sitter highlighting.
Configures `pyright` and `pylsp` for Python language services.
2026-01-29 02:37:25 +01:00
mazex 1363267dbe feat(eww): add scrolling ticker to bar
Implement a dynamic scrolling text ticker in the center of the Eww bar.
This includes new SCSS for animation and fading effects, and Yuck updates
to integrate the ticker content and layout. Also renames some classes.
2026-01-27 02:55:35 +01:00
mazex 67422fefb4 feat(eww): add bluetooth and battery status to bar 2026-01-27 01:02:54 +01:00
mazex c8048a3759 style(niri): increase default column width 2026-01-26 23:53:26 +01:00
mazex 2a8e7f6469 feat(niri): add Mod+Y keybind and adjust default column width 2026-01-25 01:27:35 +01:00
mazex 8e005af8a3 style(clipcat): remove unnecessary blank line in daemon settings 2026-01-25 01:12:57 +01:00
mazex 6b83af615e feat(home): add document tools, media apps, and modules
Integrates pandoc, texlive, zathura, zettlr, and your_spotify.
Also adds batsignal and playsched home-manager modules.
Removes psst and clipcat.
2026-01-25 01:11:19 +01:00
mazex 4364629115 chore(gitignore): refine sops secret ignore rules
Explicitly ignore temporary decrypted secret files (.dec, .unencrypted).
Clarify that .sops.yml and encrypted .yml files should be committed.
2026-01-25 01:10:55 +01:00
mazex 82c4a32891 docs(flake): clarify sops module inclusion 2026-01-25 01:10:09 +01:00
mazex 7683f15798 build(nixos): add --impure flag to rebuild command
The --impure flag allows the command to access environment variables.
2026-01-25 01:10:00 +01:00
mazex 89ebe46f1d feat(xdg): set zathura as default pdf viewer 2026-01-25 01:09:34 +01:00
mazex 12327cf4fe feat(niri): add Mod+T to set column width to 50% 2026-01-25 01:09:26 +01:00
mazex 45277abe16 feat(playsched): add playsched home-manager module
This module integrates the playsched application, a Spotify playlist scheduler.
It provides `playsched-web` for the web interface and `playsched-cli` for command-line control, along with all required Python dependencies.
2026-01-25 01:09:10 +01:00
mazex 2af9deba0c feat(zathura): add zathura program configuration
Enable zathura and configure it with dark mode defaults and clipboard selection.
2026-01-25 01:08:45 +01:00
mazex cacafaff1e feat(zen-browser): add sidebery extension, disable tabliss 2026-01-25 01:08:32 +01:00
mazex 5467cabc1f feat(zsh): add ipython alias 2026-01-19 23:31:19 +01:00
mazex cb5e77d9f9 feat(ipython): add vi editing mode configuration
Configure IPython to use vi keybindings in the terminal.
This creates `ipython_config.py` to set `editing_mode = 'vi'` and
`emacs_bindings_in_vi_insert_mode = False`.
Also removes unused `config` and `pkgs` module arguments.
2026-01-19 23:30:46 +01:00
mazex e049cdc231 chore(qbittorrent): enable torrenting port 2026-01-19 23:30:31 +01:00
mazex 082a6b9c28 new password 2026-01-17 01:33:25 +01:00
mazex 66cb7bbaf2 feat(power-management): enable power profiles daemon 2026-01-17 01:10:55 +01:00
mazex a66a5c283f niri-reset 2026-01-15 19:51:30 +01:00
mazex a3cfd37378 batsignal that works 2026-01-15 19:00:49 +01:00
mazex 0bf4adcf60 feat(gammastep): add day and night brightness settings
Configure screen brightness for day and night.
2026-01-15 18:32:46 +01:00
mazex 5e3885c1a0 git status warning fix 2026-01-15 18:32:36 +01:00
mazex faf8250a85 feat(desktop): add electron mail entry and niri csd option
Adds a desktop entry for Electron Mail with Wayland and dark mode flags.
Configures Niri to prefer no client-side decorations.
Removes commented-out xdg.portal configuration.
2026-01-15 17:39:50 +01:00
mazex 035d920b0e feat(gtk): enhance portal integration and theme consistency
set Niri's xdg-portal default to 'gtk' and disable generic portal config.
add `ADW_DISABLE_PORTAL` and `SAL_USE_VCLPLUGIN` for improved GTK app behavior.
enable Beeper desktop entry and clean up unused comments.
2026-01-15 17:25:35 +01:00
mazex 0ad0b944d8 refactor(nixvim): improve default module structure
Move imports block to top level for better module organization.
Remove unused `selectOpts` variable.
Fix missing closing brace for the `plugins` block.
2026-01-15 16:12:00 +01:00
mazex d01f5fbfdf niri open on workspace apps 2026-01-15 16:11:33 +01:00
mazex 10ab496d11 feat(neovim): add core plugins and restructure config
Introduce nvim-cmp for completion, nvim-lspconfig for LSP, and conform.nvim for formatting.
Refactor existing UI plugins (lualine, neo-tree, onedark) into plugins/ui.nix for better organization.
Enable avante plugin.
2026-01-15 01:04:49 +01:00
mazex f0d89785bf feat(zsh): set default editor to nvim 2026-01-15 00:38:47 +01:00
mazex 213bf2e1da chore(sops): add sops configuration
This initializes sops with an age key and defines creation rules for
secrets in the 'secrets/' directory.
2026-01-15 00:38:06 +01:00
mazex a3572ad8b0 feat(home-manager): add clipcat module 2026-01-15 00:37:48 +01:00
mazex 2bcff70977 fix(wallpaper): prevent services from restarting on config changes 2026-01-15 00:37:22 +01:00
mazex 0f051545cf feat(clipboard): add clipcat manager and copy notification
Configures the `clipcat` service for clipboard history and a `clip-notify` service to show notifications on copy events.
Also sets `EDITOR` and `VISUAL` environment variables to `nvim`.
2026-01-15 00:36:48 +01:00
mazex 508b1671ef nextcloud 2026-01-14 23:35:37 +01:00
mazex 5ec0be8789 sops default file 2026-01-14 23:34:52 +01:00
mazex ea4480911a niri displays 2026-01-14 23:33:41 +01:00
mazex 8d90b22d75 gc 2026-01-14 01:40:27 +01:00
mazex ef5569e91e feat(home): add direnv and gemini tools 2026-01-14 01:38:02 +01:00
mazex 0ef3b7db1b polkit module nixos 2026-01-09 15:02:47 +01:00
mazex 35cc3e888b polkit 2026-01-09 14:59:59 +01:00
mazex 314a62a464 better screenshots in niri 2026-01-09 14:54:31 +01:00
mazex 5c10227ef2 scroll project tools 2026-01-08 17:19:50 +01:00
mazex af2e98ea38 cd ~/git/nixos 2026-01-06 01:43:47 +01:00
mazex aeac2f1440 cmd + vim bindings and auto-wallpaper 2026-01-06 01:43:31 +01:00
mazex daaab2904e flatpak 2026-01-06 00:32:06 +01:00
mazex 56f80e8024 wpaperd 2026-01-06 00:31:44 +01:00
mazex 6f26b38ee7 wallpapers 2026-01-06 00:31:28 +01:00
mazex fde36e8571 tor browser in container but seems too annoying to use 2026-01-03 23:14:47 +01:00
mazex e722902932 show thumbnails in nautilus doesnt seem to work 2026-01-03 23:14:20 +01:00
mazex a6162b68e4 git rebase false 2026-01-03 23:11:39 +01:00
mazex 513c7de3c4 tor browser extension 2026-01-03 23:10:51 +01:00
mazex 0f52e2687b dlp-alias 2026-01-03 15:48:56 +01:00
mazex dc74e1eedb yt-dlp options 2026-01-03 15:47:12 +01:00
mazex 5a92132d35 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-01-03 13:46:25 +01:00
mazex 01ff07603a xwayland that works for libreoffice --calc support 2026-01-03 13:46:00 +01:00
mazex 98a8a7f198 no hyprland needed 2026-01-03 00:11:18 +01:00
mazex 8198d6654c speedtest-go is good 2026-01-02 23:58:06 +01:00
mazex ca8a15d236 removed useless modules/nixos/zsh 2026-01-02 23:57:56 +01:00
mazex 9fc3fabb79 clean legacy anywhere 2026-01-02 23:57:35 +01:00
mazex 96986d8a0b fix anywhere with home manager root 2026-01-02 23:49:42 +01:00
mazex 79510276e9 fix anywhere with home manager root 2026-01-02 23:43:44 +01:00
mazex b4ec3f6b6b fix anywhere with home manager root 2026-01-02 23:41:40 +01:00
mazex 71391bf623 home-manager for root 2026-01-02 23:38:41 +01:00
mazex 98bfddee1c neovim root 2026-01-02 23:16:44 +01:00
mazex 95a476e628 anywhere home manager 2026-01-02 23:12:29 +01:00
mazex 2064aed45e sql-db-ui 2026-01-02 22:51:29 +01:00
mazex f31596fa45 tor 2026-01-02 22:51:13 +01:00
mazex f1a63caeb7 tor 2026-01-02 22:51:06 +01:00
mazex 22badcd009 navidrome + feishin = banger 2026-01-02 21:43:40 +01:00
mazex 49acc7fa5a navidrome 2026-01-02 21:21:37 +01:00
mazex 63ef467437 feishin, harmonoid, spotdl 2026-01-02 21:11:19 +01:00
mazex 4e09760e6c neovim rack 2026-01-02 18:00:35 +01:00
mazex 6837cfe4e4 neovim rack 2026-01-02 17:58:10 +01:00
mazex 92f38eefa6 hyprland flakes are no longer necessary with function niri 2026-01-02 17:53:35 +01:00
mazex c133d4442d hyprland flakes are no longer necessary with function niri 2026-01-02 17:51:30 +01:00
mazex e080d5e592 stalwart secrets 2026-01-02 17:40:18 +01:00
mazex e6b1cba87e onionshare 2026-01-02 17:33:21 +01:00
mazex 8857fbf007 tracer 2026-01-02 17:31:38 +01:00
mazex b4fa0bfe3b stalwart url 2026-01-02 17:28:26 +01:00
mazex ed2e0ea3d5 stalwart url 2026-01-02 17:11:11 +01:00
mazex b8db4fd306 stalwart 8090 traefik 2026-01-02 17:04:17 +01:00
mazex aedd60c554 stalwart url 2026-01-02 16:54:25 +01:00
mazex 87a1bda585 stalwart 8090 2026-01-02 16:44:22 +01:00
mazex 3e7b631b93 stalwart 8090 2026-01-02 16:37:43 +01:00
mazex cf9dd3b883 stalwart 8090 2026-01-02 16:37:13 +01:00
mazex 7f8842cd19 stalwart 2026-01-02 16:30:31 +01:00
mazex 7ba40c7f87 stalwart 2026-01-02 16:24:58 +01:00
mazex ab814635b1 ; 2026-01-02 16:23:19 +01:00
mazex 132d96842b stalwart 2026-01-02 16:22:04 +01:00
mazex f746b9fb82 bluetui > bluetuith 2026-01-02 15:42:46 +01:00
mazex 133a37cf1a startup apps 2026-01-02 15:31:57 +01:00
mazex f384304d0d clearer endpoint for newt 2026-01-02 15:14:21 +01:00
mazex 174f4cc8db more wayland hints for apps 2026-01-02 15:13:53 +01:00
mazex 1277ff67b9 sddm autologin no more greetd 2026-01-02 15:13:33 +01:00
mazex e3750fdaeb bluetooth autoconnect 2026-01-02 15:13:10 +01:00
mazex 6f0ffe6c79 sddm-autologin 2026-01-02 14:31:35 +01:00
mazex ba93d563e9 gdk backend 2026-01-02 14:18:35 +01:00
mazex a6e6dea607 xdg configuration, gnome 2026-01-02 12:48:22 +01:00
mazex 7dc61a5098 newt 2026-01-02 12:46:47 +01:00
mazex 5c7ac5feba xdg home manager 2026-01-02 12:46:37 +01:00
mazex b6c957064c xdg-nixos 2026-01-02 12:46:11 +01:00
mazex ba2e0cbc56 traefik 2026-01-02 11:18:27 +01:00
mazex adb649f177 traefik 2026-01-02 11:17:34 +01:00
mazex 14d63b21e3 traefik 2026-01-02 11:14:09 +01:00
mazex f7e134b5e7 newt-basic 2026-01-02 02:53:34 +01:00
mazex c0a6cad4a7 3002 2026-01-02 02:31:08 +01:00
mazex 853356336e mkdefault 2026-01-02 02:20:15 +01:00
mazex 1aba7579b6 pangolin 2026-01-02 02:16:28 +01:00
mazex 59d0f793db pangolin secret 2026-01-02 02:14:59 +01:00
mazex 1a7b43d852 test pangolin 2026-01-02 02:10:44 +01:00
mazex 1f89956eaa selected services in anywhere 2026-01-02 01:50:09 +01:00
mazex 3fe2da68a3 selected services in anywhere 2026-01-02 01:48:20 +01:00
mazex fe3b7f007b bluetooth 2026-01-01 15:00:49 +01:00
mazex dfeccdf66a nxbt 2026-01-01 15:00:42 +01:00
mazex bcd63ece58 readarr 2025-12-31 16:34:41 +01:00
mazex d0b7c9dcee silent zen non popups 2025-12-31 16:22:47 +01:00
mazex b28588c81f spd 2025-12-31 16:01:15 +01:00
mazex cd947d209f no proton pass, no relog at reboot 2025-12-31 16:01:03 +01:00
mazex 6895db8145 electron wayland 2025-12-31 15:39:50 +01:00
mazex 8dbd5b90e6 gtk 2025-12-31 15:39:38 +01:00
mazex 6a98071220 dark zen 2025-12-30 14:15:48 +01:00
mazex a9dcafa0e9 zen 2025-12-30 14:08:47 +01:00
mazex fd1413c31b nintendo bluetooth 2025-12-30 13:51:24 +01:00
mazex 7dda470065 nextcloud 2025-12-30 13:50:21 +01:00
mazex 426bbfb188 nintendo hid kernel module for switch remote emulator 2025-12-30 12:38:45 +01:00
mazex 73f0126a02 niri 2025-12-30 12:38:05 +01:00
mazex 394713af0b nxbt module 2025-12-30 12:37:35 +01:00
mazex f28d2ffa89 nxbt 2025-12-30 12:35:11 +01:00
mazex 9711d0b831 no nixgl 2025-12-29 00:51:44 +01:00
mazex b1dc1f1079 prime nvidia and intel 2025-12-28 00:45:23 +01:00
mazex 88b375e311 fix initExtra warning 2025-12-27 17:35:02 +01:00
mazex 6f59fc9750 stdenv fix warning 2025-12-27 17:30:29 +01:00
mazex f6743a9dc8 zen browser default browser 2025-12-27 17:28:16 +01:00
mazex f07e231441 ctrl g 2025-12-27 17:27:58 +01:00
mazex 17d9dbc75a zen browser conf 2025-12-27 17:27:46 +01:00
mazex 2bad755fae zen browser conf 2025-12-27 17:27:36 +01:00
mazex 6e0b9d92f7 zen browser flake 2025-12-27 16:49:07 +01:00
mazex dcbc21031d hover eww 2025-12-27 16:37:38 +01:00
mazex 539ca8ced2 mpv 2025-12-27 15:29:06 +01:00
mazex e12f014265 profile.sh 2025-12-27 14:55:22 +01:00
mazex 5b6b27f76f aliases 2025-12-27 14:41:30 +01:00
mazex 56734c157b pasword 2025-12-25 12:51:31 +01:00
mazex 8dca2c7ff0 anywhere hostname 2025-12-24 13:13:21 +01:00
mazex 41baaf1988 anywhere hostname 2025-12-24 13:08:24 +01:00
mazex 721feb2ebf dbus session enable 2025-12-22 21:02:36 +01:00
mazex ffbe80ca11 niri shadow focus 2025-12-22 20:53:44 +01:00
mazex 724a8a62d2 greetd autologin 2025-12-22 20:44:12 +01:00
mazex 7bcab86940 alt + n 2025-12-22 20:16:57 +01:00
mazex b24b911c19 xwayland 2025-12-22 20:13:49 +01:00
mazex bf0464bdfc firefox 2025-12-19 17:10:48 +01:00
mazex fce797fb55 niri dbus pipewire 2025-12-19 16:05:29 +01:00
mazex ca68d74902 greetd 2025-12-19 16:05:14 +01:00
mazex 2b5ac0c490 hyprland bindings in niri 2025-12-19 15:31:43 +01:00
mazex 2efc796d05 ly display manager to enable dbus for home manager 2025-12-19 15:25:09 +01:00
mazex a0648f44e1 niri 2025-12-19 15:24:56 +01:00
mazex 896649df31 rbw home manager 2025-12-19 13:08:16 +01:00
mazex 8f2de344de sopswarden nixos root 2025-12-19 13:08:04 +01:00
mazex f5665d2058 dnscrypt fix warning 2025-12-19 12:29:21 +01:00
mazex f877a867cf sopswarden home manager 2025-12-19 12:26:13 +01:00
mazex a429744127 disabled syncserver 2025-12-19 12:12:56 +01:00
mazex 5e79fc963b syncserver 2025-12-19 11:58:03 +01:00
mazex f3d59c5d36 no need for double spotify 2025-12-19 05:04:34 +01:00
mazex 267b44f4d6 clean nixos root packages 2025-12-19 05:00:06 +01:00
mazex 179db39344 topgrade module 2025-12-19 04:54:53 +01:00
mazex 411d510e6c nur support 2025-12-19 04:42:12 +01:00
mazex 12f2de74eb tried installing flatpak for spotify adblock 2025-12-19 04:15:34 +01:00
mazex c4a7dcd837 dnscrypt + adguardhome 2025-12-19 03:39:12 +01:00
mazex 7243d8e405 podman 2025-12-17 15:11:28 +01:00
mazex 8e51cffe7c virt-manager 2025-12-17 02:40:25 +01:00
mazex 6ea29b4789 virt-manager 2025-12-17 02:39:05 +01:00
mazex 8d858daa39 virt-manager nixos module 2025-12-17 01:24:07 +01:00
mazex f5f3f4fb8f yazi 2025-12-17 00:22:31 +01:00
mazex 059e517d1b moodle-dl, power tools 2025-12-17 00:19:18 +01:00
mazex 64fbed3ba4 libreoffice home manager optoins doesnt exist 2025-12-16 15:49:50 +01:00
mazex 8a86b8fba8 8085 2025-12-16 05:01:17 +01:00
mazex 20be24b83e users 2025-12-16 05:00:57 +01:00
mazex 9a1ed1e30c wireguard tools 2025-12-16 04:25:43 +01:00
mazex bf00bcae34 prowlarr 2025-12-16 02:31:06 +01:00
mazex f04a6278dc qbittorrent logins 2025-12-16 01:47:57 +01:00
mazex 9ce591637e qbittorrent radarr 2025-12-16 01:17:32 +01:00
mazex eaa08032c4 starships 2025-12-16 00:35:05 +01:00
mazex f21230ff78 zsh anywhere nixos 2025-12-16 00:04:13 +01:00
mazex 05d7d0349d zsh nixos module 2025-12-16 00:01:41 +01:00
mazex c2f4ec2b86 zsh root module 2025-12-15 23:02:44 +01:00
mazex 0111cd23ce profiles anywhere garbage collector at 6h30 every day 2025-12-15 22:52:39 +01:00
mazex be12ec3bcb profiles anywhere garbage collector at 6h30 every day 2025-12-15 22:50:00 +01:00
mazex 4453360594 profiles anywhere 2025-12-15 22:38:37 +01:00
mazex 29bd3fa9ec rocket port vaultwarden 8083 2025-12-15 20:36:36 +01:00
mazex 63471cfac5 rocket port vaultwarden 2025-12-15 20:34:53 +01:00
mazex 5009bb9277 anywhere cloud back 2025-12-15 20:29:15 +01:00
mazex d471783654 anywhere services 2025-12-15 20:22:13 +01:00
mazex 1faa48cae6 anywhere services 2025-12-15 20:19:59 +01:00
mazex 5dec5a4ab0 services 2025-12-15 20:11:44 +01:00
mazex b4933f0210 anywhere cloud.nix in flake 2025-12-15 20:09:41 +01:00
mazex 02d84ab661 vaultwarden service that runs 2025-12-15 20:06:17 +01:00
mazex 216f457e09 automount that works 2025-12-15 19:46:13 +01:00
mazex 06b3aae374 auto-session.nix 2025-12-15 17:29:01 +01:00
mazex 079afe3f49 plugins neo-tree auto-session 2025-12-14 05:51:40 +01:00
mazex 8655986d2f extra config lua 2025-12-14 05:34:44 +01:00
mazex 5fa0d55cd3 nixvim options and keymaps 2025-12-14 05:24:50 +01:00
mazex c57b5d7da0 time format 2025-12-14 05:10:15 +01:00
mazex 75d2040c25 time format 2025-12-14 05:00:46 +01:00
mazex 9c9186c2dd enabled hyprpanel 2025-12-14 04:55:54 +01:00
mazex 55167a986a gammastep module 2025-12-14 04:52:40 +01:00
mazex 3dcc8284e1 no-librespot 2025-12-14 04:50:57 +01:00
mazex 4f9ab953a3 hyprpanel 2025-12-14 04:49:51 +01:00
mazex 2d54aec8f3 aliases 2025-12-14 04:43:00 +01:00
mazex 5ebbea34d3 aliases 2025-12-14 04:39:50 +01:00
mazex 4e57c5b9e7 aliases 2025-12-14 04:34:16 +01:00
mazex 28574f81e2 wofi catppuccin 2025-12-14 04:29:43 +01:00
mazex b6bb947a0a websocket-vaultwarden 2025-12-14 04:18:19 +01:00
mazex 9f9e3d0e2e vaultwarden services 2025-12-14 03:27:33 +01:00
mazex 6aa18790a7 nextcloud 8081 2025-12-14 02:54:59 +01:00
mazex 2ca9892498 nextcloud that works 2025-12-14 02:45:20 +01:00
mazex 342f99293d gpg module 2025-12-14 01:56:13 +01:00
mazex 94f364a0d2 flake.nix cleaning 2025-12-14 01:22:38 +01:00
mazex c35ee56900 zfs module snapshot 2025-12-14 01:17:38 +01:00
mazex 35f7869de7 bat module 2025-12-14 01:13:27 +01:00
mazex 8dfb4030e9 networking module cleaning 2025-12-14 01:00:49 +01:00
mazex 62a67c91e0 networking as a nixos module 2025-12-14 00:52:53 +01:00
mazex beb692a627 moved bluetooth and dns as nixos modules 2025-12-14 00:42:26 +01:00
mazex 878dc486b7 zsh root 2025-12-14 00:35:02 +01:00
mazex db7bc9682f nixosConfigurations without home manager 2025-12-14 00:15:52 +01:00
mazex c7e49e46ec gnupg 2025-12-13 23:45:48 +01:00
mazex e361a9cc1f gnupg 2025-12-13 23:45:32 +01:00
mazex 08ab087f27 keyd 2025-12-13 23:40:03 +01:00
mazex 9f0ed2f99d pipewire 2025-12-13 23:19:06 +01:00
mazex d50c17eae8 modules/home and modules/nixos 2025-12-13 23:14:12 +01:00
mazex 0e5186a1a7 ssh config enabled 2025-12-13 19:35:03 +01:00
mazex 27f0e6208a pgcli 2025-12-13 19:30:03 +01:00
mazex 0965e00fe1 lavender 2025-12-13 19:25:20 +01:00
mazex 69a40643f7 satty 2025-12-13 18:20:34 +01:00
mazex 31572ceb2a catppucin them 2025-12-13 17:15:09 +01:00
mazex bf90d62f2d iso works, but build os fails 2025-12-12 11:48:05 +01:00
mazex 894b6980ee experimenting with hyprland gestures 2025-12-11 19:09:55 +01:00
mazex 44b4a371b1 neovim plugins are back 2025-12-11 19:00:30 +01:00
mazex bde398c8fb justfile home vs nixos 2025-12-11 18:50:34 +01:00
mazex 20bac9a26e home manager no warnings 2025-12-11 18:49:44 +01:00
mazex 074db46c17 home manager build sucessful 2025-12-11 18:05:53 +01:00
mazex e22e4bd9a5 migration 25.05 -> 25.11 2025-12-11 17:50:47 +01:00
mazex 4c2ac91e2b yq 2025-12-11 16:20:25 +01:00
mazex 66fb98741b homeManagerConfigurations test 2025-12-11 16:16:26 +01:00
mazex fbb1b616b9 homeManagerConfigurations test 2025-12-11 16:16:19 +01:00
mazex d03601e2b6 open pdf with firefox using xdg 2025-12-11 16:02:12 +01:00
mazex 5c6a104274 no librespot 2025-12-10 04:05:09 +01:00
mazex 5110abcb38 pgcli 2025-12-09 22:26:55 +01:00
mazex 558ce71557 ssh matchblock 2025-12-09 19:40:14 +01:00
mazex b5d1507209 gtk module 2025-12-09 06:39:55 +01:00
mazex a37553d405 fix indent 2025-12-09 04:51:51 +01:00
mazex 4bdd07103f sync 2025-12-09 04:44:05 +01:00
mazex 8cfa1e9917 git 2025-12-09 04:00:22 +01:00
mazex 51dafd4be2 downloads 2025-12-09 03:53:34 +01:00
mazex f011df4713 none 2025-12-09 03:49:12 +01:00
mazex aaaf5dd8c9 zfs datasets 2025-12-09 03:47:01 +01:00
mazex 6b6180a3f4 hardware-configuration.nix is back 2025-12-09 03:05:59 +01:00
mazex 92f70cd18c gh 2025-12-09 02:58:52 +01:00
marc b99c797c5a disko-encrypted-swap 2025-12-09 02:16:59 +01:00
mazex 1dade1cf3e librespot, poweralertd, topgrade 2025-12-09 00:57:43 +01:00
mazex 2109ee5d2e nushell pgcli 2025-12-09 00:45:37 +01:00
mazex 809f91d63f heic support 2025-12-09 00:38:23 +01:00
mazex 4e05e47b36 pyhon simple env 2025-12-09 00:08:52 +01:00
mazex 5ecfe2c4a9 bitwarden 2025-12-08 19:27:46 +01:00
mazex e50360edd3 nixvim plugins 2025-12-08 04:47:22 +01:00
mazex 9cff5aed17 comment with error 2025-12-08 04:08:24 +01:00
mazex 989d27a782 nvim 2025-12-08 04:05:47 +01:00
mazex 7b36ad3b80 updated flake 2025-12-08 04:05:38 +01:00
mazex 98dc2bd28f ungoogled chromium & netsurf 2025-12-08 00:56:02 +01:00
mazex d41a0a4f2c syncthing precise 2025-12-08 00:31:55 +01:00
mazex de0663c6e4 playerctl 2025-12-08 00:17:06 +01:00
mazex 8a87b4c9f9 tealdeer 2025-12-07 23:21:19 +01:00
mazex 6c31f89164 ssh 2025-12-07 23:18:10 +01:00
mazex 9e8bf0ea8e syncthing 2025-12-07 23:09:58 +01:00
mazex 679a7179db mako smaller text 2025-12-06 18:01:56 +01:00
mazex d1374e3766 mako 2025-12-06 17:03:58 +01:00
mazex 7ec356baa2 no double waybar 2025-12-05 02:53:23 +01:00
mazex fe1fff4e6b initContent fix 2025-12-05 02:35:11 +01:00
mazex e1db0fa26e wallpapers that work 2025-12-05 02:26:28 +01:00
mazex 3b6b94588f wallpapers modules with wpaperd that works 2025-12-05 02:26:06 +01:00
mazex 4b834d6bc5 fix hyprland scale and zsh 2025-12-05 01:46:35 +01:00
mazex e0110348bf almost no warning 2025-12-05 01:30:44 +01:00
mazex dfe5ded3f4 migrated-sucessfully 2025-12-05 00:52:37 +01:00
marc fe33fa699a disko-networkmanager 2025-12-04 22:29:12 +01:00
marc 02c432ce16 disko-networkmanager-swap-kitty 2025-12-04 22:08:59 +01:00
marc 2805960f89 disko-no-perf 2025-12-04 21:17:59 +01:00
marc 529a0ff440 disko-no-vainfo 2025-12-04 21:17:22 +01:00
marc 8e45c7727d disko-no-mesa 2025-12-04 21:15:53 +01:00
marc ef63065775 disko-debug-cli 2025-12-04 21:13:50 +01:00
marc a5d495caa6 disko-unfree 2025-12-04 21:09:36 +01:00
marc a346846cd0 disko-no-drisupport 2025-12-04 21:06:48 +01:00
marc 10eb50f525 disko-1024 2025-12-04 21:03:07 +01:00
marc a15f19351d disko-support-intel-drivers 2025-12-04 20:57:32 +01:00
marc 82eccae877 disko-50 2025-12-04 20:08:41 +01:00
marc fa1d0e7207 disko-boot-conf 2025-12-04 20:06:36 +01:00
marc ff53abfe96 disko-example 2025-12-04 17:12:23 +01:00
marc 913831e2bc disko-gpt-first 2025-12-04 16:28:11 +01:00
marc c4c363132d disko-chatpgt 2025-12-04 16:26:53 +01:00
marc 61d52c8586 disko-first 2025-12-04 16:16:52 +01:00
marc a675a59742 disko-laptop 2025-12-04 15:48:09 +01:00
marc d4ec8a3d14 nextcloud-user-no 2025-11-25 21:06:43 +01:00
marc e143411de0 nextcloud-user 2025-11-25 21:02:33 +01:00
marc 87828258e8 nextcloud-systemd 2025-11-25 20:56:24 +01:00
marc de7fe5c327 nextcloud-options 2025-11-25 20:51:39 +01:00
marc 927f20494a nextcloud-back 2025-11-25 20:38:55 +01:00
marc 343094e759 nextcloud-host 2025-11-25 20:37:50 +01:00
marc 86d3e0352a nextcloud-host 2025-11-25 20:32:57 +01:00
marc 587df282b1 nextcloud-adminuser 2025-11-25 20:31:29 +01:00
marc 6c63d78a7b nextcloud-gpport 2025-11-25 17:36:33 +01:00
marc 982279286d nextcloud-fix 2025-11-25 17:22:39 +01:00
marc 468fb31e13 nextcloud-fix 2025-11-25 17:14:20 +01:00
marc 8249dc3c0c nextcloud-fix 2025-11-25 17:12:34 +01:00
marc 49154fcae8 nextcloud-fix 2025-11-25 17:10:34 +01:00
marc 12f8c042ff nextcloud-fix 2025-11-25 17:09:56 +01:00
marc 821c9a7c35 nextcloud 2025-11-25 17:09:18 +01:00
marc 6797b82be6 nextcloud-password 2025-11-25 17:09:00 +01:00
marc eae4bfa716 nextcloud 2025-11-25 17:00:58 +01:00
marc 7e7ef12339 postgres 2025-11-25 16:56:38 +01:00
marc e9f71b1267 darwin-try-fix 2025-11-25 16:47:15 +01:00
marc 55ea1708b0 macos 2025-11-25 16:44:43 +01:00
mazex 6582ce6e38 logical volume order matters 2025-11-10 23:54:03 +07:00
mazex 4dd3c4af01 anywhere 2025-11-10 23:47:00 +07:00
mazex 703f46a3ef letsencrypt certresolver 2025-11-10 23:43:43 +07:00
mazex e40dacb603 waybar 2025-11-07 13:22:00 +01:00
mazex 0e19656f34 aliases 2025-11-07 13:20:35 +01:00
mazex f0ee6d2399 timezone 2025-11-07 13:18:35 +01:00
mazex 8782e930d5 ipython 2025-11-07 13:14:56 +01:00
mazex c1a997afc6 ipython 2025-11-07 13:14:50 +01:00
mazex 63e700562b alacritty 2025-11-07 13:14:19 +01:00
mazex 87e268dcbc ipython 2025-11-07 13:13:24 +01:00
mazex 305e30e869 generations 2025-11-06 17:28:30 +01:00
mazex 2d9a3b6584 zsh module with packages 2025-11-06 17:03:27 +01:00
mazex a6a6158409 hyprland config that works 2025-11-06 16:46:20 +01:00
mazex 7c456f6328 zsh 2025-11-06 16:45:15 +01:00
mazex ee60c826e0 zsh 2025-11-06 16:42:15 +01:00
mazex d9f160391f home.nix flake 2025-11-06 16:41:25 +01:00
mazex 810a4a8e7b nerdctl 2025-11-06 16:38:01 +01:00
mazex eee6b61730 git module 2025-11-06 16:22:49 +01:00
mazex 2abe155181 home.nix that works, ready to switch to homeconfigurations 2025-11-06 16:21:47 +01:00
mazex 580f6a1773 home.nix 2025-11-06 16:21:16 +01:00
mazex 3e7129cb4d ssh 2025-11-03 17:02:34 +07:00
mazex cea3645c94 root user 2025-11-03 17:01:50 +07:00
mazex 6c348e93d4 postgres 2025-11-03 17:00:45 +07:00
mazex 0732fc5d65 tcp forwarding 2025-11-03 16:53:48 +07:00
mazex ea42d6d645 postgres writetext 2025-11-03 16:47:59 +07:00
mazex 1c16a6623d postgres vaultwarden db 2025-11-03 16:45:55 +07:00
mazex c60c61792d postgres is back for vaultwarden 2025-11-03 16:39:26 +07:00
mazex d209fd97fd fix firewall 2025-11-03 16:34:49 +07:00
mazex 9ec002f5cf firewall open ports 2025-11-03 16:33:35 +07:00
mazex 8f26548022 no entrypoint fornow 2025-11-03 16:24:17 +07:00
mazex 13e29357fa better vaultwraden 2025-11-03 16:23:19 +07:00
mazex 6a173d905e insecure for test 2025-11-03 16:21:37 +07:00
mazex a096c54e5c vaultwarden binary 2025-11-03 16:16:53 +07:00
mazex bf9e08b7b5 fix vaultwarden user 2025-11-03 16:07:51 +07:00
mazex c41a163b43 path 2025-11-03 16:03:26 +07:00
mazex a212e130e8 busybox 2025-11-03 15:59:56 +07:00
mazex f60939647e vaultwarden 2025-11-03 15:56:36 +07:00
mazex 2bad4573fc minimum traefik config for test 2025-11-03 15:47:47 +07:00
mazex 350e1adf48 no caddy for now traefik only 2025-11-03 15:44:01 +07:00
mazex 527452f0ed vps.marcpartensky.com 2025-11-03 15:41:40 +07:00
mazex 743167429f caddy.nix 2025-11-03 15:31:51 +07:00
mazex ea970fc645 no wireguard for now 2025-11-03 15:19:13 +07:00
mazex 413cddac4d entrypoint 2025-11-03 15:17:49 +07:00
mazex 7b4056cdfc entrypoint 2025-11-03 15:14:58 +07:00
mazex 69137091d9 vpn 2025-10-22 17:32:12 +07:00
mazex b390c13e2c beeper 2025-10-18 18:13:19 +07:00
mazex 689e01f5f4 flare-signal 2025-10-18 18:07:39 +07:00
mazex e2b7120385 trying to upgrade signal 2025-10-18 16:52:13 +07:00
mazex 66f01048fb play-pause 2025-10-12 20:58:35 +07:00
mazex 1876da8c75 sops.nix no sopswarden bc not mature yet 2025-10-12 18:56:59 +07:00
mazex 9898bccabf introducing sops.yml 2025-10-12 18:49:54 +07:00
mazex f8bc1ad16d nix-on-droid 2025-10-12 18:43:21 +07:00
mazex 2f33bbaafc copy firefox from librewolf 2025-10-12 18:42:48 +07:00
mazex ff18c55870 unstable 2025-10-12 18:39:39 +07:00
mazex be655b1af0 playerctl bindings 2025-10-12 18:37:40 +07:00
mazex 1665d95647 nautilus + bangkok 2025-10-12 18:37:15 +07:00
mazex 06345ff2bb compose2nix 2025-10-12 18:36:41 +07:00
mazex 152fc6733c anywhere 2025-10-12 18:36:09 +07:00
mazex a30f396a6a services 2025-10-08 15:24:51 +02:00
mazex 209d94c881 wireguard now 2025-10-08 11:41:26 +02:00
mazex 0ce9b530ae unstable nextcloud 2025-10-08 11:32:13 +02:00
mazex b1e61be019 unstable nextcloud 2025-10-08 11:30:23 +02:00
mazex 1d8dafd4a3 unstable 2025-10-08 11:29:29 +02:00
mazex 97c910aebb unstable 2025-10-08 11:28:02 +02:00
mazex 1e911947bc pangolin 2025-10-08 11:08:38 +02:00
mazex 72fdcbb82b nextcloud pangolin 2025-10-08 10:59:45 +02:00
mazex ea51806c17 playerctl bindings 2025-10-08 10:49:53 +02:00
mazex af0151650d home manager in nixos anywhere confg 2025-10-08 10:48:26 +02:00
mazex 09b12d207e trying to configure zfs.nix but not compatible with setup bios + grub + gpt even when boot loader is in ext4 2025-10-08 10:47:42 +02:00
mazex c8b7253975 cloud.nix 2025-10-08 10:45:10 +02:00
mazex 3d5b715805 trying 2025-10-08 10:43:17 +02:00
mazex 545613ba7d adding traefik 2025-10-08 09:48:49 +02:00
mazex 5e24d82a11 compose2nix 2025-10-08 09:43:39 +02:00
mazex ed68c58917 rename 2025-10-06 02:11:10 +02:00
mazex fbf1af4c7c nixos anywhere that works! 2025-10-06 01:28:11 +02:00
mazex d4ad307d14 ratbagd 2025-10-03 18:25:38 +02:00
mazex a4a9fefb4c disko 2025-10-03 18:25:03 +02:00
mazex 260d36658a disko rackner 2025-10-03 18:20:31 +02:00
mazex daf1646dfe hyprland 2025-10-03 18:04:08 +02:00
mazex c2d65700a2 tried configuration rack with nixos anywhere 2025-10-03 18:00:53 +02:00
mazex 09a7f9178d teams 2025-10-03 18:00:23 +02:00
mazex d74ccfc352 rack nixos-anywhere 2025-09-26 13:37:37 +02:00
mazex 1daeb23f7c satty first conf 2025-09-19 17:16:30 +02:00
mazex a1b464e468 tor browser conf 2025-09-19 17:15:49 +02:00
mazex 8d4dd671ee new root packages 2025-09-19 17:15:11 +02:00
mazex 1da1eaf711 full refactoring of librewolf module 2025-09-19 17:14:02 +02:00
mazex 8f791f3e53 weak git conf 2025-09-19 17:13:36 +02:00
mazex efa0d2c2dd screenshot binding that still doesnt work 2025-09-19 17:13:19 +02:00
mazex 17edc482fe podman support 2025-09-19 17:12:51 +02:00
mazex a8499556e1 docker compatible 2025-09-19 17:12:35 +02:00
mazex c0e0d3c6c0 dns 2025-09-19 17:11:59 +02:00
mazex db1602cdbd tried automatic bluetooth connexion 2025-09-19 17:11:34 +02:00
mazex 72e3bd481e flake 2025-09-19 17:11:16 +02:00
mazex 3fbf045ebd bitcoin wallet and microvm 2025-09-19 17:10:48 +02:00
mazex a7bdfb8ffe satty 2025-08-28 17:05:17 +02:00
mazex 9ed120c01d dc 2025-08-25 16:01:24 +02:00
mazex 9c336da4b2 map 2025-08-20 16:40:52 +02:00
mazex 906978b9e3 radarr firewall 2025-08-20 16:35:36 +02:00
mazex be9699787e nice mako 2025-08-20 16:32:36 +02:00
mazex b13cd2157f tried thunderbird 2025-08-20 16:32:26 +02:00
mazex 24eed0c1ff 3 librewolf profiles 2025-08-20 16:31:25 +02:00
mazex 7ef9a980ba tried catpuccin 2025-08-20 16:31:02 +02:00
mazex b6c2ec0c58 keyd 2025-08-20 16:29:57 +02:00
mazex f5a43bf7c4 bindings 2025-08-08 15:41:08 +02:00
mazex c31bfa1d3e with pkgs 2025-08-01 16:55:49 +02:00
mazex 8811110e9d geary + gnome online accounts 2025-07-30 15:24:57 +02:00
mazex 8337a2e89a improved wayland support hyprland 2025-07-29 19:09:40 +02:00
mazex ac3fb69daf kodi wayland + plugins 2025-07-29 19:02:54 +02:00
mazex 0fb701193c fix 2025-07-29 18:01:08 +02:00
mazex b6a452f673 tried importing newt flake 2025-07-29 18:00:08 +02:00
mazex 37593251b7 clean 2025-07-29 17:54:17 +02:00
mazex f2a39844c1 sshp 2025-07-29 17:26:30 +02:00
mazex 6e5718e792 polkit enable 2025-07-29 16:32:53 +02:00
mazex 264d8efea4 polkit module 2025-07-29 16:32:33 +02:00
mazex a1daa7af77 polkit support 2025-07-29 16:32:18 +02:00
mazex 50a69d6666 polkit 2025-07-29 16:31:20 +02:00
mazex 543a217e86 cursor 2025-07-28 23:06:31 +02:00
mazex ed35557103 bindings wallpapers 2025-07-28 23:05:37 +02:00
mazex 58b358d42c steam 2025-07-28 22:58:50 +02:00
mazex 0511b4ab36 aliases 2025-07-28 22:57:37 +02:00
mazex 55858371bf librewolf extensions and yt profile attempt 2025-07-26 10:17:06 +02:00
mazex 2346b109d9 tealdeer 2025-07-26 10:16:43 +02:00
mazex b2e73d67ba radarr 2025-07-26 10:16:32 +02:00
mazex 08b807b851 future newt support 2025-07-26 08:55:22 +02:00
mazex b2b65a6ea3 mako conf that works 2025-07-26 08:11:22 +02:00
mazex 13f81ebde1 wofi powermenu 2025-07-25 19:46:22 +02:00
mazex d2c2df2512 no abbrs 2025-07-25 17:37:57 +02:00
mazex f4ec3477d3 wpctl for volume 2025-07-25 17:27:58 +02:00
mazex 49294c61d2 tried sopswarden didnt work 2025-07-24 23:17:12 +02:00
mazex ce3cc13d96 attempt of using sopswarden 2025-07-24 23:16:52 +02:00
mazex 4c3399d04b hyprland bindings.nix 2025-07-24 20:17:38 +02:00
mazex f472a8ad2e slightly bigger font 2025-07-24 19:30:02 +02:00
mazex a3bab342bb nice waybar 2025-07-24 19:00:08 +02:00
mazex f8b11821ff packages.nix 2025-07-24 18:14:43 +02:00
mazex 59bcb6fe9d aliases 2025-07-24 16:48:15 +02:00
mazex 0ab3d1d48b bluetooth and dns 2025-07-24 16:29:56 +02:00
mazex 0e484b249d iwd backend for network manager 2025-07-24 16:03:38 +02:00
mazex 0c94de8364 kodi fix 2025-07-24 16:03:22 +02:00
mazex 1a5f7fd5c5 wolf extensions 2025-07-23 17:44:35 +02:00
mazex d8cc827b9c bookmarks 2025-07-23 17:12:58 +02:00
mazex 4fdb90e039 postgres 2025-07-23 16:56:45 +02:00
mazex 31b17a3a68 verify bucket exists nextcloud no warning 2025-07-23 16:45:44 +02:00
mazex 0adf6789e0 icon 2025-07-23 16:40:57 +02:00
mazex 50fc751cb0 codeberg 2025-07-23 16:39:50 +02:00
mazex 207087c6a6 @ 2025-07-23 16:28:38 +02:00
installer c9d51d7ad7 nvidia.nix 2025-07-15 14:49:41 +02:00
installer 045893137c pipe-viewer, dark-reader, hyprland nvidia 2025-07-15 14:27:13 +02:00
installer d9159a8221 no nod 2025-07-11 17:28:08 +02:00
installer fd94c44aba nod 2025-07-11 17:15:21 +02:00
installer 50f5848640 nod zsh 2025-07-11 17:13:26 +02:00
installer fc6ca92577 no users for now 2025-07-11 17:10:34 +02:00
installer 635033130d justfile 2025-07-11 16:53:25 +02:00
installer 737b6812e0 libreoffice not newtonwars 2025-07-10 16:25:54 +02:00
installer ec1e3035b3 Merge branch 'master' of github.com:MarcPartensky/nixos 2025-07-09 23:56:10 +02:00
installer a1ad16b041 services nextcloud 2025-07-09 23:54:45 +02:00
installer bbcb0c77f6 vnc 2025-07-09 23:54:21 +02:00
marc 5fb3c5b067 tower justfile 2025-07-08 17:15:27 +02:00
installer b903dc00bf gix to git again 2025-07-08 14:59:32 +02:00
installer 50eccfa15e gix 2025-07-08 14:45:35 +02:00
installer 28a491ff9f gitoxid 2025-07-08 14:43:52 +02:00
installer 0fece3abeb nixd 2025-07-08 14:42:08 +02:00
installer 8506c10eb8 gpl 2025-07-08 14:04:25 +02:00
installer f1dbabf2d5 ls 2025-07-08 14:04:00 +02:00
installer 07e263f4f7 Merge branch 'master' of github.com:MarcPartensky/nixos 2025-07-08 13:47:44 +02:00
installer 9783d0fddb docker 2025-07-08 13:47:01 +02:00
installer 281b4bd575 alacritty 2025-07-08 13:46:50 +02:00
installer b6618da075 speedtest-rs 2025-07-08 13:46:40 +02:00
installer 680e20719a zsh 2025-07-08 13:46:18 +02:00
marc 28a9265acb tower flake 2025-07-08 11:40:28 +02:00
359 changed files with 77828 additions and 1563 deletions
+12
View File
@@ -0,0 +1,12 @@
.env
# .sops.yml devrait être commité normalement (contient les clés publiques)
# secrets/*.yml chiffrés peuvent être commités
# secrets/*.dec fichiers déchiffrés temporaires
secrets/*.dec
secrets/*.unencrypted
result*
*.iso
# Python bytecode (ex. services/hinge-auto/__pycache__/)
__pycache__/
*.pyc
+150
View File
@@ -0,0 +1,150 @@
keys:
- &anywhere age189v3q8quejkaz4r8u0g2aechsfk4sk3465khx35erd320rea5scq98v7er
- &tower age1usm3v0ugducrzcwud60dda7xfnj49fdhecj7kcsfm7dzwzrzeyqq2jc2hm
- &mac age1fwgg9h68zz8s6xa8qt4yn7gqcqp59s0mma8xdfq9hunksqv8fq4qd9yfaz
- &deck age154uz4pavaj5qth25ytj0q8chsya4y65pgel04zcrm02je9w6uc9sug7dp2
- &deck-host age1rhnaejc5nwcqcuq5qt45wzr2fncurlwqw0adhnavfraqsdzffatqh5yhl4
creation_rules:
- path_regex: secrets/monero-deck\.yml$
key_groups:
- age:
- *tower
- *deck-host
# Clés Switch (prod.keys) pour Eden sur le deck (posées dans le home de marc)
- path_regex: secrets/switch-keys\.yml$
key_groups:
- age:
- *tower
- *deck-host
- path_regex: secrets/monero\.yml$
key_groups:
- age:
- *tower
- *deck
- path_regex: secrets/common\.yml$
key_groups:
- age:
- *anywhere
- *tower
- *mac
- *deck
- *deck-host
# Réseau ygg-mesh (services/ygg-mesh) : mot de passe commun aux machines
# membres du mesh. Mêmes destinataires que common.yml, sans le mac.
- path_regex: secrets/ygg-mesh\.yml$
key_groups:
- age:
- *anywhere
- *tower
- *deck
- *deck-host
# Mesh headscale (services/headscale + services/tailscale) : clé de
# pré-authentification partagée par les nœuds du tailnet, créée sur le VPS.
- path_regex: secrets/headscale\.yml$
key_groups:
- age:
- *anywhere
- *tower
- *mac
- *deck-host
- path_regex: secrets/stalwart-mcp\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/hermes_api_server_env\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/mac\.yml$
key_groups:
- age:
- *mac
- path_regex: secrets/anywhere\.yml$
key_groups:
- age:
- *anywhere
- path_regex: secrets/wireguard\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/tower\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/protonmail\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/zitadel\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/zitadel-smtp\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/hermes-matrix\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/hermes-discord\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/discord-hermes-bridge\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/hermes-dashboard\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/reactive-resume\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/gitea\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/gitea-oidc\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/gitea-mcp\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/openrouter-mcp\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/codeberg\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/audiobookshelf\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/ibkr\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/kasmvnc\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/anki\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/winnie\.yml$
key_groups:
- age:
- *tower
- path_regex: secrets/wise\.yml$
key_groups:
- age:
- *tower
+49 -2
View File
@@ -1,5 +1,52 @@
laptop:
nixos-rebuild switch --flake /etc/nixos#laptop
# set dotenv-load := true
set dotenv-load
# set dotenv-path := .env
# export HOST := env_var("HOST")
run:
just {{env('RUN')}}
home:
home-manager switch --flake .#{{env('HM')}}
nixos:
sudo nixos-rebuild switch --impure --flake .#{{env('HOST')}}
# VM de dev microvm.nix : construit si besoin puis lance la VM dans le terminal
# (console série, autologin marc). L'état (overlay du /nix/store, socket qmp)
# vit dans ~/.local/state/microvms/<nom>/, supprimer ce dossier pour repartir
# d'une VM vierge. Nom = clé de nixosConfigurations (vms/<nom>.nix), défaut dev.
vm name="dev":
#!/usr/bin/env bash
set -euo pipefail
state="${XDG_STATE_HOME:-$HOME/.local/state}/microvms/{{name}}"
mkdir -p "$state"
cd "$state"
# path: volontaire : marche même si vms/<nom>.nix n'est pas encore commité
exec nix run "path:{{justfile_directory()}}#{{name}}"
# Construit le runner d'une VM sans la lancer (préchauffe, pratique pour voir
# les erreurs de build sans VM au milieu)
vm-build name="dev":
nix build --no-link "path:{{justfile_directory()}}#{{name}}"
iso:
nix build .#nixosConfigurations.{{env('HOST')}}-iso.config.system.build.isoImage > nixos.iso
mac:
# darwin-rebuild switch --flake .#macos
sudo nix --extra-experimental-features 'flakes nix-command' run nix-darwin -- switch --flake .#macos
droid:
nix-on-droid switch --flake ~/.config/nixos#default
install:
nix-shell -p disko --run "disko -f .#laptop -m disko --argstr device /dev/diskname"
nixos-install --root /mnt --flake .#laptop
ventoy disk size="32000":
ventoy -I {{disk}} -r {{size}} -g
sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --no-daemon
disko -f .#laptop -m disko --argstr "device={{disk}}" ./hosts/disk/default.nix
+93
View File
@@ -0,0 +1,93 @@
# nixos
Marc Partensky's NixOS + Home Manager + nix-darwin configuration, one flake for every machine: `tower`, `laptop`, `deck`, the `anywhere` VPS, the Mac, and the phone (nix-on-droid).
## Machines
| Flake output | Type | Description |
|---|---|---|
| `nixosConfigurations.tower` | NixOS | Main machine (AMD, ZFS). `profiles/common` + `profiles/tower` + `services/` (all self-hosted services). |
| `nixosConfigurations.laptop` | NixOS | Laptop. `profiles/common` + `profiles/laptop` + `services/`. |
| `nixosConfigurations.deck` | NixOS | Steam Deck (via Jovian-NixOS). `profiles/deck` only, no `services/`. |
| `nixosConfigurations.anywhere` | NixOS | VPS (RackNerd): Pangolin, Traefik/Caddy, Stalwart mail, headscale. `profiles/anywhere`. |
| `nixosConfigurations.laptop-iso` / `deck-iso` | NixOS | Installer images (disko + hardware-configuration bundled). |
| `nixosConfigurations.dev` | NixOS (microvm) | Disposable dev VM, see `vms/`. Launched with `just vm`. |
| `homeConfigurations.marc` | Home Manager standalone | Marc's Linux profile (tower/laptop), **not wired** into any `nixosConfigurations` — managed independently. |
| `homeConfigurations."marc@macos"` | Home Manager | HM profile on the Mac (on top of nix-darwin). |
| `homeConfigurations."marc@deck"` | Home Manager | HM profile on the Deck. |
| `darwinConfigurations.macos` | nix-darwin | The Mac's system config. |
| `nixOnDroidConfigurations.default` | nix-on-droid | Android phone. |
`nixpkgs` = `nixos-26.05` (+ `unstable` for packages missing from 26.05, `nixpkgs-darwin`/`nix-darwin-26.05` for the Mac).
## Repo layout
```
flake.nix every nixosConfigurations / homeConfigurations / darwinConfigurations
Justfile + .env common commands (default HOST, HM, RUN)
profiles/<host>/ per-machine composition (imports, firewall, hostName, sops file)
common/ base shared by tower+laptop (users, nixos modules, home-manager.users.root)
hosts/<name>/ disko.nix + hardware-configuration.nix per machine
modules/
nixos/<name>/ unit NixOS modules (enabled = imported in profiles/common or profiles/<host>)
home/<name>/ Home Manager modules (Linux), imported by users/marc/home.nix
home-mac/<name>/ Mac-specific Home Manager modules
users/
marc/ home.nix + packages.nix (standalone profile, `just home`)
root/ home.nix wired via profiles/common (only HM profile inside nixosConfigurations)
mac/, deck/ HM profiles for the other machines
services/<name>/ self-hosted services (one folder per service), registry = services/default.nix
hermes/plugins/ Nix-managed plugins for the Hermes gateway
secrets/*.yml sops-age encrypted secrets (see below)
vms/ microvm.nix definitions for dev VMs
```
`services/` is only imported by `laptop` and `tower` (see `flake.nix`): `deck` and `anywhere` don't have this registry.
## Commands (Justfile)
`.env` sets the defaults: `HOST=tower`, `HM=marc`, `RUN=nixos`.
| Command | Effect |
|---|---|
| `just` | `just nixos` (via `RUN`) |
| `just nixos` | `sudo nixos-rebuild switch --impure --flake .#$HOST` |
| `just home` | `home-manager switch --flake .#$HM` (run as `marc`, not `hermes`) |
| `just mac` | `nix-darwin switch --flake .#macos` |
| `just droid` | `nix-on-droid switch --flake ~/.config/nixos#default` |
| `just vm [name=dev]` | build + launch a dev microvm (state in `~/.local/state/microvms/<name>/`) |
| `just vm-build [name=dev]` | build only, don't launch |
| `just iso` | ISO image for `$HOST-iso` |
| `just install` | disko + `nixos-install` (new machine) |
| `just ventoy <disk> [size]` | Ventoy USB stick + Nix installer |
Updating inputs: `nix flake update` before a rebuild (`--upgrade` has no effect on a flake, don't use it).
Eval check without building: `nix eval .#nixosConfigurations.$HOST.config.system.build.toplevel.drvPath --impure`.
## Secrets (sops-nix)
- `secrets/*.yml`, one file per domain (`tower.yml`, `common.yml`, `anywhere.yml`, `zitadel.yml`, `gitea.yml`, ...), encrypted with `sops` + `age` keys.
- 4 keys in `.sops.yaml`: anywhere, tower, mac, deck. `common.yml` is decryptable by every machine; each profile sets `sops.defaultSopsFile` to its dedicated file.
- Creating a **new** secret only needs the public keys already in `.sops.yaml`: `nix run nixpkgs#sops -- -e --filename-override secrets/<name>.yml --output secrets/<name>.yml <plaintext>`. Editing an **existing** file in place requires the private key (root only).
## Self-hosted services (tower/laptop)
Registry in `services/default.nix`. Active on tower:
- **Infra / networking**: `newt` (Pangolin tunnel), `autossh`, `eternal-terminal`, `adguard`, `tor`, `wayvnc`, `cage-firefox`.
- **Accounts / auth**: `zitadel` (OIDC), `vaultwarden`.
- **Cloud / files**: `nextcloud` (+ postgres), `gitea`.
- **Media**: `jellyfin`, `navidrome`, `audiobookshelf`, `radarr`/`sonarr`/`readarr`/`prowlarr`/`flaresolverr`, `qbittorrent`/`rqbit`, `media` (shared `/srv/media` dataset).
- **Matrix bridges**: `matrix` (Synapse), `matrix-whatsapp`, `matrix-signal`, `matrix-discord`, `matrix-meta`, `matrix-linkedin`.
- **Hermes agent**: `hermes` (gateway + plugins), `hermes-webui`, `hermes-dashboard`, `hermes-pocket` (mobile app backend), `discord-bot`.
- **MCP servers** (tools for Hermes): `nextcloud-mcp`, `amazon-mcp`, `firefox-mcp`, `zitadel-mcp`, `roku`, `codeberg-mcp`, `ibkr-mcp`, `meetup-mcp`, `gitea-mcp`, `arr-mcp`, `mcp-nixos`.
- **Other apps**: `jupyterhub`.
- **Disabled in the registry** (commented out, pending a fix or waiting on something): `dnscrypt`, `minio`, `stalwart-mcp` (cargoHash mismatch), `gotify`, `kanidm`, `syncserver`, `matrix-telegram` (waiting on api_id/api_hash), `vaultwarden-mcp` (missing input).
## Conventions
- Comments and commit messages in French, conventional commits format (`feat(scope): ...`, `fix(scope): ...`, `chore(scope): ...`), grouped by logical theme (not one commit per touched file).
- A module is "enabled" by being added to its registry's import list (`services/default.nix`, `profiles/common/default.nix`, `users/marc/home.nix`, ...); commented out = disabled but kept as reference.
- `home-manager.users.marc` must **never** be wired into any `nixosConfigurations`: Marc's profile stays standalone Home Manager (`just home`), only `root` goes through the NixOS module (`profiles/common`).
- The repo is edited concurrently (multiple sessions/agents): check `git status` and that no `nixos-rebuild` is already running before triggering a switch.
Generated
+1795 -505
View File
File diff suppressed because it is too large Load Diff
+290 -57
View File
@@ -1,84 +1,317 @@
{
description = "NixOS configuration of Marc";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
hyprland.url = "github:hyprwm/Hyprland";
nix-on-droid = {
url = "github:nix-community/nix-on-droid/release-24.05";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland-plugins = {
url = "github:hyprwm/hyprland-plugins";
inputs.hyprland.follows = "hyprland";
};
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager/release-25.05";
url = "github:nix-community/home-manager/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix.url = "github:ryantm/agenix";
microvm.url = "github:astro/microvm.nix";
nwg-dock-hyprland-pin-nixpkgs.url = "nixpkgs/2098d845d76f8a21ae4fe12ed7c7df49098d3f15";
};
outputs = { self, nixpkgs, ... } @ inputs: {
nixOnDroidConfigurations.default = inputs.nix-on-droid.lib.nixOnDroidConfiguration {
pkgs = import nixpkgs { system = "aarch64-linux"; };
modules = [
./profiles/nix-on-droid/configuration.nix
./users.nix
];
nixpkgs-darwin.url = "github:NixOS/nixpkgs/nixpkgs-26.05-darwin";
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-26.05";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs-darwin";
clawdbot.url = "github:clawdbot/nix-clawdbot";
clawdbot.inputs.nixpkgs.follows = "nixpkgs";
# hyprland.url = "github:hyprwm/Hyprland?ref=v0.50.0";
# hy3.url = "github:outfoxxed/hy3?ref=hl0.50.0";
# hy3.url = "github:outfoxxed/hy3";
# hy3.inputs.hyprland.follows = "hyprland";
# nix-search-tv.url = "github:3timeslazy/nix-search-tv";
catppuccin.url = "github:catppuccin/nix";
# newt.url = "github:fosrl/newt";
claude-code.url = "github:sadjow/claude-code-nix";
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
niri.url = "github:sodiboo/niri-flake";
niri.inputs.nixpkgs.follows = "nixpkgs";
disko.url = "github:nix-community/disko";
disko.inputs.nixpkgs.follows = "nixpkgs";
sops.url = "github:Mic92/sops-nix";
sops.inputs.nixpkgs.follows = "nixpkgs";
nixvim.url = "github:nix-community/nixvim/nixos-26.05";
# nixvim.inputs.nixpkgs.follows = "nixpkgs";
zen-browser.url = "github:youwen5/zen-browser-flake";
zen-browser.inputs.nixpkgs.follows = "nixpkgs";
spicetify.url = "github:Gerg-L/spicetify-nix";
spicetify.inputs.nixpkgs.follows = "nixpkgs";
# rycee-nurpkgs = {
# url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";
# inputs.nixpkgs.follows = "nixpkgs";
# };
# hyprtasking = {
# url = "github:raybbian/hyprtasking";
# inputs.hyprland.follows = "hyprland";
# };
catppuccin-thunderbird = {
url = "github:catppuccin/thunderbird";
flake = false; # The repo isn't a flake; use as raw source
};
# Pack de skins Hermes (26 palettes) : source brute, cf. modules/home-mac/hermes-skins.
hermes-menagerie = {
url = "github:ZakiChair/hermes-catppuccin";
flake = false; # The repo isn't a flake; use as raw source
};
# On crée une entrée SPÉCIALE pour le téléphone
# nixpkgs-droid.url = "github:NixOS/nixpkgs/nixos-24.05";
nix-on-droid = {
url = "github:nix-community/nix-on-droid/master";
# url = "github:nix-community/nix-on-droid/release-24.05";
# C'EST LA LIGNE CRUCIALE :
# On lui dit de suivre la version Droid, pas la version Laptop.
# inputs.nixpkgs.follows = "nixpkgs-droid";
# On aligne aussi le home-manager interne de nix-on-droid
# inputs.home-manager.follows = "home-manager-droid";
};
# On définit aussi un home-manager compatible 24.05 pour le tel
# home-manager-droid = {
# url = "github:nix-community/home-manager/release-24.05";
# inputs.nixpkgs.follows = "nixpkgs-droid";
# };
# nixvim-droid.url = "github:nix-community/nixvim/nixos-24.05";
# nixvim-droid.inputs.nixpkgs.follows = "nixpkgs-droid";
# hyprland-plugins = {
# url = "github:hyprwm/hyprland-plugins";
# inputs.hyprland.follows = "hyprland";
# };
sopswarden = {
url = "github:pfassina/sopswarden";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix.url = "github:ryantm/agenix";
microvm.url = "github:astro/microvm.nix";
# nwg-dock-hyprland-pin-nixpkgs.url = "nixpkgs/2098d845d76f8a21ae4fe12ed7c7df49098d3f15";
# nixgl.url = "github:guibou/nixGL";
# nixgl.inputs.nixpkgs.follows = "nixpkgs";
backtest.url = "github:marcpartensky/backtest-cpp-py";
backtest.inputs.nixpkgs.follows = "nixpkgs";
portfolio-optimizer.url = "github:marcpartensky/portfolio-optimizer";
portfolio-optimizer.inputs.nixpkgs.follows = "nixpkgs";
option-pricer.url = "github:marcpartensky/option-pricer";
option-pricer.inputs.nixpkgs.follows = "nixpkgs";
# addon Anki MCP (ankimcp.ai) : pas de follows, ses deps python (mcp >= 1.27)
# doivent venir du même nixpkgs que l'Anki qui le charge
anki-mcp.url = "github:ankimcp/anki-mcp-server-addon";
uv2nix.url = "github:pyproject-nix/uv2nix";
uv2nix.inputs.nixpkgs.follows = "nixpkgs";
pyproject-nix.url = "github:pyproject-nix/pyproject.nix";
pyproject-nix.inputs.nixpkgs.follows = "nixpkgs";
discord-bot.url = "github:MarcPartensky/discord-bot";
hermes-agent.url = "github:NousResearch/hermes-agent";
# hermes-agent.inputs.nixpkgs.follows = "github:NousResearch/hermes-agent";
# UI web de chat (parité CLI) pour hermes-agent. Projet communautaire
# (MIT), il publie son propre flake + module NixOS. follows nixpkgs pour
# ne pas évaluer un second nixpkgs : le paquet ne fait que python3 +
# pyyaml + cryptography, la 26.05 suffit.
hermes-webui = {
url = "github:nesquena/hermes-webui";
inputs.nixpkgs.follows = "nixpkgs";
};
# Clients YouTube Music TUI (voir modules/home/{ytm-player,yututui,yt-collate,youtube-music-cli})
ytm-player = {
url = "github:peternaame-boop/ytm-player";
# v2.1.0 exige dbus-fast >= 5.0.0, absent de 26.05 (4.0.4) :
# on suit unstable, la nixpkgs que le flake upstream teste.
inputs.nixpkgs.follows = "unstable";
};
yututui = {
url = "github:Ochichan/Yututui";
inputs.nixpkgs.follows = "nixpkgs";
};
firefox-devtools-mcp = {
# Officiel Mozilla, MCP browser automation via WebDriver BiDi. Pin sur le
# commit de la release v0.10.4 (2026-09-22) ; flake=false, source brute.
url = "github:mozilla/firefox-devtools-mcp/bdb377af9ce3a3596e8c196786014ecee50fe178";
flake = false;
};
stalwart-mcp = {
# Rust MCP server for Stalwart Mail Server (webpatser/stalwart-mcp).
# JMAP access: read, search, real-time notifications via EventSource.
# Pin sur commit main (pas de release taggée).
url = "github:webpatser/stalwart-mcp/be2c16d5921f45395996a130a5a643c542ef2105";
flake = false;
};
ankimcp = {
url = "github:ankimcp/anki-mcp-server-addon";
inputs.nixpkgs.follows = "nixpkgs";
};
jovian.url = "github:Jovian-Experiments/Jovian-NixOS";
# jovian.inputs.nixpkgs.follows = "nixpkgs";
steam-config-nix = {
url = "github:different-name/steam-config-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = {
self,
nixpkgs,
...
} @ inputs: {
nixosConfigurations = {
laptop = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
specialArgs = {inherit inputs;};
modules = [
./profiles/common
./profiles/laptop/configuration.nix
./services
];
};
tower = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {inherit inputs;};
modules = [
./profiles/common
./profiles/tower/configuration.nix
./services
];
};
deck = inputs.jovian.inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {inherit inputs;};
modules = [
./profiles/deck/configuration.nix
# ./services
];
};
laptop-iso = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {inherit inputs;};
modules = [
./modules/nixos/iso
inputs.disko.nixosModules.disko
inputs.nixvim.nixosModules.default
inputs.sopswarden.nixosModules.default
inputs.home-manager.nixosModules.default
./hosts/laptop/disko.nix
./hosts/laptop/hardware-configuration.nix
./profiles/laptop/configuration.nix
./services
./users.nix
./users/marc
];
};
deck-iso = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [./modules/nixos/iso ./users.nix {programs.zsh.enable = true;}];
};
anywhere = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {inherit inputs;};
modules = [
./profiles/anywhere/configuration.nix
./users.nix
];
};
# VM de dev microvm.nix (input `microvm`, voir vms/) : `just vm` ou
# `nix run .#dev`. Dupliquer vms/dev.nix pour une 2e VM.
dev = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {inherit inputs;};
modules = [
inputs.microvm.nixosModules.microvm
./vms/dev.nix
];
};
};
# homeConfigurations."marc@laptop" = inputs.home-manager.lib.homeManagerConfiguration {
# pkgs = inputs.nixpkgs.legacyPackages.x86_64-linux;
# specialArgs = { inherit inputs; };
# modules = [
# {
# wayland.windowManager.hyprland = {
# enable = true;
# # set the flake package
# package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
# };
# }
# # ...
# ];
# };
# Runners des VM de dev, lançables directement : `nix run .#dev`.
packages.x86_64-linux.dev = self.nixosConfigurations.dev.config.microvm.declaredRunner;
# homeConfigurations = {
# "marc@laptop" = inputs.home-manager.lib.homeManagerConfiguration {
# pkgs = nixpkgs.legacyPackages.x86_64-linux;
# specialArgs = { inherit inputs; };
# modules = [
# {
# wayland.windowManager.hyprland = {
# enable = true;
# # set the flake package
# package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
# };
# }
# ];
# };
# };
nixOnDroidConfigurations.default = inputs.nix-on-droid.lib.nixOnDroidConfiguration {
# pkgs = import inputs.nixpkgs-droid {
pkgs = import inputs.nix-on-droid.inputs.nixpkgs {
system = "aarch64-linux";
};
extraSpecialArgs = {inherit inputs;};
# extraSpecialArgs = {
# inputs = inputs // {
# nixpkgs = inputs.nixpkgs-droid;
# home-manager = inputs.home-manager-droid;
# nixvim = inputs.nixvim-droid;
# };
# };
modules = [
# inputs.home-manager.nixosModules.default
./profiles/nix-on-droid/configuration.nix
# ./users.nix
];
};
homeConfigurations = {
"marc" = inputs.home-manager.lib.homeManagerConfiguration {
extraSpecialArgs = {inherit inputs;};
pkgs = import nixpkgs {
system = "x86_64-linux";
overlays = [inputs.nur.overlays.default inputs.clawdbot.overlays.default];
};
modules = [./users/marc/home.nix];
};
"marc@macos" = inputs.home-manager.lib.homeManagerConfiguration {
extraSpecialArgs = {inherit inputs;};
pkgs = import inputs.nixpkgs-darwin {
system = "aarch64-darwin";
};
modules = [./users/mac/home.nix];
};
"marc@deck" = inputs.home-manager.lib.homeManagerConfiguration {
extraSpecialArgs = {inherit inputs;};
pkgs = import nixpkgs {
system = "x86_64-linux";
config.allowUnfree = true;
};
modules = [./users/deck];
};
};
darwinConfigurations."macos" = inputs.nix-darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs = {inherit inputs;};
pkgs = import inputs.nixpkgs-darwin {system = "aarch64-darwin";};
modules = [
./profiles/macos/configuration.nix
{nixpkgs.config.allowUnfree = true;}
];
};
};
}
+23
View File
@@ -0,0 +1,23 @@
{
services.qemuGuest.enable = true;
boot.kernelParams = [
"console=ttyS0"
"boot.shell_on_fail" # ouvre un shell si l’init échoue
];
boot.loader.grub = {
enable = true;
efiSupport = false; # BIOS-only
# device = "/dev/vda"; # grug veut pas de device si disko gère les partitions
};
# Générer un hostId aléatoire ou fixe
networking.hostId = "a1234e5e"; # 8 caractères hexadécimaux
# boot.supportedFilesystems = [ "zfs" "ext4" ];
# boot.initrd.supportedFilesystems = [ "zfs" "ext4" ];
boot.supportedFilesystems = [ "ext4" ];
boot.initrd.supportedFilesystems = [ "ext4" ];
# boot.supportedFilesystems = [ "ext4" ];
}
+87
View File
@@ -0,0 +1,87 @@
{ lib, ... }:
{
# services.qemuGuest.enable = true;
# # boot.loader.grub.device = "/dev/vda"; # adapte si ton disque est vda/sda/nvme0n1
# boot.kernelParams = [
# "console=ttyS0"
# "boot.shell_on_fail" # ouvre un shell si l’init échoue
# ];
# boot.loader.grub = {
# enable = true;
# efiSupport = false;
# # device = "/dev/vda"; # no need to set devices, disko will add all devices that have a EF02 partition to the list already
# };
# boot.supportedFilesystems = [ "ext4" ];
disko.devices = {
disk = {
main = {
type = "disk";
device = "/dev/vda";
content = {
type = "gpt";
# efiGptPartitionFirst = false;
partitions = {
# ESP = {
# type = "EF00";
# size = "512M";
# content = {
# type = "filesystem";
# format = "vfat";
# mountpoint = "/boot";
# mountOptions = [ "umask=0077" ];
# };
# };
bios = {
name = "bios";
size = "1M";
type = "EF02"; # BIOS boot partition
};
lvm = {
name = "lvm";
label = "disk-main-lvm";
size = "100%";
content = {
type = "lvm_pv";
vg = "vg0";
};
};
};
};
};
};
lvm_vg = {
vg0 = {
type = "lvm_vg";
lvs = {
# la swap avant root
swap = {
size = "4G";
content = { type = "swap"; };
};
root = {
size = "100%FREE"; # prend tout l'espace disponible
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
mountOptions = [ "defaults" ];
};
};
# home = {
# size = "10G";
# content = {
# type = "filesystem";
# format = "ext4";
# mountpoint = "/home";
# };
# };
};
};
};
};
}
+97
View File
@@ -0,0 +1,97 @@
{ lib, pkgs, ... }:
{
environment.systemPackages = with pkgs; [
zfs
];
disko.devices = {
disk = {
main = {
type = "disk";
device = "/dev/vda";
content = {
type = "gpt";
partitions = {
# Partition BIOS pour GRUB
bios = {
name = "bios";
size = "1M";
type = "EF02"; # BIOS boot
};
boot = {
name = "boot";
size = "512M";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/boot";
};
};
root = {
name = "root";
size = "10G"; # taille de / en ext4
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
# Partition ZFS pour le pool
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "rpool"; # nom du pool ZFS
};
};
};
};
};
};
# Définition du pool ZFS
zpool = {
rpool = {
type = "zpool";
mode = ""; # ou "mirror", "raidz1" si plusieurs disques
options.cachefile = "none";
rootFsOptions = {
mountpoint = "none";
compression = "lz4";
atime = "off";
xattr = "sa";
};
# mountpoint = "/";
datasets = {
# root dataset
home = {
type = "zfs_fs";
mountpoint = "/home";
options.compression = "lz4";
};
# swap dataset (optionnel)
# swap = {
# type = "zfs_volume";
# size = "4G";
# content = {
# type = "swap";
# };
# };
# home dataset (optionnel)
# home = {
# type = "zfs_fs";
# mountpoint = "/home";
# options.compression = "lz4";
# };
};
};
};
};
}
+29
View File
@@ -0,0 +1,29 @@
{
disko.devices.disk.main = {
type = "disk";
device = "/dev/nvme0n1"; # SSD interne, ou "/dev/mmcblk0" pour un essai sur microSD
content = {
type = "gpt";
partitions = {
ESP = {
type = "EF00";
size = "1G";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = ["umask=0077"];
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
}
+1
View File
@@ -0,0 +1 @@
{}
+115
View File
@@ -0,0 +1,115 @@
{
disko.devices = {
disk = {
root = {
type = "disk";
device = "/dev/sda";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "nofail" ];
};
};
swap = {
# name = "swap";
# type = "8200"; # Linux swap
size = "16G";
content = {
type = "swap";
randomEncryption = true;
priority = 100;
};
};
zfs = {
size = "1024G";
content = {
type = "zfs";
pool = "nixos";
};
};
};
};
};
};
zpool = {
nixos = {
type = "zpool";
rootFsOptions = {
mountpoint = "none";
compression = "lz4";
acltype = "posixacl";
xattr = "sa";
"com.sun:auto-snapshot" = "true";
};
options.ashift = "12";
datasets = {
"root" = {
type = "zfs_fs";
options = {
encryption = "aes-256-gcm";
keyformat = "passphrase";
#keylocation = "file:///tmp/secret.key";
keylocation = "prompt";
};
mountpoint = "/";
};
"nix" = {
type = "zfs_fs";
options.mountpoint = "/nix";
mountpoint = "/nix";
};
"marc" = {
type = "zfs_fs";
options.mountpoint = "none";
};
"marc/data" = {
type = "zfs_fs";
options.mountpoint = "/home/marc";
};
"marc/git" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/git";
};
"marc/media" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/media";
};
"marc/downloads" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/downloads";
};
"marc/syncthing" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/sync";
};
# # README MORE: https://wiki.archlinux.org/title/ZFS#Swap_volume
# "root/swap" = {
# type = "zfs_volume";
# size = "16G";
# content = {
# type = "swap";
# };
# options = {
# volblocksize = "4096";
# compression = "zle";
# logbias = "throughput";
# sync = "always";
# primarycache = "metadata";
# secondarycache = "none";
# "com.sun:auto-snapshot" = "false";
# };
# };
};
};
};
};
}
+14 -55
View File
@@ -6,70 +6,29 @@
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
# ./nvidia.nix
];
# Use the systemd-boot EFI boot loader.
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" "rtsx_usb_sdmmc" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.kernelModules = [ "kvm-intel" "i915" ];
boot.extraModulePackages = [ ];
hardware.enableAllFirmware = true;
services.xserver.videoDrivers = [ "intel" ];
fileSystems."/" =
{ device = "nixos/root";
fsType = "zfs";
};
boot.supportedFilesystems = [ "exfat" ];
services.udisks2.enable = true;
services.gvfs.enable = true;
fileSystems."/nix/store" =
{ device = "nixos/store";
fsType = "zfs";
};
fileSystems."/home" =
{ device = "nixos/home";
fsType = "zfs";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/BB98-CA7E";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/mnt/arch" =
{ device = "/dev/mapper/arch";
fsType = "btrfs";
};
# fileSystems."/mnt/arch" =
# { device = "/dev/disk/by-uuid/BB98-CA7E";
# fsType = "vfat";
# options = [ "fmask=0077" "dmask=0077" ];
# };
swapDevices = [ {
device = "/dev/disk/by-partuuid/052f0593-0118-41ad-bfc4-72f0249f33ba";
randomEncryption.enable = true;
} ];
# potentiellement avoir une partition dediee au swapfile étant donné qu'il
# n'est pas compatible d'utiliser de swapfile avec les datasets zfs
# swapDevices = [{device = "/swapfile"; size = 10000;}];
environment.etc.crypttab = {
mode = "0600";
text = ''
# <volume-name> <encrypted-device> [key-file] [options]
arch PARTUUID=b0c1fc13-c97e-4b45-b964-01822bfec30e
'';
hardware.graphics = {
enable = true;
# driSupport = true;
enable32Bit = true; # si tu utilises Steam ou applis 32-bit
};
# 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.enp0s20f0u4u4c2.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+60
View File
@@ -0,0 +1,60 @@
{ config, lib, pkgs, ... }:
{
# nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
# "nvidia-x11"
# "nvidia-settings"
# ];
# Essential OpenGL configuration
hardware.opengl = {
enable = true;
# driSupport = true;
# driSupport32Bit = true;
extraPackages = with pkgs; [
vaapiVdpau
libvdpau-va-gl
nvidia-vaapi-driver
];
};
# Load nvidia driver
services.xserver.videoDrivers = ["nvidia"];
boot.kernelModules = [ "nvidia" ];
hardware.nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
open = false;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
# PRIME configuration - NVIDIA as primary GPU
prime = {
offload.enable = false; # Disable offloading to force NVIDIA as primary
# Bus IDs from lspci output:
# 00:02.0 -> "PCI:0:2:0"
# 01:00.0 -> "PCI:1:0:0"
intelBusId = "PCI:0:2:0";
nvidiaBusId = "PCI:1:0:0";
};
};
# Environment variables for proper GPU acceleration
environment.sessionVariables = {
GBM_BACKEND = "nvidia-drm";
__GLX_VENDOR_LIBRARY_NAME = "nvidia";
LIBVA_DRIVER_NAME = "nvidia";
WLR_NO_HARDWARE_CURSORS = "1"; # Fixes cursor issues in Wayland
};
# Xorg server configuration (still required for some Wayland features)
services.xserver.config = ''
Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
Option "PrimaryGPU" "true"
EndSection
'';
}
+70
View File
@@ -0,0 +1,70 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
inputs.home-manager.darwinModules.home-manager
# inputs.sops.nixosModules.sops # Inclus dans sopswarden
# ../../services/wg-quick
];
environment.systemPackages = [
inputs.nix-darwin.packages.aarch64-darwin.darwin-rebuild
pkgs.vim
pkgs.neovim
pkgs.git
];
nixpkgs.config.allowUnfree = true;
networking.hostName = "macos";
# services.nix-daemon.enable = true; <- supprime cette ligne
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = {inherit inputs;};
backupFileExtension = "bak";
users.marc = import ../../users/mac/home.nix;
};
# darwin-configuration.nix ou flake.nix -> darwinConfigurations
system.keyboard = {
enableKeyMapping = true;
remapCapsLockToEscape = true;
};
system.primaryUser = "marc";
# deactivated
homebrew = {
enable = false;
onActivation = {
autoUpdate = true;
cleanup = "zap"; # supprime les packages non listés
upgrade = true;
};
brews = [
"mas" # packages CLI homebrew
];
casks = [
"librewolf"
"rqbit"
"beeper"
];
masApps = {
# App Store (nécessite mas)
"Xcode" = 497799835;
};
};
system.stateVersion = 6;
}
+126
View File
@@ -0,0 +1,126 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
imports = [
# ./modules/sshd
# ../../nod-sshd
# ../../zsh
# ../../services/postgres
# ../../services/nextcloud
# ../../services/radarr
];
# Simply install just the packages
environment.packages = with pkgs; [
# Some common stuff that people expect to have
procps
killall
fastfetch
#diffutils
#findutils
#utillinux
#tzdata
#hostname
#man
#gnugrep
#gnupg
#gnused
#gnutar
#bzip2
#gzip
#xz
#zip
#unzip
eza
nano
openssh
iproute2
shadow
neovim
zsh
git
# gh
just
wayvnc
stow
ncdu
# pangolin
htop
which
podman
neofetch
# gemini-cli-bin
tmate
bat
ripgrep
qemu
# pinentry-curses
];
# home-manager.users.nix-on-droid = {
# home.stateVersion = "25.11";
# imports = [
# inputs.nixvim.homeModules.default
# ../../modules/home/neovim
# ../../modules/home/zsh
# ../../modules/home/git
# ../../modules/home/ssh
# # ../../modules/home/gh
# ];
# };
home-manager.config = {
home.stateVersion = "24.05";
# home.packages = [
# (inputs.nixvim.legacyPackages.aarch64-linux.makeNixvimWithModule {
# module = import ../../modules/home/neovim;
# })
# ];
imports = [
# ../../modules/home/yt-dlp
# inputs.nixvim.homeModules.default
# ../../modules/home/neovim
# ../../modules/home/zsh
# ../../modules/home/git
# ../../modules/home/ssh
# ../../modules/home/gh
];
};
user.shell = "${pkgs.zsh}/bin/zsh";
# --- CONFIGURATION GPG (OBLIGATOIRE SUR 25.11) ---
# Sans ça, git sign / gpg plantera car il ne trouvera pas pinentry
# environment.etc."gnupg/gpg-agent.conf".text = ''
# pinentry-program ${pkgs.pinentry-curses}/bin/pinentry
# '';
# Ces options activent l'intégration Home Manager
# home-manager.useGlobalPkgs = true;
# home-manager.useUserPackages = true;
home-manager.backupFileExtension = "hm-backup";
# environment.pathsToLink = [
# "/share/applications"
# "/share/xdg-desktop-portal"
# ];
# Backup etc files instead of failing to activate generation if a file already exists in /etc
environment.etcBackupExtension = ".bak";
# Read the changelog before changing this value
system.stateVersion = "24.05";
# Set up nix for flakes
nix.extraOptions = ''
experimental-features = nix-command flakes
'';
# Set your time zone
time.timeZone = "Europe/Paris";
}
+121
View File
@@ -0,0 +1,121 @@
{
disko.devices = {
disk = {
root = {
type = "disk";
device = "/dev/nvme0n1";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = ["nofail"];
};
};
swap = {
# name = "swap";
# type = "8200"; # Linux swap
size = "16G";
content = {
type = "swap";
randomEncryption = true;
priority = 100;
};
};
zfs = {
size = "1024G";
content = {
type = "zfs";
pool = "nixos";
};
};
};
};
};
};
zpool = {
nixos = {
type = "zpool";
rootFsOptions = {
mountpoint = "none";
compression = "lz4";
acltype = "posixacl";
xattr = "sa";
"com.sun:auto-snapshot" = "true";
};
options.ashift = "12";
datasets = {
"root" = {
type = "zfs_fs";
# options = {
# encryption = "aes-256-gcm";
# keyformat = "passphrase";
# #keylocation = "file:///tmp/secret.key";
# keylocation = "prompt";
# };
mountpoint = "/";
};
"nix" = {
type = "zfs_fs";
options.mountpoint = "/nix";
mountpoint = "/nix";
};
# Média partagé (Jellyfin, Navidrome, Radarr, Sonarr, Nextcloud) :
# groupe `media` + dossiers setgid, hors des homes pour que
# systemd-tmpfiles puisse y créer les dossiers (voir services/media).
"media" = {
type = "zfs_fs";
options.mountpoint = "/srv/media";
};
"marc" = {
type = "zfs_fs";
options.mountpoint = "none";
};
"marc/data" = {
type = "zfs_fs";
options.mountpoint = "/home/marc";
};
"marc/git" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/git";
};
"marc/media" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/media";
};
"marc/downloads" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/downloads";
};
"marc/syncthing" = {
type = "zfs_fs";
options.mountpoint = "/home/marc/sync";
};
# # README MORE: https://wiki.archlinux.org/title/ZFS#Swap_volume
# "root/swap" = {
# type = "zfs_volume";
# size = "16G";
# content = {
# type = "swap";
# };
# options = {
# volblocksize = "4096";
# compression = "zle";
# logbias = "throughput";
# sync = "always";
# primarycache = "metadata";
# secondarycache = "none";
# "com.sun:auto-snapshot" = "false";
# };
# };
};
};
};
};
}
+21
View File
@@ -0,0 +1,21 @@
# (Optionnel mais recommandé) Garder un tmpfs large au cas où
mount -o remount,size=8G /tmp
mount -o remount,size=8G /run/nixos
# 2. Lancer un shell avec disko et git
# nix-shell -p disko git
# --- Dans le nix-shell ---
# 3. Partitionner
disko --flake .#tower --mode disko
# 4. Générer la config hardware (et vérifier les changements si besoin)
nixos-generate-config --root /mnt --show-hardware-config
# 5. Installer NixOS en augmentant le buffer de téléchargement à 1 Go
nixos-install --flake .#tower --root /mnt --no-root-passwd --option download-buffer-size 1073741824
# 6. Quitter et redémarrer
exit
reboot
-11
View File
@@ -1,11 +0,0 @@
{ pkgs, ... }:
{
programs.git = {
enable = true;
# aliases = {
# ci = "commit";
# co = "checkout";
# s = "status";
# };
};
}
+92
View File
@@ -0,0 +1,92 @@
{ pkgs, lib, ... }:
let
aerospaceConfig = {
config-version = 2;
after-startup-command = [ ];
start-at-login = true;
enable-normalization-flatten-containers = true;
enable-normalization-opposite-orientation-for-nested-containers = true;
accordion-padding = 30;
default-root-container-layout = "tiles";
default-root-container-orientation = "auto";
on-focused-monitor-changed = [ "move-mouse window-lazy-center" ];
automatically-unhide-macos-hidden-apps = false;
on-mode-changed = [ ];
persistent-workspaces = [
"1" "2" "3" "4" "5" "6" "7" "8" "9"
"A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
"N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
];
key-mapping.preset = "qwerty";
gaps.inner.horizontal = 0;
gaps.inner.vertical = 0;
gaps.outer.left = 0;
gaps.outer.bottom = 0;
gaps.outer.top = 0;
gaps.outer.right = 0;
mode.main.binding = {
"cmd-m" = "fullscreen";
"cmd-enter" = "exec Alacritty";
"cmd-slash" = "layout tiles horizontal vertical";
"cmd-comma" = "layout accordion horizontal vertical";
"cmd-h" = "focus left";
"cmd-j" = "focus down";
"cmd-k" = "focus up";
"cmd-l" = "focus right";
"cmd-shift-h" = "move left";
"cmd-shift-j" = "move down";
"cmd-shift-k" = "move up";
"cmd-shift-l" = "move right";
"cmd-minus" = "resize smart -50";
"cmd-equal" = "resize smart +50";
"cmd-tab" = "workspace-back-and-forth";
"cmd-shift-tab" = "move-workspace-to-monitor --wrap-around next";
"cmd-shift-semicolon" = "mode service";
"cmd-shift-c" = "exec-and-forget cnam";
"cmd-shift-s" = "exec-and-forget screencapture -i ~/Desktop/screenshot-$(date +%Y%m%d-%H%M%S).png";
"cmd-1" = "workspace 1"; "alt-shift-1" = "move-node-to-workspace 1";
"cmd-2" = "workspace 2"; "alt-shift-2" = "move-node-to-workspace 2";
"cmd-3" = "workspace 3"; "alt-shift-3" = "move-node-to-workspace 3";
"cmd-4" = "workspace 4"; "alt-shift-4" = "move-node-to-workspace 4";
"cmd-5" = "workspace 5"; "alt-shift-5" = "move-node-to-workspace 5";
"cmd-6" = "workspace 6"; "alt-shift-6" = "move-node-to-workspace 6";
"cmd-7" = "workspace 7"; "alt-shift-7" = "move-node-to-workspace 7";
"cmd-8" = "workspace 8"; "alt-shift-8" = "move-node-to-workspace 8";
"cmd-9" = "workspace 9"; "alt-shift-9" = "move-node-to-workspace 9";
};
mode.service.binding = {
esc = [ "reload-config" "mode main" ];
r = [ "flatten-workspace-tree" "mode main" ];
f = [ "layout floating tiling" "mode main" ];
backspace = [ "close-all-windows-but-current" "mode main" ];
"cmd-shift-h" = [ "join-with left" "mode main" ];
"cmd-shift-j" = [ "join-with down" "mode main" ];
"cmd-shift-k" = [ "join-with up" "mode main" ];
"cmd-shift-l" = [ "join-with right" "mode main" ];
};
workspace-to-monitor-force-assignment = {
"1" = "Built-in Retina Display";
"2" = "Built-in Retina Display";
"3" = "Built-in Retina Display";
"4" = "Built-in Retina Display";
"5" = "Built-in Retina Display";
"6" = "Built-in Retina Display";
"7" = "Built-in Retina Display";
"8" = "Mi Monitor";
"9" = "Mi Monitor";
};
};
in {
home.packages = [ pkgs.aerospace ];
xdg.configFile."aerospace/aerospace.toml".source =
(pkgs.formats.toml { }).generate "aerospace.toml" aerospaceConfig;
}
+31
View File
@@ -0,0 +1,31 @@
# Tunnel SSH inverse permanent Mac -> rack (VPS) : expose le sshd du Mac sur
# 127.0.0.1:2223 du VPS (GatewayPorts no : jamais exposé publiquement).
# Importé par profiles/macos/configuration.nix (module nix-darwin) ; la clé
# du Mac (marc@Air-de-Marc) est déjà autorisée pour root@rack.
# Depuis tower (alias `mac` dans ~/.ssh/config de hermes) :
# ssh -J rack -p 2223 marc@localhost
# Nécessite Remote Login activé (services.openssh.enable dans le profil).
{ pkgs, ... }: {
environment.systemPackages = [ pkgs.autossh ];
launchd.user.agents.rack-tunnel = {
serviceConfig = {
ProgramArguments = [
"${pkgs.autossh}/bin/autossh"
"-M" "0"
"-N"
"-o" "ServerAliveInterval=30"
"-o" "ServerAliveCountMax=3"
# Sans ça, un forward raté (port pris, sshd down au boot) laisserait
# une session inutile ; avec, autossh sort et launchd réessaie.
"-o" "ExitOnForwardFailure=yes"
"-R" "2223:localhost:22"
"root@marcpartensky.com"
];
RunAtLoad = true;
KeepAlive = true;
StandardOutPath = "/tmp/autossh-rack-tunnel.log";
StandardErrorPath = "/tmp/autossh-rack-tunnel.err";
};
};
}
@@ -0,0 +1,42 @@
# Firefox du Mac pilotable par Hermes (module nix-darwin, importé par
# profiles/macos/configuration.nix).
#
# Firefox (profil quotidien de marc, session et cookies conservés) est lancé
# par launchd avec Marionette (127.0.0.1:2828) et WebDriver BiDi
# (127.0.0.1:9222). Le serveur MCP « firefox-mac » de tower
# (services/firefox-mac-mcp) s'y attache en --connectExisting à travers ssh :
# l'instance survit aux sessions Hermes, la musique continue après la fin
# d'une conversation. LibreWolf reste le navigateur des sites sensibles.
#
# - Firefox reste l'app impérative de /Applications (auto-update Mozilla,
# binaire universel arm64) ; seul le lancement est déclaratif.
# - Si Firefox tourne déjà SANS ces flags (lancé depuis le Dock, réouverture
# des fenêtres à la connexion), le wrapper attend qu'il soit quitté puis
# prend le relais : jamais deux instances sur le même profil.
# - KeepAlive : un Cmd+Q relance Firefox (avec les flags) après ~30 s.
# Arrêt réel : launchctl bootout gui/$(id -u)/org.nixos.firefox-hermes
# - Effets visibles du mode piloté : icône robot et barre d'adresse rayée,
# navigator.webdriver=true (certains anti-bots sont plus méfiants).
# - Sécurité : ports en loopback seulement, mais sans authentification : tout
# process local du Mac peut piloter ce Firefox. Accepté par marc.
{pkgs, ...}: let
firefox = "/Applications/Firefox.app/Contents/MacOS/firefox";
wrapper = pkgs.writeShellScript "firefox-hermes" ''
while /usr/bin/pgrep -f '^${firefox}( |$)' >/dev/null; do
sleep 15
done
exec ${firefox} --marionette --remote-debugging-port 9222
'';
in {
launchd.user.agents.firefox-hermes = {
serviceConfig = {
ProgramArguments = ["${wrapper}"];
RunAtLoad = true;
KeepAlive = true;
ThrottleInterval = 30;
ProcessType = "Interactive";
StandardOutPath = "/tmp/firefox-hermes.log";
StandardErrorPath = "/tmp/firefox-hermes.err";
};
};
}
+74
View File
@@ -0,0 +1,74 @@
# Skins Hermes : pose les YAML du pack « Hermes Menagerie » dans ~/.hermes/skins/,
# dossier que l'engine lit tel quel (hermes_cli/skin_engine.py, lecture seule côté
# Hermes). Le pack est une source brute, pas un flake (flake input
# `hermes-menagerie`, flake = false).
#
# Les fichiers sont des symlinks vers /nix/store, donc read-only : `hermes skin set
# <clé> <hex>` ne peut pas réécrire ces YAML sur place. Pour itérer sur une couleur,
# forker le skin dans un fichier séparé, ou pointer une entrée vers un clone local
# (config.lib.file.mkOutOfStoreSymlink). L'activation reste impérative, config.yaml
# n'étant pas géré par Nix :
# hermes config set display.skin catpuccin-mocha
{
lib,
config,
inputs,
...
}:
let
cfg = config.my.hermesSkins;
packDir = cfg.pack + "/skins";
# Le pack écrit « catpuccin » (deux p, un seul c) : catpuccin-mocha, catpuccin-latte.
available = builtins.filter (n: builtins.match ".+\\.yaml" n != null) (
builtins.attrNames (builtins.readDir packDir)
);
selected = if cfg.skins == [ ] then available else map (s: "${s}.yaml") cfg.skins;
unknown = lib.subtractLists available selected;
in {
options.my.hermesSkins = {
enable = lib.mkEnableOption "les skins Hermes Menagerie dans ~/.hermes/skins";
pack = lib.mkOption {
type = lib.types.path;
default = inputs.hermes-menagerie;
defaultText = lib.literalExpression "inputs.hermes-menagerie";
description = "Racine du pack (flake input `hermes-menagerie`, flake = false).";
};
skins = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
example = [ "catpuccin-mocha" "fox-ember" ];
description = "Skins à installer (nom sans .yaml) ; vide = tout le pack (26).";
};
dir = lib.mkOption {
type = lib.types.str;
default = ".hermes/skins";
description = ''
Dossier des skins, relatif à $HOME. Un profil Hermes utilise
`.hermes/profiles/<nom>/skins`.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = unknown == [ ];
message = "my.hermesSkins.skins : skin(s) absent(s) du pack : ${toString unknown}";
}
];
home.file = builtins.listToAttrs (
map (f: {
name = "${cfg.dir}/${f}";
value.source = packDir + "/${f}";
}) selected
);
};
}
+66
View File
@@ -0,0 +1,66 @@
# Environnement de build de l'app Winnie sur le Mac (front Svelte 5 + shell
# Tauri), pour que builder soit une commande, pas une procédure.
#
# Le toolchain (rust + triples iOS, node 22, cocoapods, tauri-cli, postgres) vit
# dans le devShell du flake `winnie` : ce module ne fait qu'exposer les
# commandes qui l'utilisent, chacune re-rentrant dans `nix develop`.
# winnie-doctor état du poste (Xcode, simulateur, dépôt, API) ; --fix
# winnie-sync rafraîchit ~/git/winnie depuis tower (LAN ou rack)
# winnie-shell devShell interactif
# winnie-front serveur Vite (HMR)
# winnie-macos app macOS en dev ; winnie-build-macos = .app/.dmg
# winnie-ios app iOS dans le simulateur ; winnie-build-ios = archive
# winnie-verify front + svelte-check + cargo check
#
# Ce qui reste manuel, forcément : Xcode (App Store, Apple en interdit la
# redistribution), le runtime du simulateur (winnie-doctor --fix le télécharge)
# et un compte Apple pour signer un build pour iPhone réel.
{
config,
lib,
pkgs,
...
}: let
cfg = config.my.winnie;
in {
options.my.winnie = {
enable = lib.mkEnableOption "l'environnement de build Winnie sur macOS";
repoRel = lib.mkOption {
type = lib.types.str;
default = "git/winnie";
description = "Chemin du dépôt winnie, relatif à $HOME.";
};
towerRepo = lib.mkOption {
type = lib.types.str;
default = "/home/marc/git/winnie";
description = "Chemin du même dépôt sur tower, source de winnie-sync (pas de remote git).";
};
towerHosts = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = ["towerlocal" "tower"];
description = ''
Alias ssh essayés dans l'ordre par winnie-sync : le LAN d'abord
(towerlocal = 192.168.1.44), puis le tunnel par le VPS
(tower = 10.100.0.3 via rack, tenu par l'agent autossh du Mac).
'';
};
apiUrl = lib.mkOption {
type = lib.types.str;
default = "https://api.winnie.marcpartensky.com";
description = "API interrogée par winnie-doctor et par le front.";
};
};
config = lib.mkIf cfg.enable {
home.packages = lib.attrValues (import ./scripts.nix {
inherit pkgs lib;
cfg = {
inherit (cfg) repoRel towerRepo towerHosts apiUrl;
};
});
};
}
+93
View File
@@ -0,0 +1,93 @@
# Commandes de build Winnie pour macOS, en dérivations writeShellApplication :
# shellcheck tourne au build et chaque commande est versionnée avec la config.
#
# Séparé du module home-manager exprès : ce fichier s'importe tel quel depuis
# tower avec les pkgs x86_64-linux pour construire et tester les mêmes scripts
# sans Mac (le Mac les reconstruit avec ses pkgs darwin).
{
pkgs,
lib,
cfg, # { repoRel, towerRepo, towerHosts, apiUrl }
}:
let
subst = text:
lib.replaceStrings
["@REPO_REL@" "@TOWER_REPO@" "@TOWER_HOSTS@" "@API_URL@" "@WINNIE_SYNC@"]
[
cfg.repoRel
cfg.towerRepo
(lib.concatMapStrings (h: "'${h}' ") cfg.towerHosts)
cfg.apiUrl
(lib.getExe sync)
]
text;
# Scripts exécutés DANS le devShell du flake winnie : leurs outils (npm, cargo,
# tauri, xcrun, simctl) viennent de ce shell, d'où runtimeInputs vide.
inner = name: file: pkgs.writeShellApplication {
name = "winnie-${name}-inner";
text = subst (builtins.readFile file);
};
# Commandes exposées : cd dans le dépôt puis ré-exécution de l'inner dans
# `nix develop`, pour que rien ne dépende du PATH du Mac.
dev = name: innerScript: pkgs.writeShellApplication {
name = "winnie-${name}";
runtimeInputs = [pkgs.nix];
text = ''
repo="$HOME/${cfg.repoRel}"
if [ ! -f "$repo/flake.nix" ]; then
echo "winnie-${name} : dépôt absent ($repo). Lance winnie-sync." >&2
exit 1
fi
cd "$repo"
exec nix --extra-experimental-features 'nix-command flakes' develop -c ${lib.getExe innerScript} "$@"
'';
};
# Rafraîchit le dépôt depuis tower : rsync du dépôt local de tower (le dépôt
# n'a pas de remote git, tower est le seul original).
sync = pkgs.writeShellApplication {
name = "winnie-sync";
runtimeInputs = [pkgs.rsync pkgs.openssh];
text = subst (builtins.readFile ./scripts/sync.sh);
};
# État du poste : Xcode, SDK iOS, runtime du simulateur, node_modules, API.
# Xcode n'est pas dans le store Nix (App Store), donc ce diagnostic est la
# seule source de vérité, et --fix automatise tout sauf l'installation d'Xcode.
doctor = pkgs.writeShellApplication {
name = "winnie-doctor";
runtimeInputs = [pkgs.nix pkgs.curl pkgs.coreutils];
text = subst (builtins.readFile ./scripts/doctor.sh);
};
# DevShell interactif du projet, sans deviner le chemin du dépôt.
shell = pkgs.writeShellApplication {
name = "winnie-shell";
runtimeInputs = [pkgs.nix];
text = ''
repo="$HOME/${cfg.repoRel}"
if [ ! -f "$repo/flake.nix" ]; then
echo "winnie-shell : dépôt absent ($repo). Lance winnie-sync." >&2
exit 1
fi
cd "$repo"
exec nix --extra-experimental-features 'nix-command flakes' develop "$@"
'';
};
in {
inherit doctor shell sync;
# Serveur Vite (HMR) du front Svelte.
front = dev "front" (inner "front" ./scripts/front.sh);
# App Tauri : macOS (CLT suffisent) et iOS (Xcode requis).
macos = dev "macos" (inner "macos" ./scripts/macos-dev.sh);
macos-build = dev "build-macos" (inner "build-macos" ./scripts/macos-build.sh);
ios = dev "ios" (inner "ios" ./scripts/ios-dev.sh);
ios-build = dev "build-ios" (inner "build-ios" ./scripts/ios-build.sh);
# Contrôles avant commit (front + svelte-check + cargo check).
verify = dev "verify" (inner "verify" ./scripts/verify.sh);
}
+143
View File
@@ -0,0 +1,143 @@
# winnie-doctor : état du poste Mac pour builder Winnie.
# winnie-doctor diagnostic seul
# winnie-doctor --fix répare ce qui est automatisable (dépôt, node_modules,
# developer dir Xcode, licence, runtime du simulateur)
#
# Xcode, le SDK iOS et les runtimes du simulateur viennent d'Apple, jamais du
# store Nix : ce script est la seule source de vérité sur leur disponibilité.
repo="$HOME/@REPO_REL@"
api="@API_URL@"
sync_bin="@WINNIE_SYNC@"
fix=0
if [ "${1:-}" = "--fix" ]; then
fix=1
fi
todo=0
line() { printf '%-8s %s\n' "$1" "$2"; }
ok() { line "[ok]" "$1"; }
missing() { line "[manque]" "$1"; todo=$((todo + 1)); }
info() { line "[-]" "$1"; }
printf 'winnie-doctor\n\n'
# --- nix ---------------------------------------------------------------
if command -v nix >/dev/null 2>&1; then
ok "nix : $(nix --version)"
else
missing "nix absent du PATH"
fi
# --- dépôt winnie ------------------------------------------------------
if [ -f "$repo/flake.nix" ]; then
ok "dépôt : $repo"
if nix --extra-experimental-features 'nix-command flakes' flake metadata "$repo" >/dev/null 2>&1; then
ok "flake winnie évaluable"
else
missing "flake winnie non évaluable (nix flake metadata $repo)"
fi
else
missing "dépôt : $repo"
if [ "$fix" = 1 ]; then
echo " -> winnie-sync"
"$sync_bin" || true
fi
fi
# --- Xcode : seul le build iOS l'exige ---------------------------------
xcode_ok=0
if [ -d /Applications/Xcode.app ]; then
ok "Xcode.app installé"
xcode_ok=1
else
missing "Xcode.app absent (App Store, recherche « Xcode », ~8 Go)"
info "sans Xcode : le front et le build macOS marchent, seul winnie-ios l'exige"
info "fiche App Store : open 'macappstore://apps.apple.com/app/id497799835'"
fi
if [ -x /usr/bin/xcode-select ]; then
devdir="$(/usr/bin/xcode-select -p 2>/dev/null || true)"
if [ "$devdir" = "/Applications/Xcode.app/Contents/Developer" ]; then
ok "xcode-select : Xcode"
elif [ "$xcode_ok" = 1 ]; then
missing "xcode-select : ${devdir:-vide} (attendu /Applications/Xcode.app/Contents/Developer)"
if [ "$fix" = 1 ]; then
echo " -> sudo xcode-select -s /Applications/Xcode.app (mot de passe macOS demandé)"
sudo /usr/bin/xcode-select -s /Applications/Xcode.app
sudo /usr/bin/xcodebuild -license accept || true
/usr/bin/xcodebuild -runFirstLaunch || true
fi
else
info "xcode-select : ${devdir:-vide} (Command Line Tools, suffisant hors iOS)"
fi
else
info "xcode-select absent (poste non macOS ?)"
fi
if [ "$xcode_ok" = 1 ]; then
sdk="$(/usr/bin/xcrun --sdk iphoneos --show-sdk-version 2>/dev/null || true)"
if [ -n "$sdk" ]; then
ok "SDK iOS : $sdk"
else
missing "SDK iOS (xcrun --sdk iphoneos --show-sdk-version ; licence Xcode non acceptée ?)"
if [ "$fix" = 1 ]; then
echo " -> sudo xcodebuild -license accept"
sudo /usr/bin/xcodebuild -license accept || true
fi
fi
runtime_ok=0
if /usr/bin/xcrun simctl list runtimes 2>/dev/null | grep -q 'iOS '; then
runtime_ok=1
fi
if [ "$runtime_ok" = 1 ]; then
ok "runtime du simulateur iOS"
else
missing "runtime du simulateur iOS"
if [ "$fix" = 1 ]; then
echo " -> xcodebuild -downloadPlatform iOS (~8 Go, plusieurs minutes)"
/usr/bin/xcodebuild -downloadPlatform iOS || true
fi
fi
fi
# --- front / node ------------------------------------------------------
if [ -f "$repo/app/package.json" ]; then
if [ -d "$repo/app/node_modules" ]; then
ok "app/node_modules (npm ci fait)"
else
missing "app/node_modules"
if [ "$fix" = 1 ]; then
echo " -> npm ci dans le devShell (~1 min)"
(cd "$repo" && nix --extra-experimental-features 'nix-command flakes' develop -c bash -c "cd app && npm ci") || true
fi
fi
if [ -d "$repo/app/src-tauri/gen/apple" ]; then
ok "projet Xcode généré (src-tauri/gen/apple)"
else
info "src-tauri/gen/apple absent : winnie-ios le génère (tauri ios init)"
fi
fi
# --- API ---------------------------------------------------------------
code="$(curl -sS -m 8 -o /dev/null -w '%{http_code}' "$api/healthz" 2>/dev/null || true)"
if [ "$code" = "200" ]; then
ok "API : $api"
else
missing "API : $api/healthz (HTTP ${code:-aucune réponse})"
fi
# --- verdict -----------------------------------------------------------
printf '\n'
if [ "$todo" -eq 0 ]; then
echo "tout est prêt : winnie-ios (simulateur), winnie-front, winnie-macos."
exit 0
fi
echo "$todo contrôle(s) en échec."
if [ "$fix" = 1 ]; then
echo "relance winnie-doctor pour vérifier ce qui reste."
else
echo "winnie-doctor --fix répare ce qui est automatisable."
fi
exit 1
+12
View File
@@ -0,0 +1,12 @@
# Serveur Vite (HMR) de app/ : joignable sur le LAN (http://<mac>:8080) et sur
# dev.winnie.marcpartensky.com via Pangolin. Lancé par winnie-front, donc les
# outils (node 22, npm) viennent du devShell du flake winnie.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-front] npm ci"
npm ci
fi
exec npm run dev "$@"
@@ -0,0 +1,16 @@
# Archive iOS pour un iPhone réel (et export IPA si un compte Apple est
# configuré dans Xcode). Le simulateur n'exige aucun compte, pas ceci.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-build-ios] npm ci"
npm ci
fi
if [ ! -d src-tauri/gen/apple ]; then
echo "[winnie-build-ios] tauri ios init (projet Xcode + pod install)"
./node_modules/.bin/tauri ios init
fi
exec ./node_modules/.bin/tauri ios build --target aarch64 "$@"
@@ -0,0 +1,37 @@
# App iOS en dev : simulateur (aucun compte Apple requis) ou iPhone branché.
# npm ci et `tauri ios init` (projet Xcode + pod install) sont faits au besoin,
# donc la toute première exécution est longue.
# winnie-ios premier iPhone du simulateur
# winnie-ios "iPhone 17 Pro" appareil précis, en argument positionnel
# WINNIE_IOS_DEVICE=<nom|udid> winnie-ios
# winnie-ios --force-ip-prompt sur le LAN (Vite sert déjà le LAN)
# `tauri ios dev` prend l'appareil en positionnel (le champ `device` de la CLI
# n'a pas d'attribut clap) et ouvre un menu interactif quand on ne passe rien :
# d'où la recherche du premier iPhone pour que la commande marche seule.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-ios] npm ci"
npm ci
fi
if [ ! -d src-tauri/gen/apple ]; then
echo "[winnie-ios] tauri ios init (projet Xcode + pod install)"
./node_modules/.bin/tauri ios init
fi
args=("$@")
if [ "${#args[@]}" -eq 0 ] && [ -n "${WINNIE_IOS_DEVICE:-}" ]; then
args=("$WINNIE_IOS_DEVICE")
fi
if [ "${#args[@]}" -eq 0 ]; then
sim="$(xcrun simctl list devices available 2>/dev/null | awk -F ' \\(' '/^ *iPhone/ {sub(/^ */, "", $1); print $1; exit}' || true)"
if [ -n "$sim" ]; then
echo "[winnie-ios] simulateur : $sim"
args=("$sim")
fi
fi
exec ./node_modules/.bin/tauri ios dev "${args[@]}"
@@ -0,0 +1,10 @@
# Bundle macOS (.app + .dmg) : app/src-tauri/target/release/bundle/.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-build-macos] npm ci"
npm ci
fi
exec ./node_modules/.bin/tauri build "$@"
@@ -0,0 +1,11 @@
# App macOS (fenêtre Tauri + Vite en HMR) : ni Xcode ni simulateur, les
# Command Line Tools suffisent.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-macos] npm ci"
npm ci
fi
exec ./node_modules/.bin/tauri dev "$@"
+62
View File
@@ -0,0 +1,62 @@
# winnie-sync : rafraîchit ~/git/winnie depuis tower, la source de vérité
# (le dépôt n'a pas de remote git : tower est le seul original).
# Le premier alias ssh qui répond gagne : LAN d'abord (towerlocal), puis le
# tunnel par le VPS (tower -> 10.100.0.3 via rack, tenu par l'agent autossh).
# winnie-sync copie incrémentale, garde les fichiers locaux en trop
# winnie-sync --delete miroir strict de tower (supprime les fichiers en trop)
repo="$HOME/@REPO_REL@"
tower_repo="@TOWER_REPO@"
hosts=(@TOWER_HOSTS@)
delete=()
if [ "${1:-}" = "--delete" ]; then
delete=(--delete)
elif [ -n "${1:-}" ]; then
echo "usage: winnie-sync [--delete]" >&2
exit 2
fi
host=""
for h in "${hosts[@]}"; do
printf 'winnie-sync : %s... ' "$h"
if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=accept-new "$h" true >/dev/null 2>&1; then
echo "ok"
host="$h"
break
fi
echo "injoignable"
done
if [ -z "$host" ]; then
echo "winnie-sync : tower injoignable (essayé : ${hosts[*]})" >&2
echo "winnie-sync : LAN = towerlocal (192.168.1.44) ; hors LAN = tower (via rack)" >&2
exit 1
fi
mkdir -p "$repo"
echo "winnie-sync : $host:$tower_repo -> $repo"
# La barre de progression seulement sur un terminal (sans quoi un log
# redirigé se remplit de retours chariot).
progress=()
if [ -t 1 ]; then
progress=(--info=progress2)
fi
# Ce qui ne traverse jamais : binaires par plateforme (node_modules, tauri-cli)
# et artefacts liés à la machine (target, projet Xcode généré, clés de signature).
rsync -a --no-owner --no-group "${progress[@]}" \
--exclude /.direnv/ \
--exclude /backend/target/ \
--exclude /ingest/target/ \
--exclude /app/node_modules/ \
--exclude /app/dist/ \
--exclude /app/src-tauri/target/ \
--exclude /app/src-tauri/gen/ \
--exclude /app/.android-sdk/ \
--exclude /app/.android-user/ \
--exclude /app/.keys/ \
"${delete[@]}" \
"$host:$tower_repo/" "$repo/"
echo "winnie-sync : terminé (winnie-doctor pour l'état du poste)."
+29
View File
@@ -0,0 +1,29 @@
# Contrôles avant commit, dans l'ordre du projet : build du front (vite),
# svelte-check, puis cargo check du backend et de l'ingest.
# `npm run check` n'est pas appelé tel quel : son `tsc -p tsconfig.node.json`
# échoue sur TS2688 (Cannot find type definition file for 'node', @types/node
# absent de app/package.json), une dette antérieure au projet.
repo="$HOME/@REPO_REL@"
cd "$repo/app"
if [ ! -d node_modules ]; then
echo "[winnie-verify] npm ci"
npm ci
fi
echo "[winnie-verify] front : vite build"
npm run build
echo "[winnie-verify] front : svelte-check"
./node_modules/.bin/svelte-check --tsconfig ./tsconfig.app.json
cd "$repo"
echo "[winnie-verify] backend : cargo check"
cargo check --manifest-path backend/Cargo.toml
if [ -f ingest/Cargo.toml ]; then
echo "[winnie-verify] ingest : cargo check"
cargo check --manifest-path ingest/Cargo.toml
fi
echo "[winnie-verify] ok"
+72
View File
@@ -0,0 +1,72 @@
# kimi-aichat.nix
# Module Home Manager — importez-le dans votre home.nix
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.programs.aichat-moonshot;
in {
options.programs.aichat-moonshot = {
enable = mkEnableOption "aichat CLI configuré pour Moonshot/Kimi via sops-nix";
sopsSecretKey = mkOption {
type = types.str;
default = "kimi/api_key";
description = ''
Nom de la clé dans votre fichier de secrets sops.
Exemple: <literal>kimi/api_key</literal> ou <literal>aichat/moonshot_api_key</literal>.
La valeur déchiffrée doit être la clé brute (ex: <literal>sk-xxx</literal>).
'';
};
model = mkOption {
type = types.str;
default = "moonshot:kimi-latest";
example = "moonshot:kimi-k1";
description = "Modèle par défaut utilisé par aichat.";
};
extraConfig = mkOption {
type = types.attrs;
default = {};
example = literalExpression ''
{
save = true;
keybindings = "vi";
highlight = true;
}
'';
description = ''
Attributs Nix supplémentaires mergés dans <filename>~/.config/aichat/config.yaml</filename>.
Ne mettez JAMAIS de secrets ici.
'';
};
};
config = mkIf cfg.enable {
# 1. Déclare le secret pour sops-nix
# (suppose que vous avez déjà importé le module sops-nix dans votre config HM)
sops.secrets.${cfg.sopsSecretKey} = {};
# 2. Fichier de config publique (sans clé API)
home.file.".config/aichat/config.yaml".text = lib.generators.toYAML {} ({
model = cfg.model;
}
// cfg.extraConfig);
# 3. Wrapper "kimi" qui lit le secret à l'exécution
home.packages = [
(pkgs.writeShellApplication {
name = "kimi";
runtimeInputs = [pkgs.aichat];
text = ''
export AICHAT_MOONSHOT_API_KEY=$(cat "${config.sops.secrets.${cfg.sopsSecretKey}.path}")
exec aichat "$@"
'';
})
];
};
}
+76
View File
@@ -0,0 +1,76 @@
{ pkgs, ... }:
{
programs.alacritty = {
enable = true;
settings = {
window = {
title = "Terminal";
opacity = 0.9;
decorations = "None";
padding = { y = 5; };
dimensions = {
lines = 75;
columns = 100;
};
};
keyboard.bindings = [
# Copier avec Ctrl+C
# { key = "C"; mods = "Control"; action = "Copy"; }
# { key = "C"; mods = "Control"; action = "Copy"; }
# Envoyer SIGINT (interruption) avec Ctrl+Maj+C
# { key = "C"; mods = "Control|Shift"; action = "ReceiveChar"; chars = "\\x03"; }
# Coller avec Ctrl+V
# { key = "V"; mods = "Control"; action = "Paste"; }
{ key = "PageUp"; action = "Copy"; }
{ key = "PageUp"; mode = "Vi|~Search"; action = "Copy"; }
{ key = "PageDown"; action = "Paste"; }
# { key = "PageDown"; mode = "Vi|~Search"; action = "Paste"; }
];
font = {
normal = {
family = "MesloLGS NF";
style = "Regular";
};
size = 15;
};
terminal.shell = { program = "${pkgs.zsh}/bin/zsh"; };
# colors = {
# primary = {
# background = "0x000000";
# foreground = "0xEBEBEB";
# };
# cursor = {
# text = "0xFF261E";
# cursor = "0xFF261E";
# };
# normal = {
# black = "0x0D0D0D";
# red = "0xFF301B";
# green = "0xA0E521";
# yellow = "0xFFC620";
# blue = "0x178AD1";
# magenta = "0x9f7df5";
# cyan = "0x21DEEF";
# white = "0xEBEBEB";
# };
# bright = {
# black = "0x6D7070";
# red = "0xFF4352";
# green = "0xB8E466";
# yellow = "0xFFD750";
# blue = "0x1BA6FA";
# magenta = "0xB978EA";
# cyan = "0x73FBF1";
# white = "0xFEFEF8";
# };
# };
};
};
}
+19
View File
@@ -0,0 +1,19 @@
{
inputs,
pkgs,
...
}: {
home.packages = [inputs.backtest.packages.${pkgs.stdenv.hostPlatform.system}.default];
systemd.user.services.backtest = {
Unit.Description = "Backtest Streamlit dashboard";
Unit.After = ["network.target"];
Service = {
ExecStart = "${inputs.backtest.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/backtest --server.port 8501";
WorkingDirectory = "${inputs.backtest.packages.${pkgs.stdenv.hostPlatform.system}.default}/lib";
Restart = "on-failure";
RestartSec = "5s";
};
Install.WantedBy = ["default.target"];
};
}
+8
View File
@@ -0,0 +1,8 @@
{ pkgs }: {
programs.bat = {
enable = true;
# themes =
# config = {
# };
}
}
+10
View File
@@ -0,0 +1,10 @@
{lib, ...}: let
hasBattery =
builtins.pathExists /sys/class/power_supply/BAT0
|| builtins.pathExists /sys/class/power_supply/BAT1;
in {
services.batsignal = lib.mkIf hasBattery {
enable = true;
extraArgs = ["-p" "-m" "1" "-a" "ADP0"];
};
}
@@ -0,0 +1,94 @@
#!/usr/bin/env python3
import subprocess
import sys
import json
import urllib.request
import urllib.error
import os
MODEL = "claude-haiku-4-5-20251001"
MAX_TOKENS = 200
SECRET_PATH = os.path.expanduser("/run/secrets/anthropic_api_key")
def get_api_key() -> str:
try:
with open(SECRET_PATH) as f:
key = f.read().strip()
if not key:
raise ValueError("empty")
return key
except Exception as e:
print(f"claude-commit: cannot read API key from {SECRET_PATH}: {e}", file=sys.stderr)
sys.exit(1)
def get_staged_diff() -> str:
result = subprocess.run(
["git", "diff", "--cached"],
capture_output=True, text=True
)
if result.returncode != 0:
print(f"claude-commit: git error: {result.stderr}", file=sys.stderr)
sys.exit(1)
return result.stdout.strip()
def generate_commit_message(diff: str, api_key: str) -> str:
prompt = (
"Generate a concise conventional commit message (type: short description) for this diff.\n"
"Rules:\n"
"- Use one of: feat, fix, docs, style, refactor, test, chore\n"
"- Max 72 chars\n"
"- Lowercase\n"
"- No period at end\n"
"- Reply with ONLY the commit message, nothing else\n\n"
f"Diff:\n{diff}"
)
payload = json.dumps({
"model": MODEL,
"max_tokens": MAX_TOKENS,
"messages": [{"role": "user", "content": prompt}]
}).encode()
req = urllib.request.Request(
"https://api.anthropic.com/v1/messages",
data=payload,
headers={
"x-api-key": api_key,
"anthropic-version": "2023-06-01",
"content-type": "application/json",
},
method="POST",
)
try:
with urllib.request.urlopen(req) as resp:
data = json.loads(resp.read())
return data["content"][0]["text"].strip()
except urllib.error.HTTPError as e:
body = e.read().decode()
print(f"claude-commit: API error {e.code}: {body}", file=sys.stderr)
sys.exit(1)
def main():
api_key = get_api_key()
diff = get_staged_diff()
if not diff:
print("claude-commit: nothing staged", file=sys.stderr)
sys.exit(1)
msg = generate_commit_message(diff, api_key)
if not msg:
print("claude-commit: empty response from API", file=sys.stderr)
sys.exit(1)
print(f"=> {msg}")
if os.environ.get("CC_DRY") == "1":
print("(dry-run, not committing)")
return
result = subprocess.run(["git", "commit", "-m", msg])
sys.exit(result.returncode)
if __name__ == "__main__":
main()
+22
View File
@@ -0,0 +1,22 @@
{
config,
lib,
pkgs,
...
}: let
script = pkgs.writeTextFile {
name = "claude-commit.py";
text = builtins.readFile ./claude-commit.py;
};
claude-commit = pkgs.writeShellScriptBin "claude-commit" ''
exec ${pkgs.python3}/bin/python3 ${script} "$@"
'';
in {
# sops.secrets."anthropic_api_key" = {
# sopsFile = ../../secrets/common.yml;
# owner = "root";
# };
home.packages = [claude-commit];
}
+27
View File
@@ -0,0 +1,27 @@
{ ... }:
{
programs.clawdbot = {
enable = true;
systemd.enable = false;
firstParty = {
summarize.enable = false; # Summarize web pages, PDFs, videos
peekaboo.enable = false; # Take screenshots
oracle.enable = false; # Web search
poltergeist.enable = false; # Control your macOS UI
sag.enable = false; # Text-to-speech
camsnap.enable = false; # Camera snapshots
gogcli.enable = false; # Google Calendar
bird.enable = false; # Twitter/X
sonoscli.enable = false; # Sonos control
imsg.enable = false; # iMessage
};
instances.default = {
enable = true;
agent = {
model = "anthropic/claude-opus-4-5";
};
};
};
}
+48
View File
@@ -0,0 +1,48 @@
{ pkgs, ... }:
{
services.clipcat = {
enable = true;
daemonSettings = {
# OBLIGATOIRE : false pour que systemd gère le processus sans erreur
daemonize = false;
max_history = 50;
# SUPPRIME 'path = null'.
# Par défaut, sans chemin spécifié, Clipcat log vers stdout (donc journalctl).
log = {
level = "info";
};
};
# Configuration minimale pour le menu
menuSettings = {
print_command = "rofi -dmenu -p 'Clipcat'";
};
};
systemd.user.services.clipcat.Service.X-RestartIfChanged = false;
systemd.user.services.clip-notify = {
Unit = {
Description = "Notification copie presse-papier";
After = [ "graphical-session.target" ];
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
Service = {
ExecStart = toString (
pkgs.writeShellScript "clip-notify-script" ''
${pkgs.wl-clipboard}/bin/wl-paste --watch \
${pkgs.libnotify}/bin/notify-send "📋 Copy" -t 1500 -u low
''
);
Restart = "always";
X-RestartIfChanged = false;
};
};
}
+17
View File
@@ -0,0 +1,17 @@
{ pkgs, ... }:
{
dconf.enable = true;
dconf.settings = {
"org/gnome/desktop/media-handling" = {
automount = true;
automount-open = true;
};
"org/gnome/nautilus/preferences" = {
default-folder-viewer = "'list-view'";
};
"org/gnome/nautilus/list-view" = {
sort-column = "'modified'";
sort-order = "'descending'";
};
};
}
+35
View File
@@ -0,0 +1,35 @@
{pkgs, ...}: let
deep-filter-cli = pkgs.rustPlatform.buildRustPackage {
pname = "deep-filter-cli";
version = pkgs.deepfilternet.version;
src = pkgs.deepfilternet.src;
# On met le hash exact que Nix vient de nous donner !
cargoHash = "sha256-eNyX2ir+JYV15QI+e8tWcso7DVEbPxcS6PKenJIPzEA=";
cargoBuildFlags = ["-p" "deep_filter"];
nativeBuildInputs = [
pkgs.pkg-config
pkgs.python3
];
buildInputs = [
pkgs.hdf5
pkgs.hdf5.dev
pkgs.alsa-lib
];
HDF5_DIR = "${pkgs.symlinkJoin {
name = "hdf5-merged";
paths = [pkgs.hdf5 pkgs.hdf5.dev];
}}";
doCheck = false;
};
in {
home.packages = [
deep-filter-cli
];
}
+39
View File
@@ -0,0 +1,39 @@
{ pkgs, ... }:
{
users.users.marc.extraGroups = [ "docker" ];
environment.etc."resolv.conf".text = "nameserver 8.8.8.8\n";
virtualisation = {
containers.enable = true;
docker = {
storageDriver = "zfs";
enable = true;
daemon.settings = {
dns = [ "1.1.1.1" "8.8.8.8" ];
# registry-mirrors = [ "https://mirror.gcr.io" ];
# "default-address-pools" = [
# { "base" = "172.27.0.0/16"; "size" = 24; }
# ];
};
# enable = true;
rootless = {
enable = false;
# setSocketVariable = true;
};
# # Required for containers under podman-compose to be able to talk to each other.
# defaultNetwork.settings.dns_enabled = true;
};
};
# Useful other development tools
environment.systemPackages = with pkgs; [
dive # look into docker image layers
# podman-tui # status of containers in the terminal
docker-compose # start group of containers for dev
#podman-compose # start group of containers for dev
];
}
+142
View File
@@ -0,0 +1,142 @@
{
lib,
config,
pkgs,
...
}:
# Client Eternal Terminal : ouvre (ou crée) une session zellij sur l'hôte distant
# et l'enregistre côté serveur avec asciinema (script `et-session`, cf.
# services/eternal-terminal/default.nix — module côté serveur).
#
# et lit ~/.ssh/config : les alias `ssh` existants (modules/home/ssh) servent donc
# aussi de cibles à `et <alias>`.
let
cfg = config.my.et;
hostModule =
{ name, ... }:
{
options = {
remoteCommand = lib.mkOption {
type = lib.types.str;
default = cfg.remoteCommand;
description = ''
Commande lancée sur l'hôte distant à la connexion. Chemin absolu de
préférence : le PATH des shells non interactifs distants n'est pas garanti.
'';
};
session = lib.mkOption {
type = lib.types.str;
default = cfg.defaultSession;
description = "Nom de la session zellij à attacher (créée si absente).";
};
user = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Utilisateur distant (`et -u`) ; null = celui de ~/.ssh/config.";
};
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
description = "Port de l'etserver distant (`et -p`), défaut ET = 2022 ; null = défaut.";
};
functionName = lib.mkOption {
type = lib.types.str;
default = "et${name}";
description = "Nom de la fonction zsh générée.";
};
};
};
in
{
options.my.et = {
enable = lib.mkEnableOption "connexions Eternal Terminal avec zellij et enregistrement automatiques";
defaultSession = lib.mkOption {
type = lib.types.str;
default = "main";
description = "Session zellij par défaut (surchargée par ET_SESSION).";
};
remoteCommand = lib.mkOption {
type = lib.types.str;
default = "/run/current-system/sw/bin/et-session";
description = ''
Commande de session distante. Le défaut est le chemin absolu du script
installé par services/eternal-terminal (chemin stable sur NixOS).
'';
};
wrapEt = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Redéfinir `et` en fonction zsh : `et <hôte>` attache zellij enregistré,
tout appel avec option (`et -v 3 hôte`, `et -t 10080:80 hôte`) passe
directement au binaire.
'';
};
hosts = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule hostModule);
default = { };
example = {
tower = {
port = 2022;
};
towerlocal = { };
};
description = ''
Alias à exposer : chaque entrée `name` génère une fonction zsh `etname`.
`name` doit être un hôte/alias présent dans ~/.ssh/config.
'';
};
};
config = lib.mkIf cfg.enable {
home.packages = [ pkgs.eternal-terminal ];
programs.zsh.initContent = lib.mkAfter (
let
mkFunction =
name: h:
let
flags = lib.escapeShellArgs (
lib.optionals (h.user != null) [ "-u" h.user ]
++ lib.optionals (h.port != null) [ "-p" (toString h.port) ]
++ [ name ]
);
in
''
${h.functionName}() {
command et ${flags} -c ${lib.escapeShellArg "${h.remoteCommand} ${h.session}"}
}
'';
in
''
# --- my.et : Eternal Terminal + zellij + enregistrement asciinema ---
# Attache (ou crée) une session zellij distante enregistrée : ets <hôte> [session]
ets() {
local host="${"$"}{1:?usage: ets <hôte> [session]}"
shift
local session="${"$"}{1:-${"$"}{ET_SESSION:-${cfg.defaultSession}}}"
command et "$host" -c "${"$"}{ET_REMOTE_COMMAND:-${cfg.remoteCommand}} $session"
}
${lib.concatStringsSep "\n" (lib.mapAttrsToList mkFunction cfg.hosts)}
''
+ lib.optionalString cfg.wrapEt ''
# et <hôte> (sans option) = zellij enregistré ; le reste passe au binaire.
et() {
if (( $# >= 1 )) && [[ "$1" != -* ]]; then
command et "$@" -c "${"$"}{ET_REMOTE_COMMAND:-${cfg.remoteCommand}} ${"$"}{ET_SESSION:-${cfg.defaultSession}}"
else
command et "$@"
fi
}
''
);
};
}
+9
View File
@@ -0,0 +1,9 @@
{ pkgs, ... }:
{
programs.eww = {
enable = true;
package = pkgs.eww;
configDir = ./.; # Il va prendre tous les fichiers du dossier courant
};
}
+44
View File
@@ -0,0 +1,44 @@
$bg-color: #1e1e2e;
$speed: 25s;
* { all: unset; }
.bar-main {
background-color: $bg-color;
color: #cdd6f4;
border-bottom: 2px solid #89b4fa;
border-radius: 0 0 12px 12px;
padding: 0 40px;
}
.moving-zone {
min-width: 10000px; // Massive width for long strings
animation-name: scroll_smooth;
animation-duration: $speed;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
.ticker-text {
color: #fab387;
font-weight: bold;
// white-space: nowrap;
}
@keyframes scroll_smooth {
from { margin-left: 700px; }
to { margin-left: -5000px; }
}
.fade-left {
background-image: linear-gradient(to right, $bg-color, rgba(30, 30, 46, 0));
}
.fade-right {
background-image: linear-gradient(to left, $bg-color, rgba(30, 30, 46, 0));
}
.bt-label { color: #89b4fa; font-weight: bold; }
.tm-label { color: #f5c2e7; font-weight: bold; margin: 0 15px; }
.bat-label { color: #a6e3a1; font-weight: bold; }
.trigger { background-color: transparent; }
+38
View File
@@ -0,0 +1,38 @@
(defvar bar_visible false)
(defvar ticker_content "Système Opérationnel")
(defpoll time :interval "5s" "date '+%H:%M'")
(defpoll battery_percent :interval "30s" "cat /sys/class/power_supply/BAT0/capacity")
(defpoll bluetooth_device :interval "5s" "bluetoothctl info | grep 'Name:' | sed 's/Name: //g' || echo 'Disconnected'")
(defwindow bar
:monitor 0
:geometry (geometry :x "0%" :y "0px" :width "100%" :height "85px" :anchor "top center")
:stacking "fg"
:exclusive false ;; CHANGEMENT : Ne décale plus les applications
:focusable false
(eventbox :onhover "${EWW_CMD} update bar_visible=true"
:onhoverlost "${EWW_CMD} update bar_visible=false"
(box :orientation "v" :space-evenly false
(revealer :transition "slidedown" :reveal bar_visible :duration "250ms"
(centerbox :class "bar-main"
;; Left
(box :halign "start" :width 250
(label :class "bt-label" :text "󰂱 ${bluetooth_device}"))
;; Center (Ticker)
(box :class "ticker-viewport-clip" :width 700
(overlay
(box :class "moving-zone"
(label :class "ticker-text" :text "${ticker_content} • BT: ${bluetooth_device} • BAT: ${battery_percent}% • "))
;; Fade masks
(box :halign "start" :class "fade-left" :width 60)
(box :halign "end" :class "fade-right" :width 60)))
;; Right
(box :halign "end" :width 250
(label :class "tm-label" :text "󱑂 ${time}")
(label :class "bat-label" :text "󰁹 ${battery_percent}%"))))
;; Trigger zone (Zone invisible qui détecte le survol)
(box :class "trigger" :height 2))))
+201
View File
@@ -0,0 +1,201 @@
{ pkgs, lib, inputs, ... }:
{
nixpkgs.overlays = [ inputs.nur.overlays.default ];
home-manager.users.marc = { pkgs, inputs, ... }:
let
# nur = inputs.nur.packages.${pkgs.system};
firefoxAddons = pkgs.nur.repos.rycee.firefox-addons;
# Extensions from NUR or directly from pkgs
extensions = with firefoxAddons; [
darkreader
ublock-origin
bitwarden
tabliss
umatrix
refined-github
single-file
videospeed
sponsorblock
return-youtube-dislikes
privacy-badger
tab-stash
youtube-shorts-block
about-sync
auto-tab-discard
catppuccin-mocha-mauve
clearurls
container-colors
don-t-fuck-with-paste
export-tabs-urls-and-titles
enhanced-github
floccus
linkwarden
pwas-for-firefox
pywalfox
refined-github
session-sync
spoof-timezone
tab-counter-plus
tab-session-manager
youtube-high-definition
proton-pass
# wallabagger
# ghostery
# firefoxpwa
];
in
{
xdg.desktopEntries = {
# "default" = {
# name = "Perso";
# exec = "${pkgs.firefox}/bin/firefox -P Default -no-remote %u";
# terminal = false;
# type = "Application";
# icon = "firefox";
# };
# "youtube" = {
# name = "Youtube";
# exec = "${pkgs.firefox}/bin/firefox -P Youtube -no-remote %u";
# terminal = false;
# type = "Application";
# icon = "firefox";
# };
"firefox-work" = {
name = "Firefox Work";
exec = "${pkgs.firefox}/bin/firefox -P Work -no-remote %u";
terminal = false;
type = "Application";
icon = "firefox";
};
};
nixpkgs.overlays = [ inputs.nur.overlays.default ];
programs.firefox = {
enable = true;
package = pkgs.firefox;
# nativeMessagingHosts.packages = [ pkgs.firefoxpwa ];
policies = {
Extensions = {
Locked = [
# enable both extensions
"uBlock0@raymondhill.net"
"446900e4-71c2-419f-a6a7-df9c091e268b" # Extension ID for bitwarden
];
};
ExtensionSettings = {
"uBlock0@raymondhill.net" = { default_area = "menupanel"; };
"446900e4-71c2-419f-a6a7-df9c091e268b" = { default_area = "navbar"; };
"umatrix@raymondhill.net" = {
default_area = "menupanel";
filters = [
"EasyList"
"EasyPrivacy"
"Fanboy's Social Blocking List"
"uMatrix Filters"
];
};
};
};
profiles = {
default = {
name = "Default";
path = "default";
isDefault = true;
id = 0;
extensions = {
packages = extensions;
};
search = {
force = true;
default = "Startpage";
engines = {
"Startpage" = {
urls = [{
template = "https://www.startpage.com/rvd/search?query={searchTerms}&language=auto";
}];
icon = "https://www.startpage.com/sp/cdn/favicons/mobile/android-icon-192x192.png";
updateInterval = 86400000;
definedAliases = [ "@s" ];
};
};
};
settings = {
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
};
};
youtube = {
name = "Youtube";
path = "youtube";
id = 1;
# bookmarks = {
# force = true;
# bookmarks = [
# {
# name = "Youtube";
# url = "https://youtube.com";
# }
# ];
# settings = {
#
# };
# };
extensions = {
packages = extensions;
};
settings = {
"browser.newtabpage.activity-stream.feeds.section.highlights" = false;
"browser.startup.homepage" = "https://youtube.com";
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
};
# userChrome = ''
# @import "${whiteSurTheme}/chrome/userChrome.css";
# '';
};
work = {
name = "Work";
path = "work";
id = 2;
extensions = {
packages = extensions;
};
settings = {
"browser.startup.homepage" =
"https://cloud.marcpartensky.com/apps/deck/board/2";
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
"network.cookie.cookieBehavior" = 0; # Enable all cookies (Accept All Cookies)
"network.cookie.lifetimePolicy" = 2; # Retain cookies until they expire (persistent)
"privacy.clearOnShutdown.cookies" = false; # Do not clear cookies on shutdown
};
# userChrome = ''
# @import "${whiteSurTheme}/chrome/userChrome.css";
# '';
};
};
};
# home.file.".mozilla/firefox/profile.default/chrome/userChrome.css".source = ./path/to/userChrome.css;
};
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
services.flatpak = {
enable = true;
packages = [
"com.github.d4nj1.tlpui"
"com.github.KRTirtho.Spotube"
];
};
}
+15
View File
@@ -0,0 +1,15 @@
{...}: {
services.gammastep = {
enable = true;
provider = "manual";
latitude = 48.0;
longitude = 2.0;
settings = {
general = {
# Definit la luminosite
brightness-day = 1.0;
brightness-night = 0.6;
};
};
};
}
+23
View File
@@ -0,0 +1,23 @@
{
config,
lib,
...
}: let
cfgDir = "${config.home.homeDirectory}/.config/geminicommit";
cfgFile = "${cfgDir}/config.toml";
in {
sops.secrets.gemini_api_key = {
sopsFile = ../../../secrets/common.yml;
};
home.activation.geminicommitConfig = lib.hm.dag.entryAfter ["writeBoundary"] ''
secret=${lib.escapeShellArg config.sops.secrets.gemini_api_key.path}
if [ -r "$secret" ]; then
mkdir -p ${lib.escapeShellArg cfgDir}
umask 077
printf '[api]\nkey = "%s"\n' "$(cat "$secret")" > ${lib.escapeShellArg cfgFile}
else
echo "geminicommit: secret illisible ($secret), config non ecrite" >&2
fi
'';
}
+23
View File
@@ -0,0 +1,23 @@
{ config, pkgs, ... }:
let
gitInfo = pkgs.runCommand "nixos-git-info"
{ nativeBuildInputs = [ pkgs.git ]; }
''
cp -r ${config.system.build.source or ./../../.} repo
cd repo || exit 1
# Résout HEAD (si clone shallow)
git fetch --unshallow 2>/dev/null || true
SHA="$(git rev-parse --short HEAD)"
MSG="$(git log -1 --pretty=%s)"
echo -n "$SHA $MSG" > $out
'';
in
{
system.configurationRevision = builtins.readFile gitInfo;
system.nixos.label = "nixos-${config.system.configurationRevision}";
}
+13
View File
@@ -0,0 +1,13 @@
{ pkgs, ...} :
{
programs.gh = {
enable = true;
extensions = [
pkgs.gh-eco
];
settings = {
git_protocol = "ssh";
};
};
programs.gh-dash.enable = true;
}
+25
View File
@@ -0,0 +1,25 @@
{ pkgs, ... }:
{
programs.delta = {
enable = true;
enableGitIntegration = true;
};
programs.git = {
enable = true;
settings = {
user.name = "marc";
user.email = "marc@marcpartensky.com";
pull.rebase = false;
# global = {
# name = "marc";
# email = "marc@marcpartensky.com";
# };
core.editor = "nvim";
};
# aliases = {
# ci = "commit";
# co = "checkout";
# s = "status";
# };
};
}
+8
View File
@@ -0,0 +1,8 @@
{ pkgs, ... }:
{
programs.gpg.enable = true;
services.gpg-agent = {
enable = true;
enableSshSupport = true;
};
}
+32
View File
@@ -0,0 +1,32 @@
{ pkgs, ... }:
let
user = "marc";
# On crée un script de lancement propre
niri-session = pkgs.writeShellScriptBin "niri-session" ''
# 1. On exporte les variables cruciales vers le bus systemd
# Cela permet à Spotify de "voir" le bus D-Bus déjà lancé par NixOS
dbus-update-activation-environment --systemd --all
# 2. On lance Niri
exec niri
'';
in
{
services.greetd = {
enable = true;
settings = {
initial_session = {
command = "${niri-session}/bin/niri-session";
user = "${user}";
};
default_session = {
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd niri";
user = "greeter";
};
};
};
# Optionnel mais recommandé : débloquer le keyring GNOME sans mot de passe à l'autologin
security.pam.services.greetd.enableGnomeKeyring = true;
}
+131
View File
@@ -0,0 +1,131 @@
{
config,
pkgs,
lib,
...
}: let
cursorName = "catppuccin-mocha-lavender-cursors";
cursorPackage = pkgs.catppuccin-cursors.mochaLavender;
themeName = "catppuccin-mocha-lavender-standard+rimless,black";
# On définit le paquet explicitement pour être sûr
catppuccinThemePkg = pkgs.catppuccin-gtk.override {
accents = ["lavender"];
size = "standard";
tweaks = ["rimless" "black"]; # Ajustez selon vos gouts
variant = "mocha";
};
# On récupère le dépôt catppuccin/libreoffice
catppuccinLibreOffice = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "libreoffice";
rev = "main"; # Vous pouvez épingler un commit spécifique pour la stabilité
hash = "sha256-NAQJPIbJVUZFkFfdyywv1A38N06gwdLd5Uge6eqPPJM=";
};
flavor = "mocha";
accent = "lavender";
patchScript = pkgs.writeShellScriptBin "catppuccin-lo-patch" ''
# On crée un dossier de travail temporaire
WORK_DIR=$(mktemp -d)
echo "Copie des fichiers du thème..."
cp -r ${catppuccinLibreOffice}/* "$WORK_DIR"
chmod -R +w "$WORK_DIR"
cd "$WORK_DIR"
echo "Application du thème Catppuccin (${flavor} ${accent}) pour LibreOffice..."
# On exécute le script officiel
bash scripts/install_theme.sh "${flavor}" "${accent}"
# Nettoyage
rm -rf "$WORK_DIR"
echo "Terminé ! Relancez LibreOffice."
'';
in {
xdg.configFile."libreoffice/4/user/config/catppuccin-${flavor}-${accent}.soc".source = "${catppuccinLibreOffice}/themes/${flavor}/${accent}/catppuccin-${flavor}-${accent}.soc";
home.packages = with pkgs; [
gnome-themes-extra # Base absolue pour GTK
arc-theme # Thème Arc (très standard)
dracula-theme # Thème Dracula (très contrasté)
patchScript
];
catppuccin = {
enable = true;
# explicite : catppuccin/nix va basculer l'auto-enrôlement sur autoEnable
autoEnable = true;
flavor = "mocha";
accent = "lavender";
cursors.enable = true;
zathura.enable = true;
spotify-player.enable = true;
};
gtk = {
enable = true;
theme.name = lib.mkDefault themeName;
theme.package = catppuccinThemePkg;
cursorTheme.name = lib.mkDefault cursorName;
iconTheme.name = lib.mkDefault "Papirus-Dark";
iconTheme.package = lib.mkDefault pkgs.papirus-icon-theme;
gtk3.extraConfig.gtk-application-prefer-dark-theme = 1;
gtk4.extraConfig.gtk-application-prefer-dark-theme = 1;
# comportement historique (stateVersion < 26.05) : GTK4 suit le thème GTK
gtk4.theme = config.gtk.theme;
};
qt = {
enable = true;
style.name = lib.mkDefault "kvantum";
platformTheme.name = lib.mkDefault "gtk3";
};
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
};
"org/gnome/nautilus/preferences" = {
show-image-thumbnails = "always";
thumbnail-limit = 100;
};
};
home.sessionVariables = {
PRISM_LAUNCHER_DARK_MODE = "1";
GTK_THEME = themeName;
ADW_DISABLE_PORTAL = "1";
SAL_USE_VCLPLUGIN = "gtk4";
};
xdg.desktopEntries.beeper = {
name = "Beeper";
exec = "beeper --enable-features=WebUIDarkMode --force-dark-mode %U";
terminal = false;
icon = "beeper";
categories = ["Network" "Chat"];
};
xdg.desktopEntries.electron-mail = {
name = "Electron Mail";
exec = "electron-mail --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --force-dark-mode %U";
terminal = false;
icon = "electron-mail";
categories = ["Network" "Email"];
};
xdg.desktopEntries.libreoffice-calc = {
name = "LibreOffice Calc";
icon = "libreoffice-calc";
exec = "env GTK_THEME=Dracula libreoffice --calc";
terminal = false;
categories = ["Office" "Spreadsheet"];
mimeType = ["application/vnd.oasis.opendocument.spreadsheet" "application/vnd.ms-excel"];
};
}
+24
View File
@@ -0,0 +1,24 @@
# Config herdr (multiplexeur d'agents, github:ogulcancelik/herdr).
# Declaree dans modules/home/herdr/default.nix (xdg.configFile), donc posee par
# home-manager : ne pas editer ~/.config/herdr/config.toml a la main.
#
# But : voir le modele Hermes de chaque pane dans la sidebar, sans rien taper.
# Principe : le TUI hermes ecrit son titre OSC sous la forme
# <etat> <session> . <modele> . <cwd> (⚠ bloqué, ⏳ travaille, ✓ idle)
# herdr lit ce titre (il s'en sert deja pour l'etat blocked/working/done, cf
# ~/.local/state/herdr/agent-detection/remote/hermes.toml) et l'expose aux
# lignes de la sidebar via le token terminal_title_stripped.
[ui]
# Label d'agent sur les bordures de panes splittees (le titre du pane porte deja le modele).
show_agent_labels_on_pane_borders = true
# Titre ecrit dans le terminal hote : les barres d'onglets du WM suivent le pane actif.
window_title = "{hostname}: {workspace} · {terminal_title}"
# Rows par agent : par defaut herdr n'affiche pas le titre du terminal, seulement
# l'agent ("hermes"), ce qui ne dit pas quel modele tourne dans le pane.
[ui.sidebar.agents.rows_by_agent]
hermes = [
["state_icon", "machine", "tab"],
["terminal_title_stripped"],
["agent"],
]
+29
View File
@@ -0,0 +1,29 @@
{
config,
lib,
...
}: {
# --- herdr : config de marc, posee par home-manager ---
# herdr (multiplexeur d'agents, github:ogulcancelik/herdr) n'a pas d'option
# NixOS et le module `programs.herdr` n'existe pas encore dans le
# home-manager epingle (verifie : pas de modules/programs/herdr.nix dans
# l'input), donc le fichier est declare ici et pose par xdg.configFile.
#
# Contenu : voir modules/home/herdr/config.toml (rows de sidebar qui
# affichent le modele hermes de chaque pane, via le titre OSC ecrit par le
# TUI ; cote hermes, cela suppose display.interface = "tui", cf
# services/hermes/default.nix).
#
# Application a chaud apres un switch : `herdr server reload-config`
# (ou menu global -> reload config). Un client deja lance garde son ancienne
# config jusqu'au reload.
# `force = true` : la 1re activation du HM systeme bute sinon sur l'ancien
# symlink /home/marc/.config/herdr/config.toml laisse par la version
# systemd.tmpfiles (il ne ressemble pas a un fichier home-manager-files, donc
# check-link-targets le declare "would be clobbered" et l'activation echoue
# en status=1). force saute ce controle et remplace le lien.
xdg.configFile."herdr/config.toml" = {
force = true;
text = builtins.readFile ./config.toml;
};
}
+76
View File
@@ -0,0 +1,76 @@
{ pkgs, ... }: {
wayland.windowManager.hyprland.settings = {
"$mod" = "SUPER";
bind = [
# --- Applications & Utilitaires ---
"$mod, d, exec, wofi --show drun"
"$mod, return, exec, alacritty"
"$mod, f, exec, librewolf"
"$mod, b, exec, gtk-launch blueberry"
"alt, l, exec, nautilus"
"alt, w, exec, auto-wallpaper"
# --- Gestion des Fenêtres ---
"$mod, c, killactive"
"$mod, v, togglefloating"
"$mod, m, fullscreen"
"$mod, t, togglegroup"
"supershift, c, exec, xdotool getwindowfocus windowkill"
"supershift, q, exit,"
# --- Navigation style VIM (Fenêtres) ---
"$mod, h, movefocus, l"
"$mod, l, movefocus, r"
"$mod, k, movefocus, u"
"$mod, j, movefocus, d"
# --- Navigation style VIM (Espaces de travail) ---
# Navigation relative (Suivant/Précédent)
"ALT, j, workspace, e+1"
"ALT, k, workspace, e-1"
# --- Multimédia & Audio ---
"alt, d, exec, playerctl -p spotify next"
"alt, s, exec, playerctl -p spotify previous"
"alt, k, exec, playerctl -p spotify play-pause"
", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+"
", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%-"
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
# --- Luminosité ---
", XF86MonBrightnessUp, exec, brightnessctl s +1%"
", XF86MonBrightnessDown, exec, brightnessctl s 1%-"
# --- Captures d'écran ---
", Print, exec, grimblast copysave area"
"$mod, Print, exec, grimblast copysave output"
# --- Presse-papiers ---
", Prior, exec, wl-copy"
", Next, exec, wl-paste"
];
# --- Souris & Navigation ---
bindm = [
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
binde = [
"$mod, mouse_down, workspace, e+1"
"$mod, mouse_up, workspace, e-1"
];
# --- Workspaces dynamiques (1 à 9) ---
# $mod + [1-9] pour changer de workspace
# $alt + [1-9] pour déplacer la fenêtre vers le workspace
binds = builtins.concatLists (builtins.genList (i:
let ws = i + 1;
in [
"$mod, code:1${toString i}, workspace, ${toString ws}"
"ALT, code:1${toString i}, movetoworkspace, ${toString ws}"
]
) 9);
};
}
+292
View File
@@ -0,0 +1,292 @@
# { inputs, pkgs, lib, config, ... }:
# with lib;
# let cfg = config.modules.hyprland;
# in {
# options.modules.hyprland= { enable = mkenableoption "hyprland"; };
# config = mkif cfg.enable {
# home.packages = with pkgs; [
# wofi swaybg wlsunset wl-clipboard hyprland
# ];
# home.file.".config/hypr/hyprland.conf".source = ./hyprland.conf;
# };
# }
{ inputs, pkgs, ...}: {
# home.file.".config/hypr/hyprland.conf".source = ./hyprland.conf;
imports = [
./bindings.nix
];
# nix.settings = {
# substituters = ["https://hyprland.cachix.org"];
# trusted-substituters = ["https://hyprland.cachix.org"];
# trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzmz7+chwvl3/pzj6jibmioijm7ypfp8pwtkugc="];
# };
# programs.dconf.enable = true;
# programs.hyprland = {
# enable = 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;
# };
# home-manager.users.marc = { pkgs, inputs, ... }: {
programs.kitty.enable = true; # required for the default hyprland config
wayland.windowManager.hyprland.enable = true; # enable hyprland
home.sessionVariables.nixos_ozone_wl = "1";
# home.file.".config/hypr/hyprland.conf".source = "./hyprland.conf";
xdg.portal = {
enable = true;
extraPortals = with pkgs; [
xdg-desktop-portal-gtk # for gtk apps
xdg-desktop-portal-hyprland # hyprland-specific portal
];
};
wayland.windowManager.hyprland.plugins = [
# pkgs.hyprlandPlugins.hy3
# inputs.hy3.packages.${pkgs.system}.hy3
# inputs.hyprtasking.packages.${pkgs.system}.hyprtasking
# pkgs.hyprlandplugins.hyprspace
# pkgs.hyprlandplugins.hycov
];
# wayland.windowManager.hyprland = {
# extraConfig = ''
# plugin = ${inputs.hy3.packages.x86_64-linux.hy3}/lib/libhy3.so
# '';
# };
wayland.windowManager.hyprland.systemd.variables = ["--all"];
wayland.windowManager.hyprland.settings = {
# bindm = [
# # "super, d, exec, kitty"
# "super, return , exec, kitty"
# ];
exec-once = [
# "${pkgs.waybar}/bin/waybar"
# "${pkgs.dbus}/bin/dbus-update-activation-environment --systemd wayland_display xdg_current_desktop"
# "${pkgs.systemd}/bin/systemctl --user import-environment wayland_display xdg_current_desktop"
"${pkgs.xdg-desktop-portal-hyprland}/libexec/xdg-desktop-portal-hyprland"
"${pkgs.xdg-desktop-portal}/libexec/xdg-desktop-portal"
"${pkgs.wl-clipboard}/bin/wl-paste --type text --watch cliphist store" #stores only text data
"${pkgs.wl-clipboard}/bin/wl-paste --type image --watch cliphist store" #stores only image data
];
# plugin = "/usr/lib/libhy3.so";
monitor = [
"eDP-1,1920x1080@60,320x1440,1"
"DP-1,2560x1440@60,0x0,1"
"HDMI-A-1,2560x1440@60,0x0,1"
];
env = [
"dri_prime=0"
"libva_driver_name=nvidia"
"__glx_vendor_library_name=nvidia"
"qt_qpa_platform=wayland" # forces qt apps (like kodi) to use wayland
"gtk_use_portal=1"
"xdg_current_desktop=hyprland"
"xdg_session_desktop=hyprland"
"qt_qpa_platform=wayland;xcb"
"sdl_videodriver=wayland"
"clutter_backend=wayland"
"nixos_ozone_wl=1"
"gdk_backend=wayland"
"qt_wayland_force_dpi=physical"
"gdk_dpi_scale=1"
];
plugins = {
hy3 = {
tabs = {
height = 2;
padding = 6;
render_text = false;
};
autotile = {
enable = true;
trigger_width = 1500;
trigger_height = 500;
};
};
# hyprspace = {
# overview = {
# close = 0;
# disablegestures = 1;
# };
# gestures = {
# workspace_swipe_fingers = 5;
# };
# };
};
debug = {
disable_logs = false;
};
input = {
kb_layout = "fr";
kb_variant = "us";
# kb_model=
# kb_options = "caps:escape";
# kb_rules=
follow_mouse = 1;
natural_scroll = true;
touchpad = {
natural_scroll = true;
disable_while_typing = false;
middle_button_emulation = true;
tap-to-click = true;
# accel-profile = "adaptive";
# pointer-accel = 0.7;
};
kb_options = "caps:escape,prior:shift_l";
# mapping personnalisé avec xkb
# kb_custom_rules = ''
# partial alphanumeric_keys
# xkb_symbols "prior" {
# key <prior> { [ shift_l ] };
# };
# '';
};
general = {
# sensitivity=1 # for mouse cursor
# main_mod=super
gaps_in = 5;
gaps_out = 10;
# border_size=2
border_size = 0;
"col.active_border" = "0x66ee1111";
"col.inactive_border" = "0x66333333";
# apply_sens_to_raw=0 # whether to apply the sensitivity to raw input (e.g. used by games where you aim using your mouse)
# damage_tracking=full # leave it on full unless you hate your gpu and want to make it suffer
# layout=dwindle
layout = "hy3";
resize_on_border = true;
};
decoration = {
rounding = 5;
};
animations = {
enabled = 1;
# bezier=overshot,0.05,0.9,0.1,1.1
bezier = "overshot,0.13,0.99,0.29,1.1";
animation = [
"windows,1,4,overshot,slide"
"border,1,10,default"
"fade,1,10,default"
"workspaces,1,10,overshot,slidevert"
];
# animation=workspaces,1,6,overshot,slide
# animation=workspaces,11,20,overshot,slide
};
dwindle = {
pseudotile = 0; # enable pseudotiling on dwindle
};
gesture = [
"3, vertical, workspace"
# "4, right, mod:SUPER, scale: 1.5, fullscreen"
# "4, up, scale: 1.5, fullscreen"
"4, up, fullscreen"
"4, down, float"
# "3, left, scale: 1.5, float"
];
# gestures = {
# workspace_swipe = true;
# workspace_swipe_fingers = 3;
# };
misc = {
disable_hyprland_logo = true;
};
windowrule = [
"float,title:^(blueberry.py)$"
"size 40% 85%,title:^(blueberry.py)$"
"center,title:^(blueberry.py)$"
"float,title:^(org.twosheds.iwgtk)$"
"size 40% 85%,title:^(org.twosheds.iwgtk)$"
"center,title:^(org.twosheds.iwgtk)$"
"size 50% 50%,title:^(wdisplays)$"
"float,title:^(wdisplays)$"
"center,title:^(wdisplays)$"
"workspace 1,title:^(alacritty)$"
# windowrule=float,^(alacritty)$
# windowrule=size 50% 95%,^(alacritty)$
"center,title:^(alacritty)$"
"workspace 2,title:^(firefox)$"
"workspace 3,title:^(spotify)$"
"workspace 3,title:^(spotube)$"
"workspace 4,title:^(webcord)$"
"workspace 4,title:^(discord)$"
"workspace 4,title:^(whatsapp)$"
"workspace 4,title:^(element)$"
"workspace 4,title:^(instagram)$"
# windowrule=fakefullscreen,title:^(signal)$
"workspace 4,title:^(signal)$"
"workspace 4,title:^(caprine)$"
"workspace 5,title:^(mailspring)$"
# windowrule=fakefullscreen,title:^(mailspring)$
"workspace 5,title:^(geary)$"
"workspace 5,title:^(proton-mail-viewer)$"
# windowrule=fakefullscreen,title:^(proton-mail-viewer)$
"workspace 9,title:^(nautilus)$"
"workspace 10,title:^(focalboard)$"
"workspace 1,title:^(youtube)$"
"workspace 2,title:^(firefox)$"
];
workspace = [
# workspace=name:myworkspace,gapsin:0,gapsout:
"1, name:coding, rounding:true, decorate:false, gapsin:5, gapsout:10, border:true, decorate:true, monitor:edp-1"
"2, name:browser, monitor:edp-1"
"3, name:music, monitor:edp-1"
"4, name:chat, monitor:edp-1"
"5, name:mail, monitor:edp-1"
"10, name:board, monitor:edp-1"
];
};
}
+47
View File
@@ -0,0 +1,47 @@
{ inputs, ... }:
{
programs.hyprpanel = {
enable = true;
# Configure and theme almost all options from the GUI.
# See 'https://hyprpanel.com/configuration/settings.html'.
# Default: <same as gui>
settings = {
# Configure bar layouts for monitors.
# See 'https://hyprpanel.com/configuration/panel.html'.
# Default: null
layout = {
bar.layouts = {
"0" = {
left = [ "dashboard" "workspaces" ];
middle = [ "media" ];
right = [ "volume" "systray" "notifications" ];
};
};
};
bar.launcher.autoDetectIcon = true;
bar.workspaces.show_icons = true;
bar.clock.format = "%H:%M:%S %a %d";
bar.battery.label = true;
menus.clock = {
time = {
military = true;
hideSeconds = true;
};
weather.unit = "metric";
};
menus.dashboard.directories.enabled = false;
menus.dashboard.stats.enable_gpu = true;
theme.bar.transparent = true;
theme.font = {
name = "CaskaydiaCove NF";
size = "16px";
};
};
};
}
+29
View File
@@ -0,0 +1,29 @@
{ ... }:
{
programs.ipython = {
enable = true;
# Profil par défaut (profile_default)
profiles.default = {
startupBanner = false; # ← enlève le message d’accueil
};
};
# Création du fichier de configuration IPython
xdg.configFile."ipython/profile_default/ipython_config.py".text = ''
c = get_config()
# Active le mode d'édition Vi
c.TerminalInteractiveShell.editing_mode = 'vi'
# Optionnel : définit le délai de bascule (escape time)
# pour une transition plus rapide entre les modes
c.TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode = False
'';
# # Facultatif : `py` lance IPython en mode silencieux
# programs.zsh.aliases = {
# py = "ipython -q";
# };
}
+7
View File
@@ -0,0 +1,7 @@
[bar]
position = "top"
height = 32
[[bar.center]]
type = "clock"
format = "%H:%M"
+21
View File
@@ -0,0 +1,21 @@
# ~/.config/ironbar/config.yaml
position: top
height: 42
# L'option magique pour le slide au hover (500ms de délai avant de repartir)
autohide: 500
start:
- type: "workspaces"
center:
- type: "clock"
format: "%H:%M"
end:
- type: "network_manager"
- type: "bluetooth"
- type: "sys_info"
format:
- "CPU: {cpu_percent}%"
- type: "script"
mode: "poll"
cmd: "curl -s 'https://wttr.in/?format=1'"
interval: 1800
- type: "tray"
+22
View File
@@ -0,0 +1,22 @@
{ pkgs, ... }: {
home.packages = [ pkgs.ironbar pkgs.wttrbar ];
xdg.configFile."ironbar/config.toml".source = ./config.toml;
xdg.configFile."ironbar/style.css".source = ./style.css;
systemd.user.services.ironbar = {
Unit = {
Description = "Ironbar status bar";
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
};
Service = {
ExecStart = "${pkgs.ironbar}/bin/ironbar";
Restart = "on-failure";
RestartSec = "5s";
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
};
}
+35
View File
@@ -0,0 +1,35 @@
/* ~/.config/ironbar/style.css */
.background {
background: rgba(30, 30, 46, 0.95);
border-bottom: 2px solid #89b4fa;
border-radius: 0 0 10px 10px;
/* ÉTAT DE REPOS (Cachée) */
margin-top: -40px;
/* ANIMATION DE DÉPART */
transition: margin-top 350ms cubic-bezier(0.3, 0.0, 0.8, 0.15);
}
.background:hover {
/* ÉTAT ACTIF (Visible) */
margin-top: 0px;
/* ANIMATION D'ARRIVÉE */
transition: margin-top 450ms cubic-bezier(0.05, 0.9, 0.1, 1.0);
}
/* --- Style des widgets --- */
.widget {
padding: 0 12px;
margin: 4px 2px;
background: rgba(255, 255, 255, 0.05);
border-radius: 6px;
transition: background 200ms ease;
}
.widget:hover {
background: rgba(255, 255, 255, 0.15);
color: #89b4fa;
}
+48
View File
@@ -0,0 +1,48 @@
{...}: {
programs.kitty = {
enable = true;
font = {
# name = "JetBrainsMono Nerd Font";
name = "MesloLGS NF";
size = 12;
};
settings = {
background = "#1e1e2e";
foreground = "#cdd6f4";
cursor = "#f5e0e6";
cursor_text_color = "#1e1e2e";
selection_background = "#585b70";
selection_foreground = "#cdd6f4";
url_color = "#b4befe";
# Catppuccin Mocha ANSI colors
color0 = "#45475a";
color1 = "#f38ba8";
color2 = "#a6e3a1";
color3 = "#f9e2af";
color4 = "#89b4fa";
color5 = "#f5c2e7";
color6 = "#94e2d5";
color7 = "#bac2de";
color8 = "#585b70";
color9 = "#f38ba8";
color10 = "#a6e3a1";
color11 = "#f9e2af";
color12 = "#89b4fa";
color13 = "#f5c2e7";
color14 = "#94e2d5";
color15 = "#cdd6f4";
background_opacity = "0.92";
window_padding_width = 12;
hide_window_decorations = true;
confirm_os_window_close = 0;
};
};
}
+28
View File
@@ -0,0 +1,28 @@
{ pkgs, ... }:
let
homeDir = "/home/marc";
in {
programs.kodi = {
enable = true;
package = pkgs.kodi-wayland.withPackages (kodiPkgs: with kodiPkgs; [
jellyfin
jellycon
netflix
youtube
]);
# settings = {
# };
# La clé sources.video correspond à la section <video> dans sources.xml
sources.video = [
{
name = "movies";
path = "/srv/media/movies/";
# 'allowsharing = true;' partage upnp
}
{
name = "tvshows";
path = "/srv/media/tvshows/";
}
];
};
}
+228
View File
@@ -0,0 +1,228 @@
{ pkgs, lib, inputs, ... }:
{
nixpkgs.overlays = [ inputs.nur.overlays.default ];
home-manager.users.marc = { pkgs, inputs, ... }:
let
# WhiteSur theme
whiteSurTheme = pkgs.fetchFromGitHub {
owner = "rashadgasimli";
repo = "WhiteSur-librewolf-theme";
rev = "110470bdec93e2525df1e54f8b0916a00d83f34c";
sha256 = "sha256-lo9/YURgyt/SXVNwgZndn9HA5FCqquTMAwPY8Shxhss=";
};
# nur = inputs.nur.packages.${pkgs.system};
firefoxAddons = pkgs.nur.repos.rycee.firefox-addons;
# Extensions from NUR or directly from pkgs
extensions = with firefoxAddons; [
darkreader
ublock-origin
bitwarden
tabliss
umatrix
refined-github
single-file
videospeed
sponsorblock
return-youtube-dislikes
privacy-badger
tab-stash
youtube-shorts-block
about-sync
auto-tab-discard
catppuccin-mocha-mauve
clearurls
container-colors
don-t-fuck-with-paste
export-tabs-urls-and-titles
enhanced-github
floccus
linkwarden
pwas-for-firefox
pywalfox
refined-github
session-sync
spoof-timezone
tab-counter-plus
tab-session-manager
youtube-high-definition
proton-pass
# wallabagger
# ghostery
# firefoxpwa
];
in
{
xdg.desktopEntries = {
"default" = {
name = "Perso";
exec = "${pkgs.librewolf}/bin/librewolf -P Default -no-remote %u";
terminal = false;
type = "Application";
icon = "librewolf";
};
"youtube" = {
name = "Youtube";
exec = "${pkgs.librewolf}/bin/librewolf -P Youtube -no-remote %u";
terminal = false;
type = "Application";
icon = "librewolf";
};
"work" = {
name = "Work";
exec = "${pkgs.librewolf}/bin/librewolf -P Work -no-remote %u";
terminal = false;
type = "Application";
icon = "librewolf";
};
};
nixpkgs.overlays = [ inputs.nur.overlays.default ];
programs.librewolf = {
enable = true;
package = pkgs.librewolf;
# nativeMessagingHosts.packages = [ pkgs.firefoxpwa ];
policies = {
Extensions = {
Locked = [
# enable both extensions
"uBlock0@raymondhill.net"
"446900e4-71c2-419f-a6a7-df9c091e268b" # Extension ID for bitwarden
];
};
ExtensionSettings = {
"uBlock0@raymondhill.net" = { default_area = "menupanel"; };
"446900e4-71c2-419f-a6a7-df9c091e268b" = { default_area = "navbar"; };
"umatrix@raymondhill.net" = {
default_area = "menupanel";
filters = [
"EasyList"
"EasyPrivacy"
"Fanboy's Social Blocking List"
"uMatrix Filters"
];
};
};
};
profiles = {
default = {
name = "Default";
path = "default";
isDefault = true;
id = 0;
extensions = {
packages = extensions;
};
search = {
force = true;
default = "Startpage";
engines = {
"Startpage" = {
urls = [{
template = "https://www.startpage.com/rvd/search?query={searchTerms}&language=auto";
}];
icon = "https://www.startpage.com/sp/cdn/favicons/mobile/android-icon-192x192.png";
updateInterval = 86400000;
definedAliases = [ "@s" ];
};
};
};
settings = {
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
};
# userChrome = ''
# @import "${whiteSurTheme}/chrome/userChrome.css";
# '';
};
youtube = {
name = "Youtube";
path = "youtube";
id = 1;
# bookmarks = {
# force = true;
# bookmarks = [
# {
# name = "Youtube";
# url = "https://youtube.com";
# }
# ];
# settings = {
#
# };
# };
extensions = {
packages = extensions;
};
settings = {
"browser.newtabpage.activity-stream.feeds.section.highlights" = false;
"browser.startup.homepage" = "https://youtube.com";
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
};
# userChrome = ''
# @import "${whiteSurTheme}/chrome/userChrome.css";
# '';
};
work = {
name = "Work";
path = "work";
id = 2;
extensions = {
packages = extensions;
};
settings = {
"browser.startup.homepage" =
"https://cloud.marcpartensky.com/apps/deck/board/2";
"extensions.autoDisableScopes" = 0;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"svg.context-properties.content.enabled" = true;
"network.cookie.cookieBehavior" = 0; # Enable all cookies (Accept All Cookies)
"network.cookie.lifetimePolicy" = 2; # Retain cookies until they expire (persistent)
"privacy.clearOnShutdown.cookies" = false; # Do not clear cookies on shutdown
};
# userChrome = ''
# @import "${whiteSurTheme}/chrome/userChrome.css";
# '';
};
};
};
# home.file.".mozilla/firefox/profile.default/chrome/userChrome.css".source = ./path/to/userChrome.css;
home.file = {
".librewolf/default/chrome" = {
source = "${whiteSurTheme}/chrome";
recursive = true;
};
".librewolf/youtube/chrome" = {
source = "${whiteSurTheme}/chrome";
recursive = true;
};
"share/themes/WhiteSur-Dark" = {
source = "${whiteSurTheme}/chrome";
recursive = true;
};
};
};
}
@@ -0,0 +1,8 @@
{ pkgs, lib, ... }:
{
home-manager.users.marc = { pkgs, inputs, ... }: {
programs.firefox = {
};
};
}
@@ -0,0 +1,42 @@
{ config, lib, pkgs, ... }:
let
youtube-app = pkgs.writeShellScriptBin "youtube-app" ''
# Use existing LibreWolf profile (modify if using non-default profile)
PROFILE_DIR="$HOME/.librewolf/default"
# Fallback for Flatpak installations
if [ ! -d "$PROFILE_DIR" ]; then
PROFILE_DIR="$HOME/.var/app/io.gitlab.librewolf-community/.librewolf/default"
fi
# Create dedicated profile if doesn't exist
if [ ! -d "$PROFILE_DIR" ]; then
echo "Creating new LibreWolf profile for YouTube..."
${pkgs.librewolf}/bin/librewolf --headless --profile "$PROFILE_DIR" --createprofile default
fi
# Launch YouTube as standalone app
exec ${pkgs.librewolf}/bin/librewolf --new-instance \
--profile "$PROFILE_DIR" \
--class "YouTubeApp" \
--name "YouTubeApp" \
--kiosk "https://www.youtube.com"
'';
desktopEntry = pkgs.makeDesktopItem {
name = "youtube-app";
exec = "youtube-app";
icon = "librewolf";
desktopName = "YouTube";
genericName = "YouTube Desktop App";
categories = [ "Network" "Video" ];
startupWMClass = "YouTubeApp";
};
in {
environment.systemPackages = [
youtube-app
desktopEntry
pkgs.librewolf # Ensure LibreWolf is installed
];
}
+43
View File
@@ -0,0 +1,43 @@
{ pkgs, ... } : {
# home.packages = [ pkgs.catppuccin-mako ];
services.dunst.enable = false;
services.mako = {
enable = true;
# theme = "${pkgs.catppuccin-mako}/share/mako/themes/catppuccin-mocha";
settings = {
max-visible = 5;
sort = "-time";
layer = "top";
anchor = "top-right";
font = "meslo-lgs-nf 10";
background-color = "#040c16bb";
text-color = "#cce9ea";
width = 300;
height = 300;
margin = 10;
padding = 15;
border-size = 2;
border-color = "#92bbed";
border-radius = 3;
# progress-color = "over #5588AAFF";
progress-color = "#5588AAFF";
icons = true;
markup = true;
actions = true;
max-icon-size = 64;
# format = "<b>%s</b>\n%b";
default-timeout = 7000;
ignore-timeout = false;
"urgency=low" = {
border-size = 1;
border-color = "#bbbbbb";
};
"urgency=high" = {
border-size = 4;
border-color = "#E6676B";
};
};
};
}
+9
View File
@@ -0,0 +1,9 @@
{ pkgs, ... }:
{
programs.mpv = {
enable = true;
config = {
ao = "pipewire"; # Force l'utilisation de pipewire
};
};
}
+134
View File
@@ -0,0 +1,134 @@
{
pkgs,
inputs,
...
}: {
imports = [
./plugins/cmp.nix
./plugins/lsp.nix
./plugins/conform.nix
./plugins/ui.nix
./plugins/avante.nix
];
home.packages = with pkgs; [
];
programs.nixvim = {
enable = true;
# Construire nixvim sur le nixpkgs du système (au lieu de l'input nixpkgs
# interne de nixvim) : une seule éval de nixpkgs et ça supprime
# définitivement le warning "nixpkgs.source affected by your flake follows"
# (qui compare la rev à celle testée par la CI de nixvim).
nixpkgs.source = inputs.nixpkgs;
# # colorschemes.catppuccin.enable = true;
opts = import ./options.nix;
keymaps = import ./keymaps.nix;
clipboard.register = "unnamedplus"; # yank => presse-papier direct
filetype = {
extension = {
yuck = "yuck";
};
};
plugins = {
web-devicons.enable = true;
lsp.servers.nil_ls = {
enable = true;
settings."nil".nix.flake = {
autoArchive = false; # ou true pour fetch en silence
# autoEvalInputs = false;
};
};
avante = {
enable = true;
settings = {
provider = "claude";
# On déplace tout dans providers.claude
providers = {
claude = {
endpoint = "https://api.anthropic.com";
model = "claude-3-5-sonnet-20241022";
# Température et tokens vont maintenant dans extra_request_body
extra_request_body = {
temperature = 0;
max_tokens = 4096;
};
};
};
behaviour = {
auto_suggestions = false;
support_paste_from_clipboard = true;
};
window = {
position = "right";
width = 30;
};
};
};
lualine = {
enable = true;
settings = {
colorscheme = "wombat";
};
};
lspsaga = {
enable = true;
settings = {
ui.border = "rounded";
lightbulb.enable = false; # évite le spam si pas de LSP actif
};
};
treesitter = {
enable = true;
# Assure-toi que le parser yuck est bien chargé
nixGrammars = true; # Utilise les paquets Nix pour les grammaires
settings = {
ensure_installed = ["yuck" "nix" "lua" "bash" "markdown"]; # Ajoute "yuck" ici
highlight.enable = true;
};
};
};
plugins.neo-tree = {
enable = true;
settings = import ./plugins/neo-tree.nix;
};
plugins.auto-session = {
enable = true;
settings = import ./plugins/auto-session.nix;
};
colorschemes.onedark.enable = true;
extraConfigLua = builtins.readFile ./extra_config.lua;
extraPlugins = with pkgs.vimPlugins; [
auto-session
vim-toml
lualine-nvim
onedark-nvim
bufferline-nvim
telescope-nvim
nvim-cmp
nvim-lspconfig
nvim-web-devicons
# vim-autopairs
dashboard-nvim
lspsaga-nvim
scrollbar-nvim
neo-tree-nvim
vim-smoothie
comment-nvim
treesj
# session-manager-nvim
dressing-nvim
# markdown-preview-nvim
avante-nvim
# telescope-recent-files-nvim
toggleterm-nvim
vim-nix
];
};
}
+93
View File
@@ -0,0 +1,93 @@
-- =======================================================
-- CONFIGURATION LUA SUPPLÉMENTAIRE (Transparence et Autocmd)
-- =======================================================
-- 1. TRANSPARENCE DU FOND
-- onedark est configuré avec transparent = true (plugins/ui.nix), ce qui enlève
-- déjà le fond de Normal/EndOfBuffer/SignColumn/NeoTree. On force quand même
-- les groupes restants, et surtout TOUS les groupes Lualine : la barre de
-- statut est une bande grise opaque tant que ses sections gardent un bg.
local transparent_groups = {
"Normal",
"NormalFloat",
"FloatBorder",
"EndOfBuffer",
"StatusLine",
"StatusLineNC",
}
local function set_transparent_hl()
for _, name in ipairs(transparent_groups) do
local ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = name })
if ok then
hl.bg = nil
hl.ctermbg = nil
vim.api.nvim_set_hl(0, name, hl)
end
end
for _, name in ipairs(vim.fn.getcompletion("Lualine", "highlight")) do
local ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = name })
if ok then
hl.bg = nil
hl.ctermbg = nil
vim.api.nvim_set_hl(0, name, hl)
end
end
end
-- Avec un fond transparent, les ~ de fin de buffer (fg = bg0 chez onedark)
-- deviendraient visibles sur le papier peint : on les remplace par des espaces.
vim.opt.fillchars:append({ eob = " " })
vim.api.nvim_create_autocmd({ "VimEnter", "ColorScheme" }, {
group = vim.api.nvim_create_augroup("TransparentUI", { clear = true }),
callback = function()
-- différé : Lualine (re)pose ses highlights au chargement et au ColorScheme
vim.schedule(set_transparent_hl)
end,
})
vim.g.clipboard = {
name = 'OSC 52',
copy = {
['+'] = require('vim.ui.clipboard.osc52').copy('+'),
['*'] = require('vim.ui.clipboard.osc52').copy('*'),
},
paste = {
['+'] = require('vim.ui.clipboard.osc52').paste('+'),
['*'] = require('vim.ui.clipboard.osc52').paste('*'),
},
}
-- 2. AUTOCOMMANDS POUR MARKDOWN/TXT (Wrapping)
-- Crée un groupe pour organiser les autocommands
local markdown_settings_group = vim.api.nvim_create_augroup("MarkdownSettings", { clear = true })
-- Fonction de rappel pour définir les options locales de wrap
local function set_wrap_options()
vim.opt_local.textwidth = 80
vim.opt_local.wrapmargin = 2
vim.opt_local.wrap = true -- Activation du wrap localement
end
-- Appliquer les options au chargement des fichiers .md et .txt
vim.api.nvim_create_autocmd("FileType", {
group = markdown_settings_group,
pattern = { "markdown", "txt" },
callback = set_wrap_options,
})
-- 3. AUTOCOMMANDS POUR AVANTE/CHATGPT
vim.api.nvim_create_autocmd("User", {
pattern = "ToggleMyPrompt",
callback = function()
require("avante.config").override({ system_prompt = "MY CUSTOM SYSTEM PROMPT" })
end,
})
-- 4. AUTRES CONFIGURATIONS LUA SI NÉCESSAIRE (e.g., set up plugins that require Lua)
-- (Vous pourriez y ajouter ici la configuration d'Avante si le plugin le requiert)
-- Exemple: require('avante').setup({})
+200
View File
@@ -0,0 +1,200 @@
[
# ==============================
# 1. MAPPINGS GLOBALES ET SYSTÈME
# ==============================
# Enregistrer le fichier (Ctrl+s)
{
mode = "n";
key = "<C-s>";
action = ":w<cr>";
options.desc = "Save File";
}
# Sélectionner tout (Ctrl+a)
{
mode = "n";
key = "<C-a>";
action = "ggVG";
options.desc = "Select All";
}
# Fermer toutes les fenêtres/buffers (Ctrl+w - remappé ici pour la fermeture de Neovim)
{
mode = "n";
key = "<C-w>";
action = ":qa<cr>";
options.desc = "Quit All (Neovim)";
}
# Lancer 'make' (Ctrl+m)
{
mode = "n";
key = "<C-m>";
# Note : jobstart est mieux géré directement dans Lua ou en utilisant ToggleTerm
action = ":call jobstart(['alacritty', '-e', 'make'])<CR>";
options.desc = "Run Make in Alacritty";
}
# Exécuter le fichier courant (Ctrl+i)
{
mode = "n";
key = "<C-i>";
action = ":!$PWD/%<cr>";
options.desc = "Execute Current File";
}
# ==============================
# 2. GESTION DES FENÊTRES (SPLIT)
# ==============================
# Naviguer entre les splits (Ctrl+h/j/k/l)
{
mode = "n";
key = "<C-h>";
action = "<C-w>h";
options.desc = "Move Left Split";
}
{
mode = "n";
key = "<C-j>";
action = "<C-w>j";
options.desc = "Move Down Split";
}
{
mode = "n";
key = "<C-k>";
action = "<C-w>k";
options.desc = "Move Up Split";
}
{
mode = "n";
key = "<C-l>";
action = "<C-w>l";
options.desc = "Move Right Split";
}
# ==============================
# 3. MAPPINGS PLUGINS DE BASE
# ==============================
# 3.1. Telescope (Recherche de fichiers)
{
mode = "n";
key = "<C-p>";
action = "<cmd>Telescope find_files<cr>";
options.desc = "Telescope Find Files (Ctrl+p)";
}
{
mode = "n";
key = "<C-g>";
action = "<cmd>Telescope live_grep<cr>";
options.desc = "Telescope Live Grep (Ctrl+g)";
}
# 3.2. Neo-tree (Explorateur de fichiers)
{
mode = "n";
key = "<C-o>";
action = ":Neotree toggle<cr>";
options.desc = "Toggle Neo-tree (Ctrl+o)";
}
# 3.3. Comment.nvim (Commentaire)
# Pour Neovim (nixvim), la meilleure façon de mapper C-/ pour Comment.nvim
# est souvent d'utiliser directement l'appel Lua ou le mapping par défaut 'gc'.
# Utiliser <Plug>(...):
{
mode = ["n" "v"];
key = "<C-/>";
action = "<Plug>(comment_toggle)";
options.desc = "Toggle Comment (Ctrl+/)";
}
# Note : Si <Plug> ne fonctionne pas pour le mode visuel, vous devrez
# probablement utiliser la commande spécifique pour le mode visuel ou 'gc'.
# Le mapping "v" pour "gc" est déjà fait ci-dessous.
# Mapping spécifique pour le mode visuel (gc)
{
mode = "v";
key = "gc";
action = "<Plug>(comment_toggle)";
options.desc = "Toggle Comment Visually";
}
# 3.4. ToggleTerm (Terminal)
{
mode = "n";
key = "<F2>";
action = ":ToggleTerm<cr>";
options.desc = "Toggle Terminal (F2)";
}
# 3.5. BufferLine (Navigation par onglets)
{
mode = "n";
key = "<tab>";
action = ":BufferLineCycleNext<cr>";
options.desc = "Next Buffer";
}
{
mode = "n";
key = "<S-tab>";
action = ":BufferLineCyclePrev<cr>";
options.desc = "Previous Buffer";
}
{
mode = "n";
key = "<C-t>";
action = ":tabnew<cr>";
options.desc = "New Tab";
}
# 3.6. SessionManager
{
mode = "n";
key = "<C-f>";
action = ":SessionManager load_session<cr>";
options.desc = "Load Session";
}
{
mode = "n";
key = "<C-x>";
action = ":SessionManager save_current_session<cr>";
options.desc = "Save Current Session";
}
{
mode = "n";
key = "<C-q>";
action = ":SessionManager delete_session<CR>";
options.desc = "Delete Session";
}
# 3.7. Avante (Chat/IA)
# Le mapping en mode visuel pour Avante.
{
mode = "v";
key = "<C-;>";
action = ":AvanteToggle<cr>";
options.desc = "Avante: Toggle My Prompt (Visual)";
}
# Remarque : Votre autocommande pour `avante.config` doit être placée
# dans la section `programs.nixvim.extraConfigLua` ou `plugins.avante.settings.extraConfig`.
# 3.8. Git (Raccourcis shell)
{ mode = "n"; key = "gp"; action = ":!gp<cr>"; options.desc = "Git Push (Shell)"; }
{ mode = "n"; key = "gn"; action = ":!gn "; options.desc = "Git New Branch (Shell)"; }
{ mode = "n"; key = "gt"; action = ":!gt "; options.desc = "Git Tag (Shell)"; }
{ mode = "n"; key = "gl"; action = ":!gpl<cr>"; options.desc = "Git Pull (Shell)"; }
{ mode = "n"; key = "gr"; action = ":!grsh<cr>"; options.desc = "Git Rebase Stash (Shell)"; }
# 3.9. Lazy/Packer (Mise à jour)
{
mode = "n";
key = "<F1>";
action = ":Lazy update<cr>";
options.desc = "Lazy Update";
}
]
+37
View File
@@ -0,0 +1,37 @@
{
# inspiré de https://github.com/brainfucksec/neovim-lua/blob/main/nvim/lua/core/options.lua
# GENERAL
swapfile = false;
clipboard = "unnamedplus";
undofile = true;
completeopt = "menuone,noinsert,noselect";
textwidth = 80;
# Pour ajouter 't' à formatoptions, il faut utiliser la fonction concat
# (sera géré dans l'import pour simplifier)
# NEVIM UI
# Note : Vous avez 'number = false' et 'nu = true' (équivalent à number=true)
# J'utilise 'nu = true' pour correspondre à votre dernière définition
number = true;
relativenumber = true;
smartcase = true;
linebreak = true;
ignorecase = true;
guicursor = "";
# laststatus = 3; # Non inclus dans la plupart des opts standard de nixvim
background = "dark";
hlsearch = false;
incsearch = true;
wrap = false; # Désactiver le wrapping général
termguicolors = true; # Permet à Neovim d'utiliser les vraies couleurs
winblend = 0; # Transparence pour les fenêtres flottantes (0 = opaque, 100 = transparent)
# TABS / INDENTS
expandtab = true;
smartindent = true;
tabstop = 4;
softtabstop = 4;
shiftwidth = 4;
}
@@ -1,3 +1,2 @@
{
}
+53
View File
@@ -0,0 +1,53 @@
{...}: {
programs.nixvim.plugins.avante = {
enable = true;
settings = {
# Utilise le CLI claude code au lieu de l'API directe
# provider = "claude";
provider = "claude";
input = {
provider = "dressing";
};
select = {
provider = "native"; # évite le bug dressing select avec tables non-list
};
providers = {
claude_code = {
model = "claude-sonnet-4-5";
timeout = 30000;
extra_request_body = {
max_tokens = 8096;
};
};
};
behaviour = {
auto_suggestions = false;
support_paste_from_clipboard = true;
# Désactive la suggestion auto qui lit tout le projet
enable_cursor_planning_mode = false;
};
# Désactive la repo map (le truc qui scanne tout le codebase)
repo_map = {
ignore_patterns = [
"*.lock"
"node_modules"
".git"
"dist"
"build"
"__pycache__"
"*.min.js"
];
};
window = {
position = "right";
width = 30;
};
};
};
}
+52
View File
@@ -0,0 +1,52 @@
{...}: let
selectOpts = "{ behavior = cmp.SelectBehavior.Insert }";
in {
programs.nixvim.plugins = {
luasnip.enable = true;
lspkind = {
enable = true;
cmp.enable = true;
};
cmp-nvim-lsp.enable = true;
cmp-buffer.enable = true;
cmp-path.enable = true;
cmp-treesitter.enable = true;
cmp = {
enable = true;
settings = {
autoEnableSources = true;
performance.debounce = 150;
sources = [
{name = "path";}
{
name = "nvim_lsp";
keywordLength = 1;
}
{
name = "buffer";
keywordLength = 3;
}
{name = "luasnip";}
];
snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end";
mapping = {
"<Up>" = "cmp.mapping.select_prev_item(${selectOpts})";
"<Down>" = "cmp.mapping.select_next_item(${selectOpts})";
"<C-p>" = "cmp.mapping.select_prev_item(${selectOpts})";
"<C-n>" = "cmp.mapping.select_next_item(${selectOpts})";
"<C-u>" = "cmp.mapping.scroll_docs(-4)";
"<C-d>" = "cmp.mapping.scroll_docs(4)";
"<C-e>" = "cmp.mapping.abort()";
"<C-y>" = "cmp.mapping.confirm({select = true})";
"<CR>" = "cmp.mapping.confirm({select = false})";
};
window = {
completion.border = "rounded";
documentation.border = "rounded";
};
};
};
};
}
+17
View File
@@ -0,0 +1,17 @@
{...}: {
programs.nixvim.plugins.conform-nvim = {
enable = true;
settings = {
format_on_save = {
lsp_fallback = "fallback";
timeout_ms = 500;
};
formatters_by_ft = {
lua = ["stylua"];
nix = ["alejandra"];
terraform = ["tofu_fmt"];
yaml = ["yamlfmt"];
};
};
};
}
+45
View File
@@ -0,0 +1,45 @@
{...}: {
programs.nixvim.plugins.lsp = {
enable = true;
inlayHints = true;
servers = {
pyright.enable = true;
pylsp.enable = true;
# basedpyright.enable = true;
jsonls.enable = true;
marksman.enable = true;
nil_ls.enable = true;
nixd.enable = true;
yamlls.enable = true;
taplo.enable = true;
};
keymaps = {
diagnostic = {
"<leader>E" = "open_float";
"[" = "goto_prev";
"]" = "goto_next";
};
lspBuf = {
"K" = "hover";
"gd" = "definition";
"gr" = "references";
"<leader>ca" = "code_action";
"<leader>cr" = "rename";
};
};
preConfig = ''
vim.diagnostic.config({
virtual_text = false,
severity_sort = true,
float = { border = 'rounded', source = 'always' },
})
'';
postConfig = ''
local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " }
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" })
end
'';
};
}
+46
View File
@@ -0,0 +1,46 @@
{
# Laisser le reste à la configuration par défaut de Neo-tree
filesystem = {
window = {
# Ces mappings sont pour les actions principales dans la fenêtre Neo-tree (Filesystem Source).
mappings = {
# Ouvre/Ferme les nœuds. Correspond au comportement VIM standard (h/l) dans un explorateur.
"h" = "close_node"; # ⬅️ Similaire à se déplacer vers la gauche / fermer le répertoire
"l" = "open"; # ➡️ Similaire à se déplacer vers la droite / ouvrir le fichier ou le répertoire
# Le reste utilise les actions par défaut de Neo-tree (qui sont souvent déjà VIM-like).
# Mouvements de base (j/k) sont implicitement gardés si non surchargés, mais on peut les confirmer:
"j" = "move_cursor_down";
"k" = "move_cursor_up";
# Actions courantes que vous avez peut-être dans un explorateur :
"<cr>" = "open";
# Aller au répertoire parent (Back)
"<bs>" = "navigate_up";
# Aller à la racine du projet
"." = "set_root";
# Toggle les fichiers cachés
"H" = "toggle_hidden";
};
};
};
# Pour la source Buffers si vous l'activez:
buffers = {
window = {
mappings = {
"j" = "move_cursor_down";
"k" = "move_cursor_up";
"l" = "open";
};
};
};
# Assurez-vous que l'option de fermer si c'est la dernière fenêtre est là pour la commodité.
close_if_last_window = true;
}
+25
View File
@@ -0,0 +1,25 @@
{pkgs, ...}: {
programs.nixvim = {
# transparent = true retire le fond opaque de TOUS les groupes du thème
# (Normal, EndOfBuffer, SignColumn, NeoTreeNormal...), pas seulement Normal.
# Sans ça, la zone vide sous la fin du buffer garde le bg0 gris de onedark.
colorschemes.onedark = {
enable = true;
settings.transparent = true;
};
plugins = {
lualine = {
enable = true;
settings.options.theme = "wombat";
};
neo-tree = {
enable = true;
settings.enable_git_status = true;
# Si tu as un fichier de settings séparé :
# settings = import ./neo-tree-settings.nix;
};
};
};
}
+255
View File
@@ -0,0 +1,255 @@
{
pkgs,
lib,
...
}: let
# --- CONFIGURATION SCREENSHOTS ---
screenshotDir = "~/media/screenshots";
# Format : Année-Mois-Jour_Heure-Min-Sec (ex: 2024-05-20_14-30-05)
screenshotFormat = "$(date +%Y-%m-%d_%H-%M-%S).png";
in {
# Assure-toi que niri et alacritty sont installés
home.packages = with pkgs; [
pkgs.alacritty
pkgs.niri
pkgs.xwayland-satellite
# Ton script "à part"
(writeShellScriptBin "niri-reset" ''
${bluez}/bin/bluetoothctl devices | cut -f2 -d' ' | while read -r uuid; do
${bluez}/bin/bluetoothctl connect "$uuid"
done
systemctl restart NetworkManager
'')
];
systemd.user.sessionVariables = {
DISPLAY = ":0";
NIXOS_OZONE_WL = "1";
ELECTRON_OZONE_PLATFORM_HINT = "wayland";
GDK_BACKEND = "wayland";
QT_QPA_PLATFORM = "wayland";
XDG_CURRENT_DESKTOP = "niri";
XDG_SESSION_TYPE = "wayland";
};
xdg.portal = {
enable = true;
config.common.default = "gtk";
extraPortals = with pkgs; [
xdg-desktop-portal-gtk # fallback UI
xdg-desktop-portal-gnome
];
};
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
};
};
# On s'assure que les services dbus utilisateur sont là
#services.dbus.enable = true;
home.sessionVariables = {
# Force Electron/Chromium à utiliser Wayland
NIXOS_OZONE_WL = "1";
# Indique aux applis Qt d'utiliser wayland
QT_QPA_PLATFORM = "wayland";
# Indique aux applis SDL d'utiliser wayland
SDL_VIDEODRIVER = "wayland";
# Pour Mozilla (si besoin)
MOZ_ENABLE_WAYLAND = "1";
# Variables XDG standards
XDG_SESSION_TYPE = "wayland";
XDG_CURRENT_DESKTOP = "niri";
GTK_IS_WIDGET = 0;
};
programs.niri = {
package = pkgs.niri;
# package = inputs.niri.packages.${pkgs.system}.niri-stable;
settings = {
outputs = {
"eDP-1" = {
mode = {
width = 1920;
height = 1080;
refresh = 60.027;
};
position = {
x = 0;
y = 0;
};
};
"DP-1" = {
mode = {
width = 2560;
height = 1440;
refresh = 59.951;
};
position = {
x = -320;
y = -1440;
};
};
"Technical Concepts Ltd 32S331 Unknown" = {
scale = 1.5;
};
};
prefer-no-csd = true; # no bar
input.keyboard.xkb = {
layout = "fr";
variant = "us"; # "us" pour avoir le layout qwerty mais typé FR
};
input = {
mod-key = "Super";
# mod-key-nested = "Alt";
mod-key-nested = "Super";
};
binds =
{
# --- Navigation Vim ---
# Colonnes (Gauche / Droite)
"Mod+H".action.focus-column-left = [];
"Mod+L".action.focus-column-right = [];
# Workspaces (Suivant / Precedent)
"Mod+J".action.focus-workspace-down = [];
"Mod+K".action.focus-workspace-up = [];
# --- Navigation existante ---
"Mod+Q".action.close-window = [];
"Mod+Left".action.focus-column-left = [];
"Mod+Right".action.focus-column-right = [];
"Mod+Up".action.focus-window-or-monitor-up = [];
"Mod+Down".action.focus-window-or-monitor-down = [];
"Mod+Shift+E".action.quit = [];
"Mod+Space".action.toggle-overview = [];
# --- Applications ---
"Mod+D".action.spawn = ["wofi" "--show" "drun"];
"Mod+Return".action.spawn = "alacritty";
"Mod+F".action.spawn = "librewolf";
"Mod+B".action.spawn = ["gtk-launch" "blueberry"];
"Alt+L".action.spawn = "nautilus";
# --- Gestion des fenêtres ---
"Mod+R".action.spawn = ["niri-reset"];
"Mod+M".action.maximize-column = [];
"Mod+V".action.toggle-window-floating = [];
"Mod+C".action.close-window = [];
"Mod+T".action.set-column-width = "50%";
"Mod+Y".action.set-column-width = "33%";
"Super+Shift+C".action.close-window = [];
"Super+Shift+Q".action.quit.skip-confirmation = true;
# PRINT : Direct -> Dossier + Presse-papier (Automatique)
"Print".action.spawn = [
"sh"
"-c"
"grim -g \"$(slurp)\" - | tee ${screenshotDir}/${screenshotFormat} | wl-copy"
];
# MOD + PRINT : Edit -> Satty (Interactif)
# Satty permet de choisir ensuite de sauver ou copier via son interface
"Mod+Print".action.spawn = [
"sh"
"-c"
"grim -g \"$(slurp)\" - | satty -f - --output-filename ${screenshotDir}/${screenshotFormat}"
];
# --- Multimedia ---
"Prior".action.spawn = "wl-copy";
"Next".action.spawn = "wl-paste";
"Alt+D".action.spawn = ["playerctl" "-p" "spotify" "next"];
"Alt+S".action.spawn = ["playerctl" "-p" "spotify" "previous"];
"Alt+K".action.spawn = ["playerctl" "-p" "spotify" "play-pause"];
"Alt+W".action.spawn = ["auto-wallpaper"];
# --- Materiel ---
"XF86AudioRaiseVolume".action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "2%+"];
"XF86AudioLowerVolume".action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "2%-"];
"XF86AudioMute".action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"];
"XF86MonBrightnessUp".action.spawn = ["brightnessctl" "s" "+1%"];
"XF86MonBrightnessDown".action.spawn = ["brightnessctl" "s" "1%-"];
}
// lib.attrsets.mergeAttrsList (map (
i: let
ws = toString i;
in {
"Alt+${ws}".action.move-window-to-workspace = i;
"Mod+${ws}".action.focus-workspace = i;
}
) [1 2 3 4 5 6 7 8 9]);
# Lancement automatique
spawn-at-startup = [
{argv = ["${pkgs.xdg-desktop-portal}/libexec/xdg-desktop-portal"];}
{argv = ["dbus-update-activation-environment" "--systemd" "all"];}
{argv = ["systemctl" "--user" "import-environment" "PATH" "WAYLAND_DISPLAY" "XDG_CURRENT_DESKTOP"];}
{argv = ["xwayland-satellite" ":"];}
{argv = ["alacritty"];}
{argv = ["zen"];}
{argv = ["spotify"];}
{argv = ["beeper"];}
];
overview.zoom = 0.2;
input.mouse.natural-scroll = true;
input.focus-follows-mouse.enable = true;
outputs = {
"eDP-1" = {
enable = true;
scale = 1;
};
};
# Quelques réglages visuels pour ne pas être perdu
layout = {
default-column-width = {
# proportion = 0.33;
proportion = 0.5;
};
border.enable = false;
focus-ring.enable = false;
shadow.enable = true;
};
window-rules = [
{
matches = [{app-id = "Alacritty";}];
open-maximized = true;
open-on-workspace = "1";
}
{
matches = [{app-id = "^zen";}];
open-on-workspace = "2";
}
{
matches = [{app-id = "Spotify";}];
open-on-workspace = "3";
}
{
matches = [{app-id = "beeper";}];
open-on-workspace = "4";
}
{
matches = [{is-active = false;}];
shadow = {
enable = true;
softness = 10;
spread = 2;
color = "#00000044";
};
}
];
};
};
}
+27
View File
@@ -0,0 +1,27 @@
{ config, pkgs, ... }:
let
sshdDirectory = "${config.user.home}/sshd";
port = 8022;
pubKeyPath = "${config.user.home}/sshd/ssh_key.pub"; # Replace with your key path
in
{
# Generate keys and config on activation
build.activation.sshd = ''
mkdir -p "${config.user.home}/.ssh"
cat ${pubKeyPath} > "${config.user.home}/.ssh/authorized_keys"
if [ ! -d "${sshdDirectory}" ]; then
mkdir -p "${sshdDirectory}"
${pkgs.openssh}/bin/ssh-keygen -t rsa -b 4096 -f "${sshdDirectory}/ssh_host_rsa_key" -N ""
echo "HostKey ${sshdDirectory}/ssh_host_rsa_key\nPort ${toString port}" > "${sshdDirectory}/sshd_config"
fi
'';
# Add script to start sshd
environment.packages = [
(pkgs.writeScriptBin "sshd-start" ''
#!${pkgs.runtimeShell}
${pkgs.openssh}/bin/sshd -f "${sshdDirectory}/sshd_config" -D
'')
];
}
+65
View File
@@ -0,0 +1,65 @@
{ pkgs, ... }:
let
# pythonPackages = pkgs.python311Packages;
pythonPackages = pkgs.python311Packages.override {
overrides = self: super: {
# On désactive les tests spécifiquement pour pytest-benchmark
pytest-benchmark = super.pytest-benchmark.overridePythonAttrs (old: {
doCheck = false;
});
# Si d'autres paquets bloquent (ex: cryptography), tu peux les ajouter ici :
# cryptography = super.cryptography.overridePythonAttrs (old: { doCheck = false; });
};
};
nxbt = pythonPackages.buildPythonApplication rec {
pname = "nxbt";
version = "0.1.4";
src = pkgs.python3Packages.fetchPypi rec {
inherit pname version;
sha256 = "sha256-PryY4jT442AMwllvUn7w744jlqfnA9AWB5k359XFo54=";
};
pyproject = true;
build-system = [
pythonPackages.setuptools
pythonPackages.wheel
];
postPatch = ''
substituteInPlace nxbt/bluez.py \
--replace-fail "/lib/systemd/system/bluetooth.service" "${pkgs.bluez}/etc/systemd/system/bluetooth.service"
# --- Completely neutralise toggle_clean_bluez on NixOS ---
# Replace the whole function definition with a no-op
# substituteInPlace nxbt/bluez.py \
# --replace-fail 'def toggle_clean_bluez(toggle):\n .*time.sleep(0\.5)' \
# 'def toggle_clean_bluez(toggle): return'
# --- Fix secrets.txt path (avoid /nix/store) ---
substituteInPlace nxbt/web/app.py \
--replace-fail \
'os.path.dirname(__file__)' \
'"/tmp"'
'';
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = [ pkgs.bluez pkgs.dbus ];
propagatedBuildInputs = with pythonPackages; [
dbus-python
flask
flask-socketio
pynput
psutil
jinja2
eventlet
blessed
cryptography
];
dontCheckRuntimeDeps = true;
doCheck = false;
};
in
{
home.packages = [ nxbt ];
}
+18
View File
@@ -0,0 +1,18 @@
{
inputs,
pkgs,
...
}: {
home.packages = [inputs.option-pricer.packages.${pkgs.stdenv.hostPlatform.system}.default];
systemd.user.services.option-pricer = {
Unit.Description = "option-pricer Streamlit dashboard";
Unit.After = ["network.target"];
Service = {
ExecStart = "${inputs.option-pricer.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/option-pricer --server.port 8503";
WorkingDirectory = "${inputs.option-pricer.packages.${pkgs.stdenv.hostPlatform.system}.default}/lib/option-pricer";
Restart = "on-failure";
RestartSec = "5s";
};
Install.WantedBy = ["default.target"];
};
}
+13
View File
@@ -0,0 +1,13 @@
{ pkgs, ...}:
{
programs.pgcli = {
enable = true;
settings = {
main = {
smart_completion = true;
vi = true;
};
# "named queries".simple = "select * from abc where a is not Null";
};
};
}
+32
View File
@@ -0,0 +1,32 @@
{ pkgs, ... }:
let
pyEnv = pkgs.python3.withPackages (ps: with ps; [
flask
apscheduler
spotipy
pandas
openpyxl
pyopenssl
python-dotenv
]);
src = pkgs.fetchFromGitHub {
owner = "storizzi";
repo = "playsched";
rev = "main";
sha256 = "sha256-7mWc+qT+y+lirIZEBnrfXJ/3wLkiy5Vnp6fZS2f2rGU=";
};
in
{
home.packages = [
(pkgs.writeShellScriptBin "playsched-web" ''
${pyEnv}/bin/python ${src}/playsched.py "$@"
'')
(pkgs.writeShellScriptBin "playsched-cli" ''
${pyEnv}/bin/python ${src}/play_spotify_playlist.py "$@"
'')
];
}
+29
View File
@@ -0,0 +1,29 @@
{ pkgs, ...} : {
security.polkit.extraConfig = ''
polkit.addRule(function(action, subject) {
if (subject.isInGroup("wheel"))
return polkit.Result.YES;
});
'';
# home-manager.users.marc = { pkgs, inputs, ... }: {
# systemd.user.services.polkit-gnome-authentication-agent-1 = {
# Unit = {
# Description = "polkit-gnome-authentication-agent-1";
# Wants = [ "graphical-session.target" ];
# After = [ "graphical-session.target" ];
# };
# Install = {
# WantedBy = [ "graphical-session.target" ];
# };
# Service = {
# Type = "simple";
# ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
# Restart = "on-failure";
# RestartSec = 1;
# TimeoutStopSec = 10;
# };
# };
# };
}
@@ -0,0 +1,19 @@
{
inputs,
pkgs,
...
}: {
home.packages = [inputs.portfolio-optimizer.packages.${pkgs.stdenv.hostPlatform.system}.default];
systemd.user.services.portfolio-optimizer = {
Unit.Description = "portfolio-optimizer Streamlit dashboard";
Unit.After = ["network.target"];
Service = {
ExecStart = "${inputs.portfolio-optimizer.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/portfolio-optimizer --server.port 8502";
WorkingDirectory = "${inputs.portfolio-optimizer.packages.${pkgs.stdenv.hostPlatform.system}.default}/lib";
Restart = "on-failure";
RestartSec = "5s";
};
Install.WantedBy = ["default.target"];
};
}
+29
View File
@@ -0,0 +1,29 @@
{ pkgs, ... }:
let
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
# neovim providers
pynvim
python-lsp-server
python-lsp-server
ruff
# quant / data science
numpy
pandas
scipy
matplotlib
# tooling
ipython
ptpython
rich
marimo
]);
in
{
home.packages = with pkgs; [
pythonEnv
basedpyright
];
}
+16
View File
@@ -0,0 +1,16 @@
{ pkgs, ...} :
let
vault_url = "https://vault.marcpartensky.com";
in
{
programs.rbw = {
enable = true;
settings = {
email = "marc@marcpartensky.com";
lock_timeout = 300;
base_url = "${vault_url}";
identity_url = "${vault_url}";
# pinentry = pkgs.pinentry-gnome3;
};
};
}

Some files were not shown because too many files have changed in this diff Show More