Choose a version:
45% The original file has 337687 bytes (329.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 151662 bytes (148.1k, 45%).

After GZIP compression these minified files vary in size:
Boot
  61046 bytes (59.6k)
CDN
cdnjs
  53905 bytes (52.6k)
CDN
unpkg
  53631 bytes (52.4k)
CDN
gzip -6 (default)
  53506 bytes (52.3k)
local copy
jsdelivr
  53397 bytes (52.1k)
CDN
gzip -9
  53370 bytes (52.1k)
local copy
libdeflate -12
  51670 bytes (50.5k)
local copy
zultra
  51633 bytes (50.4k)
local copy
7zip -mx=9 -tgzip
  51612 bytes (50.4k)
local copy
pigz -11 -n
  51361 bytes (50.2k)
local copy
kzip -s0 -rn -b8
  51329 bytes (50.1k)
local copy
Zopfli
  51275 bytes (50.1k)
local copy
Zopfli (defluff)
  51273 bytes (50.1k)
local copy

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

You will automatically get the smallest D3 3.5.9 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 2122 bytes by using my D3 3.5.9 Zopfli version instead of the best available CDN (4.14% smaller than jsdelivr, 51275 vs. 53397 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 --mls32 --bsr10 --lazy --ohh

(found November 17, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 32  --mls32
block splitting recursion 10  --bsr10
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 2 more bytes (51273 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.5.9/d3.min.js --location | md5sum
2a813dc98a92fcca709f8d79186560fa  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.5.9.min.zopfli.js.gz | md5sum
2a813dc98a92fcca709f8d79186560fa  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 61046 bytes 2a813dc98a92fcca709f8d79186560fa November 29, 2015 @ 12:58
cdnjs 53905 bytes 2a813dc98a92fcca709f8d79186560fa (invalid)
unpkg 53631 bytes 2a813dc98a92fcca709f8d79186560fa July 11, 2016 @ 16:30
jsdelivr 53397 bytes 2a813dc98a92fcca709f8d79186560fa (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
51275 bytes -4 bytes zopfli --i100000 --mls32 --bsr10 --lazy --ohh November 17, 2015 @ 09:28
51279 bytes -6 bytes zopfli --i10000 --mls32 --bsr10 --lazy --ohh November 17, 2015 @ 08:18
51285 bytes -7 bytes zopfli --i1000 --mls32 --bsr10 --lazy --ohh November 17, 2015 @ 07:51
51292 bytes -4 bytes zopfli --i1000 --mls32768 --bsr9 --lazy --ohh November 17, 2015 @ 07:50
51296 bytes -9 bytes zopfli --i1000 --mls32768 --bsr21 --lazy --ohh November 17, 2015 @ 07:50
51305 bytes zopfli --i100 --mls32768 --bsr21 --lazy --ohh November 17, 2015 @ 07:44

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
51435 51487 51436 51459 51421 51422 51449 51430 51446 51446 51555 51535 51424 51434 51555
51314 51306 51309 51345 51313 51478 51393 51419 51393 51402 51426 51425 51406 51404 51320
51363 51469 51340 51388 51366 51329 51342 51405 51393 51411 51387 51395 51384 51415 51319
51358 51339 51322 51380 51450 51345 51308 51407 51389 51396 51384 51413 51392 51391 51322
51356 51425 51340 51399 51463 51432 51340 51410 51408 51402 51537 51417 51542 51385 51546
51297 51459 51377 51384 51350 51401 51358 51407 51406 51400 51387 51416 51384 51384 51287
51342 51364 51369 51386 51275 51466 51359 51406 51392 51395 51536 51426 51393 51399 51324
51434 51426 51435 51373 51452 51451 51330 51411 51407 51398 51402 51403 51401 51389 51312
51309 51322 51353 51383 51347 51362 51466 51413 51396 51394 51405 51401 51390 51383 51332
51361 51382 51353 51382 51365 51360 51368 51409 51408 51400 51402 51413 51398 51392 51313
51357 51437 51466 51373 51352 51430 51351 51403 51393 51389 51401 51400 51392 51404 51307
51356 51428 51326 51397 51465 51365 51368 51402 51407 51389 51384 51396 51387 51383 51352
51409 51340 51353 51398 51363 51430 51349 51412 51391 51404 51396 51409 51389 51402 51309
51347 51373 51368 51361 51464 51352 51460 51413 51394 51389 51383 51412 51390 51391 51310
51359 51439 51343 51376 51361 51467 51355 51413 51408 51397 51401 51410 51391 51405 51349
51361 51431 51439 51376 51387 51438 51347 51412 51412 51395 51395 51410 51389 51391 51318
51358 51426 51342 51392 51434 51363 51467 51409 51394 51391 51391 51402 51388 51384 51332
51356 51338 51343 51377 51395 51365 51343 51414 51388 51397 51405 51411 51390 51383 51290
51363 51343 51374 51382 51321 51467 51352 51407 51408 51401 51388 51415 51388 51385 51312
51332 51431 51343 51393 51465 51375 51342 51406 51404 51381 51399 51415 51391 51385 51318
51297 51312 51364 51387 51465 51330 51342 51409 51408 51400 51393 51403 51392 51384 51333
51334 51365 51368 51375 51361 51350 51341 51410 51408 51402 51400 51410 51387 51386 51334
51466 51430 51434 51370 51362 51432 51356 51412 51396 51417 51415 51399 51390 51392 51378

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 51305 bytes 100%
1,000 51285 bytes -20 bytes 100%
10,000 51279 bytes -6 bytes 100%
100,000 51275 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
51580 bytes +305 bytes (+0.59%) +251 bytes
51579 bytes +304 bytes (+0.59%) +250 bytes
51584 bytes +309 bytes (+0.60%) +255 bytes
51520 bytes +245 bytes (+0.48%) +191 bytes
51460 bytes +185 bytes (+0.36%) +131 bytes
51462 bytes +187 bytes (+0.36%) +133 bytes
51353 bytes +78 bytes (+0.15%) +24 bytes
51375 bytes +100 bytes (+0.20%) +46 bytes
51329 bytes +54 bytes (+0.11%)

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 - for example, your browser actually supports it !
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 40891 bytes -10384 bytes (-20.25%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 43506 bytes -7769 bytes (-15.15%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 44570 bytes -6705 bytes (-13.08%)
Brotli (Wikipedia) brotli brotli -q 11 46298 bytes -4977 bytes (-9.71%)
LZMA2 (Wikipedia) xz xz -9 47012 bytes -4263 bytes (-8.31%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 48974 bytes -2301 bytes (-4.49%)
Zstandard (Wikipedia) zstd zstd -19 49563 bytes -1712 bytes (-3.34%)

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.