Free in-browser tool — no upload, no account

FCS Validator

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.

Drop FCS file here or click to choose
FCS 2.0 / 3.0 / 3.1 / 3.2 · validated locally in your browser

🔒 Your file never leaves your computer. The validator runs entirely in your browser.

Need to actually analyze the data?

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 Trial

15-day full trial · No account · Windows 10 / 11 + macOS (Apple Silicon & Intel)

Why validate an FCS file?

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 BD FACSDiva “$SPILLOVER size discrepancy” problem

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:

n, name₁, name₂, …, nameₙ,  m₁₁, m₁₂, …, mₙₙ

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 →

What this validator checks

A 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.

Frequently asked questions

What does "$SPILLOVER size discrepancy" mean?

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.

Why does my BD FACSDiva file fail in flowCore / R but works in FlowJo?

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.

What checks does the validator run?

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.

Is my FCS file uploaded anywhere?

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.

Can the validator give me a corrected FCS file back?

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.

Which FCS versions and instruments are supported?

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.

Is there a file size limit?

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.

More free FCS tools

Inspect FCS metadata, keywords & channels →
Convert FCS to CSV online — for Excel, R, Python →
All free FlowVision tools →

← Back to FlowVision home