Status

All systems operationalUpdated October 31, 2026
console.logOperational
90 days agoOne call per changed frame, none when idle.Today
console.clearRarely used
90 days agoFirst frame, after invalidate(), at idle once 100 frames are stacked, and at 300.Today
YogaOperational
90 days agoWebAssembly flexbox layout, pointScaleFactor 1.Today
Turbolog encoderOperational
90 days agoRow-hash gate and run-length %c encoding.Today
DevTools ThrottlerRespected
90 days ago50ms viewport throttle. Frames are paced at least 66ms apart.Today
textjs.orgOperational
90 days agoDocs, Learn, Playground, blog and store.Today

Live benchmark

The @textjs/core pipeline runs in this tab on a 100×32 dashboard and writes frames to an in-memory console.

Full frame
—
layout + paint + encode
Typing
—
one-row edit
Idle frame
—
nothing changed
%c spans
—
3,200 cells

Starts automatically once the page is idle.

Performance history

packages/core/test/perf.test.ts at each milestone, same machine (Apple M5 Pro · Bun 1.4.4). Mean of 1,000 frames.

ReleaseFull frameTypingIdle%c spans
0.1.0Mar 2025 · @textjs/core · 7c91cea0.194ms0.065ms0.043ms205
0.2.0Jul 2025 · textjs.org · 92437cc0.192ms0.067ms0.042ms205
0.3.0Nov 2025 · 10× input · 8c2d1b10.205ms0.065ms0.043ms146
0.3.0Nov 2025 · Mobile pass · e2e6e460.212ms0.067ms0.045ms146
0.4.0May 2026 · Zero-flash frames · f007ade0.184ms0.046ms0.028ms146
1.0.0Oct 2026 · Text.js 1.0 · 57968b60.163ms0.011ms0.000ms149

DevTools frontend

bench/devtools in Chrome for Testing: blank paints, delivered frames and display lag, 5s per run. How we measure.

DriverFPSBlank paintsPainted / emittedLag p50
Append (shipping)151.0%74 / 7510.4ms
Clear per frame1570.6%70 / 7560.4ms
Append, unpaced600.8%67 / 29531.2ms
Clear per frame6081.1%45 / 3009.8ms

Past incidents

Newest first. Times are in UTC.

October 2026

  • Pages stuck under the header on iOS SafariOct 27 – Oct 28, 2026 · Resolved
    1. Resolved

      This incident has been resolved.

    2. Monitoring

      A fix has been deployed. Scroll anchoring is off (overflow-anchor: none). We are monitoring.

    3. Identified

      The hero headline can still end up pinned under the sticky header after scrolling down and back up. Safari's scroll anchoring is adjusting the scroll position.

    4. Monitoring

      A fix has been deployed. Those elements now scroll horizontally only, and scrollbar-gutter: stable applies to mouse devices only.

    5. Identified

      File tabs, code blocks and prose tables have 1px of vertical overflow from the active tab underline, so they scroll on both axes and iOS gives them vertical swipes meant for the page. scrollbar-gutter: stable also makes the first scroll jump on iOS.

    6. Investigating

      We are investigating reports that textjs.org pages can't be scrolled back to the top on iOS Safari.

    This incident affected: textjs.org.

    Postmortem

    textjs.org pages don't shift while they load, so scroll anchoring had nothing to correct. On iOS Safari it pinned the hero under the sticky header and blocked scrolling back to the top. ?debug=scroll on textjs.org now shows a live readout of scroll, touch and resize events and names the caller of each programmatic focus or scroll call.

    Fixes: 297c5d7, 55da525, 8424fcd · Changelog: 1.0.0

  • Lint rule tests failing in CIOct 23, 2026 · Resolved
    1. Resolved

      The tester now reads it.only lazily, when a test calls RuleTester.itOnly. CI is passing.

    2. Identified

      Bun throws when it.only is read while the CI environment variable is set. The rule tester assigns RuleTester.itOnly = it.only at import, so loading it fails.

    3. Investigating

      The eslint-plugin-textjs test suite fails in CI before any rule test runs. Local runs pass.

    Postmortem

    @typescript-eslint/rule-tester takes its test functions as static properties of RuleTester. The fix wraps it.only in a function. No package or page was affected.

    Fix: eca3f78

  • Layout shift on /playground and /opencodeOct 21 – Oct 22, 2026 · Resolved
    1. Resolved

      Cumulative layout shift is 0 on every route.

    2. Monitoring

      A fix has been deployed. Both pages share one pad layout, and the size is appended without moving “Fit console”. We are monitoring.

    3. Identified

      The console size control appends the measured size to its label after hydration (Fit console · 120×36), which moves the “Fit console” text node. The pad's top and bottom rows also differ in height between the two pages, so the pad recenters on navigation.

    4. Investigating

      Our layout-shift audit reports a cumulative layout shift of 0.0001 on /playground and /opencode. Every other route it covers reports 0. The focus pad also moves when navigating between the two pages.

    This incident affected: textjs.org.

    Postmortem

    The pad now has fixed-height top and bottom slots, and every demo reserves the same rows, so changing pages or demos moves nothing. The OpenCode connection panel shows one status line in every state, with a skeleton until it hydrates. apps/web/scripts/e2e-layout.mjs asserts identical boxes across routes, demos, viewport sizes and connection states.

    Fix: 8f22b9b · Changelog: 1.0.0

  • Docs sidebar scrolls out of view at the end of long pagesOct 16 – Oct 17, 2026 · Resolved
    1. Resolved

      This incident has been resolved.

    2. Monitoring

      A fix has been deployed. Learn chapters render the footer inside the content column too. We are monitoring.

    3. Identified

      The chapter sidebar on Learn has the same issue.

    4. Monitoring

      A fix has been deployed. Docs pages render the footer inside the content column, so the layout reaches the bottom of the page.

    5. Identified

      The sidebar is position: sticky inside the docs layout, and the site footer renders after that layout. A sticky element stays pinned only while its containing block is on screen, so when the footer scrolls in, it takes the sidebar with it.

    6. Investigating

      We are investigating reports that the docs sidebar scrolls out of view at the bottom of long pages.

    This incident affected: textjs.org.

    Postmortem

    Pages with a sticky sidebar (docs and Learn chapters) render the footer in their content column. Other pages keep the shared footer.

    Fix: 131ac96 · Changelog: 1.0.0

  • Package name textjs unavailable on npmOct 14 – Oct 15, 2026 · Resolved
    1. Resolved

      This incident has been resolved.

    2. Monitoring

      The framework and CLI package is now @textjs/next, in the same scope as @textjs/core and @textjs/react. Imports change from textjs to @textjs/next.

    3. Identified

      The name textjs has belonged to another npm package since March 25, 2016.

    4. Investigating

      Publishing the framework package textjs to npm fails with 403 Forbidden.

    Postmortem

    Starting with Text.js 1.0, apps import from @textjs/next instead of textjs, and the OpenCode bridge is bunx @textjs/app proxy, which runs from any directory.

    Text.js 1.0: One rename · Changelog: 1.0.0

September 2026

  • Empty paint layers at row breaksSep 15 – Sep 16, 2026 · Resolved
    1. Resolved

      This incident has been resolved.

    2. Monitoring

      A fix has been deployed. Row breaks that don't continue a run now reset %c to an empty style first, so DevTools emits a plain newline. Each frame carries one curtain.

    3. Identified

      When a styled run ends at a row break, the \n is written inside the run's %c span. DevTools splits the span at the line break, and the empty remainder becomes a display: inline-block span with contain: paint, which gets its own paint layer.

    4. Investigating

      We are investigating empty <span> elements at most row breaks in DevTools frames, and a doubled curtain span on some frames.

    This incident affected: Turbolog encoder.

    Postmortem

    Spans with the same style still merge across row breaks. The curtain also moved onto its own line: DevTools floats the source link (VM12:1) to the right of a message's first line, and an inline curtain left that link beside row 0, narrowing it.

    Changelog: 1.0.0

August 2026

  • Increased display latency after console.clearAug 27 – Aug 31, 2026 · Resolved
    1. Resolved

      Median display lag in bench/devtools is 10.4ms. The fix ships in Text.js 1.0.

    2. Monitoring

      A fix has been deployed. After any frame that clears, the renderer waits 110ms once, so later frames arrive more than 50ms after DevTools' previous refresh and take its immediate path.

    3. Identified

      After a clear, DevTools inserts a “Console was cleared” row. It takes the throttler's immediate slot and pushes the next frame onto the 50ms timer. With frames 66ms apart, every later frame stays on that timer.

    4. Investigating

      bench/devtools reports a median display lag of 63ms once the console has been cleared. Lag stays at that level for every later frame.

    This incident affected: DevTools Throttler, console.clear.

    Postmortem

    Discrete input still renders synchronously when the frame interval allows.

    Break the phase lock · Changelog: 1.0.0

  • Spinner misaligns rows in the DevTools consoleAug 11 – Aug 12, 2026 · Resolved
    1. Resolved

      This incident has been resolved. The fix ships in Text.js 1.0.

    2. Monitoring

      A fix has been deployed. The default dots spinner now draws quadrant blocks (▘ ▝ ▗ ▖), one cell each in Menlo. The braille frames are available as variant="braille" for terminals.

    3. Identified

      The default spinner draws braille patterns (U+2800 to U+28FF). Text.js measures each as one cell, but Menlo, the DevTools console font on macOS, has no braille glyphs. The fallback glyph is wider than a cell and pushes the rest of the row right.

    4. Investigating

      On macOS, rows that contain a <Spinner> are misaligned in DevTools. Cells to the right of the spinner sit off the grid.

    This incident affected: console.log.

    Postmortem

    LineChart draws quadrant dots by default for the same reason. Braille is available with marker="braille".

    Changelog: 1.0.0

May 2026

  • Elevated blank paints in the DevTools consoleMay 5 – May 19, 2026 · Resolved
    1. Resolved

      The fix is released in Text.js 0.4.0. Blank paints are at 1.0%, all of them on the first frame.

    2. Monitoring

      textjs.org now appends frames instead of clearing. A zero-width curtain span keeps earlier frames out of view, and frames are paced at least 66ms apart.

    3. Identified

      DevTools applies console.clear() synchronously but paints new messages on a 50ms throttle. Each frame removes the previous one immediately and paints up to 50ms later. In bench/devtools, a 100×32 dashboard was blank in 70.6% of DevTools paints at 15fps and 81.1% at 60fps.

    4. Investigating

      We are investigating reports of the DevTools console flashing empty between frames under load.

    This incident affected: console.clear, DevTools Throttler.

    Postmortem

    Since 0.1.0, Turbolog had sent one console.clear() and one console.log() per changed frame. bench/devtools, which drives the real DevTools frontend in Chrome for Testing, was built to measure this incident and produced the numbers in the DevTools frontend table above.

    Fix: f007ade · Turbolog: eliminating the flash · Changelog: 0.4.0

April 2026

  • File paths in console frames restyled as linksApr 14 – Apr 15, 2026 · Resolved
    1. Resolved

      This incident has been resolved.

    2. Monitoring

      A fix has been deployed. The encoder inserts a word joiner (U+2060) into path:line, //host:port and data: text, unless the cell allows links.

    3. Identified

      DevTools turns URLs, path:line and //host:port text in console messages into links and forces its theme colors onto them. The encoder already broke up :// and www., but path:line and the //host:port after a scheme still match.

    4. Investigating

      Text such as src/app.tsx:12 and http://localhost:3000 renders in DevTools' link color instead of its %c style.

    This incident affected: Turbolog encoder.

    Postmortem

    :// and www. have carried a word joiner since 0.1.0. Cells that should stay clickable set the allow-link attribute and are written unchanged.

    Changelog: 0.4.0

November 2025

  • Delayed keystrokes in console appsNov 4 – Nov 18, 2025 · Resolved
    1. Resolved

      The fix is released in Text.js 0.3.0.

    2. Monitoring

      A fix has been deployed. Discrete input, such as a keypress or a paste, now renders synchronously in the same task. Other updates still commit on requestAnimationFrame.

    3. Identified

      Every update, including a keypress, waits for the next requestAnimationFrame before React commits and the frame is logged.

    4. Investigating

      Typing in console apps lags behind the keyboard, most visibly in OpenCode on textjs.org.

    This incident affected: textjs.org.

    Postmortem

    Keypresses no longer wait for the next animation frame. Commits that don't come from input, such as timers and streamed data, are still batched per animation frame.

    Fix: 8c2d1b1 · Changelog: 0.3.0