Licences
Everything on this site that somebody else wrote, what it is licensed under, and what that obliges us to do. It is a short page, because there is very little of it: almost every tool here runs on code written for this site and on what your browser already has.
The AVIF encoder
The first of the three pieces of third-party code this site ships. No browser can write an AVIF file, so the converters that produce one offer to fetch an encoder — once, from this site, and only if you ask. Nothing is installed on your machine: it goes into your browser's ordinary cache like an image.
| What | @jsquash/avif 2.1.1, a WebAssembly build of libavif |
|---|---|
| Wrapper licence | Apache License 2.0 |
| Codec | libavif, BSD, implementing AV1 |
| Patents | AOMedia Patent License 1.0 |
| Where it came from | github.com/jamsinclair/jSquash |
Why the patent licence is reproduced here and not merely linked. The AOMedia licence, clause 1.2.1, requires that where an implementation is distributed in binary form the licence be included “in the documentation, legal notices, and/or other written materials provided with the Implementation”. A WebAssembly file is a binary, this page is the legal notice, and a copy also sits in the directory the encoder is served from.
The same clause carries the one reciprocity condition on this page: a licensee must make its own essential patent claims available on the same terms. This site holds no patents, so the obligation costs nothing — but it is a real term and it is recorded rather than glossed over.
The JPEG XL codecs
The second, and the only format on this site that browsers can neither read nor write. The converters that read a JPEG XL offer to fetch a decoder before they can tell you anything about your file at all; the converters that write one offer an encoder. Both come from this site, both are fetched only if you ask, and neither is installed on your machine.
| What | @jsquash/jxl 1.3.0, a WebAssembly build of libjxl |
|---|---|
| Wrapper licence | Apache License 2.0 |
| Codec | libjxl, BSD-3-Clause |
| Patents | none claimed either way, unlike AV1 and HEVC |
| Where it came from | github.com/jamsinclair/jSquash |
There is no patent document to reproduce for this one. libjxl carries no patent grant and no patent claim, which is worth stating plainly rather than leaving as an absence: it is the difference between this codec and the AVIF one above, and between it and HEIC, which this site does not ship at all for exactly that reason.
Reading a PDF
The third, and the one that is different from the other two: it is not optional. The AVIF and JPEG XL codecs above are offered behind a button and fetched only if you ask. The three pages that read a PDF — PDF to PNG, PDF to JPG and PDF to text — load a library as soon as you choose a file, and they say so above the file chooser rather than here.
| What | pdf.js (pdfjs-dist) 6.3.289, Mozilla’s PDF engine — the one Firefox uses to display a PDF |
|---|---|
| Licence | Apache License 2.0 |
| Size | pdf.min.mjs 448 KB and pdf.worker.min.mjs 1,236 KB — 1.64 MB uncompressed, about 495 KB over the wire |
| Where it came from | github.com/mozilla/pdf.js, taken from the npm registry and recorded with its sha256 in the directory it is served from |
| Served from | this site, not a CDN, so no third party is told that you are reading a PDF |
Why a library at all, when nothing else here uses one. Writing a PDF is a page of code and the three pages that put pictures into one do it with nothing downloaded. Reading one is a different job: object streams, cross-reference streams, eight compression filters, encryption, embedded and substituted fonts, CID character collections, and thirty years of files that do not quite follow the specification and are expected to work anyway. A partial implementation would not fail cleanly — it would open some files and quietly show the wrong thing for others, which is the worst outcome available.
Two optional font packs that pdf.js can use are deliberately not shipped: replacements for the fourteen fonts a PDF may reference without embedding (about 1 MB), and the character maps for Chinese, Japanese and Korean text in files using predefined collections (about 2 MB). If text in one of those categories comes out wrong, that is why.
The PDF writer
The pages that make a PDF ship
nobody’s code. lib-pdf.js was written for this site and
is about a page long, because that is genuinely all a document like this
needs: a header, a numbered list of objects, a table saying which byte
each object starts at, and a trailer pointing at the table.
A JPEG goes in untouched. PDF’s DCTDecode filter
is JPEG, so the file’s own bytes are copied into the page
with no decode and no re-encode. PNG and WebP cannot be carried that way
— PDF has never known either container — so those are decoded
by your browser and deflated back in by CompressionStream,
which is also part of your browser. Nothing is fetched for any of it.
Visitor measurement
Every page loads the Cloudflare Web Analytics beacon, which is a script served by Cloudflare rather than by this site. What it is, what it sends and what it does not, is set out on the privacy page — measured from the actual payload rather than taken from the documentation.
Fonts — ours is clean, yours may not be
The font converters ship nothing. A WOFF is an ordinary font file with each table deflated, and your browser already does deflate, so the code here is a repacker and carries no licence onto you.
The font is a different matter, and it is worth saying plainly. A commercial font is a licensed work, and a great many font licences specifically forbid converting or modifying the file — including turning one into a web font. Nothing here can know what you are entitled to do with a file on your own machine, and it does not guess. The pages read the licence text the font carries about itself and show it to you, which is more than most converters do.
What is deliberately absent. There is no OTF-to-TTF, because that means redrawing every outline from cubic curves to quadratic ones — an approximation with real decisions in it, and a job for font software rather than a repacker. And no WOFF2: it needs Brotli, which a browser does not offer to a page (checked, refused in both directions), and it rewrites the glyph tables into its own form, so it would mean shipping a compressor and a font library both.
ZIP, TAR and gzip — no library at all
The archive converters fetch nothing.
An archive is two things: a list of files and a way of squeezing them. Your
browser already has the squeezing — CompressionStream
does gzip and deflate because it needs both to load web pages — and
the list is a byte layout. A ZIP is a header before each file, a directory
at the end and a checksum; a tar is a 512-byte header in octal. Neither has
a licence or a patent in it.
Two formats are missing on purpose, for two different reasons. RAR cannot be written by anybody. RARLAB's own licence says their code may not be used "to re-create the RAR compression algorithm, which is proprietary". That is a legal restriction rather than a technical one, and it applies to everyone equally.
7z is a different problem. It needs LZMA, which the
browser does not have, so it would mean shipping a compressor. The one
build that could be found declares its licence as
SEE LICENSE IN LICENSE — and that file is not in the
published package, not in the repository, and not named in the README.
Upstream 7-Zip is LGPL, which would be consistent, but consistency is an
inference and this site does not record inferences as readings. An unread
licence is not a permissive one, so it is not used.
Opus and AAC — the encoders this site does not have
The Opus and M4A converters ship no encoder at all, and that is the entire reason they exist. WebCodecs lets a page use the audio encoders your browser already carries — the ones your operating system vendor has already licensed for you — so nothing is downloaded, nothing is installed, and this site distributes no codec.
Why that matters more for AAC than for anything else here. MP3's patents expired in 2017, which Fraunhofer stated themselves, so shipping an MP3 encoder costs nobody anything. AAC's have not. Via LA runs an active AAC licensing programme, and shipping an AAC encoder from this site would mean taking on that question. So it does not ship one, and never will. It asks the browser, and the browser uses the licence it already has.
| Encoders | your browser's own, through WebCodecs — nothing served from here |
|---|---|
| Written here | lib-mux.js: the Ogg
stream around Opus and the MP4 around AAC |
| Licence on that | ours, and it carries no obligation onto you |
| Patents | a container is a byte layout, not a codec; there is nothing in it to license |
The containers were written rather than fetched for the same reason BMP, QOI and GIF were: an Ogg page is a header, a segment table and a checksum, and an MP4 is a tree of boxes. Both are plain format code. Writing them keeps these two pages at nothing-to-download, which is the property worth protecting.
The NAMB writer
The NAM to NAMB converter ships
nobody's code: lib-namb.js was written for this site. But it is
a port of a published writer rather than an independent
guess at a file format, and that is worth saying plainly.
| Ported from | namb_format.h and
tools/nam2namb.cpp in tone-3000/nam-binary-loader, MIT |
|---|---|
| Checked against | namb/get_dsp_namb.cpp
in the same repository — the loader that reads these files on a
device, which states the layout a second time |
| Activation numbers | the declaration order of
nam::activations::ActivationType in
sdatkinson/NeuralAmpModelerCore, MIT |
| Shipped here | nothing of theirs; the port is ours and carries no obligation onto you |
The distinction matters because a file format is not a program. Reading a specification and writing your own encoder is how every format works, and the four architectures, the CRC and the byte layout are facts about the format rather than somebody's expression of them. The attribution above is because the work would have been far harder without those files, not because a licence demands it.
The PDF typesetter, and whose numbers it uses
The pages that turn a
document into a PDF ship nobody’s code.
lib-pdftext.js was written for this site, and it downloads
nothing — because a PDF may name any of fourteen fonts
without carrying them, every reader being required to have them already.
That is why these pages keep the promise the three PDF
reader pages cannot.
But to break a line it has to know how wide each character is, and those numbers are not ours. They are Adobe’s published metrics for the base-14 fonts — 2,616 glyph widths — which are facts about a specification rather than anybody’s expression of it. They were read from @pdf-lib/standard-fonts (MIT), which carries Adobe’s AFM data, and checked glyph by glyph against PyMuPDF, which has its own separate copy.
| Read from | @pdf-lib/standard-fonts, MIT — at BUILD time only |
|---|---|
| Checked against | PyMuPDF / MuPDF, a second implementation of the same Adobe data |
| Shipped here | nothing of either — the table is regenerated by pdftext-metrics.py, which refuses to write it if the two sources disagree |
Checking one against the other was not ceremony. It found a real error in the first: that library maps both the capital and the small Y-with-diaeresis to the same glyph name, so anything laying out text through it sets the capital 167 thousandths of an em too narrow, and nothing about the finished file looks wrong. It also reports all fourteen fonts as monospaced, which only Courier is. Neither mistake is in the table this site uses.
Everything else is ours
There is no framework here, no analytics beyond the beacon above, no fonts fetched from anywhere, no icon set and no component library. The pages are hand-written HTML and CSS, the calculators and decoders are written for this site, and the data behind the serial-number tools comes from the manufacturers and registers named on each page.
The image converters are worth a paragraph of their own. Apart from AVIF and JPEG XL, they use the codecs your browser already ships — so this site distributes no encoder and no decoder for JPG, PNG, WebP or HEIC, and inherits no licence from any of them.
Three formats are written here rather than fetched or delegated. BMP is a file header, an info header and uncompressed pixels, so it is about forty lines. QOI is a fourteen-byte header and six kinds of chunk, and was checked against the format's own reference images. GIF needed rather more — a median-cut palette, dithering and LZW compression — because a GIF holds 256 colours and choosing which 256 is a judgement rather than a translation. In all three cases writing it was a better trade than a dependency, and none of them owes anybody anything.
What you make with it
Yours. Nothing you convert, calculate or look up here is uploaded, stored or seen by anyone, so there is nothing for this site to have a claim on. The terms say the same thing at greater length.