An interactive app that writes a 30-60-90 plan document. The product is the document. It is not a tracker.
- New plan: Enter the seat title, pick a family (PM, hardware, general), set a start date, and optionally add the hire and manager names. Check the 180-day box if you want a fourth horizon.
- Edit: Fill in the CBTO grid. Each cell has four fields: key objective, evaluation criteria, tactics, and status. The editor flags cells where criteria looks like a tactic instead of an inspectable outcome.
- Open: Load an existing
.jsonplan file. The app rejects files that are notkindel.30-60-90. - Save: Download the plan as JSON. This is the canonical format. The filename uses the hire name or seat title.
- Export XLSX: Download a spreadsheet that matches the historical grid layout. One sheet named "30-60-90" with horizons as column groups.
- Export Markdown: Download a readable plan document with headings per lens and facet.
It does not become a weekly status tool. It does not replace Goalie. It does not accept a pile of orientation checkboxes.
The schema is the 30-60-90 grid: CBTO rows, dated named horizons, inspectable criteria. Locked from three real plans Tig wrote or edited (an SVP rewrite, Avi's hardware plan, and Abhishek's PM plan).
Horizons are dated and named, not generic "30 days."
| Horizon | Default name |
|---|---|
| Day 30 | Land |
| Day 60 | Understand Direction |
| Day 90 | Grasp Current Condition / Set Next Challenge |
| Day 180 (optional) | Ship has Turned |
Rows are CBTO (Customer, Business, Technical, Organization), then a facet of that lens. Each horizon cell has four fields:
- Key objective: one outcome for that facet in that window.
- Evaluation criteria: first-person and inspectable. "I can enumerate the 15 programs" counts. "Meet with the PMs" does not. That is a tactic.
- Tactics / deliverables: the work that might produce the criterion.
- Status: empty when you write the plan. Filled later if someone prints it again.
The canonical store is JSON. See SCHEMA.md for the full specification.
Excel is an export format, not a reload format. The XLSX export matches the historical grid layout so a human recognizes it, but you should save and reload using the JSON file.
Each family has a different set of default facets:
- pm: Product Management focus with facets like End-customer, Dealers/users, Marketing, Cloud/software, Device/firmware.
- hardware: Hardware focus with facets like Dealers, 3rd parties/vendors, Operations/supply.
- general: General Manager/SVP focus with a shorter set of facets.
Users can add, remove, and rename facets. The four CBTO lenses are fixed.
The editor applies inline checks. They flag but do not block save:
- If an objective is set but criteria is empty, the cell is flagged.
- If criteria starts with Meet, Attend, Read, Talk, Interview, Email, Call, or Schedule and does not contain a first-person inspectable claim, the cell is flagged as using a tactic instead of criteria.
The app can import historical XLSX files with the old layout:
- Sheets with "30 Days" / "60 Days" / "90 Days" in the first row are detected as grids.
- Lens names like "Customer/Product" and "Technical/Execution" are mapped to the CBTO standard.
- Files with 3 columns per horizon (no Status) are supported.
- Non-grid sheets (like "Martin's First Stab") are skipped.
After import, the store is JSON. XLSX is not a reload format.
Open index.html or preview.html in a browser. No build step required.
The app loads SheetJS from a CDN for XLSX support. If you are offline, XLSX export and import will not work, but JSON save/load and Markdown export will.
npm install xlsx
node scripts/generate-fixtures.js
node scripts/check.jsThe check script validates:
- Schema compliance
- Pressure-test logic
- XLSX round-trip (export then import preserves cells)
- Historical XLSX import
MIT. Copyright (c) 2026 Kindel, LLC. Keep the copyright notice and permission notice in all copies.
Derivatives must include a visible link to kindel.com.