{"id":13588524,"url":"https://github.com/knrdl/hubleys-dashboard","last_synced_at":"2026-03-18T00:19:46.654Z","repository":{"id":65747469,"uuid":"578651630","full_name":"knrdl/hubleys-dashboard","owner":"knrdl","description":"Hubleys Brave New Dashboard","archived":false,"fork":false,"pushed_at":"2025-04-01T12:55:02.000Z","size":4078,"stargazers_count":78,"open_issues_count":5,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-01T13:40:06.674Z","etag":null,"topics":["authelia","dashboard-application","personal-dashboard","sveltekit","tailwindcss"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/knrdl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-15T15:01:37.000Z","updated_at":"2025-04-01T12:53:49.000Z","dependencies_parsed_at":"2023-11-13T18:26:47.502Z","dependency_job_id":"fccfcdd7-f968-4539-a9d0-0f388d3349eb","html_url":"https://github.com/knrdl/hubleys-dashboard","commit_stats":{"total_commits":556,"total_committers":4,"mean_commits":139.0,"dds":0.3794964028776978,"last_synced_commit":"b42c3fccc4732a0b7d8a254e649432fd3a22859d"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knrdl%2Fhubleys-dashboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knrdl%2Fhubleys-dashboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knrdl%2Fhubleys-dashboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knrdl%2Fhubleys-dashboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/knrdl","download_url":"https://codeload.github.com/knrdl/hubleys-dashboard/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247994121,"owners_count":21030050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authelia","dashboard-application","personal-dashboard","sveltekit","tailwindcss"],"created_at":"2024-08-01T15:06:46.158Z","updated_at":"2026-03-18T00:19:46.598Z","avatar_url":"https://github.com/knrdl.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","Software"],"sub_categories":["Personal Dashboards"],"readme":"# Hubleys\n\n## Hubleys - Brave New Dashboard\n\nSo you run a bunch of self-hosted services for multiple users but are tired of handing out links? No problem, Hubleys got you covered.\n\n- separate dashboard per user, according to their groups/permissions\n- all dashboard contents are predefined by the admin(s)\n- dashboard features:\n  - link tiles, organized by folders\n  - search engines with autocomplete\n  - upcoming calendar events\n  - show messages to the users\n- customizable \u0026 dynamic backgrounds\n- current weather \u0026 forecast\n- clock, stopwatch, timer\n\n## Quick Demo\n\n```shell\ndocker run -it --rm -e SINGLE_USER_MODE=1 -e ORIGIN=http://localhost:3000 -p127.0.0.1:3000:3000 ghcr.io/knrdl/hubleys-dashboard:edge\n```\n\n\u003e Weather and unsplash backgrounds won't work in demo.\n\n![Screenshot](./docs/screenshot.png)\n\n\n# Setup\n\n\n## 1. Setup Docker Compose\n\n```yaml\nversion: '2.4'\n\nservices:\n  hubleys:\n    image: ghcr.io/knrdl/hubleys-dashboard\n    hostname: hubleys\n    restart: unless-stopped\n    environment:\n      OPENWEATHERMAP_API_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  # get a free api key: https://home.openweathermap.org/api_keys\n      UNSPLASH_API_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  # get a free api key (Access Key): https://unsplash.com/oauth/applications\n      ADMINS: user:user1, user:user2, group:admins\n    volumes:\n      - ./data:/data  # run `chown -R 1000:1000 ./data` on the host to fix folder permissions\n    networks:\n      - proxy  # must be reachable by the reverse proxy\n    mem_limit: 100m\n```\n\nPersistent files reside under `/data`. The file structure is auto-generated on startup:\n\n| Path                       | Type | Description                                                                                                               |\n| -------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------- |\n| `/data/`                   | 📂   | holds all persistent data                                                                                                 |\n| `/data/config.yml`         | 🗎    | system config file                                                                                      |\n| `/data/logos/`             | 📂   | additional image files to reference in `config.yml`.\u003cbr/\u003ehubleys also ships some [default icons](./static/fallback-logos) |\n| `/data/wallpaper/`             | 📂   | if this folder contains photos, \"wallpaper collection\" is available as background image setting  |\n| `/data/users/backgrounds/` | 📂   | where user uploaded images are persisted                                                                                  |\n| `/data/users/config/`      | 📂   | where user settings are persisted                                                                                         |\n| `/data/users/default-config.json` | 🗎  | the user settings template. edit to predefine settings for new users                                                                                         |\n| `/data/favicon.png`        | 🗎  | provide a custom favicon                  |\n\n\u003e You can customize these paths via environment variables defined [here](./Dockerfile#L63). This might be necessary if you for example want to track the `config.yml` separately in a git repository.\n\n\n## 2. Configure Hubleys\n\nEdit the contents of `./data/config.yml`. The default example can be found [here](./src/lib/server/sysconfig/default.yml). After a config change restart the application *OR* go to Settings → Admin → Reload application.\n\nFine-tuning is done via environment variables defined [here](./Dockerfile#L60).\n\n\n## 3. Configure reverse proxy + auth provider\n\nHubleys uses forward auth (also known as webproxy auth) to get all relevant user info via http header:\n\n- **Remote-User**: unique userID, must be present\n- **Remote-Groups**: comma separated group memberships\n- **Remote-Name**: optional display name\n- **Remote-Email**: optional email addr\n\nSee also: [Authelia docs](https://www.authelia.com/integration/trusted-header-sso/introduction/#response-headers)\n\n### 3.0 How does it work?\n\n```mermaid\ngraph LR\nclient[Browser]\nproxy[Reverse Proxy]\nidp[Auth Provider]\napp[Hubleys]\nclient --1--\u003e proxy\nproxy --2--\u003e idp\nidp --3--\u003e proxy\nproxy --4--\u003e app\napp --5--\u003e proxy\nproxy --6--\u003e client\n```\n\n1. the browser sends a request to your server\n2. the reverse proxy forwards the request to your auth provider (aka IDP)\n3. the auth provider checks the request\n    - if the user is logged in, it sets the **Remote-User** response header (and the other headers explained above)\n    - if the user is not logged in, it returns the login page\n4. the reverse proxy checks and copies the **Remote-User** header into the request to Hubleys\n5. Hubleys reads the **Remote-User** header and acts according to the user profile\n6. send Hubleys response to the client\n\n\n### 3.1 [Caddy](https://caddyserver.com/) + [Authelia](https://www.authelia.com/) example configuration\n\n```\nhubleys.example.org {\n\tforward_auth authelia:9091 {\n\t\tmethod GET\n\t\turi /api/verify?rd=https://login.example.org\n\t\theader_up X-Forwarded-Method {method}\n\t\theader_up X-Forwarded-Uri {uri}\n\t\tcopy_headers Remote-User Remote-Groups Remote-Name Remote-Email\n\t}\n\n\treverse_proxy hubleys:3000\n}\n```\n\n### 3.2 [Nginx](https://nginx.org) + [Authelia](https://www.authelia.com/) example configuration\n\n```\nlocation /authelia {\n  internal;\n  proxy_pass http://authelia:9091/api/verify;\n  proxy_redirect off;\n  proxy_pass_request_body off;\n  proxy_set_header Content-Length \"\";\n  # this must also be set in order to avoid status code 413 response\n  client_max_body_size 0;\n  proxy_set_header X-Forwarded-Proto $scheme;\n  proxy_set_header X-Original-URL $scheme://$http_host$request_uri;\n}\n\nlocation / {\n  proxy_pass            http://hubleys:3000/;\n  auth_request          /authelia;\n  auth_request_set      $target_url $scheme://$http_host$request_uri;\n  proxy_set_header      Upgrade $http_upgrade;\n  proxy_set_header      Connection $connection_upgrade;\n  proxy_set_header      Remote-User $upstream_http_remote_user;\n  proxy_set_header      Remote-Groups $upstream_http_remote_groups;\n  proxy_set_header      Remote-Name $upstream_http_remote_name;\n  proxy_set_header      Remote-Email $upstream_http_remote_email;\n}\n```\n\n## 4. I need more icons\n\nPlease have a look here:\n\n- https://selfh.st/icons/\n- https://github.com/walkxcode/dashboard-icons\n- https://github.com/Templarian/MaterialDesign\n- https://simpleicons.org/\n\nYou can download additional icons into the `/data/logos` folder or just reference the image via it's url in the `config.yml`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknrdl%2Fhubleys-dashboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fknrdl%2Fhubleys-dashboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknrdl%2Fhubleys-dashboard/lists"}