LiteChat 0.2 release notesSTABLE
September 2026 · 36 changes · tap ▸ for details
v0.3v0.2v0.1
✨ 6🐛 3⚡ 2⚠️ 2
✨ New
- Scripted messages:
<script> with render() and onAction() ▸Every message gets its own JavaScriptCore sandbox. A click on a data-action element calls onAction, and render() returns the new HTML for the same bubble — nothing is posted to the chat.
- Bubble transitions: fade, slide and pop ▸
transition('slide-left') snapshots the old content and animates the new one in while the bubble height follows. This card uses it for the version tabs.
animate(), tween() and 14 easing curves ▸Up to 60 frames per second. Frames and timers pause while a bubble is off screen and catch up when it comes back.
- Script Log… in the message context menu
- Restart link for scripts stopped by the sandbox
esc(), mix(), alpha(), lerp() and clamp() helpers
🐛 Fixes
- Timers keep their order after a bubble scrolls back on screen
- A script error no longer wipes the last good HTML
- Hover state survives a re-render
⚡ Performance
- Unchanged
render() output skips layout entirely
- Frames are coalesced when several animations run at once
⚠️ Breaking
chat:toggle demo cards were rewritten as scripts
- Scripts get 50 ms per call and 200 ms of CPU per second
✨ 12🐛 15⚡ 6⚠️ 3
✨ New
- Interactive messages:
chat:toggle and chat:select links ▸A link toggles a class on the bubble's <body> and re-renders it: tabs, accordions and checklists without a single line of script.
- Dark-mode aware CSS kit:
.card, .btn, .badge, .panel, kbd ▸Colours come from the current theme, so one message looks right in light and dark mode without any media queries.
- Six new demo conversations with long, complex messages ▸
Including this one: an article, a digest, release notes, an FAQ, legal text and a poem.
- Theme classes
lc-dark / lc-light / lc-in / lc-out on every bubble
on= attribute in .chat files to pre-select tabs
lhrender --hover x,y renders a hover state
lhrender --click x,y reports which link was hit
- Typing indicator for scripted replies
- Open any .html file as a message (⌘O)
- Snippets menu in the composer
- Hover tooltip with parse and layout timings
- View HTML Source from the context menu
🐛 Fixes
- Hard colour stops in conic gradients (
red 0% 25%, blue 25% 50%)
- Gradient stops that go backwards are clamped like browsers do
- Bubble tail corner on the last message of a group
- Composer corners clipped in dark mode
- Funnel labels clipped inside narrow bars
- Link preview image narrower than its card
- Body margin doubled the bubble padding
- Italic synthesised for families without an italic face
- SF Symbols tinted with the requested colour
- Monotonic baseline: ascent + descent equals line height
- Image drawing upside-down in flipped contexts
- Text matrix reset before every CoreText draw
- Double border with rounded corners
- Dotted borders drawn as round dots
- Groove / ridge / inset / outset shading
⚡ Performance
- Per-font text-width cache (up to 8,192 entries)
- Layout cached per bubble width — scrolling never re-lays out
- Shrink-to-fit costs one extra layout only when the content is narrower
- Images decoded once into a process-wide cache
- Fonts resolved through NSFontManager once per document
- Background tiles skipped outside the clip rectangle
⚠️ Breaking
- Messages that contain their own
<body> tag do not receive theme classes
chat:select groups are prefixes: tab-1, tab-2 belong to tab
- Minimum macOS is now 14 (conic gradients)
✨ 5🧭 3
✨ New
- Every message rendered by litehtml + gumbo ▸
HTML and CSS are laid out by a compact C++ engine and drawn by the app. No web views, no web process per message.
- CoreText container with automatic font fallback ▸
Emoji, Cyrillic, Japanese and Arabic render even when the CSS only asks for the system font.
- SF Symbols through
sf: URLs ▸Size, colour, weight and multicolor mode are query parameters: sf:heart.fill?size=20&color=ff2d55.
- Bundled
app: pictures for demos
.chat files describe demo conversations
🧭 Known issues
- Remote images are not loaded yet
- No bidirectional text reordering
- Long unbreakable words overflow the bubble
…and 33 more changes.