soft broad light behind a page, without banding
ui
web components as a shadcn registry: npx shadcn add @ag/<item>
glass & surfaces
controls that read the picture behind them and take the scheme it calls for
a security hologram: a print shown in a band of foil at the hand
the glass collection: the glass material and a gliding highlight
what a control is made of, plain or glass, set once for a whole section
fog at the window's top and bottom as the page scrolls, and at a row's sides
the one capped scroller: its ends fade, it wears thumbs when long, the page scrolls on
a long scroller's scrollbar: thumbs over the content that take no room, and drag
foundations
any cards in lanes by real height, a grid, a bento or justified rows, from the first paint
an aurora borealis palette any colour enters and travels, for glows and trails
a person's face in a round crop, centred on them, ringed in the picture's colour
an avatar that opens the full portrait in a lightbox of its own
a company's or a platform's logo, in the words' colour, from simple-icons
the focus ring for the keyboard only, never on what a click focused
the spectrum a diffraction foil throws, one strength at every hue
the rules things are arranged by: masonry lanes, justified rows, an ordered bento
how a set of things is arranged, framework-free, whatever the things are. the lanes rule (placeLane) is one decision: the lane whose bottom is highest takes the next item, lanes within a tolerance (a share of the lane width) count as level and fill in reading order after the previous item's, so a level stretch reads 1 2 3 / 4 5 6. the rect engines take aspects and a width and give one rect per item in set order: lanes, decided in lane units so a resize that keeps the lane count moves nothing between lanes and appending never moves an earlier item, and justified rows (loom's greedy fill, last row never stretched), behind one interface; plus the geometry a grid moves by: the window a viewport shows, arrows in set order and within a lane, a page, a marquee's members. pack orders an ordered bento's cards (one cell, two across, two by two) for a grid's auto-placement at two and three columns. placeLane, laneCount, breakRows (the justified rows rule) and pack are self-contained, so arrange inlines them into a page
Next's Link, prefetching a page when the reader reaches for it, never on sight
a site's pages written to the event stream, for visits without cookies
a site's pages in the event stream (the utils contract, Web pages), through ts-utils' logger, shipped to the site's own route (visits' visitsRoute, which composes visits; installed with it). a post shown whole on a page (data-view, a note in a feed) is a view of its page once half on screen. a page shown is a page span, ended when hidden, a new one on a route change (soft, read off the Navigation API, any router), on coming back (resumed) and out of the back/forward cache; its end says which data-section parts came on screen and the load's vitals. a same-origin request is a fetch span under it, its traceparent on the request so the server's spans join the page's trace (log/next). errors are the page's error lines. never written: a query string, a URL, an IP, a user agent, a cookie; nothing stored in the browser, and a browser asking not to be tracked (Global Privacy Control, Do Not Track) gets nothing. PageSensor (mount once, in the root layout), currentPage() for a named event, usePageReport() for what this tab has written
a person defined once: name, handle, picture and colour, the same everywhere
where the popups inside a surface open, declared once: a fullscreen player's layer
fetch that asks the public internet only, never the server's own network
fetch for addresses a stranger named: http(s) only, every address the host resolves to must be public (no loopback, private, link-local or metadata ranges), checked where the connection resolves the name (undici's lookup, so a rebinding name server gets nowhere), redirects followed by hand and each hop checked again; server-only (node:dns, node:net)
paid and studio items kept encrypted in a public repository, opened at build
A Node script for a public repository that uses @ag paid or studio items: every file whose first line names such an item is committed encrypted beside itself (AES-256-GCM, its path bound in, the plain file's SHA-256 beside so a stale copy shows without the key), its path ignored by git in a block the script keeps, and opened by the build where SEALED_KEY is. seal, open, check; no list of files to keep, no dependencies
a colour effect kept apart from what it colours: solid, aurora, or your own
light, dark or the system's, as one radio group, for any theme provider
the studio's theme over shadcn's: type voices, tones, alpha ladder, focus ring
whether the page shows something now, or is about to: in view, or near it
ask a server again on a cadence while the answer is seen, never twice at once
a site's own visits without cookies: the route its pages post to, the store, the readers
the server half of page-sensor, framework-free: visitsRoute (a Request in, a Response out) takes a page's batch of lines and keeps each page in a visit in the site's own SQLite through ts-utils' metrics drivers (libSQL / Turso, D1); readVisits gives the visits user-flows draws, readVisit one visit's lines for its pages' traces (telemetry), readViews a page's all-time view count. a visit is one caller's pages within half an hour, within a UTC day; the caller is a hash of its IP and user agent with the site and a random salt of the day, deleted when the day ends, so nobody is followed across days and one store can hold several sites without linking a person across them. never stored: an IP, a user agent, a cookie, a field named like a person; crawlers dropped, probes and the site's staff flagged and never counted. a page's views: each visit once, opened or read where it was shown (a note in a feed). VISITS_SCHEMA is provisioned once with the database's own tools
controls
sections that open in place, one at a time or several
sign in with a provider, or the person's face and name opening their menu
a callout in the page's flow: success, warning or error, with an action
a small label for a status, a version or a count, plain or glass
where a page sits, as the links above it, a long middle folded into ⋯
a button in either material: shadcn's variants and sizes, toggle and loading
a month to pick a day or a range of days from, every key of the date grid
a yes or no ticked in a box, a dash for a group partly ticked
a field whose value is a list of chips, found as you type
a command palette: a field that finds actions as you type, their keys drawn
every base control in one install
the base controls in one install: button, badge, label, textarea, checkbox, radio-group, switch, select, toggle-group, rating, vote, tabs, separator, spinner, skeleton, panel, group-box, readout, field, form, setting, dialog, command, sheet, popover, hover-card, toast, alert, accordion, slider, number, tree, menu, breadcrumb, tooltip, progress, input, kbd, shortcut, thumb-strip, edge-arrows, scroll-thumb (the scroll area), calendar, date-picker, resizable, and material (plain or glass, for a control or a whole subtree). each stays its own item, installable alone
pick a country by its name, its own name, its code or its flag, yours first
any nested data as a tree you read: objects, JSON, XML, searched and copied
a day or a range of days chosen from a field that opens the calendar
a modal for a decision, centred over the page, or a panel beside a live page
‹ and › at the edges of a stage, quiet until the stage is hovered
one control and what is said about it: label, description, error, required
what a value control reads from the field around it, without its layout
a form engine over any schema: typed fields, errors when due, async checks
fuzzy matching for every search: letters in order, accents folded, runs first
a group named on its edge, the name in a gap in the border, for dense panels
what is behind a link, shown while the hand rests on it
a search over every lucide icon, or any set of small things, suggestions first
a text field: a sunken well, red when wrong, plain or a pill of glass
keyboard shortcuts drawn as keys, from any notation
who a key press belongs to, page-wide: one listener, one owner for each press
who a key belongs to, page-wide: every item that answers keys on the page registers here (useKeys, registerKeys) instead of on the document, and one listener hands each press to one of them. never one a focused control owns (lib/keys' ownsKeys: a field's typing, a switch's Space, a tab's arrows); a modal (an open lightbox) takes every press; else the instance holding focus, then the one under the pointer, then the one last pressed, then the newest, the first to take it ending the press, so a player and a gallery on one page never both answer Space. and the Escape ladder (useEscape, openLayer): the layers open now in the order they opened, Esc closing the innermost one only, and only when nothing inside it took that Esc. ownedHere and keyTargetOf read the same rule off the page for a widget's own handler
keyboard shortcuts as data: any notation read, and who a press belongs to
keyboard shortcuts as data: any notation (⌃⌥⌘A, ctrl+alt+cmd+a, ← →) split into the keys pressed in the Mac's glyphs, anything that is not keys refused, and shortcuts found inside text; whether a press is one (a letter still known under ⌥ by its physical key, a symbol however the layout types it); ownsKeys, the one rule for whether a press belongs to what it landed in (typed into a field, a key a focused widget answers itself, already taken) so a page-wide shortcut leaves it alone; aria-keyshortcuts written from the same notation. framework-free
what a field is called: a real label that focuses its field when pressed
a menu of verbs that teaches each one's shortcut, on a right click or a more button
a number you drag, type or step, its unit beside it, for input type=number
the one container, plain or glass: a title or a head, a foot, and a body that scrolls
who someone is: a field that finds a person by any of their names, or adds one
a small surface anchored to the control that opened it
one of a few, each shown, chosen with the arrow keys
what a person set, kept for the tab or for good, and back to its default
panes side by side or stacked, handles between, sizes as shares of the room
a search field: a magnifier, clear, Esc, and the matched letters lit
a search field and its match: Search (the input's well with a magnifier, clear, Esc, an optional page-wide focus key, Enter and down handlers) and Highlight (the letters a fuzzy match lit), on lib/fuzzy
one of a list, opened over the field: options with icons, in groups
one selection for any set shown: click, add, range, all, marquee
a hairline between two things, across or down
a value that falls back to a default: set here, inherited, or locked here
what a value control reads from the setting around it, without its slot and keys
a panel sliding in from an edge of the window, the page held behind it
any input drawn as what the hands do: keys, clicks, drags, scrolls
the shape of something still coming, breathing slowly while it loads
a slider with named marks to snap to and a drawing behind its track
work under way: a ring with a turning arc, still under reduced motion
step through an ordered set, ‹ the current one in words ›: a month, a frame, a level
on or off at once: a track and a thumb sliding across
views of one thing, one at a time: a segment or a line, swiped between, panels kept
text of several lines that grows as it is written, plain or glass
a reel's thumbnails in one row, the current one lit and centred
toasts with sonner's API: a stack at the window's foot, actions, promises
a segmented control: one or several options lit, a highlight gliding
shadcn's tooltip on Base UI, plus a control's name with its keys, and hints
a tree of files, layers or tags: every key, selection, rename, drag to move
include, exclude or neither on any tree, for filters that nest
loading as water: what has not come lies under it and surfaces as it comes
data & status
ranked things as bars: top pages, referrers, a funnel, each a share of the largest
a list of deployments and one in full: status, its build's log and trace
a country's flag as a tiny SVG file, the same on every system, beside a name or as a mark
a stream of log lines that follows the tail: time, level, source, message
how far along work is: a bar, the count and the time left
names and their values at a glance, the values in mono with tabular figures
an instant said from now, "4m ago" or "in 3d", ticking only as often as its words change
a series as a line the size of a word, as wide as where it is put
one number that matters as a tile: its name, the figure, how it moved, its trend
how something stands in a word, a dot in its tone before it: live, failing, idle
a table to read and edit: thousands of rows, sticky heads, a spreadsheet's keys
the lines and spans a log and a trace draw, linked both ways, without React
one request's spans as a waterfall: who called whom, how long each took, what failed
charts
ranked things as bars: top pages, referrers, a funnel, each a share of the largest
a series as a line the size of a word, as wide as where it is put
where people go on a site: top paths, what next after landing, before and after, funnel
ratings & feedback
stars to rate with, by halves, or the average of many beside its count
emoji under a post with how many gave each, yours pressed, more offered
was this helpful? yes or no, then why in a few chips and words, then thanks
like, neutral or dislike, hide and a star, with their keys: a pass over a list
up or down with the score between them, the same press again taking it back
text & code
a question's answers as keys: yes, no or a choice, then the reference answer
a code block with syntax highlighting by shiki on the server: marks, diffs, copy
a vCard drawn as a phone shows a contact: face, name, every field a row
copy to the clipboard, confirmed in place, never with a toast
a rich text editor whose document reads as markdown, as a page or a form field
markdown drawn as a page, on the server or in the browser, the editor's look too
markdown worked out once at build: one parse, anchors, measured pictures, tags as data
what a page of markdown needs worked out once, where the files are (a build, a script), so the page only draws it: prepareMarkdown parses with markdown-core's syntax and returns the tree Markdown draws (<Markdown tree={…} />), every heading anchored once (the table of contents and the page agree), its words as plain text, the pictures measured by the host's own measure (which throws for a file of its own that is missing), and the tags the text may name (tags: ["Bars"]) read as data: a prop is a literal (a string, a number, an array or an object of them), never code, and a tag not named throws. The tree is JSON, so a build keeps it on disk. highlightTree colours every code block ahead with Shiki (ui's code themes, or the host's highlight), so no highlighter loads in the browser. Framework-free, Node. Replaces an MDX runtime for text whose tags are components with data
text cut in the middle, so the end that tells addresses, hashes and paths apart stays
a value that identifies its owner, shown as dots and peeked for a few seconds
media
one sound on a page at a time: what starts playing silences the rest
a row of cards that overflows, with a picker, keys and swipe
overflowing cards with a shared picker, keyboard and touch navigation; optionally driven by a scroll-stage timeline
a film as a mosaic of tiles all playing, in its player's box: pinch into time
pictures of a film at any instant: frames prepared ahead, or decoded on the page
a player or talking head that follows the reader while its spot is off screen
something that leaves its place in the page to stay with the reader: a talking head reading an article aloud, a player kept while you scroll on. mode auto floats while when holds (a player's playing) and its spot is out of the window, and comes home when the spot is back; always floats; off stays. the same element moves (a video keeps playing, its sound and clock intact) and its spot keeps its size so the page never jumps. where it floats is a place on the window (fractions across and down, so it means the same on any window); it sticks to spots a page offers (the corners and edge middles by default, or your own: a gutter, a rail) when let go within a magnet's reach, and stays where it is let go otherwise; a drag is not a click; useFloating tells content it floats (to take a smaller shape); while floating a button scrolls back to its spot. reduced motion: no easing
a floating glass frame round a picture or a video, the glass only its edge
every picture: reserved space, a blur or a fade until it has loaded, any loader
a picture opened over the page: one spring, pinch, swipe, wheel, every key
the lightbox's engine without React: zoom, pan, momentum, one spring
the lightbox's keys and buttons from one table, without React
what a prepared file is: kind, size, length, poster, blur, colour and frames
portable, validated asset metadata shared by preparation, upload and presentation: what a file is (image, animation, video, audio), its size, length, poster, blur, mean colour and frames along it (frame i at i × every seconds). The contract between whoever prepares (prepare-media in Node; an app with AVFoundation) and whatever draws
image and video renditions cut at the edge by Cloudflare, at the size shown
the serving half of preparation: renditions cut at the edge on request by Cloudflare's transformations (an image at the width shown, a video's frame at a second), on a host you name, no storage dependency
how far a video has played: a track, what has loaded, the played part
media format chips wearing the real marks: 4K, HDR, Dolby, DTS, IMAX, ratings
the controls for a video or any clock: a bar cut in chapters, transport, speed
images, video and sound made ready in Node: posters, previews, frames, FFmpeg
Node image preparation and opt-in FFmpeg video and sound preparation, from bytes, a path or a URL (read by ranges, its headers sent): dimensions, transparent previews, posters, the mean colour, a span of a long source, frames along a clip, sound alone, content-addressed files, with no storage dependency. keep(dir, parts, make, ext) (lib/prepare-keep, for build scripts: a page importing it would trace the whole project) keeps anything prepared (a blur, a still, a link preview) in a file named by the hash of what it is made from and of the preparer's own code, so a build prepares only what changed; keepOnly drops what nothing asked for
a one-row choice of examples or languages, with icons and hints
where a drawing of a sound hears it: a media element tapped once, per channel
file uploads your app owns: progress, cancel, retry, local previews
the one video element: when it plays, what it rests on, captions, one sound at a time
motion
anything drawn from a moment: its length and its chapters, without React
anything drawn from a moment, as the facts a driver moves through it by: its length and its chapters. the player plays a clip, a scroll stage scrolls it, a fixed progress is a still. framework-free
a clip's own clock that plays once in view, and React's side of any timebase
the controls for a video or any clock: a bar cut in chapters, transport, speed
content that arrives as it scrolls into view, once or tied to the scroll
a stage pinned while the page scrolls past it, played act by act in CSS
the pinned stage: a tall track, a sticky stage, --stage-p driven by CSS scroll-driven animation, acts as checkpoints. an act drives a clip by cueing its clock (@ag/playback cue, @ag/clip chapterSpan); a beat's progress scrubs one directly (progressWithin)
a story told on the scroll, a card per chapter, its words beside its scene
one list of chapters (name, mark, scroll, what each draws at its progress) told on a pinned stage: a deck of cards sliding in from the side, or one card whose chapters crossfade; the picker, seeking and the stacked carousel derived from the list. StoryCard sets the words beside the scene, a device standing out of the card where it overflows
the one clock time is read from: one owner, any number of followers
a medium's time as rows under one ruler that zooms: chapters, stills, claims
the window of time a timeline shows: zoom at a point, pan to the ends, ticks
devices & demos
a coding agent's session as data, for the claude-code and codex skins
a coding agent's session as data: prompts, replies, tool calls with their results, and the working line. the claude-code and codex skins draw it. framework-free
a Safari window to put a page in: mocked, a live site, or a visit played on the playhead
Claude Code's terminal UI, drawn from an agent session
an edit of a project's files as steps: open, type at a line, save, timed into a clip
OpenAI's Codex CLI terminal UI, drawn from an agent session
Apple's iPhone Contacts app drawn from a vCard: the .vcf import sheet, the saved card
iPhone, MacBook and Studio Display frames for any content, the lid folding
a VS Code window: a project's tree, tabs, highlighted code, an edit typed on the playhead
a menu bar app performed on a Mac screen, played or as a still
the timeline a macos stage plays, as data, without React
the timeline a macos stage plays: the step types an app's scene compiler writes, the pacing, and frameAt, a pure fold from a timeline and an instant to the whole stage. framework-free
a phosphor terminal that plays a session script, live or as a still
the terminal's script: parsed, timed, and drawn as an SVG still without React
a modal editor in the terminal, helix's look, typing and saving on the playhead
how hot a machine runs over time: parts, skin and fans, at any instant
a finger's tap on a phone screen, as iOS shows touches: down, pressed, lifted
a Mac's desktop picture or an iPhone's Lock Screen, pure CSS, filling any box
a whole project page on the primitives, where scroll work lands first
social & links
a whole card that opens its place, its links and controls still their own
a conversation as messaging apps draw it: bubbles, faces, days, replies
an email address in a row to copy or write to, or the new message it opens
GitHub drawn from its facts, no API at render: repo, issue, comment, profile
a quote as a card and as its link preview image, drawn by one set of rules
a quote's rules and its SVG still, without React, for a build or an og route
a profile on Telegram, GitHub or YouTube from its facts, as a card or a compact row
a Telegram chat drawn from its messages and a playhead, played like a story
a link-summary bot's Telegram conversation, built on telegram-chat
a post on X drawn from its facts, no widget script: media, quotes, link cards
a site's RSS or Atom feed read into items: title, address, date, picture
a site's latest, from its RSS 2.0 or Atom feed (a blog, a YouTube channel's uploads, a podcast): parseFeed reads the XML into items (title, address, date, picture), newest first; feedOf finds the feed a page names; readFeed fetches one on a server through public-fetch
a link's unfurl as a card: ours, Telegram's or X's
a link's six facts and its host as shown; fetches nothing, safe in a browser
the six facts of a link (url, site, title, description, image, icon) as a type, and how a link is written (hrefOf) and shown (hostOf); fetches nothing, so a browser can import it
a link's six facts, read from its page at authoring time or live on a server
the one fetch that reads a link's six facts from its page (oEmbed for YouTube); run once at authoring time and shipped as data, or live on a server, where it asks the public internet only (public-fetch)
a profile on X as X draws it: banner, face, names, bio, website, counts
a YouTube video as a picture until it is asked for, then its player in place