Commit Graph
100 Commits
Author SHA1 Message Date
Sebastian 559ccad63f ci: check stacked pull requests (#1472) 2026-09-02 17:48:15 +02:00
Sebastian 09a0dd695d fix(native): ship stripped libraries with separate release symbols (#1437) 2026-08-31 22:38:28 +02:00
Sebastian ac8543c4d0 fix(core): retry the final automatic frame after backpressure (#1457) 2026-08-31 16:18:05 +02:00
SebastianandSimon Klee 202e1e6a00 docs: improve OpenTUI skill guidance (#1461)
Document compact layouts and companion packages.

---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-08-28 12:38:20 +02:00
Sebastian 20f669256d perf(native): reduce word layout work with eager view metadata (#1456) 2026-08-28 00:48:15 +02:00
Sebastian fbd584b28e fix(native): expose Yoga C API to Zig consumers (#1454) 2026-08-27 15:54:59 +02:00
Sebastian ab1a2aaf9b fix(core): preserve edit cursors across tab widths (#1449) 2026-08-27 15:54:09 +02:00
Sebastian 8d1dceb717 perf(core): skip tab refresh for tab-free roots (#1450) 2026-08-27 15:00:21 +02:00
Sebastian f49c935ccb fix(native): preserve mixed whitespace graphemes (#1447) 2026-08-27 14:33:41 +02:00
Sebastian bd823a02b8 fix(native): preserve truncated copy ranges (#1448) 2026-08-27 14:11:59 +02:00
SebastianandSimon Klee de0b5f2091 docs: document shared Zig cache for worktrees (#1452)
Document the opt-in shared Zig local cache workflow for repeated native
builds across worktrees.

---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-08-27 09:08:33 +02:00
Sebastian 465c3ccad0 refactor(core): clarify text layout units (#1429) 2026-08-25 22:52:07 +02:00
Sebastian d2089a81ae refactor(core): make wrapped layout byte-accurate (#1428) 2026-08-25 22:33:47 +02:00
Sebastian 8046c846cf feat(native): export audio module to Zig consumers (#1431) 2026-08-25 16:05:01 +02:00
Sebastian e69cf0cc54 ci: migrate npm publishing to OIDC (#1395) 2026-08-20 18:42:01 +02:00
8cae8eddee feat(core): add embedded terminal renderable (#1340)
---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Sebastian Herrlinger <hasta84@gmail.com>
Co-authored-by: quintoo-bot <sebastian+quintoo-github@anoma.ly>
Co-authored-by: quintoo-bot <317894163+quintoo-bot@users.noreply.github.com>
2026-08-18 22:17:56 +02:00
Sebastian Herrlinger ad9a818d7a prepare release v0.5.1 2026-08-04 03:33:05 +02:00
Sebastian 6ae5d05c8e feat(core): support ICC PNG profiles (#1327) 2026-08-04 03:32:21 +02:00
Sebastian 1a8987b803 fix(core): accept trailing PNG whitespace (#1326) 2026-08-03 22:16:26 +02:00
Sebastian Herrlinger 1bc4d2a56e prepare release v0.5.0 2026-08-03 14:10:34 +02:00
SebastianandSimon Klee 078bb44862 feat(core): add native image rendering (#1283)
---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-08-03 01:15:56 +02:00
Sebastian a1503fbe30 fix(core): harden renderer resolution lifecycle (#1306)
## Summary

- keep at most one terminal pixel-resolution query in flight and
coalesce resize or suspended refreshes into one follow-up query
- preserve complete and partial pixel-resolution replies across
suspend/resume without leaking suspended protocol prefixes into later
input
- preserve post-resume input across chunk boundaries and discard
retained prefixes when the query is cancelled
- reject unsafe or signed-32-bit-overflowing pixel dimensions before
they reach renderer geometry
- keep the implementation and causal regression coverage independent
from native image support

Extracted from the final implementation in #1283, with additional
regressions proven and fixed during standalone review.

## Verification

- focused parser and renderer tests: 605 passed
- core Bun tests: 5,221 passed, 23 skipped
- Node 26.4 source tests: 4,527 passed, 6 skipped
- library build, formatting, and lint pass
2026-08-03 00:31:22 +02:00
Sebastian 9eabce7040 feat(core): add audio input capture (#1297) 2026-07-29 14:09:07 +02:00
Sebastian b5dae2433d perf(core): reuse FFI struct storage (#1284) 2026-07-27 23:56:08 +02:00
Sebastian 6064dcdc29 docs: update OpenTUI skill (#1290) 2026-07-27 23:55:19 +02:00
Sebastian f26eb147d4 perf(core): speed up Node FFI layout reads (#1273)
- preserve fixed call shapes for short pointer-bearing Node FFI
functions, enabling V8 fast calls while retaining validation behavior
- reuse one owned Yoga layout output buffer per `FFIRenderLib` instead
of allocating and resolving a pointer per node
- add reproducible Bun/Node render benchmarks and comparison tooling
under `packages/core/src/benchmark`
2026-07-17 21:58:00 +02:00
Sebastian Herrlinger 9d7ad9fc9c prepare release v0.4.4 2026-07-16 20:51:25 +02:00
Sebastian 5d57e27e95 Add MP3 and FLAC audio streaming (#1239)
- Add URL, byte-source, and custom-connector streaming APIs.
- Support MP3/FLAC decoding, buffering, playback controls, stats, and
backpressure.
- Add reconnect policies, lifecycle events, typed errors, and robust
cleanup.
- Support ICY headers, metadata demuxing, and custom demuxers.
- Add a live radio demo with presets, telemetry, meters, and FFT
visualization.
2026-07-13 14:17:38 +02:00
Sebastian ff1fc35582 fix(core): identity-based child management, resolves duplicate-id culling corruption (#1224)
## Breaking

- `remove(id: string)` → `remove(child: BaseRenderable)` across all
renderables;
  strings throw at runtime. Look up via `getRenderable(id)` /
  `findDescendantById(id)` when needed (docs updated).

## Core

- All internal child bookkeeping uses object identity;
`renderableMapById` removed,
  ids remain as a pure query API (first match wins on duplicates)
- `remove` warns in dev when the object is not a child; ScrollBox routes
internal
parts (wrapper, scrollbars) by parentage so `destroy()` fully detaches
them
- TextNode reparenting hygiene in
`add`/`replace`/`insertBefore`/`children`
- `destroy()` no longer skips children (live-array iteration bug) and
clears
  z-index/pending-update state

## Renderer (zig)

- Frame output buffers grow on demand instead of dropping ANSI mid-frame
while
  still committing cells (the source of "stale cells never repainted")
- Failed growth reports `.failed` → forced full repaint; partial frames
are not
flushed; buffers shrink back after 64 small frames; `deinit` frees with
the
  owning allocator

## Frameworks

- react/solid reconcilers pass child references; react host config
tolerates
  teardown overlap (unmount during `renderer.destroy()`)
2026-07-03 16:24:36 +02:00
Sebastian b15b90980a Reduce Yoga callback pressure for native text measurement (#1219)
- Route JS Yoga measure/dirtied callbacks through shared native
callbacks.
- Move `TextRenderable` and `TextareaRenderable` measurement to
native-backed renderables.
- Preserve existing JS `setMeasureFunc` support for other renderables.
- Add parity/stress tests for native-backed measurement and callback
routing.
2026-07-03 11:21:42 +02:00
Sebastian 90db1813a6 handle threaded output backpressure + stale fps (#1169) 2026-06-12 18:07:31 +02:00
Sebastian Herrlinger b7e0bb9c3d prepare release v0.4.1 2026-06-11 20:38:31 +02:00
Sebastian 26f364f602 Native yoga-layout (#1126) 2026-06-11 09:32:11 +02:00
SebastianandSimon Klee e0004b9c06 Handle native render backpressure and failures (#1163)
- Retry feed-backed skipped frames once the feed becomes idle.
- Coalesce render requests while waiting for feed readiness.
- Avoid automatic retries for native failures.
- Preserve paused, stopped, suspended, and continuous-rendering
behavior.
- Prevent split-footer failure retry loops and unresolved idle waits.

---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-06-11 01:11:41 +02:00
Sebastian Herrlinger 9b216a58d9 prepare release v0.3.4 2026-06-07 21:37:17 +02:00
Sebastian 85b10e514d Fix markdown blank scrollbox (#1150) 2026-06-07 21:17:12 +02:00
SebastianandSimon Klee c127f724a0 core: guard native objects with handles (#1123)
Native calls previously accepted raw pointers, allowing stale references to
dereference freed memory after object destruction. Use generation-tagged
handles so stale, wrong-kind, and borrowed child references fail safely
instead of causing use-after-free.

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-06-04 22:34:26 +02:00
Sebastian Herrlinger 0d449d4c17 fix musl release 2026-06-04 15:21:06 +02:00
Sebastian Herrlinger e2a847d60a prepare release v0.3.2 2026-06-04 14:48:37 +02:00
Sebastianandmalventano 76b2668b52 Fix sticky scroll re-engagement and document render hook limits (#1144)
- Centralizes ScrollBox manual-scroll tracking with
`syncManualScrollState()`.
- Re-enables sticky bottom when users scroll back to the sticky edge via
mouse wheel or keys.
- Prevents programmatic sticky/layout recalculations from accidentally
changing manual-scroll state.
- Documents `renderBefore`/`renderAfter` as draw-only hooks that run
after layout and culling.
- Notes that culled ScrollBox children do not run render hooks, so
layout/state must not depend on them.

Additionally:
- Incorporates PR #1141’s sticky-bottom regression test.
- Extends the centralized manual-scroll sync to also clear manual mode
when sticky sync is active but the viewport is already back at the
sticky edge.
- Confirms this branch covers the #1141 follow-up case without
reintroducing programmatic resize/recalculation regressions.

---------

Co-authored-by: malventano <malventano@users.noreply.github.com>
2026-06-03 00:09:59 +02:00
Sebastian Herrlinger a677997458 prepare release v0.3.0 2026-05-28 17:23:01 +02:00
Sebastian f6bccbe26f drop bindings with unknown tokens (#1120) 2026-05-28 16:21:35 +02:00
Sebastian ff7d82e268 detect zellij (#1119)
- Adds explicit multiplexer detection via `capabilities.multiplexer`.
- Improves tmux notification handling with DCS passthrough wrapping.
- Adds Zellij detection and OSC 99-only notification behavior.
- Adds notification protocol/disable overrides via env vars.
2026-05-28 15:43:28 +02:00
Sebastian db12ee3b19 upgrade gh workflows to node 24 (#1117) 2026-05-28 00:55:46 +02:00
Sebastian f07a959495 detect remote shell (#1116) 2026-05-28 00:55:27 +02:00
Sebastian 74faa7879c extend qrcode demo (#1115) 2026-05-28 00:49:07 +02:00
Sebastian Herrlinger 65ea483d87 prepare release v0.2.16 2026-05-27 00:08:58 +02:00
Sebastian adbce09567 extend testing facilities (#1100) 2026-05-21 01:04:25 +02:00
Sebastian Herrlinger f464acfcba prepare release v0.2.15 2026-05-20 15:18:01 +02:00
Sebastian Herrlinger a795ac32fb prepare release v0.2.14 2026-05-18 03:20:18 +02:00
Sebastian 7ae1fdecd6 fix native benchmark and smoke test (#1080)
- Link native audio dependencies into the native_span_feed_bench dylib
- Centralize miniaudio/platform library setup for native build artifacts
- Add a PR smoke workflow for bun run bench:native --mem
2026-05-18 00:38:49 +02:00
Sebastian 48c02d19a1 no markdown fenced code flicker (#1079) 2026-05-17 23:30:22 +02:00
Sebastian Herrlinger 560288d204 prepare release v0.2.13 2026-05-17 22:40:46 +02:00
Sebastian 5969eee9b4 Fix OpenTUI native event callbacks (#1075)
- Replace OpenTUI’s process-global native event callback with
per-runtime event sinks.
- Pass each sink into native objects that emit events, avoiding stale
Bun JSCallback pointers across workers/test runtimes.
- Keep native callback support via explicit createEventSink /
destroyEventSink.
2026-05-16 23:57:26 +02:00
Sebastian Herrlinger 8887c614ab prepare release v0.2.12 2026-05-16 03:33:15 +02:00
Sebastian Herrlinger a45f8bcaf4 prepare release v0.2.11 2026-05-16 02:42:23 +02:00
Sebastian c33d377e73 Fix Kitty ctrl+space (#1069)
- Fixes anomalyco/opencode#27096
- Normalize Kitty keyboard protocol space events to name: "space"
- Preserve text insertion behavior with sequence: " "
- Update keyboard docs to distinguish name, sequence, and raw accurately
- Remove docs references to internal-only core keybinding helpers
2026-05-16 02:41:23 +02:00
Sebastian 20e1d7c32d blend fg into flattened bg (#1068)
- Fixes anomalyco/opencode#27590
- Blends replacement glyph foreground alpha against the cell’s final
background instead of the previous destination background
- Prevents transparent border glyphs from rendering as black over opaque
box backgrounds
- Adds native, core, and Solid regression coverage for transparent box
borders
- Updates foreground-alpha test expectation to match final-background
compositing behavior
2026-05-15 02:06:56 +02:00
Sebastian b2c885d9c9 fix flaky test (#1064) 2026-05-14 16:43:41 +02:00
Sebastian Herrlinger 9ab593d370 prepare release v0.2.9 2026-05-13 22:09:44 +02:00
Sebastian dde6af3bb3 fix keymap fallback priority (#1061)
- Prioritizes direct event matches before fallback matches across all
active layers.
- Preserves layer priority within each match type.
2026-05-13 21:51:23 +02:00
Sebastian Herrlinger 40ea4d9bb5 prepare release v0.2.8 2026-05-13 02:14:26 +02:00
Sebastian 59132a6f97 fixup plugin runtime (#1057) 2026-05-13 02:13:44 +02:00
Sebastian Herrlinger 8765e8d014 prepare release v0.2.7 2026-05-12 04:43:52 +02:00
Sebastian c0a1b37967 clarify audio startup and terminal capability types (#1053)
- Made audio playback startup strict: start() now only succeeds with an
active output device.
- Added explicit mixer-only mode via startMixer() and isMixerStarted().
- Changed audio autoStart default to false.
- Updated audio tests, native Zig tests, and audio benchmark for
playback vs mixer semantics.
- Updated native audio demo to fall back to mixer-only mode when
playback is unavailable.
- Added Bun standalone executable audio embedding docs and Node.js
“coming soon” note.
- Added typed TerminalCapabilities for renderer.capabilities and
capability events.
- Added testing helpers for terminal capabilities and updated
capability-related tests.
- Updated renderer docs to document TerminalCapabilities.
2026-05-12 04:43:11 +02:00
Sebastian 7610ad58ba osc notifications (#1048) 2026-05-11 19:18:32 +02:00
Sebastian Herrlinger e6639597f0 prepare release v0.2.6 2026-05-09 01:07:29 +02:00
Sebastian c08b8edf66 flat binding lookup instead of nested sections in keymap extra (#1036) 2026-05-09 01:05:37 +02:00
Sebastian Herrlinger cfceed1a7a prepare release v0.2.4 2026-05-07 16:28:52 +02:00
Sebastian a7dd6cfa7c extend the keymap resolveBindingSections extra (#1033) 2026-05-07 16:28:07 +02:00
Sebastian Herrlinger 422c4f3047 prepare release v0.2.3 2026-05-06 03:53:21 +02:00
Sebastian 7aa65a022a refine keymap (#1025) 2026-05-06 03:42:24 +02:00
Sebastian Herrlinger 629566129a prepare release v0.2.2 2026-05-02 16:37:31 +02:00
Sebastian 378fdabfaa refactor palette for color intent (#1009) 2026-05-02 16:35:59 +02:00
Sebastian 342dadda09 refine keymap (#1007) 2026-05-01 21:01:19 +02:00
Sebastian Herrlinger 171475427e prepare release v0.2.0 2026-04-28 17:00:26 +02:00
Sebastian Herrlinger 6f62557ef0 Revert "prepare release v0.1.107"
This reverts commit ce4a1fdfba.
2026-04-28 16:58:46 +02:00
Sebastian Herrlinger 4b905023f3 patch npm release workflow 2026-04-28 16:56:25 +02:00
Sebastian Herrlinger 27936a0026 fix example dep installs 2026-04-28 16:43:03 +02:00
Sebastian Herrlinger 44908655ab use prebuilt artifacts for examples in CI 2026-04-28 16:28:31 +02:00
Sebastian Herrlinger ce4a1fdfba prepare release v0.1.107 2026-04-28 16:14:07 +02:00
Sebastian 2a90ba9f59 fix example standalone build (#986) 2026-04-28 16:09:06 +02:00
Sebastian 7486e36968 plain OSC 10/11 for tmux (#977) 2026-04-28 15:48:15 +02:00
Sebastian Herrlinger 97d2493040 fix release maybe 2026-04-28 02:53:01 +02:00
Sebastian Herrlinger 642cae8cf8 prepare release v0.1.106 2026-04-28 02:12:20 +02:00
SebastianandSimon Klee f1c511780e Keymap (#983)
See `docs/keymap/overview.mdx` for details.

---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-04-28 02:10:37 +02:00
Sebastian Herrlinger 26cda81b32 prepare release v0.1.105 2026-04-27 03:13:04 +02:00
Sebastian 1a7584dfb6 reduce initial palette size for color intent (#978)
too many queries cause a stdin burst and trigger a bun bug closing the
fd
2026-04-27 03:12:29 +02:00
Sebastian Herrlinger 67e9da13e1 prepare release v0.1.104 2026-04-26 22:08:06 +02:00
Sebastian f0733f58c7 prevent color query feedback loop (#976)
Adresses #975
2026-04-26 22:05:07 +02:00
Sebastian Herrlinger 7c226fb2ef prepare release v0.1.103 2026-04-24 00:10:26 +02:00
Sebastian 97af2de57b more reliable theme mode (#969)
and no OSC 11 set background to fix gutter bg color in terminals be
cause there are issues at least in ghostty
2026-04-24 00:07:37 +02:00
Sebastian Herrlinger b2ada4d863 prepare release v0.1.101 2026-04-19 23:30:16 +02:00
Sebastian 616b16f288 Theme mode fallback (#957) 2026-04-19 23:29:27 +02:00
Sebastian Herrlinger baf74a6bf8 fix link script 2026-04-19 22:37:50 +02:00
Sebastian Herrlinger 3b1773db3d prepare release v0.1.100 2026-04-16 22:45:19 +02:00
Sebastian 8581c3b020 ensure layout is up to date for culling (#953) 2026-04-16 22:39:56 +02:00
Sebastian Herrlinger cc94b5829a prepare release v0.1.99 2026-04-13 13:14:33 +02:00
SebastianandSimon Klee 0c2dd582d6 performance (#944)
- Added _screenX/_screenY layout-time absolute coordinate caching and
used it in hot render paths (Renderable, Box, TextBufferRenderable,
EditBufferRenderable).
- Skipped drawBox entirely for boxes with no visible border and no
visible fill.
- Optimized native transparent fill paths in buffer.zig:
- fillRect uses cheaper paths when no grapheme/link tracking is involved
- fully transparent fills preserve existing visible text while
normalizing empty cells
- Optimized native transparent border drawing in drawBox for width-1
opaque border glyphs over transparent backgrounds.
- Optimized native text-buffer rendering for opaque width-1 text over
transparent backgrounds, bypassing generic alpha blending when the
result is equivalent.
- Avoided visible-child filtering work for renderables that do not
actually filter children by adding _hasVisibleChildFilter(); only
viewport-culling ScrollBox content now pays for _getVisibleChildren()
and membership checks.
- Switched primary-axis child sorting and ScrollBox viewport culling to
absolute screenX/screenY, including updating objects-in-viewport to
operate on screen-space coordinates instead of recursive x/y walks.
- Added/expanded correctness tests 
- Added new headless benchmarks
  - box-draw-benchmark.ts
  - render-traversal-benchmark.ts
  - text-buffer-render-benchmark.ts

---------

Co-authored-by: Simon Klee <hello@simonklee.dk>
2026-04-13 13:13:47 +02:00
Sebastian Herrlinger 43c56275a1 prepare release v0.1.97 2026-04-06 01:55:10 +02:00