Skip to content

A whole lotta slop - #24

Merged
tbrockman merged 106 commits into
mainfrom
tinfoil+ezco
Sep 9, 2026
Merged

tbrockman merged 106 commits into
mainfrom
tinfoil+ezco

Conversation

@tbrockman

Copy link
Copy Markdown
Contributor

No description provided.

tbrockman and others added 29 commits September 4, 2026 09:54
… a lighter frame

- The OS bar lists the open windows as chips (front = inverted, minimised = outlined); any number open, one in front;
  a minimised demo keeps running (its iframe stays, hidden). Every window has – beside ×.
- The demo documents draw their own title bar (src/scripts/ezos-frame.ts, styles/ezos-frame.css): the program's
  file-search toolbar (markdown-editor mounts it there; the codeblock's CodeMirror panel is moved up), a GitHub mark
  for the source, – and × over postMessage; the room passes its theme (?lit, then messages). No app names in the bars.
  markdown-editor: no block-action gutter, no focus outline (Astro-scoped <style> never matched the editor DOM → is:global).
- Radio bar fades exactly like a label: no grace, an invisible hit box reaches from the radio up to the bar.
- Lady's plate in the bezels' mid tone instead of solid ink; the door .976 wide and flush with the frame bars, so the
  face's painted border stays inside the frame; the desktop's + is a drawn cross (centred).
- Forms: "Budget (optional)", "$ 500 or more … USD" in the field (min/max/step), a taller message box asking for a couple
  of sentences; checkProject mirrors the worker's schema in the browser before anything is sent.
- Rendering: the interior is one group, hidden while outside with the door shut (63 draw calls instead of ~350);
  shadow maps only re-render while a caster moves (138 casters × 8 passes otherwise); the clipboard casts nothing;
  high-performance GPU requested. Chrome at 2× with vsync off: room 3.1 → 2.3 ms/frame, logo view 2.2 → 1.3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…block actions are off

- codeblock: `toolbarLayout: 'compact'` (CodeblockConfig) tags the toolbar panel `cm-toolbar-compact`, whose icon
  column hugs the text instead of matching the line-number gutter — for a toolbar hosted away from the editor, such as
  a window's title bar. Default stays `gutter`. Styled both standalone and inside the editor theme.
- markdown-editor: with `blockActions: false`, createEditor builds no `.ezco-mde-gutter` at all (the empty column kept
  its 48px).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…and a ?perf readout

- The demo title bars: the program's icon at the left, the file-search toolbar as a search field centred in the bar
  (capped at 360px) whose results drop from its own edges; pointed-at rows and the front task chip in a selection
  tint instead of inverted. codeblock uses the library's compact toolbar layout; the markdown-editor builds no gutter.
- Both editors follow the lights (dark/light) and the room's paper/ink/rules/highlights; syntax colours are their own.
  Desktop icons squared like every other edge in the OS; the demo window itself is themed.
- Profiling in any build: ?perf shows the rAF interval, the frame's JS time, gl.render, css.render and draw calls;
  ?nogl / ?nodom now skip a renderer (hiding the canvas never stopped the drawing), plus ?noaa, ?noshadow, ?dpr=1.
- The logo's hover slide runs on a clipping plane over a second, inverted copy of each face — no more two 1024² canvas
  uploads a frame while it moved; applyTheme (a pass over every material) runs only while a transition is in flight.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…, and a ?bench runner

- A window keeps one soft border (--line) and its hard shadow; inside it nothing else is boxed: desktop icons, task
  chips and window buttons (dialog and demo bars alike) sit bare and take the selection tint when pointed at. The
  search field, the dropdowns, the desktop tooltip and the editors' tooltips (LSP hovers, diagnostics, autocomplete)
  share one soft rounded edge and the OS's hard shadow, on the editor's own paper — the embedded codeblocks' toolbar
  rows and search results too. The markdown document keeps a margin from the window's edge.
- ?bench (any build) runs every bisecting configuration for you — one reload each, panning, three seconds apiece,
  outside then inside — and ends with all the readouts in a box with a copy button.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…ages you can look around in

- Every follow-lerp goes through lerpK(rate): the per-frame rates were tuned in a 120 Hz browser, so Safari's default
  60 fps cap ("Prefer Page Rendering Updates near 60fps") made the room follow the pointer half as fast. Now each step
  covers the time that actually passed and the feel is the same at any refresh rate.
- Phone: the lock-screen logo and the desktop's programs are sized to the screen (container units; names wrap);
  a fit never puts the camera behind the far wall (maxD on the whiteboard and kanban — a portrait crop of a wide board
  stood outside the room); in a page you may look as far as the thing's whole area (limitsFor), so the other kanban
  columns and the employee of the month are reachable from a portrait crop; arrows work in pages too.
- Scroll areas fade their bottom edge while there's more below (a mask on the scroll box); the kanban's ideas column
  scrolls (the captcha pushed the submit button off the board); a finger drag scrolls by touch events, since a drag that
  starts on a textarea gets its pointer events cancelled.
- The clipboard, opened from a link, is placed where looking down in the room puts it before the camera comes to it
  (it used to freeze under the floor or behind the wall, leaving only the DOM face). The manifesto's boxes lost their
  hover inversion (text on a plaque now); links keep an underline and take the selection tint when pointed at.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…rom, planes rastered at the size they're seen

- Opening the sign-up sheet no longer flies the camera back out of the room: the clipboard settles squarely in front of
  the camera at reading distance (gliding from your hands if it was already up) and the camera only tilts down to it.
  The fit reads the clipboard's goal, so both arrive together.
- A page opened from another page (the manifesto's join / work-with links) remembers it; esc, and the esc chip ("back"),
  return there instead of to the room.
- Each plane's content is laid out at its reading width and rastered at the scale it's seen at: a `.zw` wrapper carries a
  2D scale (surface.setRes), refreshed for wherever the camera is headed. Chrome re-rasters 3D layers by itself, but
  Safari and Firefox raster at layout size and minify, which turned 1px rules into dashes from across the room.
- The kanban's ideas column leaves room for the note's tilt, pin and shadow (it clipped them once it became a scroll
  column); the board's dot pattern moved to the content root so it scales with it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…e clipboard and back-navigation stay

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VqLSdJzqMJtK2KjG686c6q
…, the building's label

Real pages at /work/, /blog/, /blog/<slug>/, /newproject/, /about/ and /join/ (plus sitemap, RSS, robots) carry the same
content as the room's hash routes for crawlers and feed readers; visiting one swaps the address for the room's route
before boot, so people still land in the room. Links between pages are written as those addresses (data-room) and become
hash routes at boot. The blog post's title block, section rules and spacing set headings apart; the tagline is now the
building's label, pinned above its near corner like every other label.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
Synthesised Web Audio (no files), one PannerNode per sound at the thing's position with the listener on the camera: the
radio's switch clicks and hisses between stations the first time until the music comes; each lamp's switch sounds like
its material (paper, metal, wood); the wall dial has a detent per position; the tablet's power button; every button in
the laptop's OS (and the demo documents' title bars, by postMessage) is a mouse click at the desk; the rolodex flicks a
card per card and moves a little air. m / a chip / an accessible button switch it off (ezco-sound).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…ollow the dev origin

The tagline label is centred over the cube (anchor at the roof's middle), scales with the viewport, and shows while the
building or the label is pointed at or focused — always where nothing hovers. In dev the RSS feed and sitemap link to the
dev server's origin instead of joinez.co.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…act-form worker

The worker resolves @joinezco/shared to its built dist/ (gitignored), which existed locally but never in CI, so
tsc failed with TS2307 and a deploy would have bundled nothing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
A plain `pnpm build` runs turbo over every workspace package, including @joinezco/icanhaz-web, whose `vite build`
has no entry (a library without an index.html) and fails. The deploy workflow already used the filtered target.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…a script you can run at home

Seven workflows (contact-form-worker, shared, ezco-web, witmproxy, witmproxy-plugin-noshorts, witmproxy-docker,
witmproxy-wit) replace eleven. pnpm/Node/cache/install and the Rust toolchain/cache/apt setup live in
.github/actions/pnpm and .github/actions/rust; past setup, jobs call root scripts (check:shared, check:worker — turbo
typecheck/test:run now depend on ^build, which builds @joinezco/shared first) or src/scripts/*.sh (check-witmproxy,
build-witm, release-witmproxy, patch-witm, release-noshorts, check-noshorts, publish-shared). Every action is pinned to
a commit at its current major (checkout v7, setup-node v7, pnpm/action-setup v6, …), which also ends the Node 20
deprecation notices and the pnpm store cache path error (action-setup v2 with version '*' fought the packageManager
pin); dependabot keeps the pins fresh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…down synced with upstream

pnpm update -r (180 outdated entries down to 73, all of them majors). Three follow-ups: tiptap 3.31's InputRule gained
fields, so the link rule is built with the class; Cloudflare's ExecutionContext gained tracing, so the worker's partial
mock is cast through unknown; a memfs dependency made codeblock's CborDecoder inference non-portable, so it's annotated.
The @m234/nerd-fonts patch is re-keyed to 0.5.2 (it applied unchanged). Submodules: wrpc merges bytecodealliance main
(five dependabot commits; icanhaz-host checks), tiptap-markdown merges aguingand main (its own tests go from 21 to 5
failing). lsp-client's upstream merge is on the fork but its pointer stays: the working tree has uncommitted edits.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
An unescaped <hostname>, a link to the private ConfigFile, and a link to a module path that doesn't exist; all three
now plain code spans. Found by src/scripts/check-witmproxy.sh, which runs the same cargo doc step CI does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…the SharedWorker VFS is used

No consumer used any of it: markdown-editor, ezco-web, icanhaz-web and eznote reach codeblock's filesystem through
CodeblockFS.worker alone (a SharedWorker relaying to the OPFS worker, memfs in memory where OPFS is missing, snapshots
hydrated from a URL), plus the LSP wiring, toolbar, search and settings. Gone: the jswasi-backed Vfs.fsa/auto/fromJswasiFs,
the terminal panel and its ghostty renderer, the lazy chunked VFS (LazyVfs, ChunkFetcher, manifests, mountLazy in both
workers) and the @joinezco/lazy-pack tool that produced its images, the 32 MB rootfs, the jswasi submodule, and twelve
dependencies nothing imported. The dev example and the e2e fixtures run on the worker VFS now; the create-file e2e used
Ctrl-A to select all, which CodeMirror binds to line-start on a Mac.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
…rk carrying its one change

lsp-client moves to the fork's main (upstream codemirror/lsp-client merged, plus the local edits since committed).
conf-rs becomes ezcorg/conf-rs branch ezco: v0.4.5 plus the friendlier "a subcommand must be selected" message that
had been sitting uncommitted in the working tree; upstream's develop is 10 unreleased commits ahead and stays as a remote.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019c49sMSF1EEqaQ3KRaxT1o
@tbrockman
tbrockman merged commit 3eea7fe into main Sep 9, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant