Blog

Notes on the design

How Quillo's ideas came about, from the year it was only an idea: what each one is for, and what it replaces. Follow the feed, or get them by email.

  1. The route that reached an iPhone

    5 min read

    A Quillo program now runs on a real iPhone: the runtime inside the app, routes served on the phone itself, and real GPS, compass, camera and microphone, with no change to the program.

  2. JavaScript libraries by name: use Chart from ...

    3 min read

    A component now names the JavaScript library it uses with use, calls it as JavaScript reads (Chart.new, L.map, confetti()), and the page loads the script only where that component is.

  3. 491 components, one file each

    2 min read

    The Quillo UI kit grew from 108 components to 491, with 65 charts from bar charts to an order book, all searchable by tag. And a measurement of what a program pays for holding them.

  4. The dream monolith with an escape hatch

    2 min read

    Build one program, deploy one binary, and when one part gets busy, give it copies of its own, without changing a line. The escape hatch is a flag, not a rewrite.

  5. Styles that travel with components

    2 min read

    A page should carry the CSS of what it shows, not of every component the program has. style global did that for the booking app's home page, from 115,598 bytes to 30,663.

  6. Building apps to find the edges

    2 min read

    A forum, a project board, a newsroom, a bank of five services and a booking platform, each built in Quillo to bring out what breaks. Seventy-nine issues so far.

  7. Money, the type

    2 min read

    Exact decimals were the start. An amount also has a currency, minor units and rounding rules, and a split that must not lose a cent.

  8. Editors that know Quillo

    2 min read

    A language is used in an editor. A language server for hover and checks as you type, and a debugger with breakpoints in routes, views and components.

  9. Few love Rust

    2 min read

    Many admire Rust, and few want to write their web app in it. Quillo is written in Rust so that web developers get what Rust gives without writing it, and the few who love it still can.

  10. The consolidated tech stack

    3 min read

    A typical web app is a dozen tools with a dozen configs, each upgraded on its own schedule. What it looks like when most of them are one language and one binary.

  11. Arithmetic at machine speed

    2 min read

    An interpreter is slow at loops of numbers. Quillo compiles the functions that only do arithmetic to machine code, and gives the same answers as before.

  12. The unusual language to solve the web problem

    3 min read

    Most languages are general-purpose and leave the web to frameworks. Quillo goes the other way, a language made of the web's own parts, and that choice explains everything unusual about it.

  13. A node is not enough

    2 min read

    One process on one core is where most web servers start, and where busy ones run out of room. Quillo spreads the same program over every core, then over several servers, without a broker in between.

  14. When Rust is the right tool

    2 min read

    Image processing, parsing, a fast library from crates.io. A .qwer file is Rust, used like a .qwe file, with its functions callable from Quillo.

  15. Talking in real time

    2 min read

    Cursors, game moves and chat need messages both ways as they happen. A channel opened by a component, and handled on the server in a few lines.

  16. One app, many servers, the same code

    2 min read

    Start as one program, and move the heavy part to servers of its own when it needs them, without rewriting the calls between them.

  17. Payments that run once

    2 min read

    A client that sent a payment and got no answer cannot tell whether it went through. Idempotency keys let it ask again safely; idempotent() makes them one line.

  18. Pages before the click

    2 min read

    A link someone points at is a link they are about to follow. Fetching it then makes the next page appear at once, as long as fetching it can never change anything.

  19. Speaking every language, with plurals right

    2 min read

    "1 items" is the most common translation bug on the web. Plural rules per language, built in, make t() say the right thing in Polish and Arabic too.

  20. Small syntax decisions

    2 min read

    A language is mostly small choices. A few from the prototype: what braces mean, where a line ends, and why `for` cannot name a label.

  21. A checker that knows your routes

    2 min read

    Type checkers stop at the edge of the language. When routes, markup and effects are the language, the checker can see the whole web program.

  22. Sessions that cannot be forged

    2 min read

    Signing in should take three lines and be safe by default. Signed cookies, the right flags and a short list of rules can be the language's job.

  23. Money is not a float

    2 min read

    0.1 + 0.2 is not 0.3 in most languages, and every shop finds out at checkout. A web language should have exact decimals built in, with a literal of their own.

  24. No async, no await

    2 min read

    Async functions spread through a codebase like a dye. A web language can wait where it must and keep every function looking the same.

  25. Types that a request can be made into

    2 min read

    A type in most web stacks is a promise about data that was never checked. A record that is checked at the door, with its defaults filled in, is a type you can trust.

  26. One pattern language for everything

    2 min read

    match, let, for and routes all take apart values. If they share one pattern language, learning one teaches all four.

  27. Why the first Quillo will be an interpreter

    2 min read

    A year of design notes, and the plan for turning them into something that runs. The first version will walk the syntax tree, in Rust, and serve its own routes.

  28. Pages that follow the database

    2 min read

    Real-time pages usually need a message broker, topics and code on both ends. If the language sees what a page read and what a request wrote, it can do the wiring itself.

  29. Resume, don't redo

    2 min read

    Server rendering usually means rendering twice: once on the server, then again in the browser to attach the events. A page could instead pick up where the server left off.

  30. One file for the server and the browser

    2 min read

    Interactive pages usually mean two programs, an API between them, and types kept in step by hand. What if a component and the server function it calls sat in the same file?

  31. Saying what a function may touch

    2 min read

    A function's signature says what goes in and what comes out, but not whether it writes to the database on the way. A short `with` clause can.

  32. Errors you can hold

    2 min read

    Exceptions jump past the code that could have handled them. An error that is a value can be passed on, given a fallback or answered with, in one character.

  33. Reading code left to right

    2 min read

    Data moves through a web program in steps. A pipe operator lets the code read in the order the data moves, without a class for every step.

  34. Quillo is the accidental name

    2 min read

    Naming a language is hard. This one was named by a tired pair of hands, resting on the keyboard after a long night of coding.

  35. Checking requests at the door

    2 min read

    Validation usually happens inside the handler, after the request is already in. A pattern in the route can turn a bad request away before any code runs.

  36. HTML is a value

    2 min read

    Templates are strings with holes in them. What changes when markup is an ordinary value the language can check, pass around and escape on its own?

  37. What if routes were the language?

    2 min read

    Most web code is a router, a template engine and a validator glued together. The first idea behind Quillo: make those three the syntax itself.