featkpr
Private demo

Every app featkpr has read, and what it found in them.

Start from an app on the shelf, or go through the library another way: every feature featkpr named, every goal it keeps, every flow it drafted. Each one links to the others.

Ask for a private demoHalf an hour on BookStack, live. Tim replies by hand.

The apps #

BookStack's book permissions screen, as featkpr's crawl captured it GET /books/{slug}/permissions · crawl 25 Sep 2026

open-source wiki #

proven: 32 of 165 goals

  1. code read: done
  2. features named: done
  3. screens crawled: done
  4. flows drafted: done
  5. tests run: done
  6. wrong-user check: done
  • 438 routes and screens read from the codecode read
  • 298 features in 13 modulesfeatures named
  • 265 screens (1,194 captures of 245 paths)screens crawled
  • 149 flows ending at 89 featuresflows drafted
  • 311 tests passed, 0 failedtests run
  • 276 proven by the wrong-user check, 35 uncheckedwrong-user check

photo library #

flows drafted

  1. code read: done
  2. features named: done
  3. screens crawled: done
  4. flows drafted: done
  5. tests run: not run yet
  6. wrong-user check: not run yet

294 features in 43 modules · 161 screens (394 captures of 74 paths) · 154 goals, none proven yet

  • web42
  • Assets23
  • Authentication16
  • Albums12
  • People12
  • +38 modules

inventory management #

named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

240 features in 15 modules · no crawl yet · 314 goals, none proven yet

  • order40
  • frontend38
  • common29
  • plugin23
  • stock21
  • +10 modules

surveys #

named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

89 features in 3 modules · no crawl yet · 106 goals, none proven yet

  • web76
  • V3 Feedback Records8
  • responses5

named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

25 features in 7 modules · no crawl yet · no goals yet

  • Visit7
  • ShortUrl6
  • Tag4
  • Core2
  • Domain2
  • +2 modules

this product, on its own code #

named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

146 features in 4 modules · 45 goals

Python · Starlette with FastAPI · the second stack · not a library app: its records stay private

Weighed in our research, not read in production yet

uptime monitor #

  1. code read: started
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

code indexed

document manager #

  1. code read: started
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

code indexed

personal finance #

  1. code read: not run yet
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet

for owners

BookStackopen-source wiki #

6 of 6 steps · proven

  1. code read: done
  2. features named: done
  3. screens crawled: done
  4. flows drafted: done
  5. tests run: done
  6. wrong-user check: done
  1. code read438 routes and screens read from the codefeatkpr's records in production, read 20 Oct 2026
  2. features named298 features in 13 modulesfeatkpr's records in production, read 20 Oct 2026
  3. screens crawled265 screens (1,194 captures of 245 paths)featkpr's records in production, read 20 Oct 2026
  4. flows drafted149 flows ending at 89 featuresthe Flows board, read 20 Oct 2026
  5. tests run311 tests passed, 0 failedthe newest run, 20 Oct 2026, 03:18 UTC
  6. wrong-user check276 proven by the wrong-user check, 35 uncheckedwrong-user run 20 Oct 2026, 03:29 UTC
BookStack, GET /books/{slug}/permissions, as featkpr's crawl captured itGET /books/{slug}/permissions
BookStack, GET /settings/roles, as featkpr's crawl captured itGET /settings/roles
BookStack, GET /books/{slug}/page/{slug}/revisions, as featkpr's crawl captured itGET /books/{slug}/page/{slug}/revisions
BookStack as featkpr's crawl captured it, on the throwaway copy, 25 Sep 2026
server
PHP 8 · Laravel 12
client
vanilla TypeScript, Blade templates
licence
MIT
hosted
Codeberg, since April 2026

Why it is here

About the size of a real team's app, MIT, and it starts from one compose file. Its permission scenarios are written down in its own docs, and its release notes name each merge request, so a real change can be traced by hand.

Next

605 of 2,372 expected items missed when featkpr started again with no help (26 Sep 2026)

crawl at commit 0f5164ec, the head of pull request #6213 · latest run at 1633b3ab, BookStack's development branch, released as v26.09 the same day

BookStack: its map, report and news

Immichphoto library #

4 of 6 steps · flows drafted

  1. code read: done
  2. features named: done
  3. screens crawled: done
  4. flows drafted: done
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read335 routes and screens read from the codefeatkpr's records in production, read 20 Oct 2026
  2. features named294 features in 43 modulesfeatkpr's records in production, read 20 Oct 2026
  3. screens crawled161 screens (394 captures of 74 paths)featkpr's records in production, read 20 Oct 2026
  4. flows drafted60 flows drafted from the crawlfeatkpr's records in production, read 20 Oct 2026
  5. tests runno tests run yet
  6. wrong-user checknot run yet
  1. web42
  2. Assets23
  3. Authentication16
  4. Albums12
  5. People12
  6. Server12
  7. Users (admin)11
  8. Search10
  9. Maintenance (admin)9
  10. Shared links9

and 33 more modules with 138 features

the features featkpr named for Immich, by module, read from production, 20 Oct 2026
server
Node · NestJS
client
SvelteKit
licence
AGPL-3.0
hosted
GitHub

Why it is here

The cleanest inputs in the survey: an OpenAPI spec checked in CI, file-based routes, API and web tests in one Playwright config, and the most active maintainers. Added through Add an app on 1 Oct.

Next

Its mechanics page says what each of its goals does. Tests and the wrong-user check are not run yet.

featkpr's records in production, read 20 Oct 2026

Immich: what each of its goals does

InvenTreeinventory management #

2 of 6 steps · named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read722 routes and screens read from the codefeatkpr's records in production, read 20 Oct 2026
  2. features named240 features in 15 modulesfeatkpr's records in production, read 20 Oct 2026
  3. screens crawledno crawl yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet
  1. order40
  2. frontend38
  3. common29
  4. plugin23
  5. stock21
  6. part19
  7. build15
  8. inventree11
  9. users10
  10. scim8

and 5 more modules with 26 features

the features featkpr named for InvenTree, by module, read from production, 20 Oct 2026
server
Python · Django REST framework
client
React · Mantine
licence
MIT
hosted
GitHub

Why it is here

670 API operations in its spec, a Playwright suite to compare with, and 117 on/off settings, each with a name and a description: a feature list its owners already wrote. Added through Add an app on 1 Oct.

Next

A crawl of a running copy, then flows and tests. Not dated.

featkpr's records in production, read 20 Oct 2026

Formbrickssurveys #

2 of 6 steps · named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read295 routes and screens read from the codefeatkpr's records in production, read 20 Oct 2026
  2. features named89 features in 3 modulesfeatkpr's records in production, read 20 Oct 2026
  3. screens crawledno crawl yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet
  1. web76
  2. V3 Feedback Records8
  3. responses5
the features featkpr named for Formbricks, by module, read from production, 20 Oct 2026
server
Next.js
client
Next.js
licence
AGPL-3.0, with an enterprise folder
hosted
GitHub

Why it is here

The Next.js app of the three, with 48 Playwright specs and screens that only a licence key opens: the paid-tier gate many teams have. Added through Add an app on 1 Oct.

Next

A crawl of a running copy, then flows and tests. Not dated.

featkpr's records in production, read 20 Oct 2026

featkpr itselfthis product, on its own code #

2 of 6 steps · named

  1. code read: done
  2. features named: done
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read290 routes, commands and screens readfeatkpr's records in production, read 20 Oct 2026
  2. features named146 features in 4 modules · 45 goalsfeatkpr's records in production, read 20 Oct 2026
  3. screens crawledno crawl of its own app yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet
featkpr's own Home screen, one of the screens it will read
featkpr's own Home screen, one of the screens it will read
server
Python · Starlette with FastAPI
client
React 19 · TypeScript · Vite
hosted
GitHub

Why it is here

Chosen on 27 Sep as the third app: a second stack (Python and React), and the one app where every feature featkpr names can be checked with the people who wrote it. Since 28 Sep it reviews its own pull requests.

Next

  • featkpr runs its own goals on a test copy of itself · shipped 30 Sep: A disposable featkpr on the homelab, seeded with made-up data, signed in as the owner and as nobody, with a script per goal rendered from its command. featkpr's own goals now get runs and wrong-user flips, away from production.

read from production 20 Oct 2026 · first verdict on its own pull request #798: Pass, 0 goals

Uptime Kumauptime monitor #

0 of 6 steps · code indexed

  1. code read: started
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read8,475 symbols in 388 files, in 10 s · 0 of 113 routes readcommit b6adc19
  2. features namednot run yet
  3. screens crawlednot run yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet
388files read8,475symbols indexed0 of 113routes read
routes read: 0 of 113, waiting on the route reader for this stack
what the TypeScript indexer read: the code is there, the routes are not read yet
server
Node
client
Vue
licence
not checked yet

Why it is here

The first target for a Node route reader: small, popular and self-hosted.

Next

The Node route reader, which turns its 113 routes into rows.

our TypeScript indexer, commit b6adc19

Paperless-ngxdocument manager #

0 of 6 steps · code indexed

  1. code read: started
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code read405 of 405 files indexed, 18,867 symbols · routes not read yetwhile the readers were built
  2. features namednot run yet
  3. screens crawlednot run yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet
405files read18,867symbols indexednone yetroutes read
routes: waiting on the route reader for this stack
what the Python indexer read: the code is there, the routes are not read yet
server
Python · Django
client
Angular
licence
GPL-3.0
hosted
GitHub

Why it is here

A Django app to prove the Python indexer on, before the Python route reader exists.

Next

The Python route reader.

our Python indexer, run while the readers were built

Actual Budgetpersonal finance #

0 of 6 steps · for owners

  1. code read: not run yet
  2. features named: not run yet
  3. screens crawled: not run yet
  4. flows drafted: not run yet
  5. tests run: not run yet
  6. wrong-user check: not run yet
  1. code readnot run yet
  2. features namednot run yet
  3. screens crawlednot run yet
  4. flows draftednot run yet
  5. tests runnot run yet
  6. wrong-user checknot run yet

Nothing counted or run yet.

no picture until featkpr has something real to show
server
not checked yet
client
not checked yet
licence
not checked yet

Why it is here

An app a person who does not write code already has opinions about, to test whether a product owner can read featkpr's map without help.

Next

Not scheduled. Nothing run yet.

picked for the product-owner view

The shelf holds the 5 library apps production holds, each at the furthest of the six steps production has a count for, and featkpr's own product. Nothing on it is typed: every site ship reads the numbers from production again and stops if a page claims more than production holds. Open an app for its six steps with their dates, why it is here and what comes next. The picture is BookStack itself, as featkpr's crawl captured it.

The same library, four ways in #

A feature is a named part of an app, and it groups the goals kept on its routes. A goal is one thing a person gets done. A flow is how a person moves through the app, screen by screen, to one or more goals. Each app, with what featkpr holds for it at each level; a cell opens that level, filtered to the app.

app Featureswhat it does, named Goalswhat a person gets done Flowshow a person moves through
Immichflows drafted 294features in 43 modulesproduction, 20 Oct 2026 154goals from the code, none proven yetproduction, 20 Oct 2026 · not listed here yet 60flows drafted from the crawlproduction, 20 Oct 2026 · not listed here yet
InvenTreenamed 240features in 15 modulesproduction, 20 Oct 2026 314goals from the code, none proven yetproduction, 20 Oct 2026 · not listed here yet none yet: no crawl yet, so no flows
Formbricksnamed 89features in 3 modulesproduction, 20 Oct 2026 106goals from the code, none proven yetproduction, 20 Oct 2026 · not listed here yet none yet: no crawl yet, so no flows
Shlinknamed 25features in 7 modulesproduction, 20 Oct 2026 none yet: no goals derived for it none yet: no crawl yet, so no flows
featkpr itselfnamed 146features in 4 modulesproduction, 20 Oct 2026 · its records stay private 45goals from its own codeproduction, 20 Oct 2026 · not published here none yet: no crawl of featkpr's own app
The other 3

Uptime Kuma, Paperless-ngx and Actual Budget: weighed in our research, not read in production. Nothing in any dimension yet; open each on the shelf above for where it stands.

Follow one feature up through goals and flows #

A real thread from BookStack's records: the app, one feature, the goals kept on its routes, and the flows that end there. The links are by route; every stop opens its own page.

  1. 1 · the app

    BookStack

    open-source wiki. Its code read, its screens crawled, its features named.

  2. 2 · a feature, in Activity

    View audit log of system activity

    2 screens found · 4 tests written, 4 proven by the wrong-user check.

  3. 3 · part of 2 goals, linked by route
  4. 4 · 2 flows end on it
      1. /
      2. /favourites

      “View the list of items I've marked as favourites.”

      this flow · waiting on a person to keep or drop it
      1. /
      2. /settings
      3. /settings/{category}
      4. /settings/audit

      “Starting from the homepage, navigate through settings to view the audit log.”

      this flow · waiting on a person to keep or drop it

On the Flows board this feature is one goal of its flows; in the goal records it is part of 2. The two counts of goals differ for this reason, and both are true.

Ask for a private demoFollow any feature like this on the call, on BookStack.

How an app joins #

Five stops, the same for every app. Below each stop is what it produced for BookStack.

  1. Settings that describe the app #

    How to check it out, start it on a throwaway copy and seed one user per role. Since 30 Sep you add the app yourself, as one flow: paste the address, give one token from a page that opens already filled in, then First read, Answers and Go. The screens below are the first design of 28 Sep; the flow as released differs.

    written for each app · a few files

    Design of the Add an app screen: a repository URL field holding codeberg.org/bookstack/bookstack, an amber Add BookStack button, and a short route reading codeberg.org, Forgejo · Codeberg, public, no credential.
    The first design, 28 Sep: paste the address; featkpr names the platform with one anonymous call.
    Design of the Access row for featkpr's private repository: what featkpr found on the left, and on the right an amber button to open GitHub's token page already filled in, a note to pick the repository, and a field to paste the token.
    The first design, 28 Sep: one token, from a page that opens already filled in.
    Design of the setup screen for BookStack: step tabs across the top, the first map with six drafted components and a row of stations on the left, the setup list of seven rows on the right at 3 of 7, and under the map what featkpr read: PHP and Laravel 12 with its evidence files.
    The first design, 28 Sep: the setup list beside the first map, BookStack at row 3 of 7.

    Starting the app on a throwaway copy is not in the flow yet, so it is still a folder we write per app: targets/bookstack/ product.toml ae/checkout.sh ae/start.sh ae/routes.sh owners.toml glossary.toml

    Shlink's folder has product.toml, owners and a glossary, and no start script yet: that is why its column stops at two steps.

  2. Read the code #

    The app's own route table, each route with the file and line it comes from. This is the only part that depends on the stack.

    written for each app · no model call

    GET /books/{bookSlug}/permissions
      module   Permissions
      handler  PermissionsController@showForBook
      quote    Route::get('/books/{bookSlug}/permissions',
                 [PermissionsController::class, 'showForBook']);
      where    routes/web.php, line 74, commit 0f5164ec

    343 of 359 routes read for BookStack; the audit names the 16 it missed.

  3. Above the line, written for each app.Below it, the same code for every app: a new app adds no new stop.
  4. Name the features #

    A model groups routes into features a person would recognise, module by module. Most of the model spend is here; drafting goals later costs cents.

    the same for every app · $0.99 for BookStack, 22 Sep

    Features: one module, each feature by how far it got
    Features: one module, each feature by how far it got

    298 features in 13 modules (20 Oct 2026).

  5. Crawl, then draft flows #

    A throwaway copy is walked, signed in as the admin today, its create forms are sent, and each goal gets the flow a person takes to it, screen by screen.

    the same for every app · model calls only to draft the goals

    a drafted flow: its real screens, left to right
    a drafted flow: its real screens, left to right

    167 screens as Admin (25 Sep 2026) · 149 flows ending at 89 features (20 Oct 2026).

  6. Test, check, and count what was missed #

    Tests are written per route and role and run. Each is sent again as the wrong user, who should get the opposite answer, and must then fail. Then featkpr starts again with no help, and each step is compared with a key (for routes, the list the reader itself uses).

    the same for every app · no model call for the run

    Runs, in featkpr, for BookStack: the run of 26 Sep, 11:17 UTC, earlier the same day on the same commit
    Runs, in featkpr, for BookStack: the run of 26 Sep, 11:17 UTC, earlier the same day on the same commit

    276 of 311 proven by the wrong-user check (20 Oct 2026, 03:29 UTC) · 605 of 2,372 items missed (26 Sep 2026).

What featkpr can read today #

The pipeline is the same for every app; the reader is not. Every reader featkpr has, from production's records: which app each one read and how many routes, the readers built but not run on a library app yet, and the common stacks with no reader.

stackroutes readfeatures namedcrawledtests runwhat the reader reads, and where it stands
Read in production 10
Python · Djangoread on InvenTree (681 routes) the URLconf from ROOT_URLCONF through every include, DRF views and routers
PHP · Laravelread on BookStack (438 routes) the route table, the Blade templates, the language strings and the permission checks
Any stack · an OpenAPI specread on Immich (276 routes) and Formbricks (13 routes) the app's own OpenAPI 3 or Swagger 2 files
TypeScript · Next.jsread on Formbricks (282 routes) App Router and Pages Router file routes, the middleware matcher
TypeScript · TanStack Routerread on featkpr itself (127 routes) the route files, their gates and the API calls each screen makes
Python · click CLIread on featkpr itself (91 routes) the leaf commands
Python · FastAPI and Starletteread on Immich (3 routes) and featkpr itself (72 routes) the routes and their declared gates
TypeScript · SvelteKitread on Immich (56 routes) the src/routes tree: pages and server routes
TypeScript · React Routerread on InvenTree (41 routes) route trees in JSX, router objects and v7 routes files
PHP · Mezzioread on Shlink (28 routes) the action and config routes
Reader built, no app in production read with it yet 3
Any stack · the shipped frontend bundlein the code; no library app on this stack yet path literals in the built bundle, or its source mapsHave an app on it? Ask for a private demo
Python · Flaskin the code; no library app on this stack yet apps and blueprints, class views and Flask-RESTful resourcesHave an app on it? Ask for a private demo
TypeScript · Honoin the code; no library app on this stack yet the apps and their mounted children, read as syntaxHave an app on it? Ask for a private demo
On the plan 1
Any of these, in your own CIplanned for your app the same readers, run where your code already is, so it never leaves youThe reader in your own CI, planned, not dated
No reader yet 7
C and C++ · desktopan idea: Blender, LibreOffice raised as an idea: products far bigger than BookStack, and not web apps; nothing read yet Examples from much larger products: Blender, LibreOffice, an idea, not decided
Ruby on Railscounted in our research: Mastodon, Discourse, OpenProject and Redmine No reader yet. Ask for this stack
Gocounted in our research: Gitea, Vikunja, Grafana and Mattermost No reader yet. Ask for this stack
Java · Spring and Quarkuscounted in our research: Appsmith and Keycloak No reader yet. Ask for this stack
PHP · Symfonycounted in our research: Kimai No reader yet. Ask for this stack
Elixir · Phoenixcounted in our research: Plausible No reader yet. Ask for this stack
.NET · ASP.NET Coreno app counted on it yet No reader yet. Ask for this stack

Read from production 20 Oct 2026: which reader read each library app, and the routes and screens it read there at the app's newest commit. A cell is filled when an app read with that reader reached that step. A reader in the code that no library app was read with is listed as built, never as read. The stacks with no reader are the common ones our research met while counting apps (below); asking for one is how it gets a plan item.

What featkpr writes #

  1. pytest shipped 26 Sep calling the app's routes directly, per route and role
  2. Playwright, through a browser planned, not dated the flows a person keeps
  3. TypeScript planned, not dated beside pytest
  4. Selenium and Cucumber planned, not dated for teams whose suites already run on them

Why these apps #

Before any app was mapped, our research counted each candidate the same way (17 Sep): 8 were set aside and 2 kept as alternates. On 28 Sep we counted 43 more open-source apps on the same rules, the 6 still on the list among them, not to choose them but to see what holds at scale.

102050100200500 01310301003001,000 screens in the source (log scale) → end-to-end spec files ↑ median, 24.6 per 100 screens OpenProject: 406 screens, 787 end-to-end spec files (counted 28 Sep) OpenProject Mastodon: 214 screens, 107 end-to-end spec files (counted 28 Sep) Weblate: 120 screens, 1 end-to-end spec files (counted 28 Sep) Discourse: 166 screens, 295 end-to-end spec files (counted 28 Sep) Taiga: 72 screens, 47 end-to-end spec files (counted 28 Sep) Outline: 32 screens, 0 end-to-end spec files (counted 28 Sep) Gitea: 111 screens, 30 end-to-end spec files (counted 28 Sep) Wagtail: 165 screens, 8 end-to-end spec files (counted 28 Sep) Directus: 73 screens, 99 end-to-end spec files (counted 28 Sep) Appsmith: 21 screens, 667 end-to-end spec files (counted 28 Sep) Appsmith n8n: 61 screens, 284 end-to-end spec files (counted 28 Sep) n8n Grafana: 90 screens, 213 end-to-end spec files (counted 28 Sep) Hoppscotch: 32 screens, 0 end-to-end spec files (counted 28 Sep) Akaunting: 121 screens, 0 end-to-end spec files (counted 28 Sep) Kimai: 48 screens, 0 end-to-end spec files (counted 28 Sep) Mealie: 66 screens, 2 end-to-end spec files (counted 28 Sep) Vikunja: 59 screens, 72 end-to-end spec files (counted 28 Sep) Snipe-IT: 154 screens, 0 end-to-end spec files (counted 28 Sep) Snipe-IT Redmine: 223 screens, 28 end-to-end spec files (counted 28 Sep) FreshRSS: 63 screens, 0 end-to-end spec files (counted 28 Sep) Kanboard: 102 screens, 0 end-to-end spec files (counted 28 Sep) Umami: 59 screens, 8 end-to-end spec files (counted 28 Sep) Supabase Studio: 190 screens, 29 end-to-end spec files (counted 28 Sep) NocoDB: 66 screens, 0 end-to-end spec files (counted 28 Sep) Keycloak: 94 screens, 81 end-to-end spec files (counted 28 Sep) Uptime Kuma: 15 screens, 7 end-to-end spec files (counted 28 Sep) Paperless-ngx: 21 screens, 5 end-to-end spec files (counted 28 Sep) PostHog: 169 screens, 43 end-to-end spec files (counted 28 Sep) GLPI: 315 screens, 107 end-to-end spec files (counted 28 Sep) GLPI Linkwarden: 36 screens, 1 end-to-end spec files (counted 28 Sep) Cal.diy: 78 screens, 53 end-to-end spec files (T2, 17 Sep) Medusa: 186 screens, 0 end-to-end spec files (T2, 17 Sep) Twenty: 186 screens, 9 end-to-end spec files (T2, 17 Sep) Plane: 72 screens, 0 end-to-end spec files (T2, 17 Sep) Baserow: 54 screens, 37 end-to-end spec files (T2, 17 Sep) BookStack: 93 screens, 0 end-to-end spec files (T2, 17 Sep) BookStack InvenTree: 87 screens, 26 end-to-end spec files (T2, 17 Sep) InvenTree Immich: 56 screens, 49 end-to-end spec files (T2, 17 Sep) Immich Formbricks: 76 screens, 48 end-to-end spec files (T2, 17 Sep) Formbricks Documenso: 115 screens, 132 end-to-end spec files (T2, 17 Sep) Documenso 102050100200500 01310301003001,000 screens in the source (log scale) → end-to-end spec files ↑ median, 24.6 per 100 screens OpenProject: 406 screens, 787 end-to-end spec files (counted 28 Sep) OpenProject Mastodon: 214 screens, 107 end-to-end spec files (counted 28 Sep) Weblate: 120 screens, 1 end-to-end spec files (counted 28 Sep) Discourse: 166 screens, 295 end-to-end spec files (counted 28 Sep) Taiga: 72 screens, 47 end-to-end spec files (counted 28 Sep) Outline: 32 screens, 0 end-to-end spec files (counted 28 Sep) Gitea: 111 screens, 30 end-to-end spec files (counted 28 Sep) Wagtail: 165 screens, 8 end-to-end spec files (counted 28 Sep) Directus: 73 screens, 99 end-to-end spec files (counted 28 Sep) Appsmith: 21 screens, 667 end-to-end spec files (counted 28 Sep) Appsmith n8n: 61 screens, 284 end-to-end spec files (counted 28 Sep) Grafana: 90 screens, 213 end-to-end spec files (counted 28 Sep) Hoppscotch: 32 screens, 0 end-to-end spec files (counted 28 Sep) Akaunting: 121 screens, 0 end-to-end spec files (counted 28 Sep) Kimai: 48 screens, 0 end-to-end spec files (counted 28 Sep) Mealie: 66 screens, 2 end-to-end spec files (counted 28 Sep) Vikunja: 59 screens, 72 end-to-end spec files (counted 28 Sep) Snipe-IT: 154 screens, 0 end-to-end spec files (counted 28 Sep) Redmine: 223 screens, 28 end-to-end spec files (counted 28 Sep) FreshRSS: 63 screens, 0 end-to-end spec files (counted 28 Sep) Kanboard: 102 screens, 0 end-to-end spec files (counted 28 Sep) Umami: 59 screens, 8 end-to-end spec files (counted 28 Sep) Supabase Studio: 190 screens, 29 end-to-end spec files (counted 28 Sep) NocoDB: 66 screens, 0 end-to-end spec files (counted 28 Sep) Keycloak: 94 screens, 81 end-to-end spec files (counted 28 Sep) Uptime Kuma: 15 screens, 7 end-to-end spec files (counted 28 Sep) Paperless-ngx: 21 screens, 5 end-to-end spec files (counted 28 Sep) PostHog: 169 screens, 43 end-to-end spec files (counted 28 Sep) GLPI: 315 screens, 107 end-to-end spec files (counted 28 Sep) Linkwarden: 36 screens, 1 end-to-end spec files (counted 28 Sep) Cal.diy: 78 screens, 53 end-to-end spec files (T2, 17 Sep) Medusa: 186 screens, 0 end-to-end spec files (T2, 17 Sep) Twenty: 186 screens, 9 end-to-end spec files (T2, 17 Sep) Plane: 72 screens, 0 end-to-end spec files (T2, 17 Sep) Baserow: 54 screens, 37 end-to-end spec files (T2, 17 Sep) BookStack: 93 screens, 0 end-to-end spec files (T2, 17 Sep) BookStack InvenTree: 87 screens, 26 end-to-end spec files (T2, 17 Sep) InvenTree Immich: 56 screens, 49 end-to-end spec files (T2, 17 Sep) Immich Formbricks: 76 screens, 48 end-to-end spec files (T2, 17 Sep) Formbricks Documenso: 115 screens, 132 end-to-end spec files (T2, 17 Sep) Documenso
chosen kept as an alternate set aside counted for scale, not chosen the median, 24.6 spec files per 100 screens

our research on which apps to map first (report T2, counted 17 Sep 2026 from each repository's files and committed specs). The 43 counted for scale: tools/library_count.py, T2's protocol made mechanical; each repository shallow-cloned at its default branch on 28 Sep 2026. An app with no end-to-end suite sits on the floor, at 0; an app with no screen count is only in the table.

What the counts show at scale #

Of the 57 apps counted, 14 have no end-to-end suite in their repository, and 19 ship an API spec with their code. Of the 40 with both counts, 20 have fewer than one end-to-end spec file for every four screens (the median is 24.6 per 100 screens), and 8 have more spec files than screens. In 32 of those 40, the end-to-end suite has fewer spec files than the app has screens.

The whole count as open data: every app, the rule behind each number, the method, and CSV and JSON downloads (CC BY 4.0)

A licence that lets us publishthe map and the tests are published; an open-source licence (or source-available) is the floor
Enough screensa first app about the size of a real team's; the next ones two to three times that, not six
An API spec in the repoa committed spec makes the count exact and gives the reader a second source
An end-to-end suitetests the maintainers wrote are the answer key our drafted tests are compared with
Named flags or settingsa list of switches with names is a feature list the owners already wrote
Maintainers who answerfindings go back to them, so a live tracker matters
Every app our research counted: 57, with its counts and the reason
applicencescreensAPI opse2e specsnamed switchesthe reason
The first app
BookStackwiki · PHP · Laravel MIT 93 77 0 44 env flags, eighty-nine permissions the first app: MIT, one compose file, written permission scenarios; 1,598 PHPUnit tests instead of an end-to-end suite
The next three
InvenTreeinventory · Django · React MIT 87 670 26 117 named on/off settings the biggest API of the three, a Playwright suite, and a settings list with names and descriptionsRecounted 28 Sep at c2b7f71f2: the same, 87 screens, 26 e2e specs
Immichphotos · NestJS · SvelteKit AGPL-3.0 56 276 49 16 feature switches a spec checked in CI, file routes, the most active maintainersRecounted 28 Sep at aa0233784: the same, 56 screens, 276 API ops, 49 e2e specs
Formbrickssurveys · Next.js AGPL-3.0 + ee 76 72 48 licence-key gates the Next.js app, with paid-tier screens behind a licence keyRecounted 28 Sep at 43db6ad83: 78 screens (T2: 76) · 49 e2e specs (T2: 48); 72 API ops the same
Kept as alternates
Documensodocument signing · React Router 7 AGPL-3.0 + ee 115 not counted 132 1 flag kept as an alternate: 132 end-to-end specs to compare againstRecounted 28 Sep at a1d4bec14: 112 screens (T2: 115) · 135 e2e specs (T2: 132)
Chatwootcustomer support · Rails · Vue MIT + enterprise not counted 154 3 70 named flags kept as an alternate: 70 flags with display names
Set aside
Cal.diyscheduling · Next.js MIT 78 121 53 none rarely maintained; its README says personal, non-production use
Medusacommerce · Node · React MIT + ee 186 486 0 9 flag files too big for the next step, and no end-to-end suite
TwentyCRM · NestJS · React AGPL-3.0 + ee 186 not counted 9 15 flags its API is generated per object in GraphQL, so it cannot be counted like the others
Planeproject tracking · Django · Next.js AGPL-3.0 72 not counted 0 1 flag file no end-to-end suite to compare with
Baserowno-code database · Django · Nuxt MIT + premium 54 not counted 37 licence tiers hosted on GitLab, and its tiers split the code
Zulipteam chat · Django · Tornado Apache-2.0 not counted not counted 20 9 flag files few distinct screens
Syliuscommerce · PHP MIT not counted not counted 0 none no end-to-end suite, and PHP is already covered by BookStack
Firefly IIIpersonal finance · PHP AGPL-3.0 not counted not counted 0 none no end-to-end suite, and PHP is already covered by BookStack
Counted for scale, not chosen: 43, by the stack of their serverCounted to see the pattern, not to choose: T2's rules, at the commit shown under each reason.
JavaScript and TypeScript 14
Directusdata platform · Node · Vue MSCL-1.0 (source-available) 73 136 99 not counted counted for scalegithub.com/directus/directus at 1694b1904 (25 Sep), counted 28 Sep
Ghostpublishing · Node · Ember/React MIT no count no spec 101 not counted no screen count: the admin is moving from an Ember router to React routersgithub.com/TryGhost/Ghost at 7c3067680 (28 Sep), counted 28 Sep
HoppscotchAPI client · Vue · NestJS MIT 32 no spec 0 2 on/off keys in .env.example counted for scalegithub.com/hoppscotch/hoppscotch at a9ffa29ce (23 Sep), counted 28 Sep
Linkwardenbookmarks · Next.js AGPL-3.0 36 no spec 1 not counted counted for scalegithub.com/linkwarden/linkwarden at 952ac4540 (9 Sep), counted 28 Sep
n8nworkflow automation · Node · Vue Sustainable Use (fair-code) + ee 61 32 284 not counted routes that render a view in the Vue routergithub.com/n8n-io/n8n at 41dbfd987 (28 Sep), counted 28 Sep
NocoDBno-code database · Node · Nuxt Sustainable Use (fair-code) 66 278 0 not counted counted for scalegithub.com/nocodb/nocodb at 8cfa45dcb (28 Sep), counted 28 Sep
Outlineteam wiki · Node · React BSL-1.1 32 no spec 0 6 on/off keys in .env.sample on the list since 17 Sepgithub.com/outline/outline at 179d7dd7b (27 Sep), counted 28 Sep
Rocket.Chatteam chat · Meteor · React MIT + ee no count no spec 280 not counted no screen count: routes are registered across the client codegithub.com/RocketChat/Rocket.Chat at b149e10ee (28 Sep), counted 28 Sep
Saleor dashboardcommerce admin · React (GraphQL API) BSD no count no spec 40 not counted no screen count: routes are built from URL helpers in codegithub.com/saleor/saleor-dashboard at 8d678ea21 (28 Sep), counted 28 Sep
Strapiheadless CMS · Node · React MIT + ee no count no spec 100 not counted no screen count: the admin routes are declared across each packagegithub.com/strapi/strapi at bba9685b9 (28 Sep), counted 28 Sep
Supabase Studiodatabase dashboard · Next.js Apache-2.0 190 170 29 not counted counted for scalegithub.com/supabase/supabase at 8e2071247 (28 Sep), counted 28 Sep
Umamiweb analytics · Next.js MIT 59 no spec 8 not counted counted for scalegithub.com/umami-software/umami at ec0ff5038 (16 Sep), counted 28 Sep
Uptime Kumauptime monitor · Node · Vue MIT 15 no spec 7 not counted already on the plan (Node and Django readers)github.com/louislam/uptime-kuma at b6adc19d0 (23 Sep), counted 28 Sep
Wiki.jswiki · Node · Vue AGPL-3.0 no count no spec 1 not counted no screen count: pages are server templates plus Vue apps, not one rulegithub.com/requarks/wiki at 712a3a5bb (22 Sep), counted 28 Sep
Python 8
ERPNextERP · Frappe (Python) GPL-3.0 no count no spec 0 not counted no screen count: screens are generated from DocType recordsgithub.com/frappe/erpnext at 89f490f72 (28 Sep), counted 28 Sep
Mealierecipes · FastAPI · Nuxt AGPL-3.0 66 no spec 2 not counted counted for scalegithub.com/mealie-recipes/mealie at 86aec702a (28 Sep), counted 28 Sep
Odoobusiness suite · Python · OWL LGPL-3.0 no count no spec 525 not counted no screen count: screens are XML view records, not page filesgithub.com/odoo/odoo at a240a91eb (28 Sep), counted 28 Sep
Paperless-ngxdocuments · Django · Angular GPL-3.0 21 no spec 5 not counted already on the plan (Node and Django readers)github.com/paperless-ngx/paperless-ngx at 88000aab4 (28 Sep), counted 28 Sep
PostHogproduct analytics · Django · React MIT + ee 169 no spec 43 3 on/off keys in .env.example the scene routesgithub.com/PostHog/posthog at cb4522375 (28 Sep), counted 28 Sep
Taigaagile boards · Django · AngularJS AGPL-3.0 front · MPL-2.0 back 72 no spec 47 not counted on the list since 17 Sepgithub.com/taigaio/taiga-front at d2da06116 (4 Sep), counted 28 Sep
WagtailCMS · Django BSD 165 no spec 8 not counted counted for scalegithub.com/wagtail/wagtail at e57ccdbc0 (25 Sep), counted 28 Sep
Weblatetranslation · Django GPL-3.0 120 202 1 not counted on the list since 17 Sepgithub.com/WeblateOrg/weblate at 6ff77533c (27 Sep), counted 28 Sep
PHP 7
Akauntingaccounting · Laravel BSL-1.1 121 no spec 0 4 on/off keys in .env.example counted for scalegithub.com/akaunting/akaunting at 0c7792b2e (27 Sep), counted 28 Sep
FreshRSSfeed reader · PHP AGPL-3.0 63 no spec 0 not counted counted for scalegithub.com/FreshRSS/FreshRSS at a8e5e6300 (28 Sep), counted 28 Sep
GLPIIT service desk · PHP · Twig GPL-3.0 315 no spec 107 not counted one PHP file per page in front/github.com/glpi-project/glpi at af37be7a7 (28 Sep), counted 28 Sep
Kanboardkanban · PHP MIT 102 no spec 0 not counted counted for scalegithub.com/kanboard/kanboard at cf53b5459 (11 Sep), counted 28 Sep
Kimaitime tracking · Symfony · Twig AGPL-3.0 48 no spec 0 not counted counted for scalegithub.com/kimai/kimai at 8528bb174 (27 Sep), counted 28 Sep
Nextcloud serverfile sync and share · PHP · Vue AGPL-3.0 no count 301 102 not counted no screen count: pages are PHP templates and Vue views in each bundled app, with no one rule for bothgithub.com/nextcloud/server at c41a9138d (28 Sep), counted 28 Sep
Snipe-ITasset management · Laravel AGPL-3.0 154 no spec 0 29 on/off keys in .env.example counted for scalegithub.com/grokability/snipe-it at d5bf95c02 (26 Sep), counted 28 Sep
Ruby on Rails 5
Discourseforum · Rails · Ember GPL-2.0 166 no spec 295 not counted on the list since 17 Sep; Ember route files of the core app; the bundled plugins are not countedgithub.com/discourse/discourse at 3b6713ef7 (28 Sep), counted 28 Sep
Mastodonsocial network · Rails · React AGPL-3.0 214 no spec 107 2 on/off keys in .env.production.sample on the list since 17 Sepgithub.com/mastodon/mastodon at 35c345010 (28 Sep), counted 28 Sep
OpenProjectproject management · Rails · Angular GPL-3.0 406 331 787 not counted on the list since 17 Sep; server-rendered pages only; the Angular screens are not countedgithub.com/opf/openproject at c0146dbdd (28 Sep), counted 28 Sep
Redmineproject tracking · Rails GPL-2.0+ 223 no spec 28 not counted counted for scalegithub.com/redmine/redmine at c9008f4ce (28 Sep), counted 28 Sep
Zammadhelpdesk · Rails · Vue AGPL-3.0 no count no spec 286 not counted no screen count: two front ends (CoffeeScript and Vue) with different routersgithub.com/zammad/zammad at 619ef87bb (28 Sep), counted 28 Sep
Go 4
Giteacode hosting · Go templates MIT 111 537 30 not counted counted for scalegithub.com/go-gitea/gitea at fba8d7eac (28 Sep), counted 28 Sep
Grafanadashboards · Go · React AGPL-3.0 90 314 213 not counted counted for scalegithub.com/grafana/grafana at 5f4490098 (28 Sep), counted 28 Sep
Mattermostteam chat · Go · React Apache-2.0 + ee no count 605 996 not counted no screen count: routes are declared across the React code, not one router filegithub.com/mattermost/mattermost at 05553d083 (28 Sep), counted 28 Sep
Vikunjatasks · Go · Vue AGPL-3.0 59 172 72 not counted counted for scalegithub.com/go-vikunja/vikunja at 18f3572ed (28 Sep), counted 28 Sep
Java 2
Appsmithinternal-tool builder · Java · React Apache-2.0 21 no spec 667 1 on/off keys in .env.example counted for scalegithub.com/appsmithorg/appsmith at c7e65f8f8 (28 Sep), counted 28 Sep
Keycloakidentity and access · Java · React Apache-2.0 94 no spec 81 not counted the admin consolegithub.com/keycloak/keycloak at 9f8eb2d23 (28 Sep), counted 28 Sep
Clojure 3
Metabaseanalytics · Clojure · React AGPL-3.0 + ee no count 637 427 3 on/off keys in .env.example no screen count: routes are spread over more than 30 route files, with redirects and modalsgithub.com/metabase/metabase at 1a0ff4340 (28 Sep), counted 28 Sep
Penpotdesign tool · Clojure MPL-2.0 no count no spec 65 not counted no screen count: routes are data in ClojureScript, not page filesgithub.com/penpot/penpot at f9b8f1ba7 (28 Sep), counted 28 Sep
Plausibleweb analytics · Elixir · React AGPL-3.0 no count no spec 12 not counted no screen count: the Phoenix router mixes pages, API, dev and test routesgithub.com/plausible/analytics at ee3a27bb3 (28 Sep), counted 28 Sep

No screen count, so only in the table (17): Chatwoot · Zulip · Sylius · Firefly III · Mattermost · Rocket.Chat · Nextcloud server · Odoo · ERPNext · Saleor dashboard · Ghost · Strapi · Metabase · Penpot · Wiki.js · Plausible · Zammad. Their pages are declared in code or generated from records, so there is no page file to count; T2's rule was the same for Chatwoot and Zulip.

Next in the library #

  1. featkpr runs its own goals on a test copy of itselfshipped 30 Sep: A disposable featkpr on the homelab, seeded with made-up data, signed in as the owner and as nobody, with a script per goal rendered from its command. featkpr's own goals now get runs and wrong-user flips, away from production.
  2. Featkpr's own features named in production: 146, with 45 goalsshipped 30 Sep: part of "featkpr maps its own code: its parts, and the goals a change can alter"
  3. Node and Django readerslater, no week yet: Django, Hono, React Router and Next.js readers shipped on 30 Sep and 1 Oct; Uptime Kuma and Paperless-ngx are not read yet

The order and the weeks are on the roadmap, with the long-term idea of a public library of every open-source app's features on its ideas board. Weeks ahead are estimates and move.

Want your app in the library? #

Want an open-source app mapped? Name it in the demo form. We read each request and write back; the walkthrough is on BookStack.

Ask for a private demo

↑ ↓ to move, Enter to open, Esc to close