Choose a version:
28% The original file has 109313 bytes (106.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 30438 bytes (29.7k, 28%).

After GZIP compression these minified files vary in size:
Boot
  12174 bytes (11.9k)
CDN
cdnjs
  10720 bytes (10.5k)
CDN
gzip -6 (default)
  10700 bytes (10.4k)
local copy
gzip -9
  10678 bytes (10.4k)
local copy
libdeflate -12
  10418 bytes (10.2k)
local copy
kzip -s0 -rn -b0
  10404 bytes (10.2k)
local copy
7zip -mx=9 -tgzip
  10394 bytes (10.2k)
local copy
zultra
  10392 bytes (10.1k)
local copy
pigz -11 -n
  10390 bytes (10.1k)
local copy
Zopfli
  10379 bytes (10.1k)
local copy
Zopfli (defluff)
  10378 bytes (10.1k)
local copy

perma-link to the smallest file on my server:
http://minime.stephan-brumme.com/files/knockout/knockout-1.2.1.min.js (or via HTTPS)

You will automatically get the smallest Knockout 1.2.1 file, ETag caching is available and
if your browser doesn't support GZIP decompression then the uncompressed version will be sent.

Currently best Zopfli settings

Save 341 bytes by using my Knockout 1.2.1 Zopfli version instead of the best available CDN (3.29% smaller than cdnjs, 10379 vs. 10720 bytes):
You can use my super-compressed files for whatever purpose you like as long as you respect the library's original license agreement.
There are no restrictions from my side - but please avoid hot-linking if you run a high-traffic website.

These command-line settings yielded the best compression ratio so far (Linux version of zopfli-krzymod):
zopfli --i100000 --mb8 --mls2048 --bsr25 --lazy --ohh

(found December 18, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 2048  --mls2048
block splitting recursion 25  --bsr25
lazy matching in LZ77 yes  --lazy
optimized Huffman headers yes  --ohh
initial random W for iterations 1  --rw1
initial random Z for iterations 2  --rz2

Even Smaller Files Thanks To Defluff

Zopfli's output can be further optimized by the defluff tool.
In this particular case, defluff saves 1 more byte (10378 bytes).

Verify file integrity

After decompression, my uncompressed files are identical to the original ones:

MD5:
curl --silent --compressed https://knockoutjs.com/downloads/knockout-1.2.1.js --location | md5sum
84e53fbc3c0e540f4e589b57240afbf7  -
curl --silent --compressed https://minime.stephan-brumme.com/files/knockout/knockout-1.2.1.min.zopfli.js.gz | md5sum
84e53fbc3c0e540f4e589b57240afbf7  -

SHA1:
curl --silent --compressed https://knockoutjs.com/downloads/knockout-1.2.1.js --location | sha1sum
cb1e05980cbe35ccee4cd03cd019427c181ce6f1  -
curl --silent --compressed https://minime.stephan-brumme.com/files/knockout/knockout-1.2.1.min.zopfli.js.gz | sha1sum
cb1e05980cbe35ccee4cd03cd019427c181ce6f1  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
cdnjs 10720 bytes 84e53fbc3c0e540f4e589b57240afbf7 (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Boot 12174 bytes 76649c31ca791900793b88346a7ae406 only whitespaces differ (invalid)

Note: only the MD5 hashes are shown to keep things simple.

Other Versions

Available Knockout versions at minime.stephan-brumme.com:

3.5.1, 3.5.0,
3.4.2, 3.4.1, 3.4.0,
3.3.0,
3.2.0,
3.1.0, 3.0.0,
2.3.0,
2.2.1, 2.2.0,
2.1.0, 2.0.0,
1.2.1, 1.2.0,
1.1.2, 1.1.1, 1.1.0

The project site contains an overview how well these versions were compressed.
Other interesting projects are AngularJS, BackboneJS, Bootstrap, D3, Dojo, Ember, jQuery, lodash, React, Socket.IO, ThreeJS, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
10379 bytes -1 byte zopfli --i100000 --mls2048 --bsr25 --lazy --ohh December 18, 2015 @ 22:45
10380 bytes -1 byte zopfli --i10000 --mls512 --bsr18 --lazy --ohh September 20, 2015 @ 20:46
10381 bytes -1 byte zopfli --i1000 --mls512 --bsr14 --lazy --ohh September 10, 2015 @ 11:58
10382 bytes -3 bytes zopfli --i1000 --mls512 --bsr9 --lazy --ohh September 10, 2015 @ 11:58
10385 bytes zopfli --i100 --mls2048 --bsr4 --lazy --ohh September 10, 2015 @ 11:34

If there are multiple parameter sets yielding the same compressed size, only the first one found is shown.

Most recent activity on July 20, 2020 @ 12:52.

Heatmaps

This Zopfli heatmap visualizes how compression changes when modifying the --bsr and --mls parameter.
Cell's contents is the best filesize achieved (in bytes, hover with mouse over cells to see number of iterations).

Good parameters are green, bad are red. The best and worst are bold as well.
The brightness of the blue background color indicates how many iterations were processed:
10,000 or 100,000.
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
10382 10386 10384 10389 10388 10387 10383 10384 10385 10385 10383 10383 10382 10385 10384
10385 10385 10380 10383 10395 10394 10394 10379 10387 10384 10379 10379 10387 10385 10388
10386 10387 10385 10385 10387 10388 10380 10387 10388 10388 10380 10380 10387 10386 10382
10379 10384 10388 10380 10397 10387 10387 10379 10379 10385 10383 10379 10387 10385 10382
10382 10384 10388 10382 10383 10390 10383 10383 10384 10385 10379 10380 10380 10385 10382
10382 10383 10385 10386 10383 10384 10385 10386 10379 10385 10379 10379 10383 10388 10382
10383 10388 10388 10388 10387 10388 10387 10388 10387 10385 10379 10379 10386 10389 10386
10384 10384 10384 10382 10384 10388 10388 10388 10389 10379 10379 10387 10387 10385 10384
10384 10387 10385 10384 10387 10388 10387 10388 10379 10385 10382 10379 10385 10383 10382
10383 10384 10388 10384 10385 10387 10385 10385 10379 10385 10379 10387 10387 10388 10386
10383 10387 10380 10382 10387 10389 10394 10387 10379 10385 10379 10389 10380 10383 10382
10384 10386 10385 10383 10386 10384 10388 10383 10380 10384 10383 10387 10384 10383 10382
10387 10387 10388 10384 10388 10385 10388 10388 10379 10385 10384 10385 10387 10380 10385
10382 10384 10384 10388 10398 10387 10385 10388 10383 10385 10383 10389 10387 10388 10382
10384 10385 10390 10383 10388 10390 10385 10383 10379 10379 10379 10389 10380 10385 10384
10386 10388 10388 10384 10383 10384 10387 10383 10384 10384 10379 10382 10386 10386 10384
10382 10385 10384 10389 10388 10388 10384 10383 10384 10385 10379 10380 10382 10388 10384
10382 10385 10388 10388 10388 10387 10388 10388 10389 10383 10379 10379 10387 10383 10382
10383 10387 10385 10382 10384 10390 10383 10383 10379 10379 10383 10380 10383 10388 10382
10382 10384 10388 10388 10387 10388 10387 10388 10382 10379 10379 10380 10387 10389 10390
10384 10387 10379 10384 10383 10388 10387 10387 10379 10385 10379 10379 10386 10383 10382
10383 10384 10388 10382 10388 10384 10385 10383 10382 10384 10379 10379 10388 10385 10386
10380 10385 10385 10390 10388 10389 10387 10387 10379 10384 10379 10380 10379 10385 10384

Due to the Monte Carlo design of my search algorithm, not all parameters have reached the same number of iterations yet:
Iterations Min. Bytes Reduction Coverage
100 10385 bytes 100%
1,000 10381 bytes -4 bytes 100%
10,000 10380 bytes -1 byte 100%
100,000 10379 bytes -1 byte 17.10%
1,000,000
10,000,000

KZIP has far less options available for tuning/optimization. I only played around with the number of blocks (parameter -n):
Blocks Min. Bytes Compared To Best Zopfli Compared To Best KZIP
10404 bytes +25 bytes (+0.24%)
10404 bytes +25 bytes (+0.24%)
10431 bytes +52 bytes (+0.50%) +27 bytes
10458 bytes +79 bytes (+0.76%) +54 bytes
10455 bytes +76 bytes (+0.73%) +51 bytes
10484 bytes +105 bytes (+1.01%) +80 bytes
10515 bytes +136 bytes (+1.31%) +111 bytes
10547 bytes +168 bytes (+1.62%) +143 bytes
10586 bytes +207 bytes (+1.99%) +182 bytes

Non-DEFLATE Algorithms

Archivers based on completely different compression algorithms often produce superior results.
Unfortunately, browsers only support gzip compression at the moment.
However, support for Brotli is constantly growing - but your browser doesn't support it.
Algorithm Program Parameters Size Compared To Best Zopfli
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 9058 bytes -1321 bytes (-12.73%)
Brotli (Wikipedia) brotli brotli -q 11 9408 bytes -971 bytes (-9.36%)
ZPAQ (Wikipedia) zpaq zpaq -method 69 9656 bytes -723 bytes (-6.97%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 10071 bytes -308 bytes (-2.97%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 10229 bytes -150 bytes (-1.45%)
LZMA2 (Wikipedia) xz xz -9 10300 bytes -79 bytes (-0.76%)
Zstandard (Wikipedia) zstd zstd -19 10394 bytes +15 bytes (+0.14%)

Detailled Analysis

I wrote a DEFLATE decoder in Javascript. Click the button below to start a client-side analysis of the smallest gzipped files (may take a second):


Notes: pigz is a fast open source multi-threaded implementation of gzip written by one of the original authors of gzip.
However, when using compression level 11, pigz actually switches to the slower Zopfli algorithm and isn't multi-threaded anymore.
KrzyMOD's extensions to Zopfli offer the highest level of configuration and is therefore used for my brute-force search.
Ken Silverman wrote the closed-source KZIP compression program and Jonathon Fowler ported it to Linux.
Defluff was created by Joachim Henke; DeflOpt is a tool by Ben Jos Walbeehm.

website made by Stephan Brumme in 2015 and still improving in 2024.
all timestamps are displayed in central european time. see my changelog.
no flash, not even images or external css files - and everything squeezed into a single html file.
which was handsomely compressed before releasing it into the wild internet - obviously.

please visit my homepage and my blog, too.
email: minime (at) stephan-brumme.com

All trademarks are property of their respective owners. You know, the boring legal stuff.