Status
console.logOperationalconsole.clearRarely usedYogaOperationalTurbolog encoderOperationalDevTools ThrottlerRespectedtextjs.orgOperationalLive 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.
| Release | Full frame | Typing | Idle | %c spans |
|---|---|---|---|---|
0.1.0Mar 2025 · @textjs/core · 7c91cea | 0.194ms | 0.065ms | 0.043ms | 205 |
0.2.0Jul 2025 · textjs.org · 92437cc | 0.192ms | 0.067ms | 0.042ms | 205 |
0.3.0Nov 2025 · 10× input · 8c2d1b1 | 0.205ms | 0.065ms | 0.043ms | 146 |
0.3.0Nov 2025 · Mobile pass · e2e6e46 | 0.212ms | 0.067ms | 0.045ms | 146 |
0.4.0May 2026 · Zero-flash frames · f007ade | 0.184ms | 0.046ms | 0.028ms | 146 |
1.0.0Oct 2026 · Text.js 1.0 · 57968b6 | 0.163ms | 0.011ms | 0.000ms | 149 |
DevTools frontend
bench/devtools in Chrome for Testing: blank paints, delivered frames and display lag, 5s per run. How we measure.
| Driver | FPS | Blank paints | Painted / emitted | Lag p50 |
|---|---|---|---|---|
| Append (shipping) | 15 | 1.0% | 74 / 75 | 10.4ms |
| Clear per frame | 15 | 70.6% | 70 / 75 | 60.4ms |
| Append, unpaced | 60 | 0.8% | 67 / 295 | 31.2ms |
| Clear per frame | 60 | 81.1% | 45 / 300 | 9.8ms |
Past incidents
Newest first. Times are in UTC.
October 2026
Pages stuck under the header on iOS SafariOct 27 – Oct 28, 2026 · Resolved
- Resolved
This incident has been resolved.
- Monitoring
A fix has been deployed. Scroll anchoring is off (
overflow-anchor: none). We are monitoring. - 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.
- Monitoring
A fix has been deployed. Those elements now scroll horizontally only, and
scrollbar-gutter: stableapplies to mouse devices only. - 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: stablealso makes the first scroll jump on iOS. - 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=scrollon 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- Resolved
Lint rule tests failing in CIOct 23, 2026 · Resolved
- Resolved
The tester now reads
it.onlylazily, when a test callsRuleTester.itOnly. CI is passing. - Identified
Bun throws when
it.onlyis read while theCIenvironment variable is set. The rule tester assignsRuleTester.itOnly = it.onlyat import, so loading it fails. - Investigating
The
eslint-plugin-textjstest suite fails in CI before any rule test runs. Local runs pass.
Postmortem
@typescript-eslint/rule-testertakes its test functions as static properties ofRuleTester. The fix wrapsit.onlyin a function. No package or page was affected.Fix:
eca3f78- Resolved
Layout shift on /playground and /opencodeOct 21 – Oct 22, 2026 · Resolved
- Resolved
Cumulative layout shift is 0 on every route.
- Monitoring
A fix has been deployed. Both pages share one pad layout, and the size is appended without moving “Fit console”. We are monitoring.
- 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. - 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.mjsasserts identical boxes across routes, demos, viewport sizes and connection states.Fix:
8f22b9b· Changelog: 1.0.0- Resolved
Package name textjs unavailable on npmOct 14 – Oct 15, 2026 · Resolved
- Resolved
This incident has been resolved.
- Monitoring
The framework and CLI package is now
@textjs/next, in the same scope as@textjs/coreand@textjs/react. Imports change fromtextjsto@textjs/next. - Identified
The name
textjshas belonged to another npm package since March 25, 2016. - Investigating
Publishing the framework package
textjsto npm fails with403 Forbidden.
Postmortem
Starting with Text.js 1.0, apps import from
@textjs/nextinstead oftextjs, and the OpenCode bridge isbunx @textjs/app proxy, which runs from any directory.- Resolved
September 2026
Empty paint layers at row breaksSep 15 – Sep 16, 2026 · Resolved
- Resolved
This incident has been resolved.
- Monitoring
A fix has been deployed. Row breaks that don't continue a run now reset
%cto an empty style first, so DevTools emits a plain newline. Each frame carries one curtain. - Identified
When a styled run ends at a row break, the
\nis written inside the run's%cspan. DevTools splits the span at the line break, and the empty remainder becomes adisplay: inline-blockspan withcontain: paint, which gets its own paint layer. - 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.- Resolved
August 2026
Increased display latency after console.clearAug 27 – Aug 31, 2026 · Resolved
- Resolved
Median display lag in
bench/devtoolsis 10.4ms. The fix ships in Text.js 1.0. - 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.
- 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.
- Investigating
bench/devtoolsreports 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.
- Resolved
Spinner misaligns rows in the DevTools consoleAug 11 – Aug 12, 2026 · Resolved
- Resolved
This incident has been resolved. The fix ships in Text.js 1.0.
- Monitoring
A fix has been deployed. The default
dotsspinner now draws quadrant blocks (▘ ▝ ▗ ▖), one cell each in Menlo. The braille frames are available asvariant="braille"for terminals. - 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.
- 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
LineChartdraws quadrant dots by default for the same reason. Braille is available withmarker="braille".- Resolved
May 2026
Elevated blank paints in the DevTools consoleMay 5 – May 19, 2026 · Resolved
- Resolved
The fix is released in Text.js 0.4.0. Blank paints are at 1.0%, all of them on the first frame.
- 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.
- 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. Inbench/devtools, a 100×32 dashboard was blank in 70.6% of DevTools paints at 15fps and 81.1% at 60fps. - 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 oneconsole.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- Resolved
April 2026
File paths in console frames restyled as linksApr 14 – Apr 15, 2026 · Resolved
- Resolved
This incident has been resolved.
- Monitoring
A fix has been deployed. The encoder inserts a word joiner (U+2060) into
path:line,//host:portanddata:text, unless the cell allows links. - Identified
DevTools turns URLs,
path:lineand//host:porttext in console messages into links and forces its theme colors onto them. The encoder already broke up://andwww., butpath:lineand the//host:portafter a scheme still match. - Investigating
Text such as
src/app.tsx:12andhttp://localhost:3000renders in DevTools' link color instead of its%cstyle.
This incident affected: Turbolog encoder.
Postmortem
://andwww.have carried a word joiner since 0.1.0. Cells that should stay clickable set the allow-link attribute and are written unchanged.- Resolved
November 2025
Delayed keystrokes in console appsNov 4 – Nov 18, 2025 · Resolved
- Resolved
The fix is released in Text.js 0.3.0.
- 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. - Identified
Every update, including a keypress, waits for the next
requestAnimationFramebefore React commits and the frame is logged. - 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- Resolved