Drop an FCS file and run a full integrity check — structure, keywords, channels, and the spillover matrix.
Diagnoses the “$SPILLOVER size discrepancy” error from BD FACSDiva and other instruments.
🔒 Your file never leaves your computer. The validator runs entirely in your browser.
FlowVision desktop opens this file in seconds and adds gating (polygon, rectangle, ellipse, quadrant with auto-fit), spectral unmixing, reproducible UMAP, MFI statistics, multi-file batch, and FlowJo .wsp + Gating-ML 2.0 export. Windows + macOS, $99 lifetime.
Download FlowVision Free Trial15-day full trial · No account · Windows 10 / 11 + macOS (Apple Silicon & Intel)
A flow cytometry FCS file looks fine until a downstream tool refuses it. The error usually points at the file's TEXT segment — the block of metadata keywords that describe how the data was acquired — rather than the event data itself. A keyword that is missing, duplicated, or internally inconsistent will stop flowCore, R, Python, or a strict analysis app cold, even though the actual measurements are perfectly good.
This validator runs the file through the same parser as the FlowVision desktop app, then applies a battery of independent checks and tells you exactly what a strict reader would object to — before you waste time round-tripping the file or rebuilding an analysis.
The single most common reason a valid-looking FCS file fails in R is a malformed $SPILLOVER keyword. The keyword stores the compensation matrix as a single comma-separated string:
A leading count n, then exactly n channel names, then exactly n×n matrix values — 1 + n + n² tokens total. When a BD FACSDiva user edits compensation by hand, the export can write a count that no longer matches the number of names or values (often a trailing comma or an off-by-one count). flowCore then throws “$SPILLOVER size discrepancy” and refuses the file. FlowJo is forgiving and silently repairs it on re-save — which is why the usual fix is to open and re-save through FlowJo. This validator shows you the malformation directly and proposes a corrected string, so you can understand and fix it without a FlowJo licence.
For a full walkthrough — what the error means, why FACSDiva causes it, and three ways to fix it — read the guide: Fixing the flowCore “$SPILLOVER size discrepancy” error →
$PAR / $TOT, $DATATYPE, $MODE, byte order, and DATA segment size vs declared event count$PnN detector names, $PnE / $PnR amplifier sanity, $BEGINDATA / $ENDDATA agreement, $NEXTDATA multi-dataset detection$PnN, diagonal normalisation, and a suggested corrected string when it is malformedA PASS verdict means a strict reader like flowCore should accept the file. A WARN flags things that are unusual but legal. A FAIL flags something that will likely cause a downstream tool to reject the file.
It is an error thrown by flowCore (the R/Bioconductor package most cytometry pipelines build on) when the $SPILLOVER keyword in an FCS file's TEXT segment is internally inconsistent. A valid value is formatted as n,name1,…,nameN,m11,…,mNN — a leading count n, then n channel names, then exactly n×n matrix values, for 1 + n + n² comma-separated tokens. When the declared count n does not match the number of names or values present, flowCore raises a size discrepancy. The most common cause is BD FACSDiva exporting a manually edited compensation matrix with a trailing or mismatched token. This validator parses the matrix the same way, reports the exact declared-vs-actual counts, and suggests a corrected string.
FlowJo is tolerant of a malformed $SPILLOVER keyword — it silently ignores or repairs it, then re-writes a clean matrix when you re-save the workspace. flowCore is strict and refuses the file outright with a $SPILLOVER size discrepancy. That is why the usual workaround is to round-trip the file through FlowJo. This validator lets you see the malformation directly and copy a corrected $SPILLOVER string, so you can understand the problem without needing a FlowJo licence.
Structural checks (FCS version, header offsets, TEXT segment, $PAR / $TOT, $DATATYPE, $MODE, byte order, DATA segment size vs declared event count), keyword checks (required keywords present, duplicate $PnN detector names, $PnE / $PnR amplifier sanity, $BEGINDATA / $ENDDATA agreement with the header, $NEXTDATA multi-dataset detection), and a deep $SPILLOVER / $SPILL matrix check (token-count consistency, channel names matching $PnN, diagonal normalisation). Each check reports PASS, WARN or FAIL with an explanation.
No. The validator runs entirely in your browser via JavaScript. Your file is read into local memory and parsed on the client — it is never sent to any server. Open your browser's Network tab while you drop a file to verify: there are no upload requests.
The validator diagnoses problems and, for a malformed $SPILLOVER matrix, suggests a corrected matrix string you can paste into your pipeline or use to hand-edit the keyword. It does not yet rewrite and re-download a corrected binary FCS file — safely re-writing the TEXT segment and recomputing byte offsets needs careful per-file testing, and a tool that silently corrupted your data would be worse than no tool. Binary repair is on the roadmap. For now, the corrected string plus a FlowJo round-trip covers the common BD FACSDiva case.
FCS 2.0, 3.0, 3.1 and 3.2 — the same coverage as the FlowVision desktop app. Files from BD (FACSDiva, Chorus, FACSDiscover S8), Cytek (SpectroFlo on Aurora and Northern Lights), Sony (ID7000), Beckman Coulter (CytoFLEX, DxFLEX, Kaluza) and Stratedigm all use the same FCS standard and are validated identically. All standard datatypes (Float32, Float64, Integer 8/16/32/64), little- and big-endian, list mode.
The validator only needs the file header and TEXT segment, but the browser still allocates the full file in RAM first. The tool refuses files larger than 1.5 GB (browsers crash above that) and warns above 500 MB. For typical 50–500 MB files validation is instant. For multi-GB spectral files, use the FlowVision desktop app.