Flow Metrics — Privacy Policy

Effective November 3, 2026

Flow Metrics is built to work entirely in your browser. This page explains exactly what data exists, where it goes, and who can see it.

What Flow Metrics Stores

The only data the app holds is what you paste or type in: team names, an optional project id for each team, an optional work-in-progress limit and cycle time target for each team (two numbers you set, which the charts are drawn against), whether each team runs sprints and — for a team on a cadence of its own — that sprint's length and a date one started, whether a team counts in its train's aged share, whether a team's ServiceNow incidents count as defects, the names of any workflow stages you set up, the list of statuses read out of your exports (see below), and for each team a list of work items — a completed date, an optional start date, an optional created date, an optional work type, an optional issue key, an optional parent key and, where your export carried them, which status the item is in, a number of days against each stage, which of four ServiceNow assignment types it came from, whether a bug was found in production or pre-production, and whether the work was discretionary. A team may also hold a separate list of features, each one the same handful of dates and keys as a work item — plus the shared settings (labels, the text that marks unplanned work, the text that marks a feature, the thresholds, the six numbers the aged share, the defect share and the average feature cycle time are graded against, whether days are counted Monday to Friday, which day a week starts on, the company's sprint length and a date one started, whether items that took unusually long stop counting toward the duration figures, the work-type filter list) and your preferences (theme, chosen team, date window, whether the tabs are pinned and which cards you have folded away). No account is required to use the app, and there is no analytics, tracking or advertising of any kind.

The issue key is the one identifier the app keeps about an item, and it is kept so that a dot on a chart can be named and then looked up in your own work system. It is checked against the shape of a key — up to ten letters or digits, a dash, and up to six digits, and nothing else — rather than trimmed to fit, so a cell that is anything other than a key is discarded whole. That check runs at the paste and again whenever a saved copy is read back. Before August 20, 2026 the app stored no key at all; a copy saved before then simply has none.

The parent key is the key of the feature a work item belongs to, added August 25, 2026, and it is held to exactly the same shape check as the issue key above — the same characters, at the same two doors, discarded whole in the same way. It is what lets the app say how many items a feature took. A Parent summary column is never read. It is typed by hand and so is prose, and this app stores no prose: any column whose heading names it as a summary, description, comment, note, title, reason or justification is taken out of consideration entirely before your export is read, so no part of it can reach any field at all — the status list below included. A copy saved before that date simply has no parent keys.

The ServiceNow assignment type, the Bug Type and the Type of Work are kept as numbers from fixed lists, added September 15, 2026. Each is a Jira custom field whose values are a short, closed list — Change Task, Incident, Service Catalog Task or Vulnerabilities; Production or Pre Production; Discretionary or Non-Discretionary — and an item stores only the number of the one its cell matched, never the text of the cell. A cell holding anything else is discarded whole. A copy saved before that date simply has none of the three.

The project id is the letters at the front of those keys — DAE, for DAE-1552 — held against the team it belongs to so that one export covering several teams can be pasted in one go and split between them. It is checked against the same shape as the front of a key: up to ten letters or digits, starting with a letter, and nothing else. It is a label used to route a paste; it changes no figure, and it is never sent in a share link, because someone reading a link has nothing to paste.

Your statuses are stored, once each, in a list you can see and empty. This changed on September 1, 2026, and it reversed what this page used to say. When you paste an export with a Status column, the statuses in it are added to a list you can read and delete from in the Teams & Stages window. A work item stores a pointer into that list and never the word itself, so the words live in exactly one place — that list — however many thousands of items you paste.

A status has no shape a check can test for. "Fix the login bug on prod" is twenty-five characters of letters and spaces, which is every shape a status label has, so the test that lets an issue key in cannot work here. What guards this instead is the column rather than the value, and it is worth stating plainly because it is the whole reason the app is willing to keep these words at all:

Only work still in progress is read. Every export says Done or Closed against everything it has ever finished, which is most of the file, and a finished item's current status says nothing about how work flows. So finished rows are skipped and their statuses never reach the list.

Workflow stages are still yours, and grouping is optional. A stage is something you create and name in the app — Build, Review — and you say which statuses belong to it by ticking them. You do not have to: the charts read by status on their own. A Time in Status export names its statuses in its column headings rather than in any column, so those are still matched against names you type yourself, and only the day counts are stored from them. A share link carries the stage names, the day counts and the statuses the items in it are actually in — a link without them would show the person you sent it to a different picture from yours — but not the status names you typed into a stage's matching box. Before August 21, 2026 there were no stages at all, and before September 1, 2026 no statuses were stored; a copy saved before then simply has none.

Note what is not stored: no ticket titles or summaries, no descriptions, no names of people, and no free-text or comment fields anywhere — there is nowhere in this app you can type a sentence and have it saved, and the status list is filled from a column the app has measured, never from a box you type into. Apart from the key and the status, the app only ever needs dates, numbers and a type, and the work type is held to a short category label — a cell that looks like anything longer (a ticket summary, a description) is discarded rather than saved. The rest of what you paste is read for its dates and numbers on the spot and never stored.

Where That Data Lives

In your browser. That is the only place. Everything is stored in your browser's local storage on your own device. There is no server, no database and no account — the app has nowhere to send your data even if it wanted to.

A copy of the app itself, so it opens offline. The page, its stylesheet, its chart library and its icon are kept on your device — the same public files anyone can read on GitHub, and nothing else. Your work items are never put there. Clearing the site's browser data removes it along with everything else.

Cross-Device Sync Was Removed on August 20, 2026

Until that date the app offered optional Google sign-in, which mirrored your teams to a Firestore database in a Firebase project owned by the app's author. That feature is gone. The code, the sign-in button and every Google address were removed together, and the page's Content-Security-Policy now names no external origin at all — which is what makes this page's claims checkable rather than a promise. Any account id the old feature left in your browser is deleted the next time you open the app.

The data that had been stored there was deleted on the same day, so there is no copy of anyone's teams left in that database.

To use the app on more than one device now, use Back up to download a JSON file and restore it on the other device.

Share Links

The Share button builds a read-only link to teams you choose. The data travels inside the link itself — in the part after the #, which browsers never send to any server — so creating or opening one involves no upload, no download and no account, and nothing the recipient already has saved in their own browser is touched. A link is a frozen snapshot: it can't be edited through, and it can't be withdrawn once sent, so share it as deliberately as you would email a spreadsheet. It carries the same fields the app stores, issue keys and status names included — they are what names the items and the columns on the charts, and a link without them would show the recipient a different picture from yours. It carries stage names and day counts for the same reason. Each team's sprint settings, whether it counts in the aged share, and the company's week start and sprint cadence travel too, because they decide how the recipient's charts are cut. Only what the link's own items need travels: the stages they spent time in, and the statuses they are actually sitting in — not your whole list.

What Is Never Sent Anywhere

The Jira Bookmark

Deleting Your Data

Changes to This Policy

If what the app stores or where it sends it ever changes, this page and its effective date change in the same release.

Contact

eagleadams86@gmail.com