Troubleshooting
This document contains common problems and their solutions.
Please ensure your issue isn't listed here, before opening a new ticket.Found something not listed here? Consider adding it, to help other users.
Contentsβ
- Config not saving
- Permission denied or read-only filesystem
- Kubernetes ConfigMap mount is read-only
- SELinux or AppArmor blocks the write
- Backup step fails so save aborts
- Save button is missing or returns 403
- Save unavailable on Vercel, Netlify or other static hosts
- /config-manager/save returns 404 or HTML
- "Invalid filename" when saving a sub-page
- "Cannot save to an external URL"
- Saved successfully but the UI shows the old config
- Container crashes or restart loop after saving
- Intentionally read-only mode
- Refused to Connect in Web Content View
- 404 / Routing issues
- Sub-pages
- Build & memory errors
- Yarn Build or Run Error
- The engine "node" is incompatible with this module
yarn buildfails inside the container- High CPU or RAM Usage on Startup
- Heap limit Allocation failed
- Command failed with signal "SIGKILL"
- Node Sass unsupported environment
- Unreachable Code Error
- Cannot find module './_baseValues'
- Auth & OIDC
- Auth Validation Error: "should be object"
- Keycloak Redirect Error
- OIDC or Keycloak failure on numeric client IDs
- Redirect loop after login
- invalid_redirect_uri
- Login works in the browser but the dashboard refuses to save anything (403)
- Logged in but no admin controls
- Login works but Dashy errors on the callback with "OIDC signinCallback returned no user"
- Sign-out leaves you stuck on Authentik
- Untrusted certificate from Authentik
- Numeric client_id getting truncated
- Header auth: "not from trusted proxy"
- Header auth: "missing user header"
- Invalid user object with all-digit hash
- OIDC login fails with CORS-shaped error from untrusted cert
- Docker & image issues
- Styles and Assets not Updating
- Config Validation Errors
- Ngrok Invalid Host Headers
- Warnings in the Console during deploy
- Status Checks Failing
- Widgets
- Diagnosing Widget Errors
- Fixing Widget CORS Errors
- CORS Proxy connect ECONNREFUSED or ENOTFOUND
- CORS Proxy Target-URL host blocked or scheme rejected
- Widget Shows Error Incorrectly
- Weather Forecast Widget 401
- Widget Displaying Inaccurate Data
- Public IP Widget not working for ipinfo or ipquery providers
- Font Awesome Icons not Displaying
- Copy to Clipboard not Working
- How-To / Reference
Config not savingβ
There should be an error message, explaining the reason the config save failed. First check browser console (F12 --> Console), and then your server-side logs in the terminal. Then, see the following sections for solutions to each possible error.
Permission denied or read-only filesystem (EACCES, EROFS)β
The container can't write to your conf.yml or its directory. Almost always an ownership mismatch: the host directory belongs to a different uid than the one Dashy runs as inside the container. Less commonly a read-only mount or an over-strict file mode.
The COPY --chown=node:node in the Dockerfile only sets ownership inside the image. When you bind-mount user-data, your host directory takes over that path entirely, so its ownership is what counts - not the image's.
Dashy runs as UID=1000 (default non-root node user). You can see this by running docker exec -it dashy id. Then, check who owns the user-data directory, with: docker exec -it dashy ls -la /app/user-data - if it's not 1000 then that's the issue. And the solution is just to run sudo chown -R 1000:1000 /path/to/your/user-data to set the right owner.
Fixes:
- Hand the directory to uid 1000 (recommended). Keeps the container running as a non-root user, which is how Dashy is built to run
sudo chown -R 1000:1000 /path/to/your/user-data - Run the container as your own user if
chownisn't practical (multi-user hosts, NAS appliances, host directories you don't want relabelled). Add--user $(id -u):$(id -g)todocker run, or setuser: "1000:1000"(or your host uid:gid) on the service indocker-compose.yml. - Loosen a single-file mount if its mode is
444. Narrow case, only fixes that one symptom:chmod 644 /path/to/conf.yml
Common mistakes
- Using uid/gid 1001. A common guess on Synology, Unraid and similar where 1001 is the host's first user. Dashy's container is 1000, not 1001.
chmodalone for a UID mismatch. Loosens permissions but doesn't change who owns the file. You needchown.chmod -R 777or775. Works as a workaround, masks the real problem, weakens security. Usechownto the right uid instead.
Other gotchas:
- Named Docker volumes (created with
docker volume create) inherit ownership from whatever first writes to them. If an older container set them up as root, the diagnose step will show that. Recreate the volume orchownthe underlying directory under/var/lib/docker/volumes/. - macOS hosts rarely hit this. Docker Desktop transparently maps host uid to container uid through its VM. If saves are failing on macOS, look elsewhere first.
- Storage layers that ignore POSIX permissions (some NAS app-data folders use FUSE, SMB or overlay mounts where
chmodandchgrpare silent no-ops). Bind-mount user-data from a native filesystem path instead.
Kubernetes ConfigMap mount is read-onlyβ
If you've mounted your conf.yml from a ConfigMap, writes will always fail with EROFS regardless of UID. ConfigMap volumes are read-only by design. Either treat the ConfigMap as the source of truth and edit it directly (saves through the UI won't work), or use a writable volume type like a PersistentVolumeClaim for user-data/.
SELinux or AppArmor blocks the writeβ
If you're on RHEL/Fedora, or systems with SELinux or AppArmour, and you've confirmed permissions are fine, and container's UID matches the host owner, but you still see EACCES.
For SELinux, add the :Z flag to your volume mount so Docker relabels it for the container (e.g. volumes: [ './user-data:/app/user-data:Z' ])
For AppArmor, check dmesg for apparmor="DENIED" lines and adjust the profile. Disabling enforcement is a last resort.
Backup step fails so save abortsβ
Before each save, Dashy backs up the current conf.yml to user-data/config-backups/. If that folder can't be written, the whole save aborts with Unable to backup conf.yml.
Two ways out:
- Point
BACKUP_DIRat a writable path - Set
DISABLE_CONFIG_BACKUPS=trueto skip the backup step entirely
Save button is missing or returns 403 Forbiddenβ
Have you got auth setup? If so, make sure you are logged in as an admin, or set type: admin to your user in conf.yml.
Beyond that, there's several other config options which prevent saving the config file, so if you didn't mean to add them, just remove from conf.yml
appConfig.preventWriteToDisk: truedisables disk save and the buttonappConfig.preventLocalSave: truedisables the "Local" save optionappConfig.disableConfiguration: truehides the editor entirely.disableConfigurationForNonAdmin: truedoes the same just for non-admins.
Save unavailable on Vercel, Netlify or other static hostsβ
Updating source config file on static hosts is not possible, since they have no Node server, nor have write access to modify any files. The "Local" save mode will still work (changes are just persisted in your browser), but the real solution is to copy/export the updated YAML and replace it in the source config file in your repo.
Related: #1465.
/config-manager/save returns 404 or HTMLβ
How are you running/serving Dashy?
If you've got a reverse proxy which only forwards specific path prefixes then maybe you're missing the /config-manager/* API endpoints?
Check the failed request in the browser's Network tab. If the response is HTML (a proxy error page) or a plain 404, your proxy isn't routing the path. Add /config-manager/ to whatever you're forwarding, or simplify the rules so everything reaches Dashy.
Or if you're serving up the compiled Vue app directly, instead of using the Node server, then the endpoint won't be available.
"Invalid filename" when saving a sub-pageβ
The save endpoint rejects sub-page filenames with path separators or non-yaml extensions. Check the path: value of the page in your pages: block. It needs to be a plain basename like home.yml, not pages/home.yml or home.txt.
"Cannot save to an external URL"β
The sub-page you are editing is loaded from a remote URL. Dashy can't write back to that URL.
You will need to edit the file at it's origin yourself instead (click the Export to view the YAML).
Or you could download the config to user-data/something.yml, and update path: to point to the local version.
Saved successfully but the UI shows the old configβ
Two unrelated causes share this symptom:
- Local storage overrides the file. Dashy lets users save settings locally in browser storage, which take priority over
conf.yml. Open Dashy in incognito to confirm. If the changes appear there, clear local settings via Config menu > "Clear Local Settings". - Docker isn't picking up file changes. Some text editors save by replacing the inode, which breaks single-file bind mounts. Edit the file in place, or mount the parent directory rather than the single file. More background.
Container crashes or restart loop after saving (3.1.0 and 3.1.1 only)β
If your container crashes or restart-loops right after clicking save, with logs like ERR_HTTP_HEADERS_SENT or ERR_STREAM_WRITE_AFTER_END, this was a known double-res.end() bug in 3.1.0 and 3.1.1. Fixed in v3.2.13 and later.
docker pull lissy93/dashy:latest
docker compose up -d --force-recreate
Intentionally read-only modeβ
To hide the "Save to disk" UI for everyone, set appConfig.preventWriteToDisk: true in conf.yml. This is a UI-only flag β the /config-manager/save server endpoint itself is gated by the configured auth method (auth.users with ENABLE_HTTP_AUTH, OIDC/Keycloak admin role, header-auth, etc.), so anyone unauthenticated or non-admin already can't save regardless of this flag. For Docker users, you can harden things further by mounting user-data (or just conf.yml) as read-only β the kernel will refuse the write even before the server tries.
Refused to Connect in Modal or Workspace Viewβ
This is not an issue with Dashy, but instead caused by the target app preventing direct access through embedded elements.
As defined in RFC-7034, for any web content to be accessed through an embedded element, it must have the X-Frame-Options HTTP header set to ALLOW. If you are getting a Refused to Connect error then this header is set to DENY (or SAMEORIGIN and it's on a different host). Thankfully, for self-hosted services, it is easy to set these headers.
These settings are usually set in the config file for the web server that's hosting the target application, here are some examples of how to enable cross-origin access with common web servers:
NGINXβ
In NGINX, you can use the add_header module within the app block.
server {
...
add_header X-Frame-Options SAMEORIGIN always;
}
Then reload with service nginx reload
Caddyβ
In Caddy, you can use the header directive.
header {
X-Frame-Options SAMEORIGIN
}
Apacheβ
In Apache, you can use the mod_headers module to set the X-Frame-Options in your config file. This file is usually located somewhere like `/etc/apache2/httpd.conf
Header set X-Frame-Options: "ALLOW-FROM http://[dashy-location]/"
LightHttpdβ
Content-Security-Policy: frame-ancestors 'self' https://[dashy-location]/
404 / Routing issuesβ
404 On Static Hostingβ
If you're seeing Dashy's 404 page on initial load/ refresh, and then the main app when you go back to Home, then this is likely caused by the Vue router, and if so can be fixed in one of two ways.
The first solution is to switch the routing mode, from HTML5 history mode to hash mode, by rebuilding Dashy with the VITE_APP_ROUTING_MODE=hash build-time environment variable set.
If this works, but you wish to continue using HTML5 history mode, then a bit of extra server configuration is required. This is explained in more detaail in the Vue Docs. Once completed, you can then use VITE_APP_ROUTING_MODE=history (the default) again, for neater URLs.
404 after Launch from Mobile Home Screenβ
Similar to the above issue, if you get a 404 after using iOS and Android's "Add to Home Screen" feature, then this is caused by Vue router.
It can be fixed by rebuilding Dashy with the VITE_APP_ROUTING_MODE=hash build-time environment variable set.
404 On Multi-Page Appsβ
Similar to above, if you get a 404 error when visiting a page directly on multi-page apps, then this can be fixed by rebuilding Dashy with the VITE_APP_ROUTING_MODE=hash build-time environment variable set, then refreshing the page.
Dashy hosted at a sub-path (e.g. example.com/dashy)β
If the homepage works but sub-page links 404, or assets fail to load, it's almost always the base path.
Rebuild with BASE_URL set to the sub-path - leading slash, no trailing slash:
Vue Router uses this to prefix every route. Without it, links resolve to /home/... instead of /dashy/home/... and skip your reverse proxy altogether. More detail in web-server configuration.
Sub-pagesβ
Sub-page shows "Unable to find config for ..."β
This means Dashy couldn't match the URL segment to any entry in your pages: list. A few causes:
Old bookmark from before an upgradeβ
Slugs are now trimmed more aggressively (e.g. π Command Center used to give -command-center, now gives command-center). Re-bookmark from the nav, or update the URL by hand.
The page was renamed or removedβ
The URL no longer resolves to anything. Check the pages: array in conf.yml and confirm the sub-page still exists.
The path points at an unreachable fileβ
If the sub-config YAML can't be fetched (404, CORS, auth), you'll see "Unable to load config from ..." instead. Verify the path: is correct, reachable from the browser, and CORS-open if remote.
Page name literally "Main"β
main is reserved in the URL scheme to mean "the root config". A page named "Main" becomes reachable at /home/main-page (not /home/main). Rename the page if that's confusing.
Service worker is serving a stale appβ
Hard-refresh (Ctrl + F5) after a major upgrade. The PWA cache may still be pointing at old routes. Also see Styles and Assets not Updating.
Sub-page missing from nav, or won't open when clickedβ
If page defined in pages: is nowhere in the nav bar, or its link goes to a different page, then there's probably something wrong with the name you chose. Note that Dashy strips out any non-alphanumeric characters.
- Ensure each page does have a valid
nameandpathfield - Check two pages don't have the same/similar name
- Check each page has a name which has at least some alpha-numeric characters
- Very long names could be being stripped/truncated
Sub-page ignores its theme, layout or appConfigβ
This is by design. Only the appConfig from your root conf.yml is used - theme, layout, iconSize, statusCheck, etc. are inherited globally so behaviour stays consistent across pages.
If you put appConfig inside a sub-page YAML, it's silently dropped on load. Move the values to the root config. See Restrictions.
Sub-config files return 404β
If your conf.yml references additional pages via pages: and the browser shows Sub-config load failed: /something.yml, the cause is almost always a Docker mount that only exposes conf.yml and not the rest of user-data/.
If you've done this:
volumes:
- ./my-conf.yml:/app/user-data/conf.yml
Only conf.yml exists inside the container. Anything it references (sub-configs, custom icons, fonts, CSS) isn't there.
Mount the directory instead:
volumes:
- ./user-data:/app/user-data
Now everything in your user-data folder is reachable at the web root. Same applies to docker run -v.
Remote Config Not Loadingβ
If you've got a multi-page dashboard, and are hosting the additional config files yourself, then CORS rules will apply. A CORS error will look something like:
Access to XMLHttpRequest at 'https://example.com/raw/my-config.yml' from origin 'http://dashy.local' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
The solution is to add the appropriate headers onto the target server, to allow it to accept requests from the origin where you're running Dashy.
If it is a remote service, that you do not have admin access to, then another option is to proxy the request. Either host your own, or use a publicly accessible service, like allorigins.win, e.g: https://api.allorigins.win/raw?url=https://pastebin.com/raw/4tZpaJV5. For git-based services specifically, there's raw.githack.com
Build & memory errorsβ
Yarn Errorβ
For more info, see Issue #1
First of all, check that you've got yarn installed correctly - see the yarn installation docs for more info.
If you're getting an error about scenarios, then you've likely installed the wrong yarn... (you're not the only one!). You can fix it by uninstalling, adding the correct repo, and reinstalling, for example, in Debian:
sudo apt remove yarncurl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.listsudo apt update && sudo apt install yarn
Alternatively, as a workaround, you have several options:
- Try using NPM instead: So clone, cd, then run
npm install,npm run buildandnpm start - Try using Docker instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run
docker build -t lissy93/dashy .to build, and then use docker start to run the project, e.g:docker run -it -p 8080:8080 lissy93/dashy(see the deploying docs for more info)
The engine "node" is incompatible with this moduleβ
You'll see this error while running yarn, if your version of Node is too old or incompatible.
The solution is to upgrade to the latest LTS version of Node 24.
Alternatively (not recommended), you can ignore this warning by running yarn install --ignore-engines.
Dashy needs Node ^22.18.0 || >=24.11.0 - that's either the Node 22 LTS line at 22.18.0 or newer, or 24.11.0 or newer.
Check your current version with node --version.
The easiest way to do this, is to use a version manager, like nvm to quickly download and apply different node versions. Run nvm install 24 then nvm use 24.
yarn build fails inside the containerβ
If you run docker exec <container> yarn build and get vite: not found (or similar), it's because the published image ships only production dependencies. The build toolchain (vite, vue-tsc, sass, etc.) lives in devDependencies and isn't installed in the runtime image.
You almost certainly don't need to rebuild. Dashy's Express server reads user-data/conf.yml on every request, so config changes show up on a page refresh, no rebuild required.
If you genuinely need a fresh build (you've patched something in src/), do it on the host with yarn install && yarn build, or build a custom image from a checkout of the repo.
High CPU or RAM Usage on Startupβ
When the Dashy container first starts, it runs a Vue production build in parallel with the server. This is a one-time cost per container start, but it briefly uses around 1β1.5 GB of RAM and 100% of one CPU core for anywhere from 30 seconds to several minutes (depending on host speed). On Pi-class hardware or VMs with less than 1 GB of RAM, this spike can be enough to lock up the host.
To work around it:
- Allocate at least 1 GB of RAM to the container - 2 GB is recommended on Raspberry Pi or low-powered VMs. Anything below 512 MB is unlikely to complete the first build.
- Set explicit Docker resource limits so the build can't starve other services on the same host:
services:dashy:image: lissy93/dashy:latestdeploy:resources:limits:memory: 2gcpus: '1.5'
- Wait it out - once the build completes, idle CPU drops to near zero and idle RAM is typically under 100 MB. If you watch
docker stats, you'll see the spike taper off. - If the spike never tapers (i.e., Dashy stays at 100% CPU forever and never serves the page), see Heap limit Allocation failed below - that usually means the build was killed mid-way and is being retried.
See also: #1585, #969, #1500, #877
Ineffective mark-compacts near heap limit Allocation failedβ
If you see an error message, similar to:
<--- Last few GCs --->
[61:0x74533040] 229060 ms: Mark-sweep (reduce) 127.1 (236.9) -> 127.1 (137.4) MB, 5560.7 / 0.3 ms (average mu = 0.286, current mu = 0.011) allocation failure scavenge might not succeed
<--- JS stacktrace --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
This is likely caused by insufficient memory allocation to the container. When the container first starts up, or has to rebuild, the memory usage spikes, and if there isn't enough memory, it may terminate. This can be specified with, for example: --memory=1024m. For more info, see Docker: Runtime options with Memory, CPUs, and GPUs. For more context on what the spike is, see High CPU or RAM Usage on Startup above.
See also: #380, #350, #297, #349, #510, #511 and #834
Command failed with signal "SIGKILL"β
In Docker, this can be caused by not enough memory. When the container first starts up, or has to rebuild, the memory usage spikes, and so a larger allocation may be required. This can be specified with, for example: --memory=1024m. For more info, see Docker: Runtime options with Memory, CPUs, and GPUs
See also #624
Node Sass does not yet support your current environmentβ
Caused by node-sass's binaries being built for a for a different architecture
To fix this, just run: yarn rebuild node-sass
Unreachable Code Errorβ
An error similar to: Fatal error in , line 0. Unreachable code, FailureMessage Object: 0xffe6c8ac. Illegal instruction (core dumped)
Is related to a bug in a downstream package, see nodejs/docker-node#1477.
Usually, updating your system and packages will resolve the issue.
See also: #776
Error: Cannot find module './_baseValues'β
Clearing the cache should fix this: yarn cache clean
If the issue persists, remove (rm -rf node_modules\ yarn.lock) and reinstall (yarn) node_modules
Auth & OIDCβ
Auth Validation Error: "should be object"β
In V 1.6.5 an update was made that in the future will become a breaking change. You will need to update you config to reflect this before V 2.0.0 is released. In the meantime, your previous config will continue to function normally, but you will see a validation warning. The change means that the structure of the appConfig.auth object is now an object, which has a users property.
For more info, see this announcement.
You can fix this by replacing:
auth:
- user: xxx
hash: xxx
with
auth:
users:
- user: xxx
hash: xxx
Keycloak Redirect Errorβ
Check the browser's console output, if you've not set any headers, you will likely see a CORS error here, which would be the source of the issue.
You need to allow Dashy to make requests to Keycloak, and Keycloak to redirect to Dashy. The way you do this depends on how you're hosting these applications / which proxy you are using, and examples can be found in the Management Docs.
For example, add the access control header to Keycloak, like:
Access-Control-Allow-Origin [URL-of Dashy]
Note that for requests that transport sensitive info like credentials, setting the accept header to a wildcard (*) is not allowed - see MDN Docs, so you will need to specify the actual URL.
You should also ensure that Keycloak is correctly configured, with a user, realm and application, and be sure that you have set a valid redirect URL in Keycloak (screenshot).
For more details on how to set headers, see the Example Headers in the management docs, or reference the documentation for your proxy.
If you're running in Kubernetes, you will need to enable CORS ingress rules, see docs, e.g:
nginx.ingress.kubernetes.io/cors-allow-origin: "https://dashy.example.com"
nginx.ingress.kubernetes.io/enable-cors: "true"
See also: #479, #409, #507, #491, #341, #520
OIDC or Keycloak failure on numeric client IDsβ
If your IdP rejects the login with an "invalid client" / "client not found" error, and your clientId is a long numeric value, the cause is almost certainly YAML number parsing.
YAML parses unquoted numeric tokens as Numbers, and JavaScript can't represent integers larger than 2^53 (~16 digits) without losing precision. So an unquoted numeric clientId will be silently truncated (e.g. 918756876419824312 β 918756876419824300), or - for very large values - converted to scientific notation (e.g. 9.187568764198242e+37), and the IdP will reject it.
The fix is to wrap the clientId in quotes in your conf.yml so it gets parsed as a string:
appConfig:
auth:
enableOidc: true
oidc:
clientId: "918756876419824312"
endpoint: https://idp.example.com/
The same applies to auth.keycloak.clientId. Dashy will print a warning in the browser console when it detects a numeric clientId, to help diagnose this.
See also: #1941
Redirect loop after loginβ
Your endpoint probably includes .well-known/openid-configuration. Drop everything from .well-known onwards
invalid_redirect_uriβ
The redirect URI Authentik has registered for the provider doesn't exactly match the URL Dashy is being served from. Register both the bare URL and the trailing-slash version, and make sure the scheme matches (http vs https).
Login works in the browser but the dashboard refuses to save anything (403)β
Dashy's server is rejecting the id_token. Check Dashy's container logs for [auth-oidc] token verification failed. Common causes:
- Issuer mismatch. Authentik is behind a reverse proxy that isn't sending
X-Forwarded-Proto: https, so its discovery document advertiseshttp://while you configuredhttps://in Dashy. Fix the proxy or setAUTHENTIK_HOST/AUTHENTIK_LISTEN__TRUSTED_PROXY_CIDRSon the Authentik containers - Audience mismatch. The
audclaim in the id_token is notdashy. Confirm the provider's Client ID is exactlydashy(no leading or trailing whitespace) - Dashy server can't reach Authentik. The Dashy container fails to fetch the discovery document. Exec into the container and try
wget -qO- https://auth.example.com/application/o/dashy/.well-known/openid-configuration - Clock skew. The middleware allows 30 seconds of drift. If a container's clock is further off than that,
exp/iatchecks fail
If you've exhausted these and need a stop-gap, set oidc.disableServerSideCheck: true to skip server-side verification and fall back to client-side-only auth. This leaves Dashy's server routes unprotected, so only use it in a trusted environment (see the OIDC docs).
Sent back to the login page after a whileβ
Your SSO session's id_token expired, so Dashy signs you out (rather than leaving a logged-in-looking UI whose API calls all silently 401). For OIDC, set oidc.enableSilentRenew: true to refresh the session in the background before it lapses; this needs your provider to issue refresh tokens (Dashy adds the offline_access scope automatically when it's on). Otherwise, just sign in again when prompted.
Logged in but no admin controlsβ
The id_token doesn't include the groups claim. Open browser devtools after logging in, find the call to /application/o/dashy/userinfo/, and check the response. You should see a groups array containing dashy-admins. If not:
- The
groupsscope mapping doesn't exist, or is not attached to the provider's property mappings - The user is not in the
dashy-adminsgroup - The conf.yml is missing
groupsfromscope:and Authentik is therefore not sending it
Login works but Dashy errors on the callback with "OIDC signinCallback returned no user"β
The id_token came back without a username claim. Confirm the provider has "profile" and "email" in its scopes and the "Include claims in id_token" is on
Sign-out leaves you stuck on Authentikβ
Dashy redirects to Authentik's end-session endpoint on logout. If Authentik's invalidation flow prompts for confirmation (the default), that's expected - click through it. To skip the prompt entirely, change the provider's invalidation flow to one without a consent stage.
Untrusted certificate from Authentikβ
Self-signed certs make Dashy's server-side fetch of the discovery document fail. Use a real cert (Let's Encrypt, or your homelab CA installed into the Dashy image) for the Authentik hostname.
Numeric client_id getting truncatedβ
Don't use numeric-only client IDs. If you must, wrap the value in quotes in conf.yml so YAML treats it as a string
Header auth: "Unauthorized - not from trusted proxy"β
The IP your reverse proxy presents as isn't in auth.headerAuth.proxyWhitelist. For Docker it's usually the bridge IP, not your LAN IP. Find it with docker compose exec dashy getent hosts <proxy-service-name> and paste that into proxyWhitelist. Restart Dashy after the change.
Header auth: "Unauthorized - missing user header"β
The source IP check passed, but the configured userHeader isn't on the request. Either the proxy isn't sending it (check the Cloudflare Access policy / Authelia forward-auth / Tailscale Serve config is actually applied), or the header name in conf.yml doesn't match what the proxy sends. Header matching is case-insensitive, but spelling and prefix matter.
"Invalid user object" warning on startup with an all-digit hash or placeholderβ
YAML parsed your hash: value as a number rather than a string, because every character was a digit. Common when using placeholder all-zero hashes under header auth. Quote it: hash: "0000...". Same root cause as the numeric clientId issue above.
OIDC login looks like a CORS error in devtools, but the IdP is configured for CORS correctlyβ
If your identity provider uses a self-signed or untrusted certificate, the browser will silently abort oidc-client-ts's token-exchange fetch and surface it as a CORS-shaped error. Open the IdP URL directly in a new tab, accept the certificate warning, then retry the Dashy login. The real fix is to use a trusted cert (Let's Encrypt, or a homelab CA installed into the browser's trust store).
Docker & image issuesβ
App Not Starting After Update to 2.0.4β
Version 2.0.4 introduced changes to how the config is read, and the app is build. If you were previously mounting /public as a volume, then this will over-write the build app, preventing it from starting. The solution is to just pass in the file(s) / sub-directories that you need. For example:
volumes:
- /srv/dashy/conf.yml:/app/user-data/conf.yml
- /srv/dashy/item-icons:/app/public/item-icons
Mount Type Mismatchβ
Error response from daemon: ... mount through procfd: not a directory:
Are you trying to mount a directory onto a file (or vice-versa)?
This means the host side and container side of your volume don't agree on whether the target is a file or a directory.
Recommended pattern: mount a host directory onto /app/user-data. The directory must exist on the host and contain at least a conf.yml:
mkdir -p ~/dashy-data
cp /path/to/your/conf.yml ~/dashy-data/conf.yml
docker run -d -p 8080:8080 -v ~/dashy-data:/app/user-data lissy93/dashy:latest
If you'd rather mount a single file (-v ~/conf.yml:/app/user-data/conf.yml), the host path must be a file that already exists, otherwise Docker creates a directory in its place and you'll see this error.