# raea 0.1.2

> Components that measure as they do in Chrome, a fingerprint of what you judge good, and one timeline for picture and sound in the app's player.

raea 0.1.2 lets compositions measure themselves the way a web page does, teaches raea what you judge good, and gives the app's player one timeline for picture and sound.

**Get the app at [raea.io](https://raea.io)** (a Mac with Apple silicon, Windows 10 or 11, or Linux on x86_64).

The engine alone:

```sh
curl -fsSL https://raea.io/install | sh
```

On Windows, in PowerShell: `irm https://raea.io/install.ps1 | iex`.

## What changed since 0.1.1

**Components that measure, as in Chrome (#54, #13).** Many components written for the web measure before they draw: a title sized to its box, captions wrapped where a line really ends, a caret after the last typed letter. In a composition those reads now answer as Chrome does, from the same layout and font files that draw the frame: `getBoundingClientRect` (through transforms and perspective), `offsetWidth` and the rest, `getComputedStyle`, a ref's children and selectors, `document.createElement`, Range, `document.fonts`, `ResizeObserver`, a canvas's `measureText`, and svg text's lengths. Hold the frame with `delayRender` and `continueRender` until a measure lands. Reads answer in live play too (the app's stage, `raea play`, exported games). In a render the first read in a frame costs about 0.4 ms, and more in the same frame almost nothing. Measured against headless Chrome on snapcn's measuring components, 23 of 33 now land within a pixel (3 before). The manual's new guide, "Web components that measure", lists what answers and what doesn't yet.

**Text set as Chrome sets it.** Letters set a span each keep their kerning. A `visibility: hidden` word keeps its place and isn't drawn. A web font from `loadFont` is the one measured and drawn at every weight (raea's own Inter drew 500 as 400 and 600 as 700), and it's loaded before your first effect runs. A canvas's `system-ui` is the Mac's system font. An svg `<text>` with letter-spacing lands where Chrome puts it.

**Canvas, requestAnimationFrame and Image (#55, #56).** Compositions get the web's 2D canvas context, `requestAnimationFrame` (called once per frame drawn, with that frame's time) and `new Image()`.

**raea learns what you judge good.** `raea fingerprint` keeps a fingerprint of your taste: axes such as blur, glow or a frozen picture, each a small model over encoders that run on your Mac (SigLIP 2 for pictures, CLAP and YAMNet for sound, EmbeddingGemma for scripts). Your notes, approvals and picks between two cuts teach it, and `raea fingerprint score` says where a piece stands on each axis and whether a fix fixed what it claimed (`--was OLD`). `raea fingerprint things` finds a shot's things, their depth and the ground under them, and `raea check --things` reports one floating, passing through another, or a camera that changes speed mid-move. Archiving a project runs a post-mortem. The app has a Fingerprint page: what it knows, what it's learning, and fingerprints of your own for different kinds of work.

**One timeline in the player.** A video's player in the app is one deck: the picture on top, the sound under it and your comments' pins between them. The picture track shows frames, energy, scenes, captions or checks, and the sound track a waveform, beats or words; what a render hasn't got yet is offered with its verb (Transcribe, Detect). An agent at work has a stop button wherever the app shows it working, a feed or the Inbox can be summed up on its timeline, and a new project waits for you to make the first move.

**Review links by email.** Under a live review link in the Share panel, type up to 25 addresses and an optional note, and raea mails them the link. Sign-in codes come by email too.

**Video with alpha (#113).** A VP9 WebM's transparency and a ProRes 4444's are drawn, not refused or made opaque, and `render --alpha` leaves a frame with 3D transparent where nothing is drawn (#114).

**Projects with room to grow.** A new project has compositions/, components/, controllers/, assets/ and artifacts/, and a workspace has shared/ for what every project imports as `@shared/...`. `raea component add` (raea part's new name, which still works) copies a ready component into the project, or into shared/ with `--shared`.

**raea's Claude plugin** installs from raea's marketplace and is the raea skill with its two hooks, which run raea locally and send nothing.

**Fixes**
- The Windows app stays open when a video opens: every raea executable on Windows now has an 8 MB main-thread stack, not the 1 MB default (#112).
- The Windows app no longer crashes at launch reading a blob: FileReader, fetch's request body and a WebSocket's binary send turn bytes into a string a slice at a time, and a frame's own script is found under the app's folder (#124).
- When an agent's Claude sign-in runs out mid-conversation, the app says so and signs you in again there, instead of failing every turn (#111).
- On a Retina display the page fills the window instead of a quarter of it (#120, with Treamz), and the window is sharp.
- A frame that comes out all black though its page shows something is a warning, said once over its run of frames (#96), and a filter of opacity() alone draws as the layer's opacity (#96).
- Dark gradients no longer band in 8-bit H.264: the colour conversion dithers (#87).
- canvas `arcTo` draws the corner's short arc, as a browser does (#97).
- A Cone takes clicks only across its height (#98).
- A mesh's emissive colour changes the frame it's set in live 3D (#106).
- `getBoundingClientRect` no longer panics on a removed element and answers a zero rect under `display: none` (#108).
- A relayout keeps an inline box's baseline (#109).
- `raea check`'s safe-area rule tests a text's letters, not its box; a card that shares one word with a line isn't held to it as a caption; and a missing taste file is a note (#89, #102, with SirSicard).
- `raea cut` takes a sound-only take (#89).
- A still no longer prints dozens of CommandQueue warnings, and the 3D camera is the shadow origin (#89, #104, with SirSicard).
- A fresh `raea init` renders again.
- R3F: an opacity outside 0 to 1 is clamped instead of throwing (#117), and three.js 0.180 or later is the peer range (#118), both with Ragulsundaram. The three.js host draws `<Instances>` at each placement.
- A ShaderMaterial under Solari lighting draws instead of failing its prepass.
- raea's own commits work on a machine whose git has no `user.name`.
- `import.meta.url` is set in every module on macOS 15.

Thank you to everyone who filed issues and sent PRs this round: augusbazan, SirSicard, Ragulsundaram, Treamz, revouwu, kevinschaich, connorads and Razepriv.

Its binaries are `v0.1.2-rc5`'s, built from 1be8199c8 and checked there.

## Known missing

- Of snapcn's measuring components, 10 still don't land within a pixel of Chrome (a font's tracking table, a few transforms' ink); docs/layout-reads.feature lists each. A Range across wrapped lines is one rect, and an element has no `innerHTML`.
- `raea fingerprint` doesn't judge how real a sound is yet: it was measured on CC0 and CC BY recordings and didn't clear the bar for every kind of sound.
- The Windows and Linux apps don't update themselves yet: download the next version from raea.io.
- On Linux, raea needs ALSA, fontconfig and Vulkan (Ubuntu 24.04: `sudo apt install libasound2t64 libfontconfig1 libvulkan1 mesa-vulkan-drivers`).
- The OCR half of the reading check runs on the Mac only.
- The engine's own binaries aren't notarized. The Mac app is signed and notarized.
