Flow Metrics — Privacy Policy
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:
- The app never guesses which column is the status. It reads one only when a column is headed exactly Status or Current status. A column headed as a summary, description, comment, note, title, reason or justification is put out of reach of every field before your export is read at all.
- A status column repeats itself and prose does not. A whole workflow is about ten statuses however many items you have; a column of summaries has a different value on nearly every row. So the app counts how many different values that column holds before it stores anything, and if it looks like free text it stores nothing at all from it — not the short values, not a shortened version, nothing — and tells you so. A paste of fewer than 20 rows is too short to measure that way, so there the column is still only read when it is headed exactly Status, and the cap of 40 different values and the label shape below are what hold.
- The list is capped at 40 and shown to you. Every entry is on screen in the Teams & Stages window with a delete button beside it, and a status you delete is removed from every item that pointed at it.
- Each label is held to a short, plain shape — at most 40 characters and six words, letters, digits and a handful of separators. Anything else is dropped whole rather than shortened. This is the weakest of the four and is not what makes the feature safe; the one above it is.
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
- Nothing you store in the app ever leaves your browser. There is no exception to this any more — the only way data leaves is if you deliberately create a share link or download a backup, and both of those are files you control.
- There is no analytics, no tracking pixels, no advertising and no cookies.
- The page loads no third-party code of any kind. Its chart library is a copy kept in the repository, served from the same address as the page itself.
- The page's Content-Security-Policy sets
connect-src 'none', so the browser itself refuses to let this page open a network connection — not to Google, not to the author, not anywhere.
The Jira Bookmark
- The optional Copy for Flow Metrics bookmark runs in your own Jira tab, not in this app, and uses the Jira sign-in that tab already has. No password or token is ever asked for or kept, here or anywhere.
- It only reads, and only named fields: issue key, issue type, status, created, start and resolved dates, parent key, the three work fields and the history of status changes (to count days in each status). Summaries and descriptions are never fetched.
- It asks Jira only for the projects whose ids you set on your teams, and only for work active in the window you chose (three months, six months or a year) plus work still open. (Precisely: items started, raised or finished in the window, plus items still in progress, leaving out Cancelled.) Those ids and that window are written into the bookmark when you drag it; nothing is read from this app afterwards.
- It puts the table on your clipboard and nowhere else, and stores nothing anywhere. What reaches this app is only what you paste, read by the same rules as any other paste.
Deleting Your Data
- In this browser: "Clear this team's data" on the Your Data tab empties one team; deleting a team removes it entirely; Back up → Start again removes everything. Clearing your browser's site data does the same. That is the whole of it — there is no other copy to chase.
- Anything left over from sync: nothing. The stored copies were deleted on August 20, 2026, along with the feature itself.
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.