oc Outlier Crosstab Narrow tools for Jira
Crosstaban product Live demoInstall

Privacy policy — Crosstab

This page is written from the architecture, not from a template. The source is not public, so the claim is narrower than it sounds. What you can check is the app's Forge manifest. Atlassian shows it to you before you install. A manifest either declares an external host or does not, and this one does not.

Last reviewed: 1 November 2026. This is version 4. The app has not changed since version 3; this site has. It has a support form now, and this edition says what the form sends and the check that runs before it does: The support form. A change to what is collected, what is kept, how long, or who else sees it takes the next version number; a correction that touches none of those moves this date and the digest at the foot of the page instead.

At a glance

Every record the app keeps, and how long it lives, is in one table under Retention. Once the app is uninstalled, Atlassian keeps the app storage that holds all of it for 28 days, then deletes it. After uninstalling says what can be restored in that time.

Contact: support@chmut.com.

Who this covers

Crosstab is a Jira dashboard gadget built on Atlassian Forge. It is to be distributed through the Atlassian Marketplace. It runs inside Atlassian's infrastructure. It has no servers, no database and no backend of its own.

WhoTheir part
Your organisationController for the issue data the app reads. It is your Jira site, your data and your agreement with Atlassian. A request about that data goes to it
The vendor, Oleksandr Chmut, trading as ocProcessor for that data, on your instruction; controller for a support message, the licence contact details Atlassian passes on, and visits to these pages
AtlassianSub-processor: hosts the code, the storage, the data the app reads, and the counters and log the vendor sees
CloudflareHosts these pages and counts visits to them, without cookies; runs the check on the support form and keeps a message sent through it for 30 days; sees none of the app's data
AppleHosts the support mailbox on iCloud; sees none of the app's data

For the issue data, Crosstab is a processor. Its code runs on Atlassian's platform, and what it reads does not leave Atlassian.

For a support message, the controller is Oleksandr Chmut. That is a sole trader registered in Ukraine, trading as oc, and the vendor the Marketplace listing names. That covers the message, the address it came from, and whatever the sender chose to put in it.

For a visit to this page, the controller is the vendor too. A static host serves the page. The request that fetched it is a request to a server somewhere.

What the app reads

Only what the grid and its settings need. Only while somebody is using a gadget or the administration page, with one exception: Keep automatically. Nothing is sent outside Atlassian. What the vendor can see inside Atlassian, and how your administrator switches it off, is under What the vendor sees.

When Jira is read

MomentRead as
A dashboard carrying the gadget is opened, or refreshed from the gadget's menuThe person looking
The gadget's settings form is openThe person looking
The grid is opened at page widthThe person looking
Someone presses Read again, Finish this read or Try againThe person looking
Keep automatically is on: every week on the chosen day, on the 1st of each month, or when a sprint closes - each then, or as soon after as Jira allowsThe person who switched it on

What is read

WhatWhenWhy
The issues your settings select, through the saved filter you chose or the search you wroteEvery readThe grid
The two axis fields, the numeric field and the issue typeEvery readThe grid
StatusAn axis is status or board columnThe grid
Status category and resolution dateA read writes the totals of old finished workTo put each issue in the period it was resolved in
When each issue was createdThe Sprint scope axisThe axis
The summary of an issue's parent, usually its epicAn axis is ParentIt is the label each parent carries on that axis
The issues' change historyThe Sprint scope axis and Crosstab SprintsWhen an issue joined a sprint is recorded nowhere else
The reader's time zone, from their own Jira profileAn axis is a date with a time in it; a figure runs from a date with no time on it up to now; a render may use their totals of old finished work; a grid already read is checked with Jira's two counts; the metric is time logged in a monthJira shows and searches dates in this zone for this reader, so months on the grid are cut in it. It is stored with a kept grid where an axis has a time in it, and in finished work, as totals
The reader's display nameThey publish a gridThe sentence over the published grid that says whose view it is. The name is not stored; their account id is
The publisher's display name, by their account idA published grid is drawnThe same sentence
A schedule owner's display name, by their account idA Jira administrator opens the administration pageThe list of the site's schedules: the running ones they may switch off, and the stopped ones they may delete. Asked as the administrator, not stored
A saved filter's name, by its id, for each running schedule that reads oneA Jira administrator opens the administration pageThe same list. Asked as the administrator, so a filter they cannot open is not named. Jira answers with the whole filter; only the name is used, and nothing is stored
Each issue's worklogs: who logged them, when, for how long, and the commentThe metric is time logged in a monthTo add up the time logged inside that month. None of them is stored
The chosen filter's first hundred issues, with every numeric field the gadget could add upThe settings form, once a filter is chosenTo say which of those fields are filled on that filter, so nobody has to choose a field to find out it draws an empty grid

Also read, as configuration rather than anybody's data:

What is used, and what is dropped

Whose permissions

GridRead with the permissions of
On a dashboard, and in the settings formWhoever is looking, so a grid read for them is never wider than their own view of Jira
Kept automaticallyThe person who switched it on, while nobody is looking
PublishedThe publisher, on the press. See a published grid
What a scheduled read adds, and where to check it

The manifest declares two triggers. You can check them on the consent screen.

TriggerWhat it does
Once a dayPuts a run on the app's own queue
When a sprint closesPuts a run on the app's own queue

The queue's consumer reads one run at a time, for each schedule whose turn it is. If another trigger is ever added, this page says so first, with the date it took effect.

A scheduled read asks Jira what a render asks, plus two requests. A render can make the first one too.

RequestWhenUsed from the answer
/myself, the owner's own profileOnce a day for each weekly or monthly schedule, once when a monthly one is switched on, and again whenever a run put off for Jira's hourly allowance comes backTheir time zone only, so "every Monday" is their Monday and "the 1st" their 1st
GET /filter/{id}When a sprint closes, for a schedule over a saved filterIts line of JQL, to pick the sprint's issues out of it

The built bundle contains no external host. The test suite asserts that, rather than the documentation claiming it.

What the app stores

Most of what the app stores is there because somebody asked for it: a press, or a box left ticked. Two lasting records are written without anybody asking: finished work, as totals and the list of field names. So are two copies used only for a short while. The last grid a person read is used for five minutes. A read that stopped short is used for up to an hour.

The asking is Keep this on the grid, or Keep automatically beside it. That is the same ask, made once for every week, month or sprint. The third way is the box in the gadget's settings offering to keep the first grid it draws. That box is already ticked when a gadget is being set up. So saving the settings as they come keeps the first grid. It is kept for whoever saved the settings, and for nobody else who opens the dashboard. To know who that is, the settings hold that person's Atlassian account id. Jira keeps the settings, and anybody who opens the dashboard can read them. Settings saved by an earlier version of the app keep a first grid for nobody until they are saved again. That first grid is the one grid here kept without a press on the grid.

The box keeps one grid under the settings on screen and then stops. The settings then say which day that one was kept, and stop offering. Change an axis and the gadget draws a different grid with no history of its own. The box is then offered again for that one.

Everything this page says the app writes goes into your own site's app storage. That storage is inside Atlassian's infrastructure and under your agreement with them. None of it leaves it.

Two small notes are the exception: the gadget keeps them in the reader's own browser, in the storage it gives this app's pages. They never leave that browser, and clearing its site data deletes them.

A kept grid

Written by Keep this, by Keep automatically, or by the settings box.

Within one set of settings, newer grids crowd old ones out without asking: each set holds its fifty most recent grids. Each person holds up to ten histories, one for each set of settings, and keeping a grid that would start an eleventh asks first.

A saved setup

A site holds its fifty most recent setups. One person may have ten of the fifty.

A schedule

For Keep automatically.

What a last run came toAlso stored
Running-
Kept-
Kept without the sprint's name-
Nothing to keep-
Under half the issues of the last grid keptThe two counts
Waiting for Jira's hourly allowance-
FailedThe status Jira or storage answered

Beside it, the schedule keeps one small mark per week, month or sprint it has taken. The mark says when, and what that turn came to.

A turn that wasIts mark is deleted
Put off for JiraAt once
FailedBy the platform, after an hour
Anything elseBy the platform, after ten days, or thirty-five for a month

The limits:

The grids it keeps are kept grids like any other, in that person's history. Each is marked with one word for which schedule kept it. Switched off, the grids it kept stay, like grids kept by hand.

Finished work, as totals

The grid's own totals of the finished work resolved before the current month. They are split by the month, quarter or year it was resolved in. A weekly keep or a render then reads that work again only where Jira says some of it moved.

The list of field names

The five-minute copy

One thing is written without a press, and used for five minutes: the last grid a person read. Every read of Jira is spent from one hourly allowance. That allowance is shared by every site the app is installed on.

Past the five minutes, the copy is answered again for five more. That happens only where Jira says in two counts that the search still holds as many issues as the read, and none of them was updated since. For a read the ceiling stopped, that is as many as Jira counted in the search at the time.

It is never answered past the five minutes in these cases:

Crosstab Sprints is copied the same way, under a key of its own. The copy is the bars and sentences it sent to that person's screen. It is used for five minutes and never past them. The platform deletes it after that.

A read that stopped short

One more copy, used for up to an hour: a read that stopped short. A read can stop before the end of the filter. It stops at the gadget's ceiling, at the platform's time limit, or because Jira asked it to slow down. The app then keeps where it stopped and the totals so far. Finish this read can then go on from that page rather than read the same first pages again.

A published grid

Left by Publish this grid for everybody who opens that gadget. There is one per gadget.

The gadget asks before every publish, except when the publisher's own published grid is the one showing on that gadget.

Only the publisher can replace or take down a published grid. Publishing over somebody else's is refused, and the refusal says who published it and when.

Changing the gadget's settings does not delete it. It is offered only under the settings it was published under.

Publishing is off until a Jira administrator turns it on for the whole site. That is done on the Crosstab page under Apps in Jira's administration. Off, nobody can publish and grids already published are not shown. Nothing is deleted: turning it back on shows them again. Uninstalling the app is what removes them.

The grid carried to a page

For Open at page width, and on a dashboard the count of kept grids and Changes since.

Site-wide records

Four records describe the site, and none of them is about a person.

RecordIn itLives
The site's background allowance, for Keep automaticallyHow many of Jira's points its schedules have spent in the current hour. Until when they are standing back because Jira refused or warned. Two numbers about the siteTwo hours. The platform then deletes both, up to two days late
The site's allowance for opened gadgetsHow many of Jira's points the gadgets people open have spent this hour, so the site stops at its share. One number for each read, under an id drawn at random for that read that names no person, gadget or filter. Three minutes later it is folded into one number for its minuteTwo hours. The platform then deletes it, up to two days late
The publishing switchOne setting for the whole site: whether a Jira administrator has turned publishing onUntil an administrator changes it, or the app is uninstalled
The Keep automatically switchOne setting for the whole site: whether a Jira administrator has turned Keep automatically off, and the moment it was last turned back on. It does not record whoUntil an administrator changes it, or the app is uninstalled

What the vendor sees

Counts, per minute, and nothing that is in them. The app adds to a handful of counters Atlassian keeps for every Forge app.

CounterWhat it counts
Points and issuesHow many of Jira's points it spent and how many issues it read, for a render, a publish, the settings form and the background keep
Reads and copiesHow often a render read Jira. How often it was answered with the grid read in the last five minutes, or with one Jira's counts said had not moved
Grids kept and publishedHow many, by a press or by a schedule. How many a schedule kept again because nothing had moved. How many finished issues a render or a schedule did not read because their totals were kept. How many schedules waited for the hour or kept nothing
Jira's allowanceHow often Jira said its hourly allowance was running low, and how often a read was cut short because it had run out

Atlassian files each count under your site. The vendor reads them in Atlassian's developer console, where they are kept for fourteen days. The counters take a number and nothing else. No account id, search, filter, field, name or anything from an issue goes into a counter.

There is also the app's log, kept by Atlassian and read in the same console. A line is written when a read was large or something did not go as planned:

SwitchTurns off
Custom metrics accessThe counters
Logs accessThe log

Your site's administrator can switch both off, where the site's apps are managed. The app works the same with either switched off. The vendor then sees nothing of that site.

Personal data

No axis can be a person. Not assignee, not reporter, not creator, not any user field. This is enforced against the schema of every field your site returns, not against a list of names. So a custom user picker called Reviewers is refused for the same reason Assignee is. So is one that holds several people at once.

The rule enforces the shape of a field. Three things fall outside a shape, and they are set out here rather than left for a reviewer to find.

Nothing the app stores names anybody. Three records hold an account id.

RecordHoldsThe name
A published gridIts publisher's account idRead from Jira each time it is drawn, because a figure passed to other people has to say whose view it is
A schedule for Keep automaticallyThe id of whoever switched it onNot stored
A saved setupThe id of whoever saved itNot stored

Once a week the app sends Atlassian every account id these three records hold, through the platform's personal data reporting. The report is sent from the app's daily run, which Atlassian starts only on a site with an active licence. On a site without one the ids stay stored and are not reported; the first daily run after the licence returns, once a week has passed since the last report, reports them. Atlassian answers which of those accounts are closed. For a closed account, the app deletes its schedules and takes down the grids it published. Its saved setups stay, with the account id deleted. A report that fails is made again the next day.

Atlassian may also say an account was updated. The app stores only the id, never a name or an email address, so there is nothing to refresh.

The support form

The support page has a form. It is another way to write to support@chmut.com, not a different thing.

Sub-processors

WhoWhat it does
AtlassianHosts everything the app does: the code, the storage and the data it reads. Also the counters and log above, which reach the vendor only through Atlassian's developer console
AtlassianPasses the vendor the contact details attached to a paid licence. Your organisation gave them to Atlassian rather than us. This app is paid, so this one applies
CloudflareHosts this page and the documentation beside it, as static files on Cloudflare Pages. On the support page it runs the check and keeps the message the form sends for 30 days, in the European Union. For the site and for a message sent through the form, the vendor is the controller; what Cloudflare does with the check's signals is set by its own terms for Turnstile
AppleHosts the support mailbox, so a message sent to support@chmut.com, and the answer to one sent through the support form, is stored on iCloud. Nothing from your Jira site reaches it

There is no second processor for the app's data, because there is no second place for anything to be. The pages load no font from a CDN. Besides the support page's check above, Cloudflare Web Analytics is the one thing they load from anywhere else. It is a script the host adds to every page to count visits, with no cookies. It sees the pages and never the gadget. The gadget runs inside Jira and sends nothing here.

Retention

Each record's full lifetime is set out in its own section above. This table is the index.

RecordLives until
A kept gridSomebody deletes it, or newer grids crowd it out. Past the fiftieth, one row of its totals stays
A saved setupSomebody deletes it, or newer setups by the person who saved it crowd it out
A scheduleIts owner switches it off, a Jira administrator deletes it once it has stopped, or its owner's account is closed
Finished work, as totalsThe next read replaces it. The platform deletes it thirty-five days after it was last written
The list of field namesA week from when it was read from Jira
The five-minute copyThat person's next read of the same grid, or four weeks from the read at most
A read that stopped shortThat person's next read of the same grid, or a day from its last page at most
A published gridIts publisher takes it down or publishes again, or their account is closed
The grid carried to a pageThat person's next Open at page width, or a day from the press at most
Site-wide recordsTwo hours for the two allowances; the two switches until they are changed
The counters the vendor seesFourteen days, in Atlassian's console
A message sent through the support form30 days in the form's database, or sooner on request
A message to support24 months, or sooner on request
The app's storage, once the app is uninstalledTwenty-eight days. Atlassian then deletes it

The platform deletes a record once its time is up, on its own schedule. That can be up to two days late. The app does not wait for it: it checks each record's time when it reads it, and never uses one past it.

Earlier versions of the app wrote five of these records with no deadline: finished work, the list of field names, the five-minute copy, a read that stopped short, and the grid carried to a page. The next time the app writes such a record, it writes a deadline with it. A read that finds it past its time deletes it. One that no read reaches again stays until the app's storage is deleted.

Support correspondence is kept long enough to answer a follow-up about the same thing. It is not used for anything else: no marketing, no profiling, no list.

After uninstalling

Once the app is uninstalled, Atlassian keeps its storage for 28 days, then deletes it. The app deletes nothing itself on the way out. Atlassian's Forge storage reference, under Data recovery for apps with hosted storage (developer.atlassian.com/platform/forge/storage-reference), says the storage is kept for 28 days after the app is uninstalled, and that Atlassian can link it to a new installation if asked within 21 days. So if you install it again and write to us within 21 days of uninstalling, your kept grids, saved setups and schedules can come back: Atlassian relinks the old storage when the vendor asks, and the vendor asks only with your consent. Write to support@chmut.com.

Your rights

DataWhere the request goes
The issue dataYour own organisation. It is the controller, and the app holds nothing about you that your Jira site does not already hold
A support messageThe vendor, who is the controller. Write to the support address above

Changes

The date this page was last reviewed is at the top. The digest of the exact text is at the foot. So a reader who kept a copy can tell whether they hold the current one. The digest is over the markdown the page is rendered from, which is published beside it. A digest over something nobody outside can hold would be decoration rather than evidence.

The app is listed on the Marketplace, so a reader may have agreed to this edition when they installed it. A change to what is collected, what is kept, how long, or who else sees it takes the next version number, and the edition it replaces stays published with its own digest. A correction that touches none of those moves the review date and the digest, and leaves the version number where it is.

Version 4 adds the support form: what it sends, the check that runs before it does, and the 30 days Cloudflare keeps it for. It also names Apple, which hosted the support mailbox under version 3 as well and was not named there, and says how long a support message is kept, 24 months, where version 3 said only long enough to answer a follow-up. The app has not changed since version 3. Version 3 stays published as privacy-v3.md, with the SHA-256 digest 1518440d9ccb98cbfb5e4c595ac75e0d876fe96642902b4b585465c7e241a93a.

This edition

The file below is the authoritative text. This page renders it and adds navigation and this block, so the page and the file are not byte-identical — it is the file that governs, and the digest is over the file.

Version 4 — privacy.md, 59 KB

9ef372ecccadffcc98e647d44cfa232728620d720bc542cb3ef28867a52554b7

Check it with shasum -a 256 privacy.md once the file is downloaded, which prints the digest above and nothing to compare by eye. On Windows, Get-FileHash privacy.md -Algorithm SHA256 in PowerShell, which prints in capitals — the comparison is case-insensitive. The digest is published by us: it shows the file has not drifted or been altered in transit, and it is not a third-party attestation.