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

After GZIP compression these minified files vary in size:
gzip -6 (default)
  42303 bytes (41.3k)
local copy
unpkg
  42274 bytes (41.3k)
CDN
gzip -9
  42186 bytes (41.2k)
local copy
7zip -mx=9 -tgzip
  40798 bytes (39.8k)
local copy
zultra
  40766 bytes (39.8k)
local copy
libdeflate -12
  40760 bytes (39.8k)
local copy
pigz -11 -n
  40727 bytes (39.8k)
local copy
kzip -s0 -rn -b8
  40654 bytes (39.7k)
local copy
Zopfli
  40512 bytes (39.6k)
local copy
Zopfli (defluff)
  40511 bytes (39.6k)
local copy

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

You will automatically get the smallest D3 3.0.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 1762 bytes by using my D3 3.0.1 Zopfli version instead of the best available CDN (4.35% smaller than unpkg, 40512 vs. 42274 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 --bsr14 --lazy --ohh

(found November 23, 2015)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 256  --mls256
block splitting recursion 14  --bsr14
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 (40511 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.0.1/d3.min.js --location | md5sum
58340b7108bd9821f6e0df0b3a27bfb1  -
curl --silent --compressed https://minime.stephan-brumme.com/files/d3/d3-3.0.1.min.zopfli.js.gz | md5sum
58340b7108bd9821f6e0df0b3a27bfb1  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 42274 bytes 58340b7108bd9821f6e0df0b3a27bfb1 July 11, 2016 @ 16:32

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
40512 bytes -8 bytes zopfli --i100000 --mls256 --bsr14 --lazy --ohh November 23, 2015 @ 16:52
40520 bytes -3 bytes zopfli --i10000 --mls256 --bsr14 --lazy --ohh October 14, 2015 @ 11:21
40523 bytes -2 bytes zopfli --i1000 --mls256 --bsr14 --lazy --ohh September 20, 2015 @ 21:45
40525 bytes -11 bytes zopfli --i1000 --mls8 --bsr14 --lazy --ohh September 20, 2015 @ 21:27
40536 bytes zopfli --i100 --mls8 --bsr14 --lazy --ohh September 18, 2015 @ 22:04

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
40632 40649 40715 40699 40645 40648 40645 40696 40648 40721 40722 40610 40719 40718 40730
40697 40606 40705 40610 40697 40699 40711 40704 40701 40724 40528 40544 40724 40625 40722
40567 40579 40696 40541 40685 40531 40693 40691 40694 40721 40713 40716 40717 40635 40727
40546 40615 40540 40544 40550 40607 40691 40589 40559 40721 40691 40597 40717 40606 40720
40625 40617 40621 40544 40700 40554 40599 40580 40579 40532 40575 40600 40720 40564 40628
40566 40546 40575 40562 40567 40583 40635 40693 40605 40715 40576 40713 40717 40586 40718
40542 40605 40603 40613 40533 40600 40633 40571 40572 40578 40577 40571 40717 40622 40720
40572 40566 40570 40562 40602 40542 40686 40701 40703 40721 40528 40625 40717 40723 40721
40574 40572 40628 40537 40701 40542 40562 40582 40584 40543 40527 40580 40716 40626 40614
40572 40565 40583 40534 40584 40558 40546 40588 40690 40721 40721 40716 40719 40637 40718
40561 40567 40521 40560 40699 40532 40589 40512 40564 40524 40521 40595 40716 40635 40727
40567 40571 40585 40561 40569 40579 40581 40578 40587 40721 40571 40577 40717 40617 40735
40536 40589 40592 40567 40576 40611 40685 40693 40558 40721 40532 40582 40735 40625 40717
40537 40536 40573 40562 40576 40598 40591 40695 40581 40707 40707 40581 40718 40628 40718
40558 40560 40705 40566 40579 40564 40578 40695 40581 40589 40559 40584 40721 40632 40718
40599 40566 40588 40568 40581 40527 40575 40582 40585 40531 40573 40588 40717 40717 40718
40570 40634 40547 40559 40700 40563 40574 40691 40715 40721 40721 40591 40717 40607 40602
40580 40574 40598 40585 40697 40580 40590 40582 40573 40533 40588 40574 40718 40632 40718
40577 40582 40632 40560 40699 40641 40574 40581 40581 40722 40721 40591 40720 40719 40720
40575 40569 40694 40562 40697 40559 40554 40565 40539 40721 40575 40596 40717 40614 40717
40572 40566 40582 40560 40557 40601 40600 40695 40540 40721 40522 40570 40716 40627 40717
40563 40582 40700 40605 40698 40588 40561 40584 40576 40587 40588 40584 40718 40626 40718
40579 40567 40579 40571 40572 40607 40601 40589 40561 40723 40535 40706 40721 40629 40601

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 40536 bytes 100%
1,000 40523 bytes -13 bytes 100%
10,000 40520 bytes -3 bytes 100%
100,000 40512 bytes -8 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
40740 bytes +228 bytes (+0.56%) +86 bytes
40743 bytes +231 bytes (+0.57%) +89 bytes
40739 bytes +227 bytes (+0.56%) +85 bytes
40752 bytes +240 bytes (+0.59%) +98 bytes
40750 bytes +238 bytes (+0.59%) +96 bytes
40771 bytes +259 bytes (+0.64%) +117 bytes
40758 bytes +246 bytes (+0.61%) +104 bytes
40750 bytes +238 bytes (+0.59%) +96 bytes
40654 bytes +142 bytes (+0.35%)

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 32813 bytes -7699 bytes (-19.00%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 34621 bytes -5891 bytes (-14.54%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 36104 bytes -4408 bytes (-10.88%)
Brotli (Wikipedia) brotli brotli -q 11 36852 bytes -3660 bytes (-9.03%)
LZMA2 (Wikipedia) xz xz -9 37632 bytes -2880 bytes (-7.11%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 39205 bytes -1307 bytes (-3.23%)
Zstandard (Wikipedia) zstd zstd -19 39280 bytes -1232 bytes (-3.04%)

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.