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

After GZIP compression these minified files vary in size:
Boot
  53399 bytes (52.1k)
CDN
Baidu
  46605 bytes (45.5k)
CDN
cdnjs
  46594 bytes (45.5k)
CDN
gzip -6 (default)
  46305 bytes (45.2k)
local copy
unpkg
  46183 bytes (45.1k)
CDN
gzip -9
  46126 bytes (45.0k)
local copy
zultra
  44640 bytes (43.6k)
local copy
7zip -mx=9 -tgzip
  44626 bytes (43.6k)
local copy
libdeflate -12
  44599 bytes (43.6k)
local copy
kzip -s0 -rn -b7
  44524 bytes (43.5k)
local copy
pigz -11 -n
  44437 bytes (43.4k)
local copy
Zopfli
  44323 bytes (43.3k)
local copy
Zopfli (defluff)
  44320 bytes (43.3k)
local copy

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

You will automatically get the smallest D3 3.1.0 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 1860 bytes by using my D3 3.1.0 Zopfli version instead of the best available CDN (4.20% smaller than unpkg, 44323 vs. 46183 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 --mls2 --bsr40 --lazy --ohh

(found December 21, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 2  --mls2
block splitting recursion 40  --bsr40
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 3 more bytes (44320 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.0/d3.min.js --location | md5sum
f4caa72947c8b723c076eb53b962eb4e  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.1.0.min.zopfli.js.gz | md5sum
f4caa72947c8b723c076eb53b962eb4e  -

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

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

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Baidu 46605 bytes d3e8d7e1b86e997e457f3250f3d52bf4 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
44323 bytes -5 bytes zopfli --i100000 --mls2 --bsr40 --lazy --ohh December 21, 2015 @ 11:45
44328 bytes -9 bytes zopfli --i10000 --mls2 --bsr40 --lazy --ohh October 16, 2015 @ 10:29
44337 bytes -14 bytes zopfli --i1000 --mls2 --bsr40 --lazy --ohh October 14, 2015 @ 11:35
44351 bytes zopfli --i100 --mls2 --bsr40 --lazy --ohh October 13, 2015 @ 17:23

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

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
44516 44508 44506 44505 44507 44508 44506 44364 44505 44498 44496 44524 44463 44514 44535
44432 44469 44487 44404 44391 44417 44428 44485 44470 44399 44416 44419 44508 44491 44391
44399 44502 44438 44432 44430 44388 44414 44409 44401 44369 44399 44402 44523 44391 44408
44504 44436 44499 44412 44429 44412 44392 44477 44358 44348 44421 44493 44506 44523 44471
44407 44501 44510 44494 44461 44404 44392 44400 44362 44419 44396 44400 44513 44390 44485
44502 44490 44423 44426 44437 44372 44373 44478 44472 44519 44398 44357 44528 44523 44522
44507 44513 44432 44413 44430 44467 44379 44474 44490 44353 44402 44372 44508 44526 44488
44416 44413 44423 44429 44438 44418 44393 44379 44387 44367 44399 44426 44523 44523 44511
44436 44423 44437 44416 44430 44403 44388 44363 44385 44365 44392 44349 44508 44526 44510
44350 44498 44449 44417 44432 44415 44408 44399 44391 44354 44398 44424 44522 44522 44491
44501 44412 44423 44413 44433 44386 44364 44459 44481 44411 44401 44359 44502 44530 44523
44506 44500 44500 44422 44427 44457 44396 44455 44482 44368 44401 44510 44517 44522 44488
44405 44414 44426 44415 44438 44393 44385 44447 44513 44353 44392 44403 44506 44525 44517
44384 44494 44504 44414 44431 44419 44404 44400 44400 44409 44388 44508 44512 44524 44500
44413 44398 44384 44418 44415 44403 44399 44375 44350 44372 44399 44402 44511 44527 44412
44436 44492 44500 44422 44447 44384 44387 44447 44473 44353 44399 44413 44514 44489 44523
44402 44399 44369 44383 44446 44397 44366 44457 44476 44421 44395 44360 44508 44383 44415
44430 44414 44432 44435 44403 44404 44406 44444 44482 44353 44397 44359 44529 44527 44410
44505 44429 44438 44499 44498 44499 44397 44398 44358 44408 44399 44357 44508 44524 44486
44438 44413 44428 44412 44500 44404 44403 44367 44392 44375 44394 44420 44517 44524 44523
44437 44412 44439 44497 44446 44388 44386 44456 44470 44363 44395 44491 44526 44522 44433
44505 44429 44430 44415 44435 44387 44397 44445 44480 44360 44401 44359 44528 44523 44486
44323 44499 44510 44411 44434 44454 44371 44450 44471 44411 44399 44422 44522 44523 44524

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 44351 bytes 100%
1,000 44337 bytes -14 bytes 100%
10,000 44328 bytes -9 bytes 100%
100,000 44323 bytes -5 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
44539 bytes +216 bytes (+0.49%) +15 bytes
44553 bytes +230 bytes (+0.52%) +29 bytes
44543 bytes +220 bytes (+0.50%) +19 bytes
44555 bytes +232 bytes (+0.52%) +31 bytes
44592 bytes +269 bytes (+0.61%) +68 bytes
44602 bytes +279 bytes (+0.63%) +78 bytes
44576 bytes +253 bytes (+0.57%) +52 bytes
44524 bytes +201 bytes (+0.45%)
44532 bytes +209 bytes (+0.47%) +8 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 35656 bytes -8667 bytes (-19.55%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 37680 bytes -6643 bytes (-14.99%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 38231 bytes -6092 bytes (-13.74%)
Brotli (Wikipedia) brotli brotli -q 11 40132 bytes -4191 bytes (-9.46%)
LZMA2 (Wikipedia) xz xz -9 40904 bytes -3419 bytes (-7.71%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 42603 bytes -1720 bytes (-3.88%)
Zstandard (Wikipedia) zstd zstd -19 42792 bytes -1531 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.