{ config, pkgs, lib, ... }: let vaultName = "main"; notesDir = "${config.home.homeDirectory}/Obsidian"; vaultDir = "${notesDir}/${vaultName}"; plugins = [ "calendar" "advanced-tables" "dataview" "markdown-formatting-assistant" ]; pluginDir = "${vaultDir}/.obsidian/plugins"; setupPlugins = pkgs.writeShellScriptBin "setup-obsidian-plugins" '' set -e mkdir -p "${pluginDir}" cd "${pluginDir}" ${lib.concatMapStringsSep "\n" (plugin: '' if [ ! -d "${plugin}" ]; then echo "Installing plugin: ${plugin}" git clone --depth=1 https://github.com/obsidianmd/obsidian-releases/tree/master/community-plugins/${plugin} ${plugin} || true fi '' ) plugins} ''; cfg = config.homeModules.obsidian; in lib.mkIf cfg.enable { home.packages = with pkgs; [ obsidian setupPlugins ]; # Ensure Notes and vault directory exist home.file."Obsidian/.keep".text = ""; # Shell alias programs.zsh.shellAliases = { obsidian = "obsidian ${vaultDir}"; }; # Obsidian desktop entry xdg.desktopEntries.obsidian = { name = "Obsidian"; genericName = "Markdown Notes"; comment = "A powerful knowledge base with Markdown and local storage."; exec = "obsidian ${vaultDir}"; icon = "obsidian"; type = "Application"; categories = [ "Office" ]; }; # Reminder to run plugin setup home.activation.obsidianPluginSetup = lib.hm.dag.entryAfter ["writeBoundary"] '' echo "💡 Run 'setup-obsidian-plugins' to install default plugins into ${pluginDir}" ''; }