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.
Where these numbers come from
Section titled “Where these numbers come from”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.
Group 1 — The data asset
Section titled “Group 1 — The data asset”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.
| Metric | Definition | Baseline today | Source of the number | Why it matters |
|---|---|---|---|---|
| Days of history accumulated | Whole days between the earliest object in the raw archive and today | 0 | Oldest key prefix in the archive store | Increases daily with no engineering effort; the only metric here that cannot be recovered by working harder later |
| Days of history, best-covered source | Same, for the single source with the longest unbroken record | 0 | Oldest key prefix under one source tag | A buyer evaluates the deepest series, not the average |
| Sources live | Distinct sources that wrote to the archive on their intended cadence in the last 24 hours | 0 of 10 candidates | Count of distinct source tags with a fetch in the last 24h | Breadth is the second question after depth; the ten candidates are named on The Minimum Viable Data Set |
| Cumulative observations collected | Total rows in the observations table, never decreasing | 0 — no table and no writer exist | SELECT count(*) once the table exists | The raw size of the asset; the number that goes in a data-room summary |
| Raw archive size | Bytes stored in the archive, all sources, all time | 0 B | du -sb or the bucket’s own size metric | Proxy for asset scale, and the input to the storage line of the cost model |
| Collection uptime | Scheduled fetches that succeeded, as a percentage of scheduled fetches, last 30 days | Not measurable — nothing is scheduled | Fetch log | A gappy archive is worth much less than a complete one, and gaps are also unrecoverable |
| Plausibility pass rate | Observations passing range, monotonicity and unit checks, as a percentage of observations ingested | Not measurable — no gates and no observations | Quality-gate counters | Distinguishes a real data set from a pile of files; needed before anyone will pay for it |
Group 2 — Product and engineering
Section titled “Group 2 — Product and engineering”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.
| Metric | Definition | Baseline today | Source of the number | Why it matters |
|---|---|---|---|---|
| Capabilities Shipped | Table cells whose entire value is Shipped, across the docs site excluding reports/ | 88 | grep over src/content/docs, command below | The honest surface area of working software |
| Capabilities Partial | Same, for Partial | 12 | Same command | Work in flight; a rising number with a flat Shipped number is a warning |
| Capabilities Planned | Same, for Planned | 61 | Same command | The size of the promise still outstanding |
| Capabilities Not built | Same, for Not built | 36 | Same command | The gap between the pitch and the tree |
| Roadmap phases complete | Phases on Roadmap marked complete | 0 of 11 — one Partial (Phase 0), ten Planned | Status column of the phase table | The plan’s own unit of progress |
| Gap register, open | Entries on Gap Register not marked closed | 86 open, 0 closed | Summary table of the register | The list of things that get more expensive with time |
| Gap register by severity | Open entries split Existential / High / Medium / Low | 5 / 42 / 35 / 4 | Same table | Severity mix matters more than the total; closing four Low items is not progress |
| Gaps due Now still open | Register entries whose When is Now | 17 | Same table | These are the ones whose cost is rising today |
| Automated tests, web | Tests executed by the Laravel suite | 211 passing, 922 assertions, 2.38 s | ./vendor/bin/pest | The only suite on the platform that is actually run and green |
| Automated tests, desktop | #[test] plus #[tokio::test] functions in the Rust workspace | 121 (115 + 6), across 18 crates, bin/ and examples/ | grep over crates/ bin/ examples/ | Counted statically, not executed — see the caution below |
| Automated tests, mobile | Jest tests executed | 102 passing in 6 suites, 0.60 s | npx jest | Small but real and green |
| Repos with CI | Repositories with a working CI configuration | 1 of 5 — only demostatics-pc_application | .github/workflows in each repo | Four repositories have no automated check of any kind on any commit |
| CI pass rate, desktop | Successful runs of ci.yml, last 20 | 4 of 20 green; the latest run on main is red | gh run list --workflow=ci.yml | A red default branch is a stronger signal than a test count |
| API endpoints | Routes registered under api/ | 45 (of 105 routes total) | php artisan route:list --path=api | The contract surface other clients depend on |
| Schema size | Migrations / Eloquent models / controller files in demostatics-web | 22 / 23 / 36 | ls and find, commands below | Cheap proxy for how much domain the display tier already models |
| Tracked lines of code | Tracked non-vendor, non-lockfile, non-binary lines across all five repos | 53,853 — web 17,378, desktop 16,747, mobile 10,098, docs 9,628, backend 2 | git ls-files piped to wc -l | Context for the test and CI numbers; not a goal in itself |
| Commits, all repos | git rev-list --count --all summed | 114 — web 44, desktop 57, mobile 5, docs 7, backend 1 | git rev-list | Activity, not achievement; useful only alongside the rows above |
| Docs pages | Markdown files under src/content/docs | 41 at time of measurement; this page makes 42 | find … -name '*.md' | wc -l | The documentation is currently the most complete artifact the company has |
| Environments deployed | Reachable environments serving the real application | 0 | Direct HTTP check, below | The gate in front of every metric that needs a running system |
Group 3 — Business and regulatory
Section titled “Group 3 — Business and regulatory”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.
| Stage | Meaning | Reached |
|---|---|---|
| 1. Not started | No counsel, no jurisdiction, no entity | Current position |
| 2. Counsel engaged | A qualified adviser is retained and has the questions from Regulatory Posture | No |
| 3. Jurisdiction decided | The regulator and regime are chosen in writing | No |
| 4. Entity formed | A legal person exists that can hold a licence | No |
| 5. Application prepared | Policies, capital plan and compliance function drafted to the regulator’s shape | No |
| 6. Application filed | Submitted, clock running with the regulator | No |
| 7. Licensed | Authorisation granted | No |
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.
| Metric | Definition | Baseline today | Source of the number | Why it matters |
|---|---|---|---|---|
| Licensing stage | Position on the seven-rung ladder above | 1 of 7 — Not started | Regulatory Posture | Lines 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 changed | Calendar days at the current rung | 0 — the ladder is defined on this page today | Date arithmetic | A stage that has not moved in six months is the report’s most important sentence |
| Infrastructure spend, actual | Money actually paid for hosting, storage, APIs and inference last month | Not tracked — no billing artifact exists in any repository, so this could not be measured | Provider invoices | Without an actual there is no COGS, and without COGS there is no price |
| Infrastructure spend, estimated | The Scenario A figure from Cost and Funding | ESTIMATE $500–$5,000/month (Scenario B: ESTIMATE $50,000–$250,000/month) | Cost and Funding | The two scenarios differ by roughly 100x and describe two different companies |
| Actual as a share of estimate | Actual divided by the Scenario A midpoint | Not computable until an actual exists | Arithmetic | The point at which the cost model stops being a guess |
| Cost drivers with a real quote | Of three — LLM inference, managed database, object storage | 0 of 3 | Cost and Funding | Self-serve pricing pages; days of work that convert the whole cost table from estimate to fact |
| Cost scenario chosen | A or B, in writing | Undecided | Cost and Funding | Architecture, price and whether investors are needed at all follow from this one line |
| Runway, months | Cash divided by monthly burn | Not computed — no burn figure and no funding figure exist anywhere | Founder’s own accounts | The 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 cap | Paid services with a hard budget alarm configured | 0 of 0 — no paid dependency exists yet | Provider consoles | The cap has to exist before the first API key does, not after the first bill |
Group 4 — Commercial, pre-revenue
Section titled “Group 4 — Commercial, pre-revenue”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.
| Metric | Definition | Baseline today | Source of the number | Why it matters |
|---|---|---|---|---|
| Design-partner conversations, this month | Substantive calls with a named prospective user about their actual problem | 0 | A markdown log, one line per call | The only Group 4 metric that is fully under the founder’s control today |
| Design-partner conversations, cumulative | Same, all time | 0 | Same log | Ten conversations before writing ingestion code changes what gets ingested |
| Pilot agreements signed | Written agreements, paid or unpaid, to trial the product | 0 | Signed documents | The first external commitment of any kind |
| Expressed interest | Named people or organisations who have asked to be told when it launches | 0 — no waitlist form exists | A markdown list, or a form once one is deployed | Cheapest possible demand signal; costs one afternoon to start collecting |
| Inbound enquiries | Unsolicited approaches about the product | 0 | Distinguishes pull from push | |
| Weekly active accounts | Distinct accounts with a session in the last 7 days | Not measurable — nothing is deployed | Application database, once deployed | The first metric that becomes real the week after Phase 0 lands |
| Paying accounts and MRR | Self-explanatory | 0 — no billing code, no plans or subscriptions tables exist | Billing provider, once one exists | Listed here to be explicit that it is deliberately out of scope until Roadmap Phase 3 |
How to collect these
Section titled “How to collect these”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.
# Commits per repofor 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, binariesfor 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# 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/docsgrep -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 countfind . -name '*.md' | wc -l# Web: tests, routes, schemacd demostatics-web./vendor/bin/pest # 211 passed (922 assertions), 2.38sphp artisan route:list --path=api # 45 routesls database/migrations | wc -l # 22ls app/Models | wc -l # 23find 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_applicationgrep -rE '^\s*#\[(test|tokio::test)' crates/ bin/ examples/ | wc -l # 121
# Mobile: executed test countcd ../demostatics-mobile_applicationnpx jest --silent # 102 passed in 6 suites
# CI health (only demostatics-pc_application has CI at all)cd ../demostatics-pc_applicationgh run list --workflow=ci.yml --limit 20 --json conclusion# Environments: is anything actually serving the application?curl -sSL -o /dev/null -w '%{http_code}\n' http://demostatics.com # 200, but a placeholder pagegetent hosts docs.demostatics.com # no recordThe 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;Which metrics need something built first
Section titled “Which metrics need something built first”| Metric group | Blocked on | Available today |
|---|---|---|
| Group 1, all rows | The archiver — a cron job writing raw source files to object storage with a timestamp and a source tag | Nothing; this is the one thing worth unblocking first |
| Group 1, plausibility pass rate | Quality gates on top of the archiver | No |
| Group 2, all rows | Nothing | Yes, all of it, today |
| Group 3, licensing stage | Nothing — it is a judgement recorded by hand | Yes |
| Group 3, actual spend and runway | A billing account and a habit of recording the invoice each month | Partly; the estimate exists, the actual does not |
| Group 4, conversations, pilots, interest | Nothing — a text file and a phone | Yes |
| Group 4, weekly active accounts | A deployment and a session table | No |
What not to measure yet
Section titled “What not to measure yet”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.