{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreicxz3uppgvmmgclwgbuyx5znjtv7rqydtvol4p6zdxbp3ngyjs36a",
"uri": "at://did:plc:saveesaetvd7rir7ylfiqlxz/app.bsky.feed.post/3mnygfyhn6sj2"
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreib4x455cwlr47pygfuumrg43a5ixqop33ivc32q66x2o2ujtceuza"
},
"mimeType": "image/png",
"size": 2645683
},
"description": "Let me tell you about a language. But if you wish to go play instead go here. It's going to get a little abstract below.\n\n\nThere is a Canvas to Compose Upon\n\nThe canvas is a square with the largest circle that has a radius of ρ.\n\n\nThere are Vectors of Time\n\nƎ a raven ∋ the vector of hours.\n\nƎ a crow ∋ the vector of minutes.\n\nƎ a mag-pi ∋ the vector of seconds.\n\nƎ an origin ∋ a vector of zero.\n\n\nThe Vectors can form:\n\nScalars\n\nWhere the vectors become a single number.\n\n * ./ρ² – the normalized do",
"path": "/there-is-3-such-that/",
"publishedAt": "2026-06-11T04:50:01.000Z",
"site": "https://www.fractalkitty.com",
"tags": [
"go here.",
"https://te-st.ing",
"Recurse Center",
"Svelte Flow",
"p5.js",
"IndieWeb"
],
"textContent": "Let me tell you about a language. But if you wish to go play instead go here. It's going to get a little abstract below.\n\n### There is a Canvas to Compose Upon\n\nThe canvas is a square with the largest circle that has a radius of ρ.\n\n### There are Vectors of Time\n\nƎ a raven ∋ the vector of hours.\n\nƎ a crow ∋ the vector of minutes.\n\nƎ a mag-pi ∋ the vector of seconds.\n\nƎ an origin ∋ a vector of zero.\n\n### The Vectors can form:\n\n**Scalars**\n\nWhere the vectors become a single number.\n\n * ./ρ² – the normalized dot product of two vectors\n * ||˙||/ρ – the normalized magnitude\n * →/ρ – the normalized horizontal component\n * ↑/ρ – the normalized vertical component\n\n\n\n(All scalars are normalized by ρ (the canvas radius) )\n\nAnd once you have scalars, they can form _new scalars_ too: sum, subtract, multiply, divide.\n\n * ⊞ Add\n * − Subtract\n * ⊠ Multiply\n * ⊡ Divide\n\n\n\n**Modified Vectors**\n\nVectors can be added, subtracted, rotated and multiplied\n\nVectors and Modified vectors have a horizontal and vertical component just like a point or location.\n\n### Glyphs\n\nMake things visible. They take in vectors and output to the canvas. The moon, sun, and star are at the vector's coordinates and the line connects two vectors.\n\nEach glyph can be tuned.\n\n### Habitats\n\nAdd composition and can take vector inputs.\n\nHabitats paint the canvas — not just a point.\n\n * grass\n * trees\n * a nebula\n * a meta-trace\n * an egg\n * a focus (a porthole)\n * moss\n\n\n\nVector inputs will change how they move just a little bit.\n\n### Tuning ◍\n\nParameters can change how the whole composition breathes.\n\n * cycles per day — how many times the clock wraps in 24 hours\n * hours per cycle — the base for the raven's loop\n * default breath depth and speed — the resting rhythm everything inherits\n * default stroke weights for lines and shapes\n * a theme — ambiance, mono, contrast, cividis, tri, botanical\n * a backdrop color, a default line color, a default shape color\n * frame rate\n\n\n\n### Composition\n\nCompose a clock using all of the types of pieces and connecting them.\n\nGo to https://te-st.ing and make a clock for yourself, then export it to save.\n\n## How?\n\nI am currently in a 6-week batch at the Recurse Center. I wanted to make a language that produced clocks for \"Impossible Day.\" After drafting a prototype, I refined the idea a little and made a second prototype.\n\n### It starts with types\n\nThere are vectors, modified vectors, scalars, scalar modifiers, glyphs, and habitats.\n\n### the shape\n\nThere some main components to the tool:\n\n * A **Loom** holds the composition — nodes, arrows, and globals.\n * Types are represented as nodes.\n * You can bring a node from the palette to the Loom.\n * Nodes can connect with arrows.\n * A **Weave** compiles the composition into a p5 sketch inside a preview iframe.\n * Every change in the **Loom** re-weaves the **clock** in the preview\n * Each Clock can be downloaded as a standalone HTML file.\n\n\n\n### the pieces\n\n * **Svelte 5** — runes, snippets, event attributes.\n * **TypeScript** with `svelte-check` and ESLint.\n * **Vite** for dev and build.\n * Svelte Flow for the node-graph (Loom)\n * p5.js for the rendered clock on the canvas\n * Inline into the exported HTML so the file is self-contained — open it offline, drop it on a slash page (maybe /clock would be nice on a blog - hint hint)\n * **`localStorage`** for autosave, undo history, positions, and some preferences.\n\n\n\nEverything in your browser.\n\n### choices\n\n**The editor is wordless**(mostly) Sigils on the buttons, hand-drawn icons on the nodes, minimal clutter. Only the header actions keep their labels. Tool tips are toggled on and off (after feedback from IndieWeb meet)\n\n**The clock is procedural** The nodes in the palette and the on-canvas node bodies use symbols or hand-drawn PNGs. But the exported clock paints everything from p5 primitives with randomness.\n\n**One source of truth for time.** A `dayFraction` function in the woven sketch returns where we are in the day, and every bird's angle derives from it. Change `cyclesPerDay` or `hoursPerCycle` and the clock re-paces.\n\n**Debug mode is visual** Toggle `⌖` and the debug mode turns on. A slider appears that scrubs through the whole day. Selected nodes highlight in this mode.\n\n**Canvas** The empty-canvas has some example clocks after some feedback from the IndieWeb. Layers panel is drafted, but still getting worked.\n\n### the names\n\nThe header sigils `Ǝ` and `∋` read as _there exists_ / _such that_ — the editing side and the rendering side. The \"Loom\" holds the threads; the \"Weave\" turns them into something you can see ( `∋` such that).",
"title": "There is(Ǝ) – Such that (∋)",
"updatedAt": "2026-06-11T04:50:01.603Z"
}