Choose a version:
47% The original file has 292381 bytes (285.5k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 137058 bytes (133.8k, 47%).

After GZIP compression these minified files vary in size:
Boot
  53420 bytes (52.2k)
CDN
Baidu
  46605 bytes (45.5k)
CDN
cdnjs
  46594 bytes (45.5k)
CDN
gzip -6 (default)
  46306 bytes (45.2k)
local copy
unpkg
  46175 bytes (45.1k)
CDN
gzip -9
  46125 bytes (45.0k)
local copy
zultra
  44619 bytes (43.6k)
local copy
7zip -mx=9 -tgzip
  44604 bytes (43.6k)
local copy
libdeflate -12
  44588 bytes (43.5k)
local copy
kzip -s0 -rn -b7
  44519 bytes (43.5k)
local copy
pigz -11 -n
  44420 bytes (43.4k)
local copy
Zopfli
  44309 bytes (43.3k)
local copy
Zopfli (defluff)
  44305 bytes (43.3k)
local copy

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

You will automatically get the smallest D3 3.1.2 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 1866 bytes by using my D3 3.1.2 Zopfli version instead of the best available CDN (4.21% smaller than unpkg, 44309 vs. 46175 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 --mls256 --bsr23 --lazy --ohh

(found December 21, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 256  --mls256
block splitting recursion 23  --bsr23
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 4 more bytes (44305 bytes).

Verify file integrity

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

MD5:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.1.2/d3.min.js --location | md5sum
0706baf070a4bbd7cea6dd712821e730  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.1.2.min.zopfli.js.gz | md5sum
0706baf070a4bbd7cea6dd712821e730  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v3.1.2/d3.min.js --location | sha1sum
ae9c2a63247f372c82aacf977a1329da64070219  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.1.2.min.zopfli.js.gz | sha1sum
ae9c2a63247f372c82aacf977a1329da64070219  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 53420 bytes 0706baf070a4bbd7cea6dd712821e730 (invalid)
cdnjs 46594 bytes 0706baf070a4bbd7cea6dd712821e730 (invalid)
unpkg 46175 bytes 0706baf070a4bbd7cea6dd712821e730 July 11, 2016 @ 16:32

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 46605 bytes 560f87e2ebc8e68f6ad9e07ef9bb1552 only whitespaces differ (invalid)

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

Other Versions

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

6.7.0, 6.6.2, 6.6.1, 6.6.0, 6.5.0, 6.4.0, 6.3.1, 6.2.0, 6.1.1, 6.1.0, 6.0.0,
5.16.0, 5.15.1, 5.15.0, 5.14.2, 5.14.1, 5.14.0, 5.13.1, 5.13.0, 5.12.0, 5.11.0, 5.10.1, 5.10.0,
5.9.7, 5.9.6, 5.9.5, 5.9.4, 5.9.3, 5.9.2, 5.9.1, 5.9.0, 5.8.2, 5.8.1, 5.8.0, 5.7.0, 5.6.0, 5.5.0, 5.4.0, 5.3.0, 5.2.0, 5.1.0, 5.0.1, 5.0.0,
4.13.0, 4.12.2, 4.12.1, 4.12.0, 4.11.0, 4.10.2, 4.10.1, 4.10.0,
4.9.1, 4.9.0, 4.8.0, 4.7.4, 4.7.3, 4.7.2, 4.7.1, 4.7.0, 4.6.0, 4.5.0, 4.4.4, 4.4.3, 4.4.2, 4.4.1, 4.4.0, 4.3.0, 4.2.8, 4.2.7, 4.2.6, 4.2.5, 4.2.4, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.1, 4.1.0, 4.0.0,
3.5.17, 3.5.16, 3.5.15, 3.5.14, 3.5.13, 3.5.12, 3.5.11, 3.5.10, 3.5.9, 3.5.8, 3.5.7, 3.5.6, 3.5.5, 3.5.4, 3.5.3, 3.5.2, 3.5.1, 3.5.0, 3.4.13, 3.4.12, 3.4.11, 3.4.10, 3.4.9, 3.4.8, 3.4.6, 3.4.5, 3.4.4, 3.4.3, 3.4.2, 3.4.1, 3.4.0, 3.3.13, 3.3.12, 3.3.11, 3.3.10, 3.3.9, 3.3.8, 3.3.7, 3.3.6, 3.3.5, 3.3.4, 3.3.3, 3.3.2, 3.3.1, 3.3.0, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0

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

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
44309 bytes -4 bytes zopfli --i100000 --mls256 --bsr23 --lazy --ohh December 21, 2015 @ 11:52
44313 bytes -6 bytes zopfli --i10000 --mls256 --bsr23 --lazy --ohh September 23, 2015 @ 19:06
44319 bytes -2 bytes zopfli --i1000 --mls256 --bsr23 --lazy --ohh September 23, 2015 @ 18:52
44321 bytes -3 bytes zopfli --i1000 --mls8 --bsr25 --lazy --ohh September 23, 2015 @ 18:47
44324 bytes -1 byte zopfli --i1000 --mls512 --bsr13 --lazy --ohh September 20, 2015 @ 14:13
44325 bytes -2 bytes zopfli --i1000 --mls256 --bsr18 --lazy --ohh September 20, 2015 @ 14:11
44327 bytes -5 bytes zopfli --i1000 --mls128 --bsr15 --lazy --ohh September 20, 2015 @ 14:07
44332 bytes zopfli --i100 --mls128 --bsr15 --lazy --ohh September 18, 2015 @ 21:24

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:54.

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
44504 44496 44497 44496 44492 44495 44498 44354 44495 44476 44483 44498 44506 44507 44512
44425 44463 44492 44493 44498 44385 44396 44389 44469 44412 44406 44408 44501 44385 44499
44427 44363 44409 44419 44419 44334 44387 44339 44333 44357 44392 44340 44523 44515 44501
44497 44491 44474 44424 44383 44402 44339 44357 44406 44351 44388 44354 44496 44514 44461
44360 44390 44395 44482 44454 44377 44390 44371 44350 44360 44396 44389 44517 44479 44389
44430 44403 44415 44411 44425 44388 44370 44446 44465 44511 44376 44338 44504 44515 44500
44499 44409 44383 44407 44498 44388 44358 44472 44475 44340 44383 44357 44513 44394 44479
44404 44488 44415 44421 44401 44396 44336 44336 44349 44348 44389 44406 44509 44514 44502
44423 44400 44387 44399 44384 44342 44387 44320 44404 44355 44388 44372 44518 44395 44504
44495 44482 44384 44404 44400 44387 44361 44397 44319 44365 44389 44407 44503 44514 44476
44424 44399 44378 44405 44408 44338 44373 44446 44463 44349 44388 44392 44497 44430 44507
44494 44401 44494 44414 44400 44407 44319 44473 44371 44349 44377 44343 44395 44517 44478
44391 44404 44394 44403 44484 44385 44363 44448 44463 44355 44392 44393 44508 44517 44505
44422 44414 44395 44402 44404 44390 44320 44407 44404 44352 44386 44501 44518 44512 44411
44386 44387 44380 44398 44406 44390 44394 44320 44378 44339 44390 44339 44510 44416 44514
44420 44400 44406 44404 44379 44384 44364 44342 44340 44357 44388 44395 44496 44380 44504
44384 44391 44383 44412 44412 44387 44355 44448 44460 44363 44382 44446 44513 44387 44413
44422 44395 44385 44405 44416 44388 44393 44453 44446 44343 44390 44414 44516 44380 44387
44498 44404 44482 44488 44492 44379 44393 44395 44343 44356 44389 44491 44518 44514 44508
44429 44426 44422 44403 44395 44390 44357 44309 44356 44349 44389 44338 44521 44408 44403
44415 44389 44315 44481 44492 44367 44333 44446 44464 44342 44390 44483 44514 44515 44411
44320 44388 44489 44423 44387 44384 44382 44448 44459 44340 44378 44346 44517 44513 44513
44420 44387 44414 44432 44415 44341 44381 44334 44468 44343 44389 44351 44509 44513 44515

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 44329 bytes 100%
1,000 44319 bytes -10 bytes 100%
10,000 44313 bytes -6 bytes 100%
100,000 44309 bytes -4 bytes 0.29%
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
44536 bytes +227 bytes (+0.51%) +17 bytes
44542 bytes +233 bytes (+0.53%) +23 bytes
44536 bytes +227 bytes (+0.51%) +17 bytes
44551 bytes +242 bytes (+0.55%) +32 bytes
44586 bytes +277 bytes (+0.63%) +67 bytes
44596 bytes +287 bytes (+0.65%) +77 bytes
44573 bytes +264 bytes (+0.60%) +54 bytes
44519 bytes +210 bytes (+0.47%)
44524 bytes +215 bytes (+0.49%) +5 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
ZPAQ (Wikipedia) zpaq zpaq -method 69 35585 bytes -8724 bytes (-19.69%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 37675 bytes -6634 bytes (-14.97%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 38228 bytes -6081 bytes (-13.72%)
Brotli (Wikipedia) brotli brotli -q 11 40092 bytes -4217 bytes (-9.52%)
LZMA2 (Wikipedia) xz xz -9 40880 bytes -3429 bytes (-7.74%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 42603 bytes -1706 bytes (-3.85%)
Zstandard (Wikipedia) zstd zstd -19 42780 bytes -1529 bytes (-3.45%)

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.