Personal Dashboard is a static, local-first app. Its attack surface is small, but a few choices are worth understanding before you change defaults.
The Launchpad module shows a registry of tools with a command for each. By default the dashboard only ever copies that command to your clipboard. The "Run" button is disabled, and the bundled local server (scripts/serve.py) returns HTTP 403 for /api/launch.
This is deliberate. A web page that can spawn arbitrary local processes is dangerous: any page or script that reached your local server could run commands on your machine.
If you want real launching, you are accepting that risk. To enable it you must do both:
- Set
features.processLaunch: trueinconfig.js(enables the button). - Implement the
/api/launchhandler inscripts/serve.pyyourself, with your own strict allowlist of permitted commands and workspaces.
Recommended guardrails if you do:
- Allowlist exact commands; never pass user input straight to a shell.
- Bind the server to
127.0.0.1only (the default). - Do not expose the server to your network or the internet.
scripts/serve.py listens on 127.0.0.1:8765. Keep it that way. Do not put it behind a public reverse proxy.
The dashboard renders your own data into the page. User-provided strings are HTML-escaped before insertion (esc() in index.html). Because the app is single-user and local-first, the only content rendered is content you typed yourself, so the realistic risk is self-inflicted. If you extend the app to ingest data from untrusted third parties, sanitize it before rendering.
This is a template, not a hosted service. If you find an issue in the template itself, open a GitHub issue. For your own fork, you own its security.