A local-first, single-file personal operator dashboard you can fork and make your own. Track projects, capture notes and ideas, keep a registry of sources, and launch your own tools, all from one dark, dense, keyboard-friendly console.
No accounts. No backend required. No data leaves your machine. Open index.html and it just works.
This is a clean, generic template. It ships with sample data only. Replace the samples with your own, or edit everything in-app and let it save to your browser.
Most dashboards either lock your data in someone else's cloud or need a heavy build step and a server. This one is the opposite:
- Local-first. Your edits persist to your browser's
localStorageinstantly. Opening the file overfile://works fully offline. - Single file. The whole app is
index.html. No bundler, nonpm install, no framework. - Honest about state. A three-tier loader (canonical file, embedded fallback, inline seed) keeps it rendering whether you serve it, open it directly, or ship it as a static asset.
- Customizable without touching code. Branding, theme colors, which modules show, and their labels all live in one
config.js. - Dense when you need it. The sidebar collapses into a compact rail and remembers that choice locally.
The template ships as a public-safe mirror skeleton: it preserves a broad dashboard shape, but every page uses sample fixtures or honest empty states.
| Module set | What it's for |
|---|---|
| Overview | Current focus, what's next, active-project count, recent activity. |
| Sitemap archive | A grouped index of every enabled module. Start here when you want to see the whole app. |
| Today / To do / Calendar | Generic daily planning, task queue, and schedule surfaces with editable examples. |
| Projects | A status pipeline (active / paused / archived / dead). Inline-editable cards. |
| Launchpad | A registry of your tools/agents. Copies the command to run them. Process launching is OFF by default for safety. |
| Notes | Quick capture. Click to edit, Enter to save. |
| Sources | The feeds, newsletters, and inputs you track. |
| Ideas | A backlog with status and effort. |
| Workflow / Goals / Memory / Usage / Telemetry | Generic mirror pages for the larger operator-console shape. Replace sample context with your own. |
| Routine / Wellness / Inventory / Budget / Hobbies / Creative / Move tracker / Housing / Connections | Optional life-system pages, generic by default and safe to hide in config.js. |
| Sync | Persistence status, reset to samples, and JSON export. |
The arrow button in the sidebar header collapses the module column into a narrow rail. That preference is stored in localStorage and stays local to your browser.
git clone https://github.com/cesalas13/personal-dashboard.git
cd personal-dashboard
open index.html # macOS. Or just double-click it.That's it. Edit anything in the UI and it saves locally.
You only need this if you want your state to sync across browser tabs or devices on your own machine.
python3 scripts/serve.py # serves at http://127.0.0.1:8765Then set serverSync: true in config.js. See SECURITY.md before enabling anything that runs processes.
- Rebrand and retheme: edit
config.js(app name, accent color, which modules appear). - Add your data: edit
state.json, then runsh scripts/build.shso the offline fallback stays in sync. Or just add everything in-app. - Read the guide:
docs/customization.mdcovers theming, modules, adding a new panel, and the data model.
1. fetch('./state.json') canonical data (served, or Safari over file://)
2. <script id="embedded-state"> offline fallback, rebuilt by scripts/build.sh
3. INLINE_STATE last-resort minimal seed
+ any {"_external": "data/x.json"} pointer is loaded from that file
+ your edits overlay on top and persist to localStorage
sh scripts/build.sh (which calls scripts/embed_state.py) regenerates tier 2 from state.json. The embed step escapes </script> and externalizes heavy keys so the inline fallback stays small and safe. A test suite guards all of this.
This template never collects or transmits anything. The included scripts/privacy_scan.py is a gate you can run before publishing your fork to make sure no personal markers (names, emails, home paths) slipped in. See PRIVACY.md.
python3 -m pytest # privacy gate + embedded-state safety + fixtures
python3 scripts/privacy_scan.pyMIT. Build whatever you want with it.