Developer-Dashboard
view release on metacpan or search on metacpan
browser sees them. Broken section glyphs fall back to `â`, broken item-icon
glyphs fall back to `ð·ï¸`, and common damaged joined emoji sequences such as
`ð§âð»` are repaired so edit and play routes stop showing Unicode replacement
boxes from older bookmark files.
The default web bind is `0.0.0.0:7890`. Trust is still decided from the request origin and host header, not from the listen address.
`DD-OOP-LAYERS` comparisons normalize canonical path identities, so symlinked
aliases such as macOS `/var/...` versus `/private/var/...` do not break
layer discovery, deepest-layer writes, or layered bookmark/nav lookup.
The CLI path helpers follow the same portability rule: commands such as
`dashboard path project-root` may surface the canonical filesystem path, and
the supported contract treats macOS aliases such as `/var/...` and
`/private/var/...` as the same project root instead of different repos.
The same portability rule now also applies to the shell-helper and
`locate_dirs_under` regression suites, so equivalent temp roots are compared
by real path identity instead of raw string spelling.
## Runtime Lifecycle
The runtime manager follows the older local-service pattern:
- `dashboard serve` starts the web service in the background by default
- `dashboard serve` starts the configured collector loops alongside the web
service, so a plain serve keeps collectors and the web runtime under the same
lifecycle action
- `dashboard serve --foreground` keeps the web service attached to the terminal
- `dashboard serve --ssl` enables HTTPS in Starman with the generated local
certificate and key, keeps that certificate on a browser-correct SAN profile
covering localhost, loopback IPs, the concrete non-wildcard bind host, and any
configured `web.ssl_subject_alt_names`, regenerates older dashboard certs when
they are stale, redirects non-HTTPS requests to the matching `https://...`
URL, and reuses the saved SSL setting on later `dashboard restart` runs unless
you override it
- `dashboard serve --no-editor` and `dashboard serve --no-endit` keep the
browser in read-only mode by hiding Share, Play, and View Source chrome,
denying `/app/<id>/edit`, `/app/<id>/source`, and
bookmark-save POST routes with `403`, and persisting that read-only flag for
later `dashboard restart` runs until `dashboard serve --editor` turns it back
off
- `dashboard serve --no-indicators` and `dashboard serve --no-indicator` keep
normal page rendering and left-side page chrome intact while clearing the
whole top-right browser-only chrome area, including the status strip,
username, host or IP link, and live date-time line, and persisting that flag
for later `dashboard restart` runs until `dashboard serve --indicators`
turns it back off
- `dashboard serve logs` prints the combined Dancer2 and Starman runtime log
captured in the dashboard log file, `dashboard serve logs -n 100` starts from
the last 100 lines, and `dashboard serve logs -f` follows appended output live
- `dashboard serve workers N` saves the default Starman worker count and starts
the web service immediately when it is currently stopped; `--host HOST` and
`--port PORT` can steer that auto-start path, and both
`dashboard serve --workers N` and `dashboard restart --workers N` can still
override the worker count for one run
- `dashboard stop` stops both the web service and managed collector loops and,
prints the final lifecycle summary as a terminal table by default or JSON with
`-o json`; on an interactive terminal it also prints the full stop task board
on `stderr` before work starts so each shutdown step becomes visible instead
of silent waiting. The shutdown path now also follows the saved managed
listener port back to the real listener pid when the live web process has
renamed itself into a `starman master` shape, so minimal Docker runs still
stop the actual serving process instead of leaving the listener behind.
Managed collector stop and restart flows also wait for the previous loop to
really die before accepting a replacement, so a slow shutdown does not leave a
stale collector process rewriting loop state while the next restart is proving
the new pid.
- `dashboard stop web` only stops the managed web service
- `dashboard stop collector` only stops managed collector loops
- `dashboard stop collector <name>` only stops the requested managed
collector loop, and collector-name shell completion suggests registered
collector names
- `dashboard restart` stops both, starts configured collector loops again, then
starts the web service, prints the final lifecycle summary as a terminal table
by default or JSON with `-o json`, and only reports success after the
replacement collector loops and web runtime become visible and survive a short
post-ready confirmation window, with the web side still holding a live managed
pid and an accepting listener on the requested port. Restart now also reuses
the saved listener port to recover the real serving pid when the web process
has renamed itself into the underlying `starman master` form, so container
restarts still own and replace the active listener instead of losing control
after startup. On Linux hosts that are also running Developer Dashboard inside
Docker containers, managed stop and restart paths now reject sibling runtime
pids that live in a different Linux pid namespace, so a host-side restart does
not accidentally kill or adopt a container-owned web listener or collector
loop
- `dashboard restart web` only restarts the managed web service
- `dashboard restart collector` only restarts managed collector loops
- `dashboard restart collector <name>` only restarts the requested
collector loop, including an on-demand manual collector by converting it into
a managed interval loop, and collector-name shell completion suggests
registered collector names
- managed collector loops also run under a watchdog supervisor; if a loop dies
unexpectedly after startup, the watchdog restarts it automatically, records
the restart attempt in collector status/logs, and after too many crashes
inside the watchdog window marks the collector `attention_required` so the
operator sees an explicit problem instead of infinite silent restart churn
- `dashboard log` and `dashboard logs` print the combined dashboard web log
plus collector logs
- `dashboard log web` prints only the dashboard web log and still supports
`-n` and `-f`
- `dashboard log collector` prints only collector logs
- `dashboard log collector <name>` prints only the requested collector
log, and collector-name shell completion suggests registered collector names
- interactive restart and stop task boards mark the active step with a blue
`-`, stream active detail lines in blue, mark completed steps with a green
`[OK]`, mark failed steps with a red `[X]` plus red failure detail lines,
keep the final table or JSON summary on `stdout`, and use numeric POSIX
shutdown signals so minimal Alpine/iSH Perl builds that reject `TERM` by
name still terminate managed web and collector processes correctly
- web shutdown and duplicate detection do not trust pid files alone; they validate managed processes by environment marker or process title and use a `pkill`-style scan fallback when needed
## Environment Customization
After installing with `cpanm`, the runtime can be customized with these environment variables:
- `DEVELOPER_DASHBOARD_BOOKMARKS`
Overrides the saved page or bookmark directory.
- `DEVELOPER_DASHBOARD_CHECKERS`
Limits enabled collector or checker jobs to a colon-separated list of names.
- `DEVELOPER_DASHBOARD_CONFIGS`
Overrides the config directory.
- `DEVELOPER_DASHBOARD_ALLOW_TRANSIENT_URLS`
Allows browser execution of transient `/?token=...`, `/action?atoken=...`,
and older `/ajax?token=...` payloads. The default is off, so the web UI only
executes saved bookmark files unless this is set to a truthy value such as
`1`, `true`, `yes`, or `on`.
Collector definitions come only from dashboard configuration JSON, so config
remains the single source of truth for path aliases, providers, collectors,
and Docker compose overlays.
## Testing And Coverage
( run in 1.694 second using v1.01-cache-2.11-cpan-e93a5daba3e )