Skip to content

Guides & reference

The Data and Statistics benches

Bring rows into the Lab, clean and shape them, derive typed blocks, run eleven statistics calculators, and let the Advisor rank your next move.
Sculptural study of connected forms and structured ideas

The Lab's two benches are where real numbers enter a FlowScript document. The Data bench reads your rows from a file or a paste, checks and cleans them, binds them to the document so a figure that names a missing column stops compiling, and writes typed blocks whose every number was counted from those rows. The Statistics bench runs eleven calculators on the Lab's statistics kernel and writes each answer into the document together with the published method that produced it. Both benches refuse rather than guess: when the rows or the inputs cannot support a result, you get the reason in plain words instead of a plausible-looking number. This page documents every shelf, control, option, limit and message on both benches, plus the Advisor that sends you to them and the Photo → FlowScript importer.

At a glance

SurfaceWhat it doesOpen it fromWrites into the document
Data bench, Data shelfReads CSV, TSV, JSON records and Excel workbooks; previews the rows; downloads or hands them to FigureTool rail Data, or ⌘K DataNothing on its own. It binds the rows to the document
Data bench, Clean shelfLists problems in the rows and offers one-click fixesThe Clean tab inside the Data benchNothing. It edits the held rows
Data bench, Shape shelfSorts, filters and adds derived columnsThe Shape tab inside the Data benchNothing. It edits the held rows
Data bench, Derive shelfTurns columns into typed blocksThe Derive tab inside the Data benchdataset and column, cohort and arm, contrast, table_one, survival
Statistics bench, Calculate shelfEleven calculators for power, effects, diagnostic accuracy, meta-analysis, health economics, baseline rows, survival and ROCTool rail Statistics, or ⌘K Statisticspower, contrast, diagnostic, meta, icer, table_one, survival, roc
Statistics bench, Method finderSearches all 176 methods the statistics kernel implements, with formulas and citationsThe Method finder tab inside the Statistics benchNothing
AdvisorRanks the next things to do, offline and the same way every timeTool rail AdvisorOnly when you accept a proposal that inserts a block
Photo → FlowScript…Turns a photo of a real-world artefact into editable source with AI⋮ menu, Import, Photo → FlowScript…Only when you choose Edit in Lab

The Lab is a Starter workstation: it opens on Starter, Plus, Ultra and Enterprise plans, and every bench on this page is included on those plans. The benches run entirely in your browser and use no AI and no AI points. Only Photo → FlowScript… uses AI. See Plans and what they include.


Where the benches live

The Lab's left-hand sheet is the workbench. Its tab strip holds five shelves: Source, Data, Statistics, Figures and Standards. This page covers Data and Statistics. Source is the FlowScript editor (The FlowScript language), Figures is the views gallery (Lab views and renderers) and Standards is the reporting-standards bench (Reporting standards).

You can open a bench in four ways:

  1. The tool rail. The Lab's rail lists Hand (shortcut H), then Source, Data, Statistics, Figures and Standards, then Insert a block or view, Advisor and Provenance. Clicking the button of the shelf that is already open closes the sheet.
  2. The command palette. Press ⌘K and type the shelf's name. Every shelf appears under Go to.
  3. The keyboard. ⌘\ (Toggle code pane) opens and closes the whole sheet. No key is bound to a single shelf.
  4. The Advisor. A proposal such as Open the data bench or Open this calculator on the bench opens the right shelf for you (see The Advisor).

While the Data bench is holding rows for the open document, the Data button on the rail (and its Go to entry in ⌘K) carries a bound badge. The sheet can be dragged between 360 and 720 pixels wide; with the resize edge focused, the arrow keys widen and narrow it (hold Shift for bigger steps) and Home and End jump to the limits. Below 560 pixels, the shelves that are not open fold to icons.

On Windows and Linux, read ⌘ as Ctrl and ⇧ as Shift.


The Data bench

The Data bench has four shelves, chosen from the tab strip at its top: Data, Clean, Shape and Derive. The strip ends with the words "counted, never typed", which is the bench's rule: every number it writes into your document is counted or copied from your rows.

While the bench holds a dataset, a second strip sits under the tabs on every shelf. It shows the dataset's name, its size as rows × columns, the block id the rows are bound to (for example trial_csv), and an X button labelled "Let go of this dataset and unbind the document". Clicking X releases the rows and switches the document's column checks off.

Clean, Shape and Derive need rows. Until the bench holds a dataset each shows a one-line hint, for example "Read some rows first — there is nothing to check until the bench is holding a dataset."

Bringing rows in

The Data shelf is where rows arrive.

  1. Click Upload CSV / Excel / JSON and pick a file, or paste rows into the Rows box ("or paste below"). The box's placeholder shows the expected shape: a header line, then one row per line. You can paste JSON into the box too.
  2. Optionally type a Name. The placeholder is trial-export.csv. The name becomes the dataset's name and the basis of its block id. A picked file fills it in for you.
  3. Choose a Delimiter if detection would get it wrong.
  4. Click Read these rows. A picked text file is read immediately, so you only need this button after pasting or editing.

The file picker accepts these types:

ExtensionRead as
.csv, .tsv, .txtDelimited text. The text also lands in the Rows box, so you can correct a stray delimiter and read it again
.jsonA JSON array of row objects, or an object holding such an array under data, rows, values or records
.xlsx, .xlsmAn Excel workbook. Only the first sheet is read, and formulas arrive as the values they compute. The Rows box is cleared because a workbook is not text

Legacy .xls files are not accepted. Save them as .xlsx or CSV first.

While a file is being read, the upload button says Reading…. After a workbook is read, a note says "Read N rows from the first sheet of "file.xlsx" — formulas came across as the values they compute."

The Delimiter menu offers:

OptionMeaning
Detect itThe default. The reader guesses, and re-reads with another separator if the guess leaves the rows uneven or splits on decimal commas
CommaComma-separated
TabTab-separated
SemicolonSemicolon-separated, as many European spreadsheets export
PipeSeparated by the vertical-bar character

An explicit choice is never second-guessed. Columns are typed by reading every row, not a sample. The four column types are number, string, date and boolean.

Note: A file over 12 MB is refused before it is read, with the message "… is 12.4 MB, over the 12.0 MB limit for a single intake, so it was not parsed." Export a subset of the columns you need, or aggregate first. The parser also refuses more than 200,000 rows or 256 columns. Separately, a Table 1 or Survival block can carry at most 5,000 observations (see Derivation limits).

When the parser refuses

A refusal appears in an amber box headed "The parser refused this." with the parser's own sentence beneath it. If you were already holding a dataset, it stays held and bound: a typo in a second paste never unbinds the document. The common refusals and their fixes are listed in Troubleshooting.

When the parser recovers

Some files parse with a caveat. The rows are kept, and an amber box headed "These rows were read, with a caveat." (or "with caveats.") sits directly under the row count. Caveats you may see include:

  • A short row: "Row 7 has fewer values than the 5 columns in the header, so its missing cells were read as blanks. Nothing was dropped, but a blank is not a zero…"
  • No delimiter found: "No delimiter could be detected, so every line was read as one column…" Choose the delimiter yourself if the rows should have several columns.
  • A re-read: "Values are separated by ";": splitting on "," left the rows uneven, so the file was read with ";" instead."
  • Decimal commas: a column written like 0,52 is read as 0.52, and the caveat names the columns and gives an example.
  • Missing-value codes: in a column that is otherwise numeric, cells written as NA, N/A, NaN, null, #N/A, #NA, <NA>, ., - or a dash are read as blanks rather than text, so the column stays numeric. The caveat names the columns and the spellings it found and ends "A blank is not a zero." None and ? are deliberately not treated this way.

Caveats stay with the rows. They survive switching shelves, closing the sheet and every later edit on the Clean and Shape shelves, because the cells they describe are still the same cells.

What the Data shelf shows

Once rows are held, a card on the Data shelf shows:

  • The size, as "N rows × M columns".
  • Any caveats, immediately under the size.
  • A preview of the first 8 rows. Each column heading shows the column name (or "(unnamed)"), its type and, when it has any, "· N blank". The line under the table says "Showing the first 8 of N rows." The count is always the real count of the whole dataset.
  • The binding sentence. When the document already declares a dataset block for these rows, it reads "The whole dataset is bound to the document as trial_csv, so a figure naming a column these rows do not have is a compile error rather than a blank." When it does not yet, it reads "Nothing in the document names these rows yet. Derive a dataset block below and the column checks switch on…"
  • Download these rows as CSV. Saves the rows exactly as the bench now holds them, cleaned, filtered and with derived columns, as <name>.csv (the dataset name with its extension replaced). Text cells and headers that a spreadsheet would run as a formula (starting with =, +, -, @, a tab or a carriage return) are protected with a leading apostrophe; genuine numbers such as -1.5 are never changed. A toast confirms the download.
  • Open these rows in Figure. Hands the rows to the Figure studio, which adopts them as a new sheet. Column types such as leading zeros and true/false are preserved. If the rows are too large to hand over, or browser storage is blocked, you see "Couldn't stage the rows (too large or storage unavailable)." Use Download these rows as CSV instead and open the file in Figure.
  • Shape chips. Up to five small chips name the kinds of figure the columns could support. Hover a chip to read why.

Saved data across documents

The Lab is multi-document, and each document keeps its own binding. When at least one document has rows saved, the Data shelf shows a Saved data · N documents list. Each row names the document (the open one carries an open badge), the file name or "pasted rows", the block id it is bound to, and its size. Release lets go of that document's saved rows and switches its column checks off. On the open document, Release does the same as the X in the dataset strip.

Rows are saved in this browser's local storage, per document, so the binding comes back when you reload. Be aware of these limits:

SituationWhat you seeWhat it means
The rows take more than 400,000 characters to store"These N rows are too large to keep locally (over 400k characters). They stay for this session — reloading will switch the column checks off."Keep the file to hand and read it again after a reload
Local storage is full"The rows could not be saved locally, so the column checks will not survive a reload. Local storage is full — clearing revision history makes room."Clear a document's revision history, or release rows you no longer need
Storage made room by dropping older copies"These rows replaced the copy saved for "Study A" — local storage keeps a limited amount of data, so that document's column checks stay off until its file is loaded again."Read that document's file again when you return to it
A saved copy is damaged"The saved rows for this document could not be read. Load the file again to restore the column checks."Read the file again
You loaded a template over the document"The rows bound to this document were released when the template replaced it…"The rows described the study that was there before. Read the file again if you still want them

Saved rows do not travel to other browsers or devices. On another machine, read the file again on the Data shelf.

How binding works

Binding is what makes the Data bench worth using. When the document declares a dataset block and the bench holds rows under the same id, every column reference in the document is checked against the real column names. A figure that names a column the rows do not have becomes a compile error, with the near-miss named, instead of a blank axis. The dataset block's declared rows: and columns: are also checked against the real counts and raise warnings if they disagree.

The block id comes from the dataset's name: trial-export.csv becomes trial_export_csv. Reading a file again lands on the id the document already names, so a corrected file re-binds silently. When the bench was empty and the document declares exactly one dataset block (after a reload that could not restore the rows, or when you open someone else's document), reading a file adopts that block and says "These rows were bound to the "trial_csv" block already in this document, so the column checks are on again." With several dataset blocks and nothing held, the bench does not guess and mints a fresh id.

When column checks cannot run, the Lab says so. The status popover's Validation section shows "Column checks not run" and explains either "Column checks did not run. This document declares 1 dataset block with no rows bound…" or "Column checks ran for 1 of 2 dataset blocks…". Load the data on the Data shelf to switch them back on.

The Clean shelf

The Clean shelf lists what is wrong with the rows and offers fixes. Every fix is applied by the cleaning engine, the columns are re-profiled from the result, and the document is re-bound to the edited rows at once.

Three buttons sit at the top and act on the whole dataset:

ButtonWhat it does
Trim spacesRemoves leading and trailing spaces from every text value
Drop empty rowsDeletes rows in which every cell is blank
Drop duplicate rowsDeletes rows that repeat an earlier row exactly, keeping the first of each

Below them, the shelf counts the issues found ("7 issues", or "52 issues · showing the first 40" when there are more than 40) and lists them. Each issue shows its type, the column it concerns, a count and an explanation. The issue types are:

LabelWhat it flagsOne-click fix
BlanksCompletely empty rows, or blank cells in a column (fewer than half its cells)Drop empty rows; for a numeric column, fill blanks with the column's median. Text columns get no suggestion, because only you know what belongs there
Mixed typesA text column in which at least 70% of the values are numbersConvert to numbers. When commas could be decimals or thousands, or the column writes numbers both ways, you get two choices instead (see below)
Duplicate rowsRows repeating an earlier row exactlyDrop duplicate rows
Stray spacesValues with leading or trailing spaces; the message says when this splits one category into two (" North" and "North")Trim that column
Constant columnA column with the same value in every rowDrop the column
Mostly blankA column with half or more of its cells blank, with its percentage blankNone. Filling more than half a column would be fabrication
Unnamed columnA column with no headerDrop the column, when it is also completely empty and is not the only column
OutliersIn a numeric column with at least 8 values, values outside the 1.5 × IQR fence, with the fence and the rows listedNone. Nothing is removed, because an extreme value is often the real finding
Mixed date formatsISO and slash dates in one columnConvert to ISO dates, when no day/month clash prevents it
Day/month order clashDay-first and month-first slash dates in one columnNone. Correct the odd ones out, or rewrite them as ISO dates
Impossible datesDate-shaped values that are not real days, such as 31/02None. The column is read as text until they are corrected
Day or month first?Slash dates where no day is above 12, so the order cannot be told. They are read month first until you chooseTwo choices: read slash dates day first, or month first

How each issue's fix is offered:

  • Fix. A Fix button with a one-line description beside it, for example "Fill blanks in "age" with the column's median…" or "Convert "visit_date" to ISO dates (2026-03-04) — values that are not recognised dates become blank." Click it to apply.
  • Choices. When only you can decide, the issue offers its answers as buttons, with none pre-chosen. For example "Convert "dose" to numbers, reading "," as the decimal point (0,5 → 0.5; 1,234 → 1.234)" beside "…reading "," as a thousands separator (1,234 → 1234)".
  • Refused fix. When the cleaning engine would refuse the suggested fix, the issue says so before you click: "The one-click fix for this one is refused: …" A common case is the last remaining column, which cannot be dropped.
  • No fix. "No one-click fix: this one needs a decision only you can make."

Issues are listed worst first: type problems (mixed types and the date issues), then unnamed columns, duplicates, mostly-blank columns, blanks, outliers, stray spaces and constant columns.

A successful edit shows a grey note describing what changed. An edit that changes nothing says "Nothing to change." A refused edit shows "That edit was refused." with the reason. When the rows are clean, the shelf says "Nothing to report — no blanks, mixed types, duplicates or outliers in these rows."

The Shape shelf

The Shape shelf edits the held rows. Every edit replaces the held dataset, so anything you derive afterwards is counted from the rows you can see, and the document is re-bound to them the moment the edit lands. It has three cards.

Sort

Choose a Column and a Direction (Ascending or Descending), then click Sort rows. The sort is stable, so rows with equal values keep their order, and blank cells go last in both directions.

Filter

Choose a Column, a Comparison, a Value (hidden for the blank tests) and whether Rows that match are kept or are dropped, then click Filter rows.

ComparisonMeaning
equals / does not equalExact match
is greater than / is at leastAbove, or at or above
is less than / is at mostBelow, or at or below
contains / does not containText containment, ignoring case
is blank / is not blankEmpty cells

equals and does not equal compare the cell's text exactly. For the four ordering comparisons, a number column needs a number ("The condition on "age" compares numbers, but "sixty" is not numeric — give it a number to compare against.") and a date column needs a recognisable date ("… is not a recognisable date — use ISO like 2026-03-04."). A blank cell never satisfies an ordering comparison. A filter that removes rows reports "Filtered out N rows (M remain)."

Derive a column

Type a New column name (placeholder age_group), choose what it is made From, fill in the fields that appear, and click Add the column.

FromFieldsResult
Two columnsLeft column, Operator (+, -, *, /), Right columnRow-by-row arithmetic
A column and a numberColumn, Operator, NumberThe column combined with a constant
A function of a columnColumn, FunctionSee the function table below
Part of a dateColumn (date columns only), Part: year, month, day or weekdayMonth is 1–12; weekday is 0 (Sunday) to 6 (Saturday)
Bins of a columnColumn, BinsEqual-width bins labelled by their range, such as 40–50
FunctionWhat it computes
log10, lnLogarithms. Values at or below zero are left blank, and a note says how many
sqrtSquare root. Negative values are left blank
absAbsolute value
zscore(value − mean) ÷ sample standard deviation. A constant column gives 0 throughout
cumsumRunning total in the current row order. A blank adds nothing but still receives the running total
pct-changePercentage change from the previous row. The first row, and any row after a zero or blank, is blank
rankAscending rank from 1; tied values share the average of their ranks
roundRounded to the nearest whole number

The functions, the arithmetic and Bins of a column need a number column; any other type is refused with "Can't derive with … it is a string column … Convert the column first." From starts at A column and a number, the Number box at 1, the Operator at *, the Function at log10, the Part at year and Bins at 4. Bins are clamped to between 2 and 50, and a note says so when your request was clamped ("Asked for 100 bins; equal-width binning is limited to 2–50 bins, so 50 were used."). A constant column produces one bin. A derived column cannot reuse an existing name ("A column called "age" already exists — pick a different name for the derived column.") and cannot be blank ("A derived column needs a name — a blank header labels nothing.").

The Derive shelf

The Derive shelf turns columns into typed FlowScript blocks. Pick one of five derivations from the tab strip. Each shows a one-line description, its own form, and a Derive from these columns button.

DerivationWhat it needsBlock it writes
DatasetNothingOne dataset block plus one column block per column
Arm countsA grouping columnA cohort (or a screened and an analysed cohort) plus one arm per level
2×2A binary outcome column and a two-level group columnOne contrast block with the four counts and, when the kernel allows, a risk ratio
Table 1A grouping column and at least one characteristicOne table_one block carrying every raw observation
SurvivalA numeric follow-up time column and an event indicator columnOne survival block carrying one time and one event code per subject

If a required picker is empty, you are asked for it first, for example "Choose the outcome column and the column that splits the subjects into two groups first — nothing can be counted until the bench knows which column that is."

Column pickers list every column as "name · type". The "which value" pickers list a column's distinct values. When a column has more than 24 distinct values, the picker becomes a text box: "type the value exactly as it appears".

The preview and the insert

A successful derivation shows a preview card:

  • The headline, such as contrast outcome_by_arm.
  • Summary lines, for example each arm's n, or each group's events / n.
  • What was used. "120 rows reached the block; none were dropped." or "…, 3 did not."
  • Notes in amber: rows dropped and why, which value was counted as the event, and any statistics-kernel refusal, word for word.
  • The FlowScript the bench will insert.
  • Insert as a … block. The label names the block kind: Insert as a dataset block, Insert as a cohort block, Insert as a contrast block, Insert as a table_one block or Insert as a survival block.

The block is appended to the end of the document and selected, and a toast confirms it ("Inserted contrast 'outcome_by_arm'"). The button then reads Inserted — derive again to add another and is disabled. Deriving again re-mints every id against the document as it now stands, so a second copy never collides with the first. Ids are always chosen to avoid every id already in the document.

If the columns cannot support the block, an amber box headed "These columns cannot support that block." gives the reason.

Dataset

Declares the rows. Optional fields: Title (defaults to the dataset name) and First row held the column names (Do not say, Yes or No, written as header: when you choose one).

The dataset block records rows: and columns:. Each column block records of: (the dataset), the column name: as a quoted string so it is checked, its type: (number, date, boolean, category for a text column with 12 or fewer levels, otherwise string), rows:, missing: as a fraction when any cells are blank, levels: for a category, and min:, max: and mean: where they apply.

The preview's last line says what the figures bind to. "Figures bind to: trial_csv" means the column checks will be on. "Declared as: trial_csv_2 — not bound; these rows are supplied as trial_csv" means the document already declares this dataset, so the new block is a second declaration that nothing supplies rows for. Delete the old block first if you meant to replace it.

Arm counts

Fields: Grouping column — its values are the arms and an optional Cohort label (default "Grouped by <column>"). Every distinct value becomes an arm with its count. The grouping column must have between 2 and 12 distinct values.

Rows with a blank group are not dropped silently. When there are any, the bench writes a screened cohort holding every row and an analysed cohort with a named exclusion for the blanks, so the flow's arithmetic still adds up and the figure says which rows went where.

2×2

Fields:

FieldDefaultNotes
Outcome column (binary)RequiredMust hold no more than two distinct values among the rows used
Group columnRequiredMust differ from the outcome column
Which value is the event"Infer it, or refuse if ambiguous"See event coding below
Interval coveragePlaceholder 0.95A fraction, not a percentage: type 0.9 for 90%. Typing 95 leaves the risk ratio out with the note "No risk ratio is written: A confidence level of 95 is not a fraction strictly between 0 and 1."
Group A (exposed)"First level in the rows"The treated or exposed row of the table
Group B (reference)"Second level in the rows"The comparator. It decides which way the ratio points
Label"<outcome> by <group>"

If the group column has more than two levels, name both groups or filter the rows first. Naming only one side works only when the column has exactly two levels.

The four counts are always counted from the rows. The risk ratio comes from the statistics kernel, which applies Katz's log standard error and, when any cell is zero, the Haldane–Anscombe correction, which it declares in the notes. When the kernel refuses, for example no events in either arm, the estimate is left out and the note reads "No risk ratio is written: …" with the kernel's reason. The block is still written, because the counts are still real.

Event coding

The 2×2 and Survival derivations need to know which value means "the event happened". When you leave Which value is the event on its default, the bench infers it only from codes that cannot mean anything else, compared case-insensitively:

Read as the eventRead as no event
1, true, yes, y, t, event, case, positive, pos, dead, death, died, failure, relapse0, false, no, n, f, none, censored, control, negative, neg, alive, survived, event_free

A numeric code is trusted only against a value that clearly means "no event". A column holding 1 and 2 is refused, because 1 = no / 2 = yes is a common export coding and reading it the wrong way would invert every count. In that case, and whenever the values are ambiguous, choose the event value yourself or recode the column to 0/1.

Table 1

Fields:

FieldNotes
Grouping column — its values are the table columns2 to 8 distinct values
Bind rows to a dataset blockNot bound — no column checks, or one of the document's dataset blocks
Characteristics, in the order you tick themTick boxes for every other column, with its type. The order you tick them is the row order
TitleDefault "Baseline characteristics by <group>"

Each characteristic row carries the raw observations, not summaries, so the table computes its own means, medians and missingness and redraws correctly when a row is corrected. A numeric column becomes a continuous row; a text or boolean column becomes a categorical row of level counts, with at most 12 levels. Date columns are refused: derive an age or a duration first.

Binding matters here. The bind picker labels each option "trial_csv — these rows, columns checked" or "other_block — other rows, columns NOT checked". Binding to a block other than the one the bench supplies rows for switches the column checks off for the whole table, and an amber warning says so. If the document does not yet declare a dataset block for these rows, the picker reminds you to derive one first.

Blank characteristic cells are counted in the column denominator and printed as missing, and a note tells you how many.

Survival

Fields:

FieldNotes
Follow-up time (numeric)Only number columns are offered. Times must be zero or more
Event indicatorBinary; see event coding above
Arm (optional)"One curve for everybody", or a grouping column with 2 to 12 levels
Which value is the event"Infer it, or refuse if ambiguous"
Time unitPlaceholder months. Written as time_unit, which labels the axis
TitleDefault "Time to <event column>"

Nothing is written until the Kaplan–Meier estimator has accepted the records. If nobody had the event, the bench refuses, because a curve flat at 1 would assert that nobody had the outcome. If you leave the time unit blank, a note reminds you to set time_unit before publishing. The block turns on the numbers-at-risk table and censor marks.

Derivation limits

LimitValue
Distinct groups in a grouping column (arms, 2×2 group, survival arm)12
Columns of a Table 18
Levels of a categorical Table 1 row, or listed levels of a category column12
Observations a table_one cell or a survival block may carry5,000
Decimal places written for a derived number10

FlowScript numbers have no exponent form, so a value too large or too small to write as a plain decimal is refused with a message telling you to rescale the column (for example with a log10 derived column or a divide).


The Statistics bench

The Statistics bench has two shelves: Calculate and Method finder. The tab strip ends with "computed, never retyped". Every number it shows comes from the Lab's statistics kernel, the same code the renderers and the validator use, and every result names the formula and the citation behind it.

The Calculate shelf

  1. Choose a calculator from What are you working out?. Under it you see the question the calculator answers, in italics, and a one-line description.
  2. Fill in the fields. Every field starts at a worked default, so you can press Compute straight away to see the shape of an answer.
  3. Click Compute.
  4. Read the result card: the headline number, supporting lines, the method sentence, the citation, and any notes in amber.
  5. Check the FlowScript preview, then click Insert as a … block.

Percentages are entered as percentages (type 80 for 80%) and passed to the kernel as fractions. Any edit to a field clears the result, so a result on screen always belongs to the inputs on screen; press Compute again. After an insert the button reads Inserted — compute again to add another and is disabled until you compute again. The inserted block is appended to the document and selected, its id is renamed if it would collide, and a toast confirms it. The note under the button reminds you that "The block carries these numbers into the document, where the validator, the renderers and the publish preflight all read them."

When the kernel refuses, an amber box headed "The kernel refused this input." gives its reason. No partial or guessed result is shown.

The eleven calculators

CalculatorModuleQuestionWrites
Sample size — two proportionsDesign & powerHow many participants per arm to detect this difference in event rates?power
Sample size — two meansDesign & powerHow many participants per arm to detect this difference in means?power
Events required — survivalDesign & powerHow many events does a trial need to detect this hazard ratio?power
Effect size — 2×2 tableEffect sizesHow big is the effect, and how sure are we?contrast
Effect size — two group meansEffect sizesHow large is the difference between these two groups?contrast
Diagnostic accuracy — 2×2Diagnostic accuracyHow well does this test identify the condition?diagnostic
Meta-analysis — pool study estimatesMeta-analysisWhat do these studies say together?meta with one estimate per study
Health economics — ICER and net benefitHealth economicsIs it worth the money?icer
Descriptive — baseline table rowDescriptiveWhat do these data look like, and do the groups differ?table_one
Survival — Kaplan–Meier and log-rankSurvivalHow long until the event, and does it differ between arms?survival
Diagnostic — ROC curve and AUCDiagnostic accuracyDoes this test discriminate, and at which cut-off?roc

The design fields

The two sample-size calculators share five design fields; Events required — survival uses all of them except Expected dropout.

FieldDefaultRange
Target power80%50–99.9%. Shown with the hint "1 − β"
Alpha0.050.0001–0.5
SidesTwo-sidedOr One-sided (must be justified)
Allocation ratio10.1–10, as n₂/n₁
Expected dropout0%0–90%

Dropout inflates each arm separately, and the total is the sum of the inflated arms, so the per-arm and total figures always agree. When the arms are unequal, the headline names each arm's n rather than saying "per group", and the block omits n_per_group with a note explaining why.

Calculator details

Each calculator's own fields, defaults and result lines are listed below. Defaults are shown in brackets.

Sample size — two proportions

Fields: Control event rate (default 30%) and Treated event rate (default 20%), both 0.1–99.9%, the design fields, and Variance form: Pooled (score test), Unpooled or Arcsine (Cohen's h). The result shows the randomised total and per-arm numbers, the achieved power at that n, the unrounded requirement and the absolute risk difference in percentage points.

Sample size — two means

Fields: Difference to detect (default 5, "In the outcome's own units"), Standard deviation (default 12), the design fields, and Method: t (exact, noncentral) or Normal approximation. The result adds the standardised effect (d).

Events required — survival

Fields: Hazard ratio to detect (default 0.7), the design fields without dropout, and Method: Schoenfeld or Freedman. The headline is the number of events required; a time-to-event trial is powered on events, not participants.

Effect size — 2×2 table

Fields: Treated — events (15), Treated — no event (85), Control — events (30), Control — no event (70) and Interval coverage (95%). The headline is the risk ratio with its interval; the lines add the odds ratio, the risk difference, the number needed to treat and the group sizes. When the risk-difference interval spans no effect, the NNT line shows the two-sided presentation (for example "NNTB 6.1 to ∞ to NNTH 15.2"). A zero cell triggers the kernel's ½ correction, and its note is shown. The inserted contrast block records the two groups (treated and control, with control as the reference), their sizes and their event counts; the ratios on the bench are not written into the block as numbers.

Effect size — two group means

Fields: Group A — mean (12.4), Group A — SD (3.1), Group A — n (60), Group B — mean (10.1), Group B — SD (3.4), Group B — n (58) and Interval coverage. The headline is the mean difference with its interval; the lines add Hedges' g and a summary of each group.

Note: The contrast block this calculator inserts records only the two group names and their sizes (n_a, n_b). The means, SDs, mean difference and Hedges' g shown on the bench are not written into the document. Copy them, with the method sentence, into a source note if you need them recorded.

Diagnostic accuracy — 2×2

Fields: True positives (92), False positives (18), False negatives (8), True negatives (182) and Interval coverage. The headline is sensitivity with its interval, as a percentage. The lines give specificity, positive and negative predictive values, LR+ and LR−, and the number tested. Every measure keeps its row even when it is undefined for your table, in which case the row carries the kernel's explanation. The predictive-value notes remind you that a PPV depends on the prevalence of the sample it came from.

Meta-analysis — pool study estimates

Fields:

FieldOptions
Study rowsOne study per line. Default: four trials as Trial A: 0.68, 0.51, 0.90
Input formEstimate with confidence interval (Label: estimate, lower, upper), Estimate with standard error (Label: estimate, standard error), or 2×2 counts (events, n per arm) (Label: events treated, n treated, events control, n control)
MeasureRisk ratio, Odds ratio, Hazard ratio, Risk difference, Mean difference, Standardised mean difference
Pooling modelRandom effects — DerSimonian–Laird, Random effects — REML, Random effects — Paule–Mandel, Random effects — Hartung–Knapp–Sidik–Jonkman, Fixed (common) effect
Coverage of the published intervalsThe level each study's interval was published at, used only to recover its standard error
Interval coverageThe level of the pooled interval

Ratios are pooled on the log scale automatically. A mean difference or SMD cannot be computed from 2×2 counts; enter the published estimate and interval instead. For a ratio entered with a standard error, the SE must be on the log scale. The result gives the pooled estimate, the studies and participants pooled, I², τ², Q with its degrees of freedom, the heterogeneity test, the test of the pooled effect, the prediction interval when there is one, and the estimate under the other model. The block carries one estimate row per study with its weight, so a forest plot can be drawn from it.

Health economics — ICER and net benefit

Fields:

FieldDefaultNotes
StrategiesUsual care: 20000, 7.68 and New pathway: 32000, 8.10Name: cost, effect, the comparator first. Add , cost SE, effect SE for an interval
Willingness to pay30000Money per unit of effect (λ)
CurrencyGBPFree text
Effect unitQALYMust not be empty
Cost–effect correlation0−1 to 1; used only when standard errors are given
Interval coverage95%

The result gives the comparison, incremental cost and effect, the ICER (or the dominance verdict when one strategy dominates), the net monetary and net health benefit at your threshold, and the probability that the strategy is cost-effective ("not estimable — no standard errors were given" without SEs). The ratio is always computed for the strategy on the second line. With three or more strategies, the bench builds the efficiency frontier (listed in an Efficiency frontier line showing each strategy as on the frontier, dominated or extendedly dominated) and measures the second-line strategy against its next-best non-dominated alternative, which may not be the first line; a note says when that happens. If the second-line strategy is the cheapest on the frontier, the bench refuses and asks you to put the strategy you want the ratio for on the second line.

Descriptive — baseline table row

Fields: Characteristic (Age), Unit (years), Observations (Arm: v1, v2, …, one arm per line; a single line gives a one-column summary), Summary form (Mean (SD), Median [IQR], Median [range], Mean (CI), Geometric mean), Between-group test (Welch t / ANOVA, Mann–Whitney / Kruskal–Wallis, Chosen by the kernel's policy, None — report the SMD only), Digits (0–6) and Interval coverage. The result shows each arm's summary and n, an all-participants column, the standardised mean difference with a balanced or imbalanced verdict, and the test. The block keeps the raw values, so the table redraws from the data.

Survival — Kaplan–Meier and log-rank

Fields: Follow-up times (Arm: time, time+, …, one arm per line; a trailing +, * or c marks a censored observation), Time unit (months; must not be empty), Test weighting (Log-rank (Mantel–Cox), Gehan–Wilcoxon (early events), Tarone–Ware) and Interval coverage. The result gives each arm's median with its interval (or "not reached"), events, censored count, the test for a difference, a hazard ratio for two arms, and the median follow-up. The hazard ratio is the Yusuf–Peto one-step approximation, not a fitted Cox model, and a note says so.

Diagnostic — ROC curve and AUC

Fields: Scores — condition present and Scores — condition absent (one score per subject), Direction (A higher score means the condition is present or A lower score means the condition is present), Optimal cut-off rule (Youden's J (sensitivity + specificity − 1) or Closest to (0, 1)) and Interval coverage. The headline is the AUC with a DeLong interval; the lines give the subjects, the Mann–Whitney U, the optimal cut-off with sensitivity and specificity there, and the number of distinct scores and ties. The block carries the curve and every subject's score, and is marked validation: apparent.

Entering rows of numbers

The rows fields (study rows, strategies, observations, follow-up times and ROC scores) accept one record per line in the form Label: value, value, value. You can also use ; as a line break. Values can be separated by commas, tabs, pipes or spaces, because papers, spreadsheets and exports disagree. A line without a label is named "Group 1", "Group 2" and so on, or "All" when it is the only line. In the baseline-row and Kaplan–Meier calculators, two lines with the same label are refused; put all of an arm's values on one line.

Decimal commas are handled carefully, because guessing wrong would change n:

You typeRead as
61, 58, 64Three values (commas separate)
5,3 4,9 6,1Three values with decimal commas (5.3, 4.9, 6.1), because the values are separated by spaces. A note says so
5,3, 4,9Refused as ambiguous: "could be one number with a decimal comma or two values"
1,234.5Refused as ambiguous; write 1234.5
20,000 7,5Refused as ambiguous: "20,000 could be 20000 with a thousands separator or 20.000 with a decimal comma"

An ambiguous field is refused with the field name, the line and the token, followed by "Use a dot for decimals (5.3), or a comma and a space between values (5, 3)." For a value like 1,234.5 the advice is instead "Write it without the thousands separator (1234.5)."

Empty and invalid boxes

A cleared number box is never read as zero. Pressing Compute with one empty gives "The "False positives" box is empty. A cleared box is not a zero and this bench will not read it as one — type the value you meant, or put back the field's default of 18." A non-number gives "… is not a finite number." Empty rows fields get a message naming the field and showing the line format, for example "No study rows were given. Write one study per line — Trial A: 0.68, 0.51, 0.90 — and at least two lines…"

The Method finder

The Method finder searches every method the statistics kernel implements: 176 methods across eight modules, each with its formula and, where one exists, its citation.

  1. Type in the search box (placeholder "risk ratio, kaplan, power…"). Every word you type must appear in the method's name, module or formula.
  2. Optionally narrow by module. Every module is the default; the others are listed in reporting order. Picking a module shows the question it answers.
  3. Read the count ("176 methods"). The list shows at most 60 at once ("· showing the first 60"); narrow the search to see the rest.
ModuleMethodsWhat it answers
Design & power32How many subjects does the study need?
Effect sizes24How big is the effect, and how sure are we?
Descriptive36What do these data look like, and do the groups differ?
Survival14How long until the event, and does it differ between arms?
Diagnostic accuracy30Does this test discriminate, is it calibrated, and is it useful?
Meta-analysis16What do the studies say together?
Health economics12Is it worth the money?
Distributions12What is the tail probability, or the critical value, under this law?

Only eleven methods have a form on the Calculate shelf. The rest, such as non-inferiority sample sizes, RMST, trim and fill, calibration slope or decision-curve analysis, are reachable by writing FlowScript; see The FlowScript language. If nothing matches, the shelf says "Nothing matches those words. Try one term at a time."

Note: The kernel has no agreement or reliability statistics: no Cohen's kappa, weighted kappa, ICC, Bland–Altman, concordance correlation or Cronbach's alpha. Compute those elsewhere and record where the numbers came from with a source note (see Publishing, provenance and compliance in Lab).

The Advisor

The Advisor answers "what should I do next?" for the open document. It reads the compiler's messages, the reporting standards that apply, the provenance record and your field, and ranks the next moves. It works offline, uses no AI, and gives the same answer every time for the same document. Open it from the rail's Advisor button or ⌘K. It shares the right-hand column with Provenance, Publish, Comments and the other panes, one at a time.

Choosing your field

The picker What field is this work in? sets which analyses and figures the Advisor proposes, and in what order. It starts at General figure each time you open the Lab. The fields are:

FieldCalculators it leads with
General figureNone
Clinical trialTwo-proportion, two-means and survival sample sizes; 2×2 effect size; baseline row
Observational epidemiology2×2 effect size, baseline row, Kaplan–Meier
Systematic review and meta-analysisMeta-analysis, 2×2 effect size
Diagnostic and prognostic accuracyDiagnostic 2×2, ROC
Health economicsICER and net benefit
Quality improvementBaseline row, 2×2 effect size
Machine-learning evaluationROC, diagnostic 2×2
Qualitative researchNone
Laboratory and animal scienceTwo-means sample size, two-means effect size
Engineering reliability and riskKaplan–Meier, events required
Project deliveryNone
Business and financeNone

Under the picker is the field's description and a Show the N coaching lines for this field toggle, which reveals the field's practical guidance and a note on which reporting standards it is scored against.

How proposals are ranked

Proposals are grouped into bands, in this fixed order. Click a band's heading to read why it sits where it does.

BandWhat it holds
Get startedShown alone when the document is empty: start from a standard's skeleton, draw a view, Bring your data in, or open your field's first calculator
Make it compileCompiler errors, in source order, each with Go to line N
Meet the standardUnmet items of the reporting checklists your figure is scored against
Say where the numbers came fromTyped numbers with no source, a figure with no dataset, a dataset the document never declares
Analyse and drawYour field's preferred calculators and views that the document does not have yet
Finish itCompiler warnings, the caption, the alt text, and Check the figure against a journal

Each proposal shows an area chip (Fix, Build, Data, Analyse, Standards, Draw or Publish), a title, its rank number and the engine's own sentence explaining it. The list stops at 12 proposals; the count in the header says how many there are. When nothing is outstanding it says "Nothing to propose…".

Acting on a proposal

ButtonWhat it does
Open the source, Open the statistics bench, Open the data bench, Open the views gallery (or Open the views gallery at … a named renderer)Opens that shelf of the workbench
Open this calculator on the benchOpens the Statistics bench with that calculator selected and its defaults loaded
Declare a … viewAdds the view to the document
Open this checklist / Open this checklist at …Opens the Standards bench at the standard or item
Open the provenance rail / Open the publish checksOpens the Provenance or Publish pane in the Advisor's place
Go to line NOpens the source and puts the cursor on the line
Insert the … block / Merge into the … blockWrites a snippet into the document (see below)

A proposal that writes into the document never does so blind. Click Show the N lines you have to write (or Show what this writes) first; the same button then reads Hide what this writes. The disclosure says whether it appends a new block ("This appends a new … block.") or merges attributes onto an existing one ("These attributes go onto the … block this document already has."), lists the placeholder lines you will have to replace ("Nothing in it claims anything about your work…"), shows the snippet, and only then offers the insert button. Every value in a snippet is a TODO — … placeholder, and the proposal stays on the list until you replace them. If you choose Merge into the … block but the document has no block of that kind, a new block is appended instead and the toast says so. The inserted block is selected, and ⌘Z takes it back.


Photo → FlowScript

Photo → FlowScript…, in the ⋮ menu under Import, opens the Photo → Engine dialog. It photographs or uploads a real-world artefact, such as a whiteboard flow, a printed table or a hand-drawn chart, and AI picks the best-matching engine on the platform and recreates the artefact as editable source.

  1. Choose Use camera or Upload image. You can also drop an image anywhere on the dialog or paste a screenshot. Accepted formats are PNG, JPEG, WebP and GIF. Every image is scaled so its long edge is at most 1,600 pixels and re-encoded as JPEG before it is sent. While the browser asks for camera permission the card reads Waiting for the camera….
  2. With the camera, click Take photo. Flip switches between rear and front cameras; Cancel returns to the choice. Under the captured photo, Retake starts again.
  3. Optionally fill in Optional hint (placeholder "e.g. this is a circuit; or this is a floor plan from a real-estate listing"). Hints are cut to 400 characters.
  4. Click Recognise & convert. The button reads Recognising photo… while it works.
  5. Read the result: "Recognised as <engine>" with a confidence chip ("N% confident", or "confidence not reported" when the model gave none), any short note from the model, the source, and possibly Closest templates on the platform. Clicking a template replaces the result with that template's source (no confidence is shown for a template, because the AI never scored it); revert to AI recreation brings the AI's answer back without spending more points.
  6. Choose what to do with it:
ButtonEffect
Open in workstationOpens the source in the studio that owns the recognised engine. A FlowScript result opens as a new Lab document rather than overwriting the open one
Edit in LabShown only for a FlowScript result. Replaces the open document's source and closes the dialog; the toast "Recognised FlowScript loaded" offers Undo, and ⌘Z works too
DownloadSaves the source as recognized-<engine>-<timestamp>.<ext>, with the engine's own extension (.glyph for FlowScript, .txt when the engine has none)
CopyCopies the source to the clipboard ("Copied the code"). Needs a secure (https) page
Try againClears the result so you can recognise again (a new recognition spends points again)

Each recognition costs 2 AI points on hosted AI (Plus and up), or runs on your own AI key (Starter and up), which spends no points but counts towards a daily fair-use ceiling. Points are charged once the AI answers, even if its answer then turns out to be unusable. Replacing the photo or closing the dialog cancels a recognition that is still running. You can also open the dialog from ⌘K with Photo → FlowScript…. See AI points and limits and Bring your own AI key.


Tips

  • Derive a dataset block first. Until the document declares one for your rows, nothing checks column names. Deriving it is the single step that switches the checks on.
  • Clean before you derive. Derivations count the rows as they are held. Fix mixed types and decimal commas on the Clean shelf first, then derive.
  • Name the event yourself when in doubt. It costs one click and removes any chance of an inverted 2×2 or survival curve.
  • Use Table 1 and Survival from the Data bench when you have the rows. Both carry every observation, so the figure recomputes from data. The Statistics bench's baseline-row and Kaplan–Meier calculators are for when you only have the values on paper.
  • Mind the coverage formats. The Data bench's 2×2 Interval coverage is a fraction (0.95); the Statistics bench's is a percentage (95).
  • Use the Method finder to cite. Every method lists its formula and reference, which you can quote in your Methods section.
  • Let the Advisor pick the order. Set your field, then work down the list; the bands are ordered by what stops a figure being accepted.

Limits and known constraints

  • Files: 12 MB per intake; 200,000 rows and 256 columns per dataset; only the first sheet of a workbook; no .xls.
  • Derivations: at most 12 groups, 8 Table 1 columns, 12 category levels and 5,000 observations per block.
  • Persistence: rows are saved per document in this browser only, up to 400,000 characters each and about 800,000 characters across all documents; past that the least recently saved documents' rows are dropped, and the bench names them. Larger rows last for the session only.
  • The Clean shelf lists at most 40 issues at a time (the count is exact), and offers no automatic fix for outliers, sparse columns, impossible dates or day/month clashes.
  • The Statistics bench has forms for eleven methods only; the other kernel methods need FlowScript. There are no agreement or reliability statistics.
  • Units: on the Kaplan–Meier calculator, the time unit is attached to the median and follow-up figures only when it is one the compiler recognises (seconds, minutes, hours, days, weeks, months or years, in forms such as s, min, h, d, wk, mo, yr, day, months). Any other word is kept as text in time_unit, and the numbers are written bare.
  • Effect-size blocks: the two effect-size calculators write group sizes and counts into their contrast blocks, not the estimates shown on the bench.
  • The Advisor's field is not remembered between visits; it starts at General figure.
  • Photo → FlowScript needs AI and a secure (https) page for the camera. Chrome and Firefox cannot decode HEIC (the iPhone default) and some AVIF and TIFF files.

Troubleshooting

What you seeWhereWhat it meansWhat to do
"No data yet — paste rows or drop a file."Data shelfThe Rows box is emptyPaste or upload rows
"No rows found — is the first line a header?" or "Couldn't parse: …"Data shelfThe text is not a tableMake sure the first line holds column names, and set the delimiter
"That's 250,000 rows — the limit is 200,000. Take a sample or aggregate first."Data shelfToo many rowsSample or aggregate first
"300 columns — the limit is 256."Data shelfToo many columnsRemove columns you do not need
"Invalid JSON: …", "This JSON is an object, not a table…", "This JSON is a single value, not a table.", "The JSON array is empty — no rows to chart."Data shelfThe JSON is not an array of row objectsProvide [{"col": value}, …] or an object with the rows under data, rows, values or records
"Unterminated quote on line N — everything after it was read as one cell…"Data shelfA quoted field is never closedClose the quote, or double it ("") for a literal quote inside a field
"Row N has 2 values more than the 5 columns in the header…"Data shelfA row is wider than the header, usually because a title line sits above the real header rowRemove the title line, give every column a header, or choose the right delimiter
"… is 14.2 MB, over the 12.0 MB limit for a single intake, so it was not parsed."Data shelfThe file is too largeExport fewer columns, or aggregate
"… could not be read as a workbook (…). Save it as CSV and try again."Data shelfThe workbook could not be openedSave as CSV, or re-save as .xlsx
"… has no rows in its first sheet…"Data shelfThe data is on another sheetMove it to the first sheet, or save that sheet as CSV
"… could not be read (…). Try picking it again, or paste the rows below."Data shelfThe file moved or became unreadable after you picked itPick it again
"Couldn't stage the rows (too large or storage unavailable)."Open these rows in FigureThe handover failedDownload the CSV and open it in Figure
"The one-click fix for this one is refused: …"Clean shelfThe engine would refuse the fix, for example dropping the only columnRead the reason; fix the data another way
"A column called "x" already exists — pick a different name for the derived column."Shape shelfName clashChoose another name
"Can't derive with "log10" from "x" — it is a string column…"Shape shelfThe derivation needs a number (or, for Part of a date, a date) columnConvert the column on the Clean shelf first
"The condition on "x" compares dates, but "…" is not a recognisable date…"Shape shelf, FilterThe comparison value is not a dateType the date in ISO form, such as 2026-03-04
"Choose … first — nothing can be counted until the bench knows which column that is."Derive shelfA required picker is emptyChoose the column
"Column "x" has 40 distinct values across 200 rows, which is more than the 12 a … can carry…"Derive shelfThe column is an identifier, not a groupPick another column, or bin it on the Shape shelf
"Column "x" holds one value — "A" — in all 120 rows…"Derive shelfNothing to comparePick a column that varies
"Column "x" takes 3 distinct values (…). This needs a binary indicator…"2×2, SurvivalThe outcome is not binaryRecode to 0/1, or derive an indicator column
"Column "x" holds "1" and "2". A number only means "the event happened" when the other value means it did not…"2×2, SurvivalAmbiguous codingChoose the event value, or recode to 0/1
"Column "x" has 3 levels (…). A 2×2 compares exactly two — name which two, or filter the rows first."2×2Too many groupsChoose Group A and Group B
"No risk ratio is written: …"2×2 previewThe kernel refused the estimateRead its reason; the counts are still inserted
"Column "time" is negative in 2 rows (first: row 14)…"SurvivalNegative follow-up timesShift the origin so all times are zero or more
"… so every one of them is censored and the curve would be flat at 1…"SurvivalNo eventsCheck the event coding, or report follow-up instead of a curve
"… Above 5,000 the document stops being editable; aggregate or sample first."Table 1, SurvivalToo many observationsSample, or summarise to a life table
"Declared as: … — not bound; these rows are supplied as …"Dataset previewThe document already declares this datasetDelete the old dataset block if you meant to replace it
"Column checks did not run…"Status popover, ValidationA dataset block has no rows boundLoad the file again on the Data shelf
"The kernel refused this input."Statistics benchThe inputs cannot produce the estimateRead the kernel's reason and change the inputs
"The "…" box is empty. A cleared box is not a zero…"Statistics benchA number field is blankType a value, or restore the default shown
"…, line 2: 5,3 could be one number with a decimal comma or two values…"Statistics bench rows fieldsAmbiguous commasUse a dot for decimals, or a comma and a space between values
"The effect unit is empty…" or "The time unit is empty…"ICER, Kaplan–MeierA required unit is blankName the unit
"The browser refused access to the camera…"Photo → EngineCamera permission deniedAllow the camera in the address bar, or use Upload
"This browser could not decode … HEIC…"Photo → EngineThe image format is not supportedConvert to PNG or JPEG
"Photo is too large — resize to under ~3 MB and retry."Photo → EngineThe encoded image is too large to sendUse a smaller or simpler image
"Local storage is full, so the recognised diagram could not be saved as a Lab document…"Photo → Engine, Open in workstationThe new document could not be savedClear some space, or use Download or Copy
"You're out of AI points (…)", "Hosted AI isn't included on the … plan…" or "Daily AI quota reached…"Photo → EngineNo hosted AI left on your plan or allowanceAdd your own key in Settings, buy a top-up pack, or upgrade. See AI points and limits
"The camera has not delivered a frame yet…"Photo → Engine, Take photoThe camera is still startingWait a moment and press Take photo again, or use Upload

Something unclear or out of date on this page? Tell us from the Support link in any studio — the flowss team reads every report.

© 2026 Voranox Inc. flowss — Flow Systems Studio. All rights reserved.

This documentation, its text and its examples are protected by copyright. Engine and format names are trademarks of their respective owners — see the terms and copyright and licences.