What your product does, from one module down to one feature.
A feature map of your web app, read from its code: featkpr names each feature it finds, with the source lines behind the name. Five screens show the result, each one closer in: a module, the board of every feature, one feature and the lines that justify its name, the goals each feature groups, with the proof of each, and what the code has that nobody has asked about yet.
featkpr's app, shot 27 Sep 2026 · BookStack's numbers: featkpr's records, exported 20 Oct 2026
Screens of featkpr's app run on sample data, so the numbers inside them are examples, not BookStack's. A screen marked "recorded from BookStack" replays featkpr's own records of BookStack's run of 26 Sep.
298 features in 13 modules, named from 343 routes read in the code. BookStack · featkpr's records, exported 20 Oct 2026; routes: the missed-items check of 26 Sep 2026
One module, every route in it #
The Map opens on every module at once (the home page shows it). Open one module and its routes line up: the features featkpr has named, the ones known only from the code, and the routes no feature names yet, grouped by the path they share.
Map/map/Exportssample data
- Every module as a tab with its feature count. Exports is open; Entities carries three features on the open pull request's path.
- Features known only from the code: named, with no scenario yet.
- Routes no feature names yet, grouped by the path they share. Each chip is one format; its number is the scenarios behind it.
Every feature, placed by how far it is proven #
The Features board puts each feature in the column its evidence has reached, from known only in the code to proven by a run. A feature moves right as tests are written and run. Filters live in the address, so a filtered board can be shared.
Features/featuressample data
- How far each feature is proven, left to right.
- Amber outline: features the open pull request changed. They need a person now.
- Flows drafted to this feature, waiting for review.
One feature, and why featkpr believes it exists #
A feature is never a guess: its name rests on lines of the product's own source, each cited with its file and line. The Feature screen opens on its verdict, then shows its route, its screen, its scenarios and the flows that end there.
Feature/f/…sample data
- The verdict first: scenarios waiting on a person, new with no test yet, covered.
- Its words: the route, the permission and the release note it rests on, each with its file and line.
- The route's real screen, as the crawl captured it.
- Its scenarios by what the route does, and the test files that cover them.
- The drafted flow that ends here.
One goal, and what must hold around it #
Each feature groups its goals. A goal is one change a person makes, with who may make it, what must be refused and what it leaves behind. The Goals screen lists every goal with its proof.
Goals/goalssample data
- The kind of goal: achieve, cease or query.
- Facts proven, of all the goal's facts.
- Links to other goals, and how many a run proved.
achieve37make or change somethingcease16delete itquery112see or read itavoidthe wrong person never changes it, worked out for every achieve and cease goal
BookStack at 1633b3ab in production: 165 goals, and 182 of their 829 facts proven so far, roles counted separately. Read 30 Sep 2026.
“Create a book”, fact by fact #
Every fact is either proven by a run or shown as not proven yet. A few, like webhook jobs, featkpr can't observe yet.
- the changea new book exists (proven by a run)
- by rolethe Admin: its test passed, but no run as the wrong person has proven it yet (its test passed, not proven yet)
- must refusea book that doesn't exist or is hidden (proven by a run)
- must refuseanyone who can't view books (not proven yet)
- only if33 more facts that hold only in some setups, such as mail to watchers or webhook calls (not proven yet)
Every fact of this goal, and how goals connect
- the changethe record every book, chapter and page shares is updated (proven by a run)
- leaves behindan audit row saying the book was created: seen in a run
- leaves behindwebhook jobs: featkpr can't observe them yet
- by rolethe Editor, and two roles featkpr created for its tests (proven by a run)
- by rolethe Viewer, Public and three more test roles (not proven yet)
- must refuseanyone without the permission to create books (proven by a run)
- must refuseinvalid input: the name, description, image, tags or template (not proven yet)
- throughthe web pages (proven by a run)
- throughthe API (its test passed, not proven yet)
5 of its 10 facts are proven, plus 33 that hold only in some setups, none proven yet. Roles are counted separately: 3 of 9. 12 tests cover it. Production, 30 Sep 2026.
How goals connect
- enablesone goal makes another possible: “Create a book” enables “Create a bookshelf (from book)”, since a book can be turned into a shelf only once it exists. Proven on 29 Sep 2026 by running one goal, then the other, on a fresh copy.
- disablesone goal stops another: once something is deleted, changing it is refused
- and more13 kinds in all, such as leads to, refines and conflicts with
Production holds 731 links between BookStack's goals, most still read from the code. On 29 Sep 2026, runs proved 27 of the 28 links that could be run; the one that failed was a real BookStack bug, which we reported: #6233.
What the code has that nobody has asked about #
Everything the code reader found is counted once: on the map, asked on a card, set aside, or still waiting for a look. The sheet puts modules against kinds of thing, so the gaps show as numbers, not as a feeling.
Discovery/discoverysample data
- One tally: found = on the map + asked + set aside + still waiting.
- A column per kind of thing the code holds.
- A cell: still waiting, of all found in that module and kind. It opens them with their files.
On BookStack, what featkpr missed is published step by step, with the reason for each miss. What featkpr missed on BookStack
The map is read at one commit, and it follows each app's release flow: The map follows BookStack's development branch, never a pull request's head; names carried across the move for less than a cent, shipped 28 Sep (part of "How your app ships, drawn and approved"). our plan of 1 Oct 2026 (roadmap)
See BookStack's map on a call #
A live walkthrough of these screens on BookStack, and what featkpr would need to read your product's code.




