Thanks
What Quillo is built on
Quillo is one binary, but not one piece of work. It speaks the web's protocols and formats, which people thought of and wrote down over fifty years; the way its routes, groups, patterns and pipelines are written was seen in other languages and frameworks first; the whole idea, one language for a web app, was tried before by others, who are named here too; inside it are 40 Rust crates, each written and kept by people who share it; around it, databases, a code generator, a browser and a runtime for its tools; and on this site, fonts and a map. This page names them. The list of crates is made from Quillo's own Cargo.toml, so it follows the code.
The web itself
Before any crate, the ideas: the protocols, formats and standards Quillo speaks, and the people who thought of them and wrote them down.
| Idea | By | In Quillo | Written down at |
|---|---|---|---|
| The web, HTTP and URLs | Tim Berners-Lee at CERN, 1989 to 1991; HTTP/1.1 by Roy Fielding, Henrik Frystyk Nielsen and others at the IETF | what a Quillo program speaks: requests, answers, addresses, keep-alive, chunked bodies | IETF RFC 9110 and RFC 3986 |
| HTML | Tim Berners-Lee; the living standard by the WHATWG, Ian Hickson and others | what pages are made of; Quillo's HTML literals are HTML | WHATWG HTML |
| CSS | Håkon Wium Lie and Bert Bos, 1994 to 1996; the W3C CSS working group | a component's style, scoped, and the sheets a page gets | W3C CSS |
| JavaScript | Brendan Eich at Netscape, 1995; ECMAScript by Ecma TC39 | what components compile to, and run as in the browser | ECMA-262 |
| JavaScript engines and the DOM | V8 by Lars Bak and the team at Google; SpiderMonkey by Brendan Eich and Mozilla; JavaScriptCore at Apple; the DOM by the W3C and the WHATWG | what runs a component in the browser, and the document it changes | WHATWG DOM |
| JSON | Douglas Crockford, who wrote it down in 2001 | every API answer, every call to the server, the island's state | ECMA-404 and RFC 8259 |
| Cookies | Lou Montulli at Netscape, 1994 | sessions, signed | IETF RFC 6265 |
| WebSockets | Ian Hickson at the WHATWG; Ian Fette and Alexey Melnikov at the IETF | live data and --watch reloads reaching open pages | IETF RFC 6455 |
| Server-sent events | Ian Hickson at the WHATWG | events(), a stream of updates a page listens to | WHATWG HTML, section 9.2 |
| QUIC, HTTP/3 and WebTransport | Jim Roskind at Google, then the IETF QUIC working group; WebTransport by Victor Vasiliev and the W3C | channels and media over datagrams and streams | IETF RFC 9000 and RFC 9114; W3C WebTransport |
| TLS | SSL by Taher Elgamal and Kipp Hickman at Netscape; TLS by Tim Dierks, Christopher Allen and Eric Rescorla at the IETF | every connection Quillo makes to a database or another server | IETF RFC 8446 |
| SQL | Donald D. Chamberlin and Raymond F. Boyce at IBM, 1974 | what db.query and the rest speak | ISO/IEC 9075 |
| TCP and UDP | Vint Cerf and Bob Kahn, 1974; UDP by David P. Reed, 1980 | the server's connections, and udp.listen and udp.send | IETF RFC 9293 and RFC 768 |
| Unicode and UTF-8 | Joe Becker, Lee Collins and Mark Davis for Unicode; UTF-8 by Ken Thompson and Rob Pike, 1992 | every string, counted in characters | The Unicode Standard; IETF RFC 3629 |
| DEFLATE and gzip | Phil Katz; gzip and zlib by Jean-loup Gailly and Mark Adler | text answers, compressed | IETF RFC 1951 and RFC 1952 |
| SHA-2 and HMAC | SHA-2 by the NSA, published by NIST; HMAC by Mihir Bellare, Ran Canetti and Hugo Krawczyk, 1996 | crypto.sha256, crypto.hmac, and the signatures on sessions and calls between services | FIPS 180-4; IETF RFC 2104 |
| Argon2 | Alex Biryukov, Daniel Dinu and Dmitry Khovratovich, 2015, winner of the Password Hashing Competition | crypto.hash_password | IETF RFC 9106 |
| Regular expressions | Stephen Cole Kleene, 1951; in software by Ken Thompson, 1968; JavaScript's dialect by Ecma TC39 | re.test and the rest, the same on the server and in the browser | ECMA-262, RegExp |
| Markdown | John Gruber with Aaron Swartz, 2004; CommonMark by John MacFarlane and others, 2014 | markdown(), and the docs you are reading | CommonMark |
| cron | Ken Thompson in Version 7 Unix, 1979; the five fields as most know them by Paul Vixie, 1987 | schedule("@daily", ...) and the fields it reads | Vixie cron's crontab(5) |
| kqueue, epoll and inotify | kqueue by Jonathan Lemon for FreeBSD, 2000; epoll by Davide Libenzi for Linux, 2002; inotify by John McCutchan, 2005 | the event loop over every connection, and the watcher told of a saved file | FreeBSD and Linux manual pages |
| Source maps | John Lenz at Google and Nick Fitzgerald at Mozilla, the version 3 proposal, 2011 | a breakpoint in a .qwe file, set from the browser or an editor | The Source Map specification, now at TC39 |
| The Language Server and Debug Adapter Protocols | Microsoft, with Red Hat and Codenvy, 2016 | quillo lsp and quillo dap: completion, diagnostics, breakpoints and stepping in any editor | LSP and DAP specifications |
| OpenAPI | Tony Tam, as Swagger, 2011; the OpenAPI Initiative under the Linux Foundation | quillo docs and --describe: a program's API, written down | OpenAPI 3 |
| JSX | Jordan Walke and the React team at Facebook, 2013 | the shape of Quillo's HTML literals: markup in code, expressions in braces | The JSX specification |
| Islands | Katie Sylor-Miller, who named them, and Jason Miller, who wrote them up, 2019 to 2020 | how a page is served whole and its components wake where they stand | Jason Miller's essay |
Ideas, and where they were seen before
How a route, a group, a pattern or a pipeline is written in Quillo did not start here. Each line names the people who wrote it that way first, and where to read it.
| In Quillo | Seen before in | What it looks like here |
|---|---|---|
| A route as a line of the program | Sinatra, by Blake Mizerany, 2007: get '/hi' do ... end | route GET /hi = ..., the method and the path as syntax, the body as the answer |
| Typed path parameters | Ruby on Rails, by David Heinemeier Hansson, 2004, with constraints on a segment; Sinatra's :name | :id(int) in a route, converted and refused before the body runs |
| Request patterns | Pattern matching in function heads, from Erlang by Joe Armstrong, Robert Virding and Mike Williams, and Elixir by José Valim; Phoenix's router and Plug, by Chris McCord | { query, form, json, headers } after a route's path: the request's shape decides which route answers, and binds its names |
| Middleware as a chain the request passes through | Rack, by Christian Neukirchen, 2007; Connect and Express, by TJ Holowaychuk, 2010 | request | auth.required | ..., and a group's | signed_in | admins: each stage gives the request back or answers in the route's place |
| Route groups with a prefix, middleware and a host | Laravel, by Taylor Otwell, 2011: Route::prefix()->middleware()->group() and Route::domain() | routes /admin | signed_in { ... } and routes /api { headers: { host: ... } } { ... }, nested |
| Ending the request from anywhere | Sinatra's halt; Rails' render ... and return | reply 404 { error: ... } in a helper, a pipeline stage or a ?? fallback |
| Pipelines | Unix pipes, by Doug McIlroy, 1973; the |> of F#, by Don Syme, and of Elixir, by José Valim | xs | map(f) | filter(g): the value on the left goes in as the first argument |
| Errors as values, passed on with ? | Rust's ? and Result, by the Rust Project, 2016; Go's errors as values, by Rob Pike, Robert Griesemer and Ken Thompson | err(...), is_err, and ? after a call that returns the error from the function it is in |
| Fine-grained reactivity | SolidJS, by Ryan Carniato, 2018; Svelte 5's runes, by Rich Harris; Knockout's observables, by Steve Sanderson, 2010 | state, and the lets, views and elements that follow what they read, each updated on its own |
| Effects a function declares | Koka's effect types, by Daan Leijen, 2014; Unison's abilities | fn load(id) with db = ...: what a function may do besides compute, checked where it is called |
| Records with defaults, checked at the edges | TypeScript, by Anders Hejlsberg and Microsoft, 2012; Zod, by Colin McDonnell, 2020; pydantic, by Samuel Colvin, 2017 | type User = { ... } and User(request.json): the shape of the data said once, checked on the way in |
| Calling the server like a function | Meteor's methods, by the Meteor Development Group, 2012; Server Functions in React and Next.js, by Meta and Vercel | server fn, called from a component as if it were local, awaited by the compiler |
Those who tried it before
Quillo's bet, one language for the whole of a web app, is not new. These people made it before: some as research, some as companies, some still going and some stopped. Each showed a part of what the idea can be, and what it costs. Quillo tries it again on their work.
| Project | By | What they tried |
|---|---|---|
| PHP | Rasmus Lerdorf, 1994 to 1995, as Personal Home Page Tools | the page and the code in one file, the server's answer written where the HTML is |
| ColdFusion | J.J. and Jeremy Allaire, at Allaire Corporation, 1995 | a language of the page's own tags, with the database query in the page |
| Hop | Manuel Serrano, Erick Gallesio and Florian Loitsch at Inria, 2006; later with Gérard Berry | one language and one platform for the server and the browser: multitier programming |
| Links | Ezra Cooper, Sam Lindley, Philip Wadler and Jeremy Yallop at the University of Edinburgh, 2006 | web programming without tiers: one source for the server, the browser's JavaScript and the database's SQL |
| Google Web Toolkit | Bruce Johnson and Joel Webber at Google, 2006 | one language on both sides: the browser's code compiled from Java, and calls to the server as typed interfaces |
| WebDSL | Danny Groenewegen, Zef Hemel, Lennart Kats and Eelco Visser at TU Delft, 2008 | data, pages, access control and validation in one language, with a checker that holds them to each other |
| Arc | Paul Graham and Robert Morris, 2008 | a Lisp with a web server inside, small enough to write Hacker News in |
| Ur/Web | Adam Chlipala at MIT, 2010 | one statically typed program for the server, the browser and SQL, checked whole, so that a link, a form or a query cannot go wrong at run time |
| Opa | Henri Binsztok and MLstate in Paris, open source in 2011 | a language that was also its own web server and database |
| Elm | Evan Czaplicki, 2012 | a language made for the browser, with no runtime exceptions and compiler messages written to teach |
| Eve | Chris Granger, Rob Attorri, Jamie Brandon, Corey Montella, Josh Cole and Eric Hoffman, 2014 to 2018 | programming rethought from the ground up, the language and its environment as one; the team stopped in 2018, and wrote down what it learned |
| Imba | Sindre Aarsaether, public in 2015 | a full-stack language for the web, with markup as syntax, compiled to JavaScript |
| Eliom | Vincent Balat, Jérôme Vouillon, Gabriel Radanne and the Ocsigen project at Université Paris Diderot, as a core language in 2016 | tierless OCaml: the server's and the browser's code in one file, typed together |
| Mint | Gusztáv Szikszai, from 2018 | components, styles, routes and state as parts of the language, not of a framework |
| Darklang | Ellen Chisa and Paul Biggar, unveiled in 2019 | the language, the editor and the hosting as one, with no deploy step to think about |
| Wasp | Matija and Martin Šošić, 2020 | a small language that says what a full-stack app is (its routes, pages, auth and data), beside the code that does it |
Foundations
| Project | By | What it does for Quillo | Licence |
|---|---|---|---|
| Rust | the Rust Project and its contributors | the language Quillo is written in, and the compiler and cargo that build it | MIT OR Apache-2.0 |
| SQLite | D. Richard Hipp and the SQLite team | the database a Quillo program starts with, bundled in every build | Public domain |
| PostgreSQL | the PostgreSQL Global Development Group | the database for programs that outgrow one machine | PostgreSQL License |
| MySQL and MariaDB | Oracle, and the MariaDB Foundation | the other databases `db` speaks to | GPL-2.0 |
| mimalloc | Daan Leijen and Microsoft Research | the allocator on Quillo's loop and waiting threads | MIT |
| Cranelift | the Bytecode Alliance | the code generator behind compiled numbers | Apache-2.0 WITH LLVM-exception |
| CommonMark | John MacFarlane and the CommonMark group | the Markdown `markdown` reads | CC-BY-SA 4.0 |
| The IANA time zone database | Paul Eggert and its contributors | every time zone `date` knows | Public domain |
| Chromium | the Chromium authors | the browser Quillo's tests and this site's checks drive, headless | BSD-3-Clause |
| Node.js | the OpenJS Foundation and its contributors | the tools beside Quillo: the reference's harness, the repros' runner | MIT |
Inside Quillo 0.6.0
Every crate Quillo depends on directly, as cargo metadata reports it. The crates these bring in turn, a few hundred, are listed in Quillo's Cargo.lock.
| Crate | By | What it does for Quillo | Licence |
|---|---|---|---|
| argon2 0.5.3 | RustCrypto Developers | crypto.hash_password | MIT OR Apache-2.0 |
| bytes 1.12.1 | Carl Lerche, Sean McArthur | buffers shared between the loop and the waiting threads | MIT |
| corosensei 0.3.4 | Amanieu d'Antras | a coroutine for each request, with a stack of its own | MIT OR Apache-2.0 |
| cranelift-codegen 0.134.4 | The Cranelift Project Developers | numeric functions compiled to machine code | Apache-2.0 WITH LLVM-exception |
| cranelift-frontend 0.134.4 | The Cranelift Project Developers | the same: building the code | Apache-2.0 WITH LLVM-exception |
| cranelift-jit 0.134.4 | The Cranelift Project Developers | the same: running it | Apache-2.0 WITH LLVM-exception |
| cranelift-module 0.134.4 | The Cranelift Project Developers | the same: its modules | Apache-2.0 WITH LLVM-exception |
| cranelift-native 0.134.4 | The Cranelift Project Developers | the same: for the machine it runs on | Apache-2.0 WITH LLVM-exception |
| ctrlc 3.5.2 | Antti Keränen | stopping cleanly on Ctrl-C and on a signal | MIT/Apache-2.0 |
| fastrand 2.5.0 | Stjepan Glavina | random, random_int and uuid | Apache-2.0 OR MIT |
| flate2 1.1.10 | Alex Crichton, Josh Triplett | gzip for text answers | MIT OR Apache-2.0 |
| getrandom 0.4.3 | The Rand Project Developers | randomness from the system, for keys and tokens | MIT OR Apache-2.0 |
| httparse 1.10.1 | Sean McArthur | reading HTTP requests | MIT OR Apache-2.0 |
| image 0.25.10 | The image-rs Developers | image.info and image.convert | MIT OR Apache-2.0 |
| indexmap 2.14.2 | maps that keep their keys in the order written | Apache-2.0 OR MIT | |
| jiff 0.2.38 | Andrew Gallant | dates and time zones, with the IANA database bundled where the system has none | Unlicense OR MIT |
| libc 0.2.190 | the system's own calls where Rust's library has none: file events, waiting on a slow client | MIT OR Apache-2.0 | |
| libloading 0.8.9 | Simonas Kazlauskas | loading the Rust a program writes in .qwer files | ISC |
| libmimalloc-sys 0.1.49 | Octavian Oncescu | mimalloc, the allocator on the loop and the waiting threads | MIT |
| mio 1.2.4 | Carl Lerche, Thomas de Zeeuw, Tokio Contributors | the event loop: one thread over every connection, with kqueue on macOS and epoll on Linux | MIT |
| muda 0.21.2 | the macOS menu bar, for copy and paste in the window | Apache-2.0 OR MIT | |
| mysql_async 0.37.1 | blackbeam | MySQL and MariaDB for db | MIT OR Apache-2.0 |
| postgres 0.19.14 | Steven Fackler | PostgreSQL from scripts and jobs | MIT OR Apache-2.0 |
| psm 0.1.32 | Simonas Kazlauskas | switching stacks for those coroutines | MIT OR Apache-2.0 |
| pulldown-cmark 0.12.2 | Raph Levien, Marcus Klaas de Vries | markdown, CommonMark with tables and task lists | MIT |
| regex 1.13.1 | The Rust Project Developers, Andrew Gallant | re, with patterns that match as JavaScript's do | MIT OR Apache-2.0 |
| rusqlite 0.32.1 | The rusqlite developers | SQLite, bundled, the database a program starts with | MIT |
| rustls 0.23.46 | TLS, in Rust | Apache-2.0 OR ISC OR MIT | |
| rustls-native-certs 0.8.5 | the operating system's own root certificates, when asked | Apache-2.0 OR ISC OR MIT | |
| serde_json 1.0.154 | JSON, read and written exactly | MIT OR Apache-2.0 | |
| sha2 0.11.1 | RustCrypto Developers | crypto.sha256 and crypto.hmac | MIT OR Apache-2.0 |
| stacker 0.1.25 | Alex Crichton, Simonas Kazlauskas | room on the stack for deep recursion | MIT OR Apache-2.0 |
| tao 0.37.1 | Tauri Programme within The Commons Conservancy, The winit contributors | the window itself | Apache-2.0 |
| tokio 1.53.3 | Tokio Contributors | the threads that wait on databases and the network while the loop goes on | MIT |
| tokio-postgres 0.7.18 | Steven Fackler | PostgreSQL, with queries pipelined on shared connections | MIT OR Apache-2.0 |
| tokio-postgres-rustls 0.13.0 | Jasper Hugo | TLS to PostgreSQL | MIT |
| ureq 2.12.1 | Martin Algesten, Jacob Hoffman-Andrews | the HTTP client behind http.* and services | MIT OR Apache-2.0 |
| webpki-roots 1.0.11 | the root certificates browsers trust, for connections Quillo makes | CDLA-Permissive-2.0 | |
| wry 0.57.0 | Tauri Programme within The Commons Conservancy | quillo app: the program in a native window | Apache-2.0 OR MIT |
| wtransport 0.7.2 | Biagio Festa | channels and media over WebTransport | MIT OR Apache-2.0 |
And for the tests only:
| Crate | By | What it does | Licence |
|---|---|---|---|
| rcgen 0.14.10 | certificates for the tests of TLS to databases | MIT OR Apache-2.0 |
On this site
| Project | By | Where | Licence |
|---|---|---|---|
| Instrument Serif | Rodrigo Fuenzalida and Jordan Egstad | the headings | OFL-1.1 |
| Inter | Rasmus Andersson | the text | OFL-1.1 |
| JetBrains Mono | JetBrains | the code | OFL-1.1 |
| Leaflet | Volodymyr Agafonkin and contributors | the map in the MapView component, loaded on its page | BSD-2-Clause |
| OpenStreetMap | the OpenStreetMap contributors | the map tiles MapView shows | ODbL |
| cdnjs | Cloudflare and the cdnjs community | where that page fetches Leaflet from | MIT |
| GitHub | GitHub, Inc. | where Quillo, the components, the plugins and this site are kept, and sign-in for comments and samples | |
Quillo itself is MIT licensed. If you made something here and want it named differently, or something is missing, say so on Discord or in an issue on GitHub.