Skip to content

Metrics

Every number on this page is zero or absent today. That is the point of writing it down now. Demostatics has no users, no revenue, nothing deployed and no analytics, so the standard startup dashboard — MRR, DAU, churn, CAC — measures nothing and will keep measuring nothing for months. What this page defines instead is a set of leading indicators that move month to month before any customer exists, and that an incubator reviewer can check without taking anything on trust.

It is the companion to the report template, which is the format each report takes, and to the August 2026 baseline, which is the first report. This page is the measuring instrument; those two are the readings.

Everything in the Baseline today columns below was measured on 2026-08-02 by running the command in the Source column against the working copies of the five repositories. No figure here is an estimate unless the word ESTIMATE appears next to it, and the two figures that could not be measured say so instead of guessing.

This is the most important group on the page and the one that makes the company legible to an outsider. Demostatics is not, today, a product company with a slow start; it is a data company that has not begun accumulating its asset. Every other group measures work. This group measures worth.

The standout metric is days of history accumulated. It starts at zero, it increases by one every single day once collection starts whether or not a line of code ships that day, and it cannot be bought back later. A quantitative buyer’s first question about a data set is how far back it goes, and there is no answer to that question other than having waited.

MetricDefinitionBaseline todaySource of the numberWhy it matters
Days of history accumulatedWhole days between the earliest object in the raw archive and today0Oldest key prefix in the archive storeIncreases daily with no engineering effort; the only metric here that cannot be recovered by working harder later
Days of history, best-covered sourceSame, for the single source with the longest unbroken record0Oldest key prefix under one source tagA buyer evaluates the deepest series, not the average
Sources liveDistinct sources that wrote to the archive on their intended cadence in the last 24 hours0 of 10 candidatesCount of distinct source tags with a fetch in the last 24hBreadth is the second question after depth; the ten candidates are named on The Minimum Viable Data Set
Cumulative observations collectedTotal rows in the observations table, never decreasing0 — no table and no writer existSELECT count(*) once the table existsThe raw size of the asset; the number that goes in a data-room summary
Raw archive sizeBytes stored in the archive, all sources, all time0 Bdu -sb or the bucket’s own size metricProxy for asset scale, and the input to the storage line of the cost model
Collection uptimeScheduled fetches that succeeded, as a percentage of scheduled fetches, last 30 daysNot measurable — nothing is scheduledFetch logA gappy archive is worth much less than a complete one, and gaps are also unrecoverable
Plausibility pass rateObservations passing range, monotonicity and unit checks, as a percentage of observations ingestedNot measurable — no gates and no observationsQuality-gate countersDistinguishes a real data set from a pile of files; needed before anyone will pay for it

The site already has a status vocabulary — Shipped / Partial / Planned / Not built — applied to every capability on the component pages, the roadmap and Where Things Stand. Rather than invent a second scheme, the metric is a count of those labels. It is grep-able, it is unambiguous, and it moves the moment something genuinely ships. It undercounts slightly, by design: a cell that mixes two statuses in a sentence — as the Reports row on the web component page does, where the page is Shipped and the producer behind it is Not built — is not counted at all. The command is the definition, and it is the same command every month.

MetricDefinitionBaseline todaySource of the numberWhy it matters
Capabilities ShippedTable cells whose entire value is Shipped, across the docs site excluding reports/88grep over src/content/docs, command belowThe honest surface area of working software
Capabilities PartialSame, for Partial12Same commandWork in flight; a rising number with a flat Shipped number is a warning
Capabilities PlannedSame, for Planned61Same commandThe size of the promise still outstanding
Capabilities Not builtSame, for Not built36Same commandThe gap between the pitch and the tree
Roadmap phases completePhases on Roadmap marked complete0 of 11 — one Partial (Phase 0), ten PlannedStatus column of the phase tableThe plan’s own unit of progress
Gap register, openEntries on Gap Register not marked closed86 open, 0 closedSummary table of the registerThe list of things that get more expensive with time
Gap register by severityOpen entries split Existential / High / Medium / Low5 / 42 / 35 / 4Same tableSeverity mix matters more than the total; closing four Low items is not progress
Gaps due Now still openRegister entries whose When is Now17Same tableThese are the ones whose cost is rising today
Automated tests, webTests executed by the Laravel suite211 passing, 922 assertions, 2.38 s./vendor/bin/pestThe only suite on the platform that is actually run and green
Automated tests, desktop#[test] plus #[tokio::test] functions in the Rust workspace121 (115 + 6), across 18 crates, bin/ and examples/grep over crates/ bin/ examples/Counted statically, not executed — see the caution below
Automated tests, mobileJest tests executed102 passing in 6 suites, 0.60 snpx jestSmall but real and green
Repos with CIRepositories with a working CI configuration1 of 5 — only demostatics-pc_application.github/workflows in each repoFour repositories have no automated check of any kind on any commit
CI pass rate, desktopSuccessful runs of ci.yml, last 204 of 20 green; the latest run on main is redgh run list --workflow=ci.ymlA red default branch is a stronger signal than a test count
API endpointsRoutes registered under api/45 (of 105 routes total)php artisan route:list --path=apiThe contract surface other clients depend on
Schema sizeMigrations / Eloquent models / controller files in demostatics-web22 / 23 / 36ls and find, commands belowCheap proxy for how much domain the display tier already models
Tracked lines of codeTracked non-vendor, non-lockfile, non-binary lines across all five repos53,853 — web 17,378, desktop 16,747, mobile 10,098, docs 9,628, backend 2git ls-files piped to wc -lContext for the test and CI numbers; not a goal in itself
Commits, all reposgit rev-list --count --all summed114 — web 44, desktop 57, mobile 5, docs 7, backend 1git rev-listActivity, not achievement; useful only alongside the rows above
Docs pagesMarkdown files under src/content/docs41 at time of measurement; this page makes 42find … -name '*.md' | wc -lThe documentation is currently the most complete artifact the company has
Environments deployedReachable environments serving the real application0Direct HTTP check, belowThe gate in front of every metric that needs a running system

Licensing is the longest-lead-time item in the company and it does not have a percentage. There is no such thing as 40% licensed. It is a ladder, and the only honest report is which rung the company is standing on.

StageMeaningReached
1. Not startedNo counsel, no jurisdiction, no entityCurrent position
2. Counsel engagedA qualified adviser is retained and has the questions from Regulatory PostureNo
3. Jurisdiction decidedThe regulator and regime are chosen in writingNo
4. Entity formedA legal person exists that can hold a licenceNo
5. Application preparedPolicies, capital plan and compliance function drafted to the regulator’s shapeNo
6. Application filedSubmitted, clock running with the regulatorNo
7. LicensedAuthorisation grantedNo

Stage 1 of 7 is verified from Regulatory Posture, which states the position as “Not built, and not started” — no legal entity, no application, no compliance function, no counsel engagement. The metric for a report is the stage number and the date it last changed.

MetricDefinitionBaseline todaySource of the numberWhy it matters
Licensing stagePosition on the seven-rung ladder above1 of 7 — Not startedRegulatory PostureLines 2, 3 and 4 of the business cannot earn a lira until this moves; it is measured in months to years
Days since licensing stage last changedCalendar days at the current rung0 — the ladder is defined on this page todayDate arithmeticA stage that has not moved in six months is the report’s most important sentence
Infrastructure spend, actualMoney actually paid for hosting, storage, APIs and inference last monthNot tracked — no billing artifact exists in any repository, so this could not be measuredProvider invoicesWithout an actual there is no COGS, and without COGS there is no price
Infrastructure spend, estimatedThe Scenario A figure from Cost and FundingESTIMATE $500–$5,000/month (Scenario B: ESTIMATE $50,000–$250,000/month)Cost and FundingThe two scenarios differ by roughly 100x and describe two different companies
Actual as a share of estimateActual divided by the Scenario A midpointNot computable until an actual existsArithmeticThe point at which the cost model stops being a guess
Cost drivers with a real quoteOf three — LLM inference, managed database, object storage0 of 3Cost and FundingSelf-serve pricing pages; days of work that convert the whole cost table from estimate to fact
Cost scenario chosenA or B, in writingUndecidedCost and FundingArchitecture, price and whether investors are needed at all follow from this one line
Runway, monthsCash divided by monthly burnNot computed — no burn figure and no funding figure exist anywhereFounder’s own accountsThe roadmap’s “9 to 18 months for one full-stack engineer” is stated purely in time and has never been priced
Paid dependencies with a spend capPaid services with a hard budget alarm configured0 of 0 — no paid dependency exists yetProvider consolesThe cap has to exist before the first API key does, not after the first bill

Revenue metrics do not apply and will not for months. These are the leading indicators that exist before money changes hands, and every one of them can be moved by a founder with a phone and no deployment.

MetricDefinitionBaseline todaySource of the numberWhy it matters
Design-partner conversations, this monthSubstantive calls with a named prospective user about their actual problem0A markdown log, one line per callThe only Group 4 metric that is fully under the founder’s control today
Design-partner conversations, cumulativeSame, all time0Same logTen conversations before writing ingestion code changes what gets ingested
Pilot agreements signedWritten agreements, paid or unpaid, to trial the product0Signed documentsThe first external commitment of any kind
Expressed interestNamed people or organisations who have asked to be told when it launches0 — no waitlist form existsA markdown list, or a form once one is deployedCheapest possible demand signal; costs one afternoon to start collecting
Inbound enquiriesUnsolicited approaches about the product0EmailDistinguishes pull from push
Weekly active accountsDistinct accounts with a session in the last 7 daysNot measurable — nothing is deployedApplication database, once deployedThe first metric that becomes real the week after Phase 0 lands
Paying accounts and MRRSelf-explanatory0 — no billing code, no plans or subscriptions tables existBilling provider, once one existsListed here to be explicit that it is deliberately out of scope until Roadmap Phase 3

Most of this is a shell command, not a dashboard. The commands below produce the Group 2 figures exactly as measured for this page, run from ~/Desktop with the five repositories checked out alongside each other.

Terminal window
# Commits per repo
for d in demostatics-web demostatics-pc_application demostatics-mobile_application \
demostatics-docs demostatics-backend; do
printf "%-34s " "$d"
(cd "$d" && git rev-list --count --all)
done
# Tracked lines of code per repo, excluding vendor/node_modules/target/dist, lockfiles, binaries
for d in demostatics-web demostatics-pc_application demostatics-mobile_application \
demostatics-docs demostatics-backend; do
printf "%-34s " "$d"
(cd "$d" && git ls-files \
| grep -vE '(^|/)(vendor|node_modules|target|dist|build)/' \
| grep -vE '(package-lock\.json|composer\.lock|Cargo\.lock|pnpm-lock\.yaml|yarn\.lock)$' \
| grep -vE '\.(png|jpg|jpeg|gif|svg|ico|woff2?|ttf|otf|webp|pdf|zip|wav|mp4)$' \
| tr '\n' '\0' | xargs -0 -r wc -l | tail -1)
done
Terminal window
# Capability status counts, the site's own vocabulary.
# reports/ is excluded: the reports quote these counts back, so including them
# would make the metric count itself.
cd demostatics-docs/src/content/docs
grep -rhoE '\| *\*{0,2}(Shipped|Partial|Planned|Not built)\*{0,2} *\|' --exclude-dir=reports . \
| tr -d '|* ' | sort | uniq -c
# Shipped 88, Partial 12, Planned 61, Not built 36 — 197 total
# Docs page count
find . -name '*.md' | wc -l
Terminal window
# Web: tests, routes, schema
cd demostatics-web
./vendor/bin/pest # 211 passed (922 assertions), 2.38s
php artisan route:list --path=api # 45 routes
ls database/migrations | wc -l # 22
ls app/Models | wc -l # 23
find app/Http/Controllers -name '*.php' | wc -l # 36
# Desktop: static test count (cargo test --workspace is slow; this is the cheap proxy)
cd ../demostatics-pc_application
grep -rE '^\s*#\[(test|tokio::test)' crates/ bin/ examples/ | wc -l # 121
# Mobile: executed test count
cd ../demostatics-mobile_application
npx jest --silent # 102 passed in 6 suites
# CI health (only demostatics-pc_application has CI at all)
cd ../demostatics-pc_application
gh run list --workflow=ci.yml --limit 20 --json conclusion
Terminal window
# Environments: is anything actually serving the application?
curl -sSL -o /dev/null -w '%{http_code}\n' http://demostatics.com # 200, but a placeholder page
getent hosts docs.demostatics.com # no record

The two product tables deserve their own note, because they are the ones an outsider will assume contain data. reports and database_items in demostatics-web have no producer in production. The only code anywhere that writes to them is database/seeders/ReportSeeder.php, which inserts 12 demo rows, and database/seeders/DatabaseItemSeeder.php, which inserts 7 — 19 rows of hand-written demo content in total. Both are invoked only by DemoSeeder, never by DatabaseSeeder, so a plain php artisan migrate --seed creates none of them. The production row count for both tables is therefore zero and will stay zero until the worker tier exists. Once there is a database to point at, the metric is one query:

SELECT count(*) FROM reports;
SELECT count(*) FROM database_items;
Metric groupBlocked onAvailable today
Group 1, all rowsThe archiver — a cron job writing raw source files to object storage with a timestamp and a source tagNothing; this is the one thing worth unblocking first
Group 1, plausibility pass rateQuality gates on top of the archiverNo
Group 2, all rowsNothingYes, all of it, today
Group 3, licensing stageNothing — it is a judgement recorded by handYes
Group 3, actual spend and runwayA billing account and a habit of recording the invoice each monthPartly; the estimate exists, the actual does not
Group 4, conversations, pilots, interestNothing — a text file and a phoneYes
Group 4, weekly active accountsA deployment and a session tableNo

Being deliberate about what is excluded is what keeps the list above short enough to actually run each month.

  • Anything requiring users who do not exist. DAU, MAU, WAU, retention cohorts, session length, funnel conversion, churn, NPS, activation rate. Zero users produces zero of all of them, and a table of zeros crowds out the rows that are genuinely moving.
  • Revenue and revenue derivatives. MRR, ARR, ARPU, CAC, LTV, payback period, net revenue retention. There is no billing code and no plans, subscriptions or invoices tables anywhere; first revenue is gated on Roadmap Phase 3 at the earliest.
  • GitHub vanity. Stars, forks, watchers, contributors. This is a one-person private project; these measure attention the company is not seeking.
  • Lines of code as a goal. The figure is in Group 2 as context for the test and CI numbers, not as a target. Deleting the desktop client’s mock-server coupling would reduce it and be an improvement.
  • Velocity, story points, burndown. One engineer, no sprint boundary, no estimate history. The roadmap phase and the gap register already carry the sequencing.
  • Uptime, latency percentiles, error rates, MTTR. All require a deployment. They become real the week Phase 0 lands, and instrumenting them earlier measures a laptop.
  • Test coverage percentage. Reaching a trustworthy coverage figure across PHP, Rust and TypeScript means three separate toolchains wired into three CI setups, four of which do not exist. The absolute test counts and the CI pass rate carry the same signal for far less work.
  • Model accuracy, precision, recall, F1. There is no model, no training data and no ground truth. These arrive with the observations, not before them.
  • Anything that would take longer to instrument than the decision it informs is worth. The test for a candidate metric: if collecting it costs more than an hour a month, and no decision changes based on its value, it does not go on the page.

The format each report takes is on the report template. The first reading of every metric above is recorded in the August 2026 baseline. The work that would make the second reading different from the first is sequenced on What To Do Next.