fix: dashboard 404s on Linux due to Pulse vs PULSE path casing#1175
Merged
danielmiessler merged 1 commit intoMay 20, 2026
Merged
Conversation
…ility Three hardcoded paths in the observability module used 'Pulse' (TitleCase) while the canonical install directory is 'PULSE' (uppercase). On macOS HFS+/APFS (case-insensitive default), 'Pulse' and 'PULSE' resolve to the same directory, so the bug is invisible. On Linux ext4/btrfs (case-sensitive), the dashboard directory is never found, every static-file lookup returns 404, and the Pulse server appears broken while the HTTP server is actually serving fine. Symptom: localhost:31337 returns 404 for / and every dashboard page on Linux; macOS users see no issue. Affected paths: - DEFAULT_DASHBOARD_DIR (line 69) - getDashboardDir() relative-path resolver (line 152) - handleUserIndexApi() user-index.json lookup (line 1650) Behavior on macOS unchanged — case-insensitive FS already resolved 'Pulse' to the canonical 'PULSE' directory. Signed-off-by: Gerald Starks <gerald.starks@icloud.com>
This was referenced May 20, 2026
This was referenced May 22, 2026
larsboes
added a commit
to larsboes/PAI
that referenced
this pull request
Jun 10, 2026
…, PULSE casing Selective integration of upstream danielmiessler/PAI (9fb9c86 → 2fde1bb): - security: port execSync→execFileSync in tab-setter.ts (danielmiessler#1046), incl. the fork's extra cmux call sites + the kitten|jq pipe → execFileSync+JSON.parse, and replace `command -v` with `which`. Adds KITTY_LISTEN_ON socket validation. - security: remove Midjourney/Discord integration from Art/Media skills (6 files) + strip stale "Midjourney" trigger keyword from Media SKILL.md descriptions. - fix(PULSE): "Pulse"→"PULSE" directory casing across PULSE module — real bug on Linux/WSL2 case-sensitive FS (live dir is PULSE; refs were "Pulse") (danielmiessler#1259/danielmiessler#1175). - bump .pai-fork/last-synced.ref → 2fde1bb. Skipped (verified N/A to fork): plansDirectory danielmiessler#672 (no such key), case-colliding danielmiessler#621 (no pai-observability-server), wiki Algorithm danielmiessler#1273 (fork casing consistent), PAI-Install danielmiessler#1267 (fork doesn't deploy PAI-Install). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Releases/v5.0.0/.claude/PAI/PULSE/Observability/observability.tshardcodes three filesystem paths using"Pulse"(TitleCase). The canonical install directory in v5.0.0 is"PULSE"(uppercase) — confirmed by theinstall.shtemplate and theReleases/v5.0.0/.claude/PAI/PULSE/directory in this repo.On macOS HFS+/APFS (case-insensitive default),
PulseandPULSEresolve to the same directory — bug is invisible. On Linux ext4/btrfs (case-sensitive), the dashboard directory is never found, every static-file lookup returns 404, andlocalhost:31337/appears completely broken even though the HTTP server is bound and serving fine.This is a Linux-portability regression — the daemon starts cleanly, the cron loop runs, voice notifications work — but the Life Dashboard is dark.
Reproduction (Linux ext4 / btrfs)
Voice notify (
POST /notify) works fine — only the dashboard's static-file serving is dead.Root cause:
serveStaticFile()callsgetDashboardDir()which returns~/.claude/PAI/Pulse/Observability/out(lowercase 'P'). That path doesn't exist on case-sensitive filesystems — the actual directory is~/.claude/PAI/PULSE/Observability/out. SoexistsSafe()returns false and every page returns 404.Fix
Three string changes —
"Pulse"→"PULSE"— inobservability.ts:DEFAULT_DASHBOARD_DIRconstantgetDashboardDir()relative-path resolverhandleUserIndexApi()user-index.json lookupThese are the only path-construction sites using
"Pulse". The other"Pulse"references in the file (around lines 851/853/859/861) are string literals describing the daemon by name in tooling descriptions — those are correct and remain unchanged.Test (Linux)
After patch:
Risk
Very low.
"Pulse"to the canonical"PULSE"directory, so the same paths resolved fine before and after the change.