diff --git a/modules/services/homer/default.nix b/modules/services/homer/default.nix
new file mode 100644
index 0000000..a765418
--- /dev/null
+++ b/modules/services/homer/default.nix
@@ -0,0 +1,175 @@
+{
+ config,
+ lib,
+}:
+with lib; let
+ cfg = config.my.services.homer;
+ inherit (my.server) domain;
+ config = ''
+ ---
+ # Homepage configuration
+ # See https://fontawesome.com/v5/search for icons options
+
+ # Optional: Use external configuration file.
+ # Using this will ignore remaining config in this file
+ # externalConfig: https://example.com/server-luci/config.yaml
+
+ title: "App dashboard"
+ subtitle: "Homer"
+ # documentTitle: "Welcome" # Customize the browser tab text
+ logo: "assets/logo.png"
+ # Alternatively a fa icon can be provided:
+ # icon: "fas fa-skull-crossbones"
+
+ header: true # Set to false to hide the header
+ # Optional: Different hotkey for search, defaults to "/"
+ # hotkey:
+ # search: "Shift"
+ footer: '
Created with ❤️ with bulma, vuejs & font awesome // Fork me on
' # set false if you want to hide it.
+
+ columns: "3" # "auto" or number (must be a factor of 12: 1, 2, 3, 4, 6, 12)
+ connectivityCheck: true # whether you want to display a message when the apps are not accessible anymore (VPN disconnected for example).
+ # You should set it to true when using an authentication proxy, it also reloads the page when a redirection is detected when checking connectivity.
+
+ # Optional: Proxy / hosting option
+ proxy:
+ useCredentials: false # send cookies & authorization headers when fetching service specific data. Set to `true` if you use an authentication proxy. Can be overrided on service level.
+
+ # Set the default layout and color scheme
+ defaults:
+ layout: columns # Either 'columns', or 'list'
+ colorTheme: auto # One of 'auto', 'light', or 'dark'
+
+ # Optional theming
+ theme: default # 'default' or one of the themes available in 'src/assets/themes'.
+
+ # Optional custom stylesheet
+ # Will load custom CSS files. Especially useful for custom icon sets.
+ # stylesheet:
+ # - "assets/custom.css"
+
+ # Here is the exhaustive list of customization parameters
+ # However all value are optional and will fallback to default if not set.
+ # if you want to change only some of the colors, feel free to remove all unused key.
+ colors:
+ light:
+ highlight-primary: "#3367d6"
+ highlight-secondary: "#4285f4"
+ highlight-hover: "#5a95f5"
+ background: "#f5f5f5"
+ card-background: "#ffffff"
+ text: "#363636"
+ text-header: "#424242"
+ text-title: "#303030"
+ text-subtitle: "#424242"
+ card-shadow: rgba(0, 0, 0, 0.1)
+ link: "#3273dc"
+ link-hover: "#363636"
+ background-image: "assets/your/light/bg.png"
+ dark:
+ highlight-primary: "#3367d6"
+ highlight-secondary: "#4285f4"
+ highlight-hover: "#5a95f5"
+ background: "#131313"
+ card-background: "#2b2b2b"
+ text: "#eaeaea"
+ text-header: "#ffffff"
+ text-title: "#fafafa"
+ text-subtitle: "#f5f5f5"
+ card-shadow: rgba(0, 0, 0, 0.4)
+ link: "#3273dc"
+ link-hover: "#ffdd57"
+ background-image: "assets/your/dark/bg.png"
+
+ # Optional message
+ message:
+ # url: "https://" # Can fetch information from an endpoint to override value below.
+ # mapping: # allows to map fields from the remote format to the one expected by Homer
+ # title: 'id' # use value from field 'id' as title
+ # content: 'value' # value from field 'value' as content
+ # refreshInterval: 10000 # Optional: time interval to refresh message
+ #
+ # Real example using chucknorris.io for showing Chuck Norris facts as messages:
+ # url: https://api.chucknorris.io/jokes/random
+ # mapping:
+ # title: 'id'
+ # content: 'value'
+ # refreshInterval: 10000
+ style: "is-warning"
+ title: "Optional message!"
+ icon: "fa fa-exclamation-triangle"
+ content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+
+ # Optional navbar
+ # links: [] # Allows for navbar (dark mode, layout, and search) without any links
+ links:
+ - name: "Link 1"
+ icon: "fab fa-github"
+ url: "https://github.com/bastienwirtz/homer"
+ target: "_blank" # optional html tag target attribute
+ - name: "link 2"
+ icon: "fas fa-book"
+ url: "https://github.com/bastienwirtz/homer"
+ # this will link to a second homer page that will load config from page2.yml and keep default config values as in config.yml file
+ # see url field and assets/page.yml used in this example:
+ - name: "Second Page"
+ icon: "fas fa-file-alt"
+ url: "#page2"
+
+ # Services
+ # First level array represents a group.
+ # Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed).
+ services:
+ - name: "Application"
+ icon: "fas fa-code-branch"
+ # A path to an image can also be provided. Note that icon take precedence if both icon and logo are set.
+ # logo: "path/to/logo"
+ items:
+ - name: "Awesome app"
+ logo: "assets/tools/sample.png"
+ # Alternatively a fa icon can be provided:
+ # icon: "fab fa-jenkins"
+ subtitle: "Bookmark example"
+ tag: "app"
+ keywords: "self hosted reddit" # optional keyword used for searching purpose
+ url: "https://www.reddit.com/r/selfhosted/"
+ target: "_blank" # optional html tag target attribute
+ - name: "Another one"
+ logo: "assets/tools/sample2.png"
+ subtitle: "Another application"
+ tag: "app"
+ # Optional tagstyle
+ tagstyle: "is-success"
+ url: "#"
+ - name: "Other group"
+ icon: "fas fa-heartbeat"
+ items:
+ - name: "Pi-hole"
+ logo: "assets/tools/sample.png"
+ # subtitle: "Network-wide Ad Blocking" # optional, if no subtitle is defined, PiHole statistics will be shown
+ tag: "other"
+ url: "http://192.168.0.151/admin"
+ type: "PiHole" # optional, loads a specific component that provides extra features. MUST MATCH a file name (without file extension) available in `src/components/services`
+ target: "_blank" # optional html a tag target attribute
+ # class: "green" # optional custom CSS class for card, useful with custom stylesheet
+ # background: red # optional color for card to set color directly without custom stylesheet
+ '';
+in {
+ options.my.services.homer = with lib; {
+ enable = mkEnableOption "Homer Dashboard";
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.caddy.virtualHosts."${domain}".extraConfig = ''
+ root * ${pkgs.homer}
+ respond /assets/config.yml {
+ body
+ ${config}
+ end
+ }
+ file_server {
+ hide .git
+ }
+ '';
+ };
+}