Your file is the specimen · number
The Part of Your File That Will Not Shrink
Drop any file up to 8 MiB and this page attempts three named lossless descriptions entirely on your device, decodes every output it counts, and shows the byte-for-byte check first. On the shipped 152,089-byte alice29.txt it meets two published gzip figures for the same bytes, 2.86 bits per character in Arnold and Bell's paper and 2.85 on the corpus website, beside their separate 2.30 PPMC result. The concession is the result: these lengths are upper bounds under chosen codecs and decoder accounting, not the file's information content, randomness, or an incompressible core.
0 · the published anchor runs first
shipped specimen, exact bytesRoss Arnold and Tim Bell's 1997 Canterbury Corpus paper prints two different rates for the same alice29.txt: gzip at 2.86 bits per character, and their separate PPMC implementation at 2.30. Before this page accepts your file, it runs the exact corpus member through this browser's gzip, opens it again, and compares all 152,089 bytes.
the value reproduced here when this engine rounds to the same figure
historical disagreement, quoted but not reproduced by the custom order 1 model
The file control remains closed until this finishes or gives a specific refusal.
Two published gzip figures already exist for these same 152,089 bytes. Arnold and Bell's Table 4 prints 2.86. The corpus website's own results page for the method it calls gzip-b, last updated 3 May 2001, prints 2.85 for the same text file. GNU gzip 1.12 on this workstation lands on both: 54,423 bytes at its default level and 54,179 bytes at --best, neither storing a filename. The container may store one, by RFC 1952 FNAME; here alice29.txt and its zero terminator add 12 bytes, which is 96 bits and far too little to move either second decimal, though divided by a few thousand input bytes rather than 152,089 the same 12 bytes would move it. The offline verifier reproduces the phenomenon live with no external tool: one zlib, one file, four compression levels, four different two-decimal figures, every one of them a valid gzip stream that decodes to these exact bytes. The anchor of this page is already not a property of the file.
Specimen provenance: the exact 152,089-byte member of the immutable Standard Canterbury Corpus archive, Alice's Adventures in Wonderland, Millennium Fulcrum Edition 2.9, by Lewis Carroll. SHA-256 7467306ee0feed4971260f3c87421154a05be571d944e9cb021a5713700c38f0. Arnold and Bell say the corpus candidates were public domain. The 1865 text is public domain. No licence conditions are claimed.
1. Now give the machines your file
A file is bytes before it is a photograph, archive, font, or confession. This instrument reads the complete byte sequence and never branches on MIME type or extension. The browser supplies only the basename. A file above 8 MiB is refused before its bytes are read.
Instrument 1 · three reversible descriptions
worker thread, memory onlyWaiting for the Alice anchor.
- specimen basename
- alice29.txt
- complete byte count
- pending
- SHA-256
- pending
- CRC-32
- pending
- empirical byte histogram H0
- pending
| named description | total bytes | bits / input byte | savings | frame accounting | decoder check |
|---|---|---|---|---|---|
| pending | |||||
rate = 8C / N bits per input byte
savings = 100 × (1 - C / N)%
For an empty file, both ratios are undefined and the page says so. Expansion is ordinary for short, encrypted, or already-compressed inputs. It does not diagnose any of those things.
The browser gzip row is whatever valid gzip stream this engine chooses to make. The other two rows use one published arithmetic-coding construction with two deliberately small models. Order 0 predicts the next byte only from global counts. Order 1 keeps a separate set of counts after each previous byte. All 257 symbols, bytes 0 through 255 plus EOF, begin with count 1. Counts change after each symbol and rescale at total 16,383. The frame records magic, version, model order, original length, payload bit length, and CRC-32.
Each row remains absent until its matching decoder has seen EOF, recovered the declared length, checked CRC-32 where the format carries it, and compared every recovered byte. Gzip gets an additional inspection: magic bytes 1f 8b, method 08, optional header fields parsed by flags, trailer CRC-32, and ISIZE modulo 232.
2. Make the supposed minimum move
The shortest row is tempting to name as the stubborn part of the file. It is only the shortest description found by this finite set. Remove a machine and the best-so-far answer can get worse. Add one under the same accounting and it can only stay put or improve. Neither motion reveals a hidden intrinsic number.
Instrument 2 · the finite codec set
the word “best” keeps its boundaryWaiting for codec results.
Wire accounting treats every matching decoder as already installed. That is a large free choice.
The source-charged switch is intentionally awkward. It adds the exact UTF-8 byte length of the shipped reversible implementation to each custom arithmetic stream. It refuses to price gzip because the native decoder's source is not visible to this page. This still is not a proof of the shortest self-contained program. It is a way to stop an installed decoder from disappearing silently from the bill.
One warning about that switch, because it is where this instrument comes closest to saying nothing. The same constant is added to every candidate it prices, so it can never change which of them is shortest. Comparing a codec against itself plus a positive constant is true by construction and carries no information about models. What the charge can change is whether compressing beats simply keeping the bytes, and that depends on length: at this file's measured rate the panel prints the input size at which each priced coder would first break even. That crossover is the only part of the decoder charge with any content, and it is an extrapolation from one rate that a different file has no obligation to keep.
3. Keep every byte, move every answer
The deeper objection is right: these are arbitrary machines. So make that objection operable. Four fixed reversible transforms are placed before every coder, with a six-byte AWTX version and transform ID charged to every total. Those six bytes are not a bookkeeping entry. The description that gets counted is the complete frame, and the way back is to parse that frame, read the transform ID out of it, decode the payload, apply the inverse the frame named, and compare with your original. Corrupt any of the four prefix fields and the round trip refuses instead of quietly succeeding on an ID supplied from somewhere else.
Instrument 3 · reversible transform matrix
not run for this specimen| fixed bijection | H0 bits / byte | gzip bytes | order 0 bytes | order 1 bytes | complete inverse |
|---|---|---|---|---|---|
| Run the transform matrix when the first three round trips are complete. | |||||
Some specimens cannot support this comparison at all. If a file is empty, or is one byte value repeated, all four bijections map it to the identical sequence and every total in the table is then equal by construction. The panel detects that from the transformed bytes themselves, says the specimen cannot demonstrate the comparison, and voids the relevant check instead of showing four identical green rows.
The position permutation starts with indices 0 through N-1 and seed 0x6d2b79f5. For i from N-1 down to 1 it updates state = (1664525 × state + 1013904223) mod 2^32, chooses j = floor(state / 2^32 × (i + 1)), and swaps i with j. Reversal and this permutation preserve the 256-bin byte histogram exactly. XOR delta does not have to.
Identity asks each codec about the bytes in their current order.
Byte reversal keeps the same byte counts and reverses position. Some local predictions reverse cleanly; others do not.
XOR delta stores the first byte, then each byte XOR the one before it. Runs and gradual changes become predictable zeros, while other structures can become harder.
Fixed position permutation preserves the empirical order 0 entropy exactly while disrupting adjacency. If gzip or order 1 moves while H0 does not, the histogram was never a universal floor for this one file.
A fixed computable bijection has a fixed program, once a reference machine and exact rule are chosen. Under such a machine, shortest-program length before and after the transform can differ by no more than the cost of that transform and its inverse, plus fixed interpreter overhead. This page does not know that additive constant. What it can show is that practical compressor lengths can move by much more than the six-byte transform label while the underlying bytes remain reversibly recoverable.
4. The quantity that cannot be put in the table
Shannon entropy is an average coding rate for a specified stochastic source. The plug-in histogram of one finite file is a useful description of its byte counts, not an intrinsic lower bound on every reversible description of that file. A model using order can fall below the order 0 line without breaking Shannon's theorem, because it is making a different source assumption.
Shortest-program length has the opposite problem. It speaks about one finite string, but it depends on the reference universal machine up to an additive constant and cannot be computed in general. Chaitin's 1966 paper proves that the function assigning shortest program length is not recursive. A compressor supplies one program-like description under one known decoder, which makes an upper-bound witness. Running three, twelve, or twelve million named codecs cannot turn the smallest witness into the unknowable minimum.
One thing about incompressibility can be proved, and it is a counting fact rather than a fact about your file. A lossless coder is injective, so the inputs of exactly N bytes it can send to a strictly shorter output are at most the number of shorter byte strings, (256N - 1) / 255, which is below 1/255 = 0.392157% of the 256N inputs. Most files of any length cannot be shortened by any one codec, and no cleverer codec escapes the count. Read in bits instead of bytes the same argument gives different numbers, and they are easy to blur: the fraction compressible to exactly n-8 bits is 2-8 = 0.390625%, and to at most n-8 bits it is 2-7 = 0.78125%. Three near neighbours, three different statements. The bound is also the exact shape of the honest claim, because it is a statement about the population and not about a named member of it.
There may be regions no selected model shortens. This page cannot certify that such a region is intrinsically incompressible. It also cannot certify randomness, encryption, meaning, quality, originality, or file type. Those are different questions, and expansion is not their detector.
The check
checks begin with the anchor
These checks execute in your browser against the same bytes and functions that produced the tables. A red FAIL line means the instrument failed. The broken-frame checks are first-class results: each feeds a truncated header, wrong magic byte, lying length, nonzero padding, a malformed gzip option, or a corrupted AWTX prefix into the real parser and requires the named refusal by code and byte offset. Two labels are deliberately not passes. VOID means this specimen cannot exercise that check, so counting it green would be a lie. MEASURED means the line is a number this run produced, not a test that could fail, and it is kept out of the score for that reason.
Every free choice and uncertainty
- Specimen: complete byte length, SHA-256, CRC-32, and browser-supplied basename are printed. MIME type and contents are not interpreted.
- Gzip: the browser engine and user agent are pending. CompressionStream guarantees a gzip format, not a cross-browser byte count or compressor strategy.
- Arithmetic models: 32-bit inclusive interval, alphabet 0 through 255 plus EOF 256, pseudocount 1, update after the symbol, rescale at total 16,383 using (count + 1) >>> 1, START context 256, and an AWAC version 1 frame.
- Framing: 26-byte arithmetic header, declared payload bits, zero byte-padding bits, CRC-32, and six bytes for each transform version and ID. Gzip framing is parsed from its actual flags rather than assumed to be ten bytes.
- Accounting: wire totals assume a preinstalled decoder. Source-charged totals add the whole shipped codec module once per custom candidate and exclude opaque native gzip. Neither captures a proven shortest interpreter.
- Transforms: identity, reversal, XOR delta, and the published seeded Fisher-Yates position rule. They were fixed in the binding specification before this page saw a reader file.
- The coder against its own published rule: the offline verifier reimplements the model rule from the prose above, with no shared code, computes the ideal code length in bits, and requires the shipped coder to sit within a 30 to 40 bit window of it. That window is the 32 zero flush bits plus one disambiguating bit plus the arithmetic coder's under-two-bit excess, not a tolerance chosen to fit. Across its fixtures the observed range is 32.372 to 33.994 bits.
- Boundary: 8 MiB is an implementation cap. Refusal says nothing about the file. Timing is local, machine-dependent, not retained, ranked, or displayed as a scientific result.
Privacy proof · visible before selection
page-controlled paths onlyThe first executable script on this page wraps fetch, XMLHttpRequest, WebSocket, EventSource, and sendBeacon and counts attempts. Resource Timing lists what the browser loaded and its origins. The fallback, worker, code, fonts, and page are same-origin. Your file buffer is passed directly to a local Worker as bytes. It is never put in a URL, object URL, form, log, or browser storage.
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; worker-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' data:; connect-src 'none'; media-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'
This audits page-controlled network paths. It cannot audit a browser extension, the browser itself, the operating system, or software outside the page. Open the browser's Network panel before choosing a file if you want an independent view. Same-origin scripts load before the specimen runs; no request contains specimen-derived data. One CSP limit is visible too: browsers ignore frame-ancestors when a policy arrives in a meta element, so that clickjacking rule also needs the site's HTTP response header. The meta-delivered connect-src 'none' rule is enforced here.
What the arithmetic frames contain, byte by byte
Bytes 0 through 3 are ASCII AWAC. Byte 4 is version 1. Byte 5 is model order 0 or 1. Bytes 6 through 13 are the unsigned 64-bit little-endian original length. Bytes 14 through 21 are the unsigned 64-bit little-endian payload bit length. Bytes 22 through 25 are CRC-32 in little-endian order. The arithmetic payload follows, with unused low bits of its final byte required to be zero.
The coder maintains inclusive low and high bounds from 0 to 0xffffffff. It uses the first quarter 0x40000000, half 0x80000000, and third quarter 0xc0000000 for E1, E2, and E3 renormalization and delayed underflow bits. Integer states remain exact; interval products use JavaScript Number because their maximum stays below 253.
What this page does not prove
- It does not locate a literal incompressible part inside a file.
- It does not compute or approximate Kolmogorov complexity with a certified error.
- It does not certify randomness, encryption, file type, meaning, authorship, or originality.
- It does not establish the best possible codec. “Best found” always names a finite selected set and one accounting regime.
- It does not turn the empirical byte histogram of one finite file into a Shannon source or a universal lower bound.
- It does not make gzip bytes portable across engines. A different valid browser gzip result is shown as a calibration mismatch, not a failure.