← The Archive
Issue #2 7 min read

The dashboard that found two projects I was running twice

I built a stalest-first view of every open project in my vault and immediately discovered I was running the same onboarding initiative as two separate workstreams.

The Workflow

I open the new Projects tab on Saturday morning and the top of the list shows two cards sitting next to each other: an onboarding program framework I’ve been building, and a future-state onboarding presentation for my boss. Both stale. Both mine. Both, on closer look, the same project I’d somehow split into two.

I’d been working on them in separate Claude sessions for weeks. They’d been quietly diverging.

The trigger was simpler than that, though. My Obsidian vault is great at capturing things and terrible at handing them back. I’ve got 17 project folders in there. I could not have told you, on Friday, which ones had gone cold or how cold.

So I asked Claude to build me a view.

Step 1. Parse every project folder: An n8n Code node walks the vault, opens each CLAUDE.md, pulls the front matter description, the last-modified date, and the count of open tasks tagged to that project.

Step 2. Sort stalest first: The dashboard renders project cards in descending order of days-since-touched. Fresh, warm, and stale badges on each card. The stuff I’ve been ignoring floats to the top, which is the opposite of how every other tool I use works.

Step 3. Make the cards expandable: Click one and you see the description, the file path, and the open tasks. Enough context to decide in five seconds whether the project still matters.

Step 4. Add a Talk to Claude button: Per card. Click it, type a quick update, and macOS launches a new Claude session with the project name, path, age, and open tasks already in the prompt. Action layer on top of the surface layer.

Step 5. Ship it to a tab I’d actually open: It lives next to Tasks, Intel, and Pipeline in the dashboard I check every morning. Light mode, amber accent, readable on my phone in daylight. None of that is the point, but I would not use it otherwise.

Four days in, the dashboard has caught two duplicate projects and one stalled rollout I’d folded into a different IT workstream. The collapsing is the win, not the building.

What Broke

V1 of the Projects tab sorted alphabetically. Which is to say, V1 was useless. The dashboard rendered seventeen project cards in a tidy A-to-Z list and I stared at it for a minute trying to figure out what it was telling me. Nothing. It was telling me nothing. The whole point was to surface what I’d been ignoring, and instead I got a filing cabinet.

The other V1 problem: project descriptions were being pulled from the first prose line of each CLAUDE.md, which meant half the cards opened with sentences like “This document is the working context for…” Useless as a glance-level signal.

Two fixes. The sort got rewritten:

Sort project cards by last-modified date, oldest first. Tag each card with a freshness badge: fresh (≤7 days), warm (8-23 days), stale (24+ days). The stalest project must render at the top of the list.

And I added a description: field to the CLAUDE.md front matter with a real one-line summary, then told the parser to check front matter first and only fall back to prose if the field was missing. One file updated, sixteen left alone, dashboard immediately readable.

The lesson: a dashboard that shows you everything in a neutral order is a list, not a signal. If you’re building a surface to catch what you’ve been ignoring, the sort order is the product. Alphabetical is the default that hides the thing you built the tool to find.

Time Ledger

  • Time saved: Hard to score yet. Catching the two duplicate onboarding projects probably saved me a week of divergent work I would have had to reconcile later. Call it 6-8 hours of future cleanup avoided.
  • Time added: Roughly 9 hours across three Saturday sessions building the Projects tab, the parser, the Talk to Claude button, and the light-mode overhaul. Plus a regression of a bug I’d already fixed once, which cost another 20 minutes.
  • Net: Underwater on hours. Even on value, since I’ve used it for four days, not four weeks.

The honest read: I’m calling this a win because two real consolidations happened in week one. If the dashboard stops surfacing things in two weeks, the math flips and it was a Saturday hobby.

The Prompt File

You are a vault parser. You read a directory of project folders, each containing a `CLAUDE.md` file, and you return a JSON array of project status objects sorted stalest-first for rendering in a dashboard.

Inputs:
- Project root path: [VAULT_PROJECTS_PATH]
- Today's date (ISO): [TODAY_ISO]
- Open tasks file (markdown, tag-grouped): [ACTIVE_TASKS_MD]

**Step 1. Walk the directory:** For each subfolder of [VAULT_PROJECTS_PATH], locate `CLAUDE.md`. Skip folders without one. Do not recurse past one level.

**Step 2. Extract description:** Parse YAML front matter first. If a `description:` field exists, use it verbatim. If not, fall back to the first non-empty prose line of the body. Never use a heading. Never use a line starting with "This document" or "Working context."

**Step 3. Compute staleness:** Read the file's last-modified timestamp. Compute days since [TODAY_ISO]. Assign a badge: `fresh` (≤7 days), `warm` (8-23 days), `stale` (24+ days).

**Step 4. Count open tasks:** From [ACTIVE_TASKS_MD], count unchecked tasks tagged to the project's folder name. Area-level tags are acceptable; do not invent hierarchical matching that isn't in the source.

**Step 5. Return JSON:** One object per project with keys `name`, `path`, `description`, `lastModifiedISO`, `daysSince`, `badge`, `openTaskCount`. Sort the array by `daysSince` descending. Stalest first.

Constraints:
- Use string concatenation for file paths. Do not `require('path')`. The n8n Code node does not have it.
- Return valid JSON only. No prose, no markdown, no commentary.
- If a `CLAUDE.md` fails to parse, include the project with `description: null` and a `parseError` field. Do not skip it silently.

Manager’s View

Ask your VP of Sales Enablement: how many of your open initiatives haven’t been touched in the last three weeks, and which ones are duplicates of each other?

Most enablement leaders cannot answer this. Not because they’re disorganized, but because their tracking lives across Asana, Slack threads, a few Google Docs, and a mental model that decays faster than they think. The duplicate-project problem is the one nobody admits to. You start an onboarding rewrite in Q1, get pulled into a kickoff, and three months later you’re scoping what is functionally the same project under a different name because the first one fell off your radar.

The ask isn’t “build a dashboard.” The ask is: pull every open enablement initiative into one list, sort by last-touched date, and look at the bottom of that list. If anything down there has been quiet for more than three weeks, it’s either dead, duplicated, or stalled waiting on someone. All three outcomes are useful to know before the next planning cycle.

Field Notes

  • The “SE on the Go” tool one of our SEs built with Claude was the third consolidation. The dashboard surfaced it as stale, and I realized it was stalled waiting on the same internal hosting decision my AI infrastructure project was waiting on. Two cards, one blocker. Folded.

  • I reintroduced a bug I’d fixed the day before: require('path') inside an n8n Code node, which doesn’t have it. Twenty minutes to re-diagnose. Claude now has a saved memory specifically telling it not to do this again. Third time will be embarrassing.

  • The Claude Cowork deep link prefills the prompt composer but doesn’t fire React’s onChange event, so the Send button stays disabled until you type any character. I documented the workaround inline in the prompt itself (“type any character to enable Send”). Reported to Anthropic. Annoying every single submit.

The dispatch

One workflow, every Tuesday morning.

Be among the first subscribers. Real workflows from one person doing the work of a whole department. Free, forever.

No tracking pixels. No drip campaigns. Unsubscribe anytime.