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 licenceApache License 2.0
Codeclibavif, BSD, implementing AV1
PatentsAOMedia Patent License 1.0
Where it came fromgithub.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 licenceApache License 2.0
Codeclibjxl, BSD-3-Clause
Patentsnone claimed either way, unlike AV1 and HEVC
Where it came fromgithub.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.

Whatpdf.js (pdfjs-dist) 6.3.289, Mozilla’s PDF engine — the one Firefox uses to display a PDF
LicenceApache License 2.0
Sizepdf.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 fromgithub.com/mozilla/pdf.js, taken from the npm registry and recorded with its sha256 in the directory it is served from
Served fromthis 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.

Encodersyour browser's own, through WebCodecs — nothing served from here
Written herelib-mux.js: the Ogg stream around Opus and the MP4 around AAC
Licence on thatours, and it carries no obligation onto you
Patentsa 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 fromnamb_format.h and tools/nam2namb.cpp in tone-3000/nam-binary-loader, MIT
Checked againstnamb/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 numbersthe declaration order of nam::activations::ActivationType in sdatkinson/NeuralAmpModelerCore, MIT
Shipped herenothing 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 againstPyMuPDF / MuPDF, a second implementation of the same Adobe data
Shipped herenothing 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.