Skip to main content

PyPI Python Downloads License keep-the-why-dashboard (package) Black Read the Docs Telegram X Bluesky Mastodon Keep the Why

Keep the Why — because "ask Bob" is not documentation.

keep-the-why-dashboard

Keep the Why preserves the reasoning behind your code. keep-the-why-dashboard shows it — who recorded what, when, and what still needs a person.

keep-the-why-dashboard is the read-only viewer for Keep the Why projects — Obsidian's graph and reader, for the why behind a codebase. Keep the Why is a repo-native convention and agent skill for preserving that reasoning: decisions, rejected alternatives, workarounds, incidents, constraints, stored as versioned Markdown in context/. Everything the dashboard shows is already in the repository — the entries, the config in .keep-the-why, the linter's findings, and the Git history of all of it. It connects them into one page: a graph of topics and references, an entry reader with backlinks, queues of what needs a person, a timeline, and per-author attribution from git blame and git log.

A viewer, not a store. It writes nothing into any project, runs no daemon beyond the terminal you start it in, and is never a source of truth: delete it and nothing is lost. That is what keeps it inside Keep the Why's own rule — no new platform, database, daemon, account, or workflow — a lens on Markdown and Git, not a place where anything lives; see Philosophy. The one file it keeps is ~/.keep-the-why/dashboard-history.json: the projects you opened, with their paths, so the project menu can offer them again.

Runs on: Python 3.10–3.14, the standard library plus keep-the-why-lint as the parser. The page is one plain JavaScript module — no framework, no build step, no CDN — so the exported file works offline. The server's only network call is an update check against pypi.org for the two packages, at start and once a day (--no-update-check turns it off); the exported page makes none.

Website: https://keepthewhy.com · llms.txt for AI agents/assistants looking up this project

Documentation: Dashboard · Live example (this repository's own context/) · Linting · Specification · Trust model

How it works

ktw-dashboard reads .keep-the-why, parses the configured context directory with the linter's own parser, adds what the linter does not keep, and serves one page:

  • Entries — title, Type, Status, Evidence, Source, Verification, Revisit when, and the body with Reason / Rejected alternative / Consequence as callouts; references between topics become links and graph edges
  • Git — per entry: who created it and when (git log -S on the heading), who last touched it (git blame), and the sequence of Status values with author and date (git log -L on the Status line). Uncommitted entries show as author working tree
  • Linter — the findings ktw-lint would report, per entry and as a list; the same rules, run in-process
  • Live — the server checks the project's fingerprint (HEAD, .git/index, the files under context/) every two seconds and pushes a fresh state to every open page over Server-Sent Events. A git pull or an entry an agent wrote a moment ago shows up within seconds
  • Export — --export DIR writes one self-contained index.html with the state embedded, plus state.json; no server, no external requests. For GitHub Pages, a release asset, or the link behind the badge

Git is optional: without a repository every Git-derived field is empty and the Timeline and Authors views say so. E-mail addresses are never part of the state; --anonymize replaces author names with author-1, author-2, … for exports of repositories whose contributors did not ask to be listed on a web page.

Exit code 0 ok, 1 the directory is not a Keep the Why project (and no other project is known), 2 usage error.

Install

pip install keep-the-why-dashboard

ktw-dashboard                        # in a project with a .keep-the-why file; opens http://127.0.0.1:8765/
ktw-dashboard /path/to/project       # or any other project root
ktw-dashboard --export site/         # one static page + state.json, then exit
ktw-dashboard --json                 # the state as JSON, for scripts
ktw-dashboard --host 0.0.0.0         # expose on the network (the CLI warns; the page shows the project's context/)
ktw-dashboard [PATH] [--host 127.0.0.1] [--port 8765] [--no-browser] [--interval 2]
              [--scan DIR] [--no-history] [--no-update-check] [--export DIR] [--anonymize] [--json] [--version]

Several projects

Started inside a project, the dashboard shows that one. The project menu in the top bar lists the ten most recently opened projects (from the history file — one project id can appear at several paths, clones and worktrees included), projects found two levels under the parent directory or under --scan DIR, and ids that have a personal file in ~/.keep-the-why/ but no known location yet. Opening a project moves it to the top. --no-history leaves the file alone.

What it shows

View Content
Strip (every view) entries, topics, authors · what needs a person: open, needs review, pending confirmation, unknown evidence, revisit-when triggers · linter errors and warnings — each a link
Overview Type / Status / Evidence distributions, config, topic cards, recently touched entries
Graph topics as hubs, entries around them colored by Evidence (ring = open / needs-review / pending-confirmation, hollow = superseded), references between topics as edges; drag, zoom, hover to focus, click to open
Topics and the reader one topic file, its entries; an entry rendered with its fields and callouts, references as links, previous / next
Side pane the project graph by default; for a topic or an entry its neighbourhood graph, plus fields, created by / last touched / status history from Git, backlinks, linter findings
Queues open, needs-review, pending-confirmation, Evidence: unknown on active entries, and the Revisit when triggers on record — the page lists, it does not decide
Timeline entries by the month their heading first appeared in Git, stacked by author; superseded events marked
Authors per Git author: created, touched, superseded, first / last activity, Evidence mix of what they created; click to filter every view
Findings the linter's findings with links to the entries they sit in
Status bar the two package versions, linking PyPI; when a newer release exists the entry shimmers and its tooltip names the version and the pip install -U line

Search (/) over titles and bodies; filters by status, evidence and author apply everywhere. Keys: g graph, o overview, q queues, t timeline, a authors, l findings.

Example

$ ktw-dashboard
ktw-dashboard 0.1.0 — 11 project(s), selected: /home/me/projects/keep-the-why
  http://127.0.0.1:8765/
  (localhost only — use --host 0.0.0.0 to expose)
  read-only; Ctrl+C to stop

What that page looks like for this repository's own context/: keepthewhy.com/dashboard/live/, exported on every docs build.

What Git can and cannot tell

git blame on an entry's heading says who committed it and when; git log -L on its Status line gives the sequence of values with author and date; git log -S on the heading finds the commit that introduced it. That is the author layer — and it is Git's notion of author: the committer of record. When a coding agent writes an entry inside a developer's session, Git shows the developer. The dashboard reports what Git says and adds no convention of its own.

Version scheme

Versioned on its own counter — 0.1.0, 0.1.1, … — independently of the skill and of the linter: the dashboard reads whatever context-schema the installed linter understands, so a skill release does not force a dashboard release. It depends on keep-the-why-lint at or above the version it was tested with. Releases are tagged dashboard-v<version> in the repository, created by the publish workflow only after a successful PyPI upload, never by hand.

What this is not

  • Not a place to write. Entries are written by the skill in an agent session, or by hand; the dashboard has no edit, approve or confirm button, on purpose — a second write path would make it a store.
  • Not a judge. Whether a Revisit when trigger has fired, whether Evidence: confirmed is deserved, whether an open question can be closed — the queues list, a person decides.
  • Not a hosted service. It runs where the repository is: your machine, a CI job that exports it, a static page you publish yourself.
  • Not an agent-versus-human tracker. Authors are Git authors; see above.

Feedback

Something not working as described, a view that misreads your context/, or Git attribution that looks wrong? Open an issue — that's exactly what it's for.

Contributing

Developed in the keep-the-why monorepo under dashboard/, released independently of the skill. See CONTRIBUTING.md, the Changelog, and the Security policy.

Contributors

Contributors

We ♥️ open source!

License

MIT

Metadata

Release files for keep-the-why-dashboard 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for keep-the-why-dashboard 0.1.2
File Size Uploaded
keep_the_why_dashboard-0.1.2.tar.gz 79.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for keep-the-why-dashboard 0.1.2
File Interpreter ABI Platform
keep_the_why_dashboard-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 155.7 kB

Release files / keep_the_why_dashboard-0.1.2.tar.gz

Download URL keep_the_why_dashboard-0.1.2.tar.gz
Size 79.3 kB
Tags Source
SHA-256 checksum
How to use checksums
bb1205e84fa59aea00fab19f86899b419a1f341c357fbda82fbbdc71790f4727
BLAKE2b-256 checksum
How to use checksums
f5e5c9d69d072a333024d3910c7bbf39aaacb5bdcdbadbe0a68e8b95930399ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 11, 2026.

Transparency log

Release files / keep_the_why_dashboard-0.1.2-py3-none-any.whl

Download URL keep_the_why_dashboard-0.1.2-py3-none-any.whl
Size 76.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d456b15c581997569d1666b664fce53bd252c5e70b4a2df14314f6e63bedc851
BLAKE2b-256 checksum
How to use checksums
ecd149e5bb618af6f719a7ae2a0b853feb4df0d7ba71be5da7ff32997b8dc165
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 11, 2026.

Transparency log

Release history Release notifications | RSS feed

0.9.1

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.0

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.4

2 release files

0.1.3

2 release files

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page