21 Commits
Author SHA1 Message Date
Can Celik 25aaa0b7e3 fix: keep offscreen kitty images loaded instead of resending them on scroll (#4686) 2026-09-27 21:05:25 +03:00
Can Celik ccd51946fd refactor: encode kitty placements in a single pass (#4657) 2026-09-26 20:19:10 +03:00
Can CelikandJJ Liebig c411883ec6 feat!: replace the custom graphics api with optimized native kitty rendering (#4561)
* feat!: replace the custom graphics api with optimized native kitty rendering

* fix: enable safe kitty optimizations automatically

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-24 20:59:48 +03:00
Can Celik e22cba35ef fix: keep direct graphics bound to its client (#3549) 2026-09-02 22:45:51 +03:00
Can Celik 6c0bb273d5 feat: support independent multi-client tab views (#3526) 2026-09-02 14:24:33 +03:00
Can Celik 207be3c771 refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell

* feat: add client-owned shell mouse controls

* feat: complete client-owned shell chrome

* feat: add client-owned shell settings and notifications

* feat: run client shell custom commands

* feat: render popup terminals in client shell

* feat: add client-owned scrollback and copy mode

* fix: preserve client worktree trust defaults

* feat: render startup diagnostics in client shell

* feat: render onboarding in client shell

* feat: render product announcements in client shell

* feat: render release notes in client shell

* feat: render mobile switcher in client shell

* feat: render kitty graphics in client shell

* fix: preserve client shell lifecycle coherence

* refactor: route client shell commands through endpoint connections

* refactor: make the client-rendered shell the default

* refactor: remove monolithic launch mode

* refactor: complete client-rendered shell cutover

* perf: retain client pane surface updates

* perf: scale retained pane surface updates

* perf: remove remote pane input latency

* test: make client shell checks platform-independent

* fix: prevent client timer starvation

* test: fix client shell platform gates

* test: accept retained surfaces in cross-area checks

* test: make client mode assertions platform-neutral

* fix: badge only outdated integrations
2026-09-01 15:48:22 +03:00
Can Celikandkataokatsuki 7d56b4c51b fix(graphics): batch kitty image row lifecycle (#3166)
* fix(graphics): coalesce terminal kitty placements

A Unicode-placeholder image arrives as one placement per viewport row it
covers, and after 624dfd47 the budgeted encoder emitted one placement per
frame, so every redraw painted images one row per frame.

* fix(graphics): coalesce only pure kitty re-displays

Keep pixel uploads and superseded-image deletes in a transaction of
their own: a placement joins the coalesced transaction only when its
image is uploaded and its source already maps to that image, and
nothing joins after an upload or a delete.

* fix(graphics): batch kitty image row lifecycle

---------

Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com>
2026-08-24 04:49:44 +03:00
akbashandakbash-bot 624dfd4796 fix(graphics): isolate oversized kitty images (#3035)
* fix(graphics): isolate oversized kitty images

refs #3033

* fix(graphics): budget pane image cleanup

refs #3033

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-20 23:09:42 +03:00
Can Celik b7dca4bb2a fix(graphics): support high-dpi direct file frames (#2680) 2026-08-13 17:21:26 +03:00
Can Celik 1777e9bba3 feat(graphics): add direct pane frame streaming (#2523)
* feat(graphics): add direct pane frame streaming

* feat(graphics): expose pane visibility

* test(graphics): preserve legacy terminal image output

* fix(graphics): harden streaming lifecycle

* fix(input): preserve mouse releases outside panes
2026-08-09 02:04:39 +03:00
Ogulcan Celik 8dcb75a5c0 refactor: extract active tab surface rendering 2026-07-16 22:47:10 +03:00
Ogulcan Celik 88370e1516 feat: add isolated pane graphics streaming 2026-07-15 02:32:52 +03:00
GabrielandCan Celik 4eceb75d8a fix: kitty graphics streams freeze on partial updates and leak host images (#948)
* fix: request a render on kitty graphics writes

pty output containing a kitty graphics sequence only scheduled the
deferred settle render. that render's wake-up notifies the render loop
only when the dirty flag was not already set, so under a continuous
stream of image updates the notify can be dropped and the pane keeps
showing an old frame until something else forces a full render.

request an immediate render like any other output. the dirty flag and
the minimum render interval still coalesce chunked writes, and the
settle render stays as a backstop.

refs #947

* fix: fingerprint kitty images exactly across retransmissions

the image fingerprint hashed only the first, middle, and last 4096
bytes of pixel data. a program that streams updates by retransmitting
one image id keeps the length and dimensions constant, so a frame whose
changed pixels all fall outside those three windows gets the same
fingerprint as the frame before it. the encoder then treats the image
as already uploaded, emits no graphics bytes, and the frame is dropped
as identical to the previous render. the pane stays stuck on the last
uploaded image until a resize resets the graphics surface.

hash the full payload instead. to keep that off the render hot path,
cache the fingerprint per image id and recompute it only when the
image's transmit time changes. libghostty-vt already refreshes the
transmit time on every transmission; vendor patch 0002 exposes it
through a new GHOSTTY_KITTY_IMAGE_DATA_TRANSMIT_TIME_NS accessor. a
static image costs one map lookup per render and a streaming image one
hash per transmitted frame.

refs #947

* fix: delete superseded host kitty images

host image ids derive from image content, so a pane image whose pixels
change maps to a new host id on every update. nothing deleted the host
image it replaced, and a streaming pane left one full-size image behind
in the host terminal per changed frame until the graphics surface was
reset. track which host image backs each pane image and delete the
replaced one once no source references it.

refs #947

* fix: prune stale kitty graphics source entries

a source entry whose pane closed or whose placement disappeared stayed
in the cache forever. through the shared-reference check it could keep
an old host image alive that nothing visible used anymore, and the
entries themselves accumulated without bound. prune sources against
the visible set at the start of every encode pass.

refs #947

* docs: link issue and upstream discussion for vendor patch 0002

the transmit time accessor now has a removal path: the ghostty
discussion proposing it upstream is linked in the patch ledger.

refs #947

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-04 02:49:15 +03:00
Ogulcan Celik cc527d45fe perf: retain terminal render updates 2026-06-02 02:31:12 +03:00
Ogulcan Celik 866aaf740e refactor: separate server client boundaries 2026-05-21 20:22:57 +03:00
Ogulcan Celik 38a3c3c5cd fix: support kitty unicode placeholders
refs #136
2026-05-20 03:47:29 +03:00
Ogulcan Celik 3ecacfddae feat: add direct terminal attach stream 2026-05-17 01:41:17 +03:00
Ogulcan Celik 7c636e97f4 fix: refresh and reuse kitty graphics placements 2026-05-15 03:53:37 +03:00
Ogulcan Celik c542fc8717 fix: gate kitty graphics behind config 2026-05-13 18:53:53 +03:00
Ogulcan Celik 4600309051 feat: support kitty graphics in attached clients 2026-05-13 14:15:26 +03:00
Ogulcan Celik fb9aff5408 feat: render kitty graphics in local panes 2026-05-13 14:15:26 +03:00