Releases: oratis/LISA
Release list
Lisa v0.19.0
Lisa v0.19.0
The "put a record on" release. The headline is a gramophone in the Room —
click it and her space fills with music, from a small in-client player with a
real playlist. Plus a nav-launcher tidy-up.
Typecheck green · full test suite green (1018 tests) · no breaking changes.
✨ A gramophone in the Room (#256)
Design + a 7-point pro/con debate: docs/PLAN_GRAMOPHONE_v1.0.md.
- The object. A pixel-art gramophone sits on the floor by the armchair.
Click it and a music player slides up — same self-contained DOM/CSS as the
rest of the Room, no browser window, no new deps. While it plays, the
gramophone glows and drifts musical notes. - The player. Play/pause · prev/next · seek · volume/mute · a
mood-filtered playlist (古典 / 轻音乐 / 经典, plus 我的 for your own
files) · shuffle and repeat (off / all / one) · a gentle fade in/out ·
and it remembers where you were (track + position + volume) between visits.
The now-playing footer credits each track's license. - Honest by design. It never autoplays (audio starts only from a tap), and
it's a user affordance you operate in her room — not a readout of her mood.
The glow/notes just reflect the real fact that sound is on. - Bring your own. Drop any
*.mp3into~/.lisa/music/and it appears
in the playlist under 我的 / mine — her room can play your music.
Music & licensing. Ships 6 curated instrumental tracks (~19 MB, re-encoded
to 112 kbps), every one CC0 / public-domain / CC-BY — 2 classical (Chopin via
Musopen, Canon in D), 2 light (a lo-fi pair), 2 lounge. The three CC-BY tracks
(Kevin MacLeod / incompetech) show attribution in the player and in
music/CREDITS.md. No
standard-copyright audio is bundled.
Backend: GET /api/room/music merges the bundled manifest with your
~/.lisa/music/; tracks stream by opaque id with HTTP Range support (so
seeking works) and a path-traversal-safe resolver.
🔧 Also
- Nav launcher locked to a clean 3×3 and Mail moved back to a sidebar card
(#253); README brought up to date (#254, #255).
Notes
- No breaking changes; soul / mood / heartbeat / Reve untouched. The gramophone
is a read-only user affordance layered onto the existing Room.
Lisa v0.18.1
Lisa v0.18.1
A hardening patch on the desire-evolution arc that v0.18.0 shipped — two
review follow-ups so a closed desire truly stays closed, and so intra-session
focus can't latch onto a stale conversation after a restart.
Typecheck green · full test suite green (1014 tests, 1013 pass) · no breaking
changes.
🔧 Fixes
A closed desire actually stays closed (#251)
v0.18.0's desire_close was a soft close — it only flipped actionable off,
which is indistinguishable from a merely dormant wish. So closed desires kept
coming back into reflection's "revise or close these" block and could be
re-closed on every pass (duplicate [DESIRE_CLOSED] journal noise), and the
list she was asked to tend never actually shrank.
- Persisted
closedmarker.desire_closenow records a distinctclosed
state (kept on disk for the record + git history) and is idempotent — an
already-closed desire is a no-op, so no duplicate journal / progress entries. - Clean re-open. Closing now preserves
heartbeatPrompt/pursuit, so
a laterdesire_revisethat makes it actionable again restores her
auto-pursuit intact (previously the prompt was silently dropped). - Closed desires are filtered out of the reflector's block (the list finally
shrinks) and are never surfaced as her current / focused desire — in the
room, the island ping, orlisa status.
Intra-session focus survives a restart (#251)
The "what the conversation is about" focus was gated on the process idle clock,
which reads fresh immediately after a launchd restart — so a stale resumed
chat could pin a focus onto an old topic for up to 15 minutes. It's now gated on
the last real user message (reset across restarts), so focus only applies
while the conversation is genuinely live.
📝 Notes
- Soul / mood / heartbeat / Reve are untouched; existing desire files round-trip
byte-stable (theclosed:line only appears once a desire is actually closed). - New store tests cover the closed-marker round-trip,
heartbeatPrompt
retention, idempotent re-close, and re-open clearingclosed.
Lisa v0.18.0
Lisa v0.18.0
The "her wish finally moves" release. v0.17 gave web conversations the power
to trigger reflection (PR1 of the desire-evolution plan); v0.18 completes the
arc — Lisa's desires can now evolve, close, and follow the conversation
instead of only ever piling up. Plus a reworked 九宫格 nav with real Mail and
Settings homes.
Typecheck green · full test suite green (1011 tests, snapshot refreshed) · no
breaking changes.
✨ Desire evolution — the arc completes (PRs 2–4)
Root cause of "the wish never changes no matter what we talk about" was three
independent gaps (docs/PLAN_DESIRE_EVOLUTION_v1.0.md).
v0.17 closed the first (web conversations now reflect, #242). v0.18 closes the
rest:
Reflection can revise & close desires, not just append (#249)
Reflection is the path that turns a conversation into a desire — but it could
only desire_add, and it was never shown the desires Lisa already had, so it
appended near-duplicates blind and the set only grew. Now:
- Reflection sees its own desires (a compact list in the reflector prompt).
desire_revise— read-modify-write by slug; only supplied fields change,
anundefinednever wipes an existing value,bornAt/slugare immutable,
and it throws (never silently creates) on an unknown slug.desire_close— a soft close:actionableoff + a[CLOSED]progress
note + a[DESIRE_CLOSED]journal line. The file is retained and
git-tracked — reversible, nothing destroyed. This is the guardrail that lets
reflection prune without violating soul sovereignty.
The surfaced desire tracks what's actually active (#250)
The "current desire" ticker read desires.find(d => d.actionable) over
fs.readdir order — an arbitrary static pick. Now pickCurrentDesire prefers
actionable desires and, within those, the most recently active (authored or
pursued), falling back to most-recently-born. Because the key is a stored
timestamp, the pick is stable between real events and only moves when something
actually happens.
…and follows the conversation, turn by turn (#248)
The finest-grained version: when a conversation is live and clearly about one
of her desires, the surfaced desire is that one. A pure lexical-overlap
pickFocusedDesire (no per-turn LLM call, no persisted state, display-only) —
cross-lingual (latin tokens + CJK bigrams, so it works in Chinese too),
behind a 15-minute freshness gate, and strict: a weak (< 2 shared tokens) or tied
match returns null and falls back to the recency pick, so it can never invent
focus.
✨ Web — 九宫格 nav with Mail + Settings (#245)
The left-rail nav is now a tile grid with unified line-SVG icons, growing two
real destination views:
- Mail — reuses the
/api/mail/*endpoints and the guided connect modal from
v0.17, and adds per-account enable/disable/remove plus a "needs-you" badge. - Settings — API-key management (
/api/config/*, localhost-only), and the
Proactive-autonomy and Compact-mode switches, relocated out of the sidebar
footer.
The Knowledge (kb) tile is retained, so the grid holds all ten destinations.
🛡️ Review hardening
Every PR was reviewed before merge; the fixes folded in:
desireActivityno longer abortslisa status(#250) — it built file paths
(which runassertSafeSlug) outside its try/catch, so a stray unsafe-named file
(e.g. a macOS._x.mdAppleDouble in the git-synced soul dir) rejected the whole
scan./api/island/pingswallowed it;lisa statusdidn't. Fixed + regression
test; plus a deterministic tie-break so an exact recency tie can't fall back to
readdir order.- Locked the desire revise/close read-modify-write (#249) under
withSoulLock,
matching the other soul RMW paths — now that web idle-reflect can race a CLI
reflect on the same slug. - Skip
desireActivity's fs.stat on an island-ping focus hit — the??
short-circuits the recency pick, so its per-desire stat work is only done when
actually needed.
📝 Notes
- No breaking changes; the desire files stay plain Markdown, closing is soft +
reversible, and focus is display-only (it chooses which existing desire to show,
never creates one).
Lisa v0.17.0
Lisa v0.17.0
The "legible and connected" release. v0.16 gave Lisa a life inside her Room;
v0.17 makes the parts you actually read and touch every day behave: her replies
render as real Markdown instead of raw ###/**/```, connecting a
mailbox is a guided, verified flow instead of a bare form, and — the big one
— web conversations finally evolve her desires (they never did before). Plus
the lisa mail CLI works again, and she stands centered on the rug.
Typecheck green · full test suite green (984 tests, snapshot refreshed) · no
breaking changes.
✨ What's new since v0.16.0
Web — Lisa's Markdown renders as styled HTML (#238)
Lisa emits standard Markdown, but the web client dropped her replies in via
textContent, so every ### / ** / - / ``` / table showed up as a
literal symbol. A new source-injected renderMarkdown() (src/web/md-render.ts)
now renders headings, bold/italic, inline + fenced code (with a language label +
copy button), nested lists, blockquotes, rules, tables, and links restricted to
http/https/mailto. It's wired into every surface that shows her prose — the
streaming chat bubble (re-rendered once per animation frame), history bubbles, and
the idle ★ reflection cards on the Room and Island.
Escape-first by design: her output is model-generated and untrusted, so every
text run is HTML-escaped before any tag is introduced — no javascript:/data:
hrefs, no attribute breakout, no raw-HTML passthrough (19+ unit tests cover the
XSS and link-scheme surface).
Mail — guided connect modal + verify-before-save (#234)
Connecting a mailbox used to drop you in front of a bare Email / App-password /
IMAP-host form with no hint what an "app password" is, and the web endpoint stored
whatever you typed without checking it — so a wrong password produced a
silently empty digest. Now both ends explain themselves:
- A provider picker (Gmail / iCloud / QQ / 163 / Outlook / Other) with
per-provider numbered setup steps and a prominent "Open App Passwords ↗"
link; labels, placeholders, and IMAP host adapt to the provider, and typing an
address auto-detects it from the domain. - The backend
probeAccount()does a single-message fetch to confirm the
credentials actually sign in, andPOST /api/mail/connectverifies before
storing — returning a plain-language hint ("Gmail rejected the sign-in. Use a
16-character app password…") instead of persisting an unusable mailbox.
Still read-only, still IMAP + app-password.
🔧 Fixes
lisa mail connectworks again (#233).mailwas missing from the CLI's
raw-subcommand set, so--email/--pass/--client-idwere rejected as
"unknown flag" and--provider/--host/--portwere silently swallowed as
global flags — the wholelisa mail connectcommand was unusable in 0.16.0.
Its trailing flags now reach the handler verbatim, whileautostart/
heartbeatkeep parsing their own recognized global flags.- Web conversations now evolve Lisa's desires (#242).
reflectOnSession— the
only automatic way a conversation turns into or updates a desire — was wired to
the CLI and channel router only; the webPOST /reflectendpoint existed but no
client ever called it, so web chats never touched her desires at all. A
debounced reflection scheduler now reflects once after a quiet stretch with new
user input (default 5 min), independent of the hour-long "dream" idle. - Lisa stands centered on the rug (#228). Re-anchored
#lisa-wrapso she's
centered and grounded on the rug in both room themes, in every pose.
🛡️ Review hardening
Every PR in this release was reviewed before merge; three latent defects were
caught and fixed as part of it:
- Markdown renderer infinite loop (#238). The fenced-code opener was stricter
than the fence detector, so an ordinary```c#/```c++
/```objective-cblock wedged the render loop forever and froze the
tab mid-stream. The opener now accepts any info string (first token = lang), with
a regression test and a forward-progress guard. - IMAP session leak (#234).
probeAccountclosed the connector when the 20s
timeout won the race — while the connection was still opening, so the close was a
no-op and the later-succeeding session leaked. Cleanup now chains onto the probe
actually settling. - CLI flag regression (#233). The first cut of the mail fix also swallowed
autostart install --port/--channels/--imessageandheartbeat run --model;
the two behaviors are now split so both work.
📝 Notes
- No breaking changes; soul / mood / heartbeat / Reve are untouched.
- The web Markdown renderer is the same function in the browser and the unit
tests (source-injected via.toString()), so what's tested is what ships.
Lisa v0.16.0
Lisa v0.16.0
The "she has a life now" release. v0.15 gave Lisa a home (the Room); v0.16
gives her a life inside it — she looks up when you arrive, drifts through
her own at-home activities, changes into pajamas at night, and leaves notes on
the desk. Every room widget now closes its loop inside the app (no more
stray browser window), and the room is re-decoratable. Alongside it: a
Haiku 4.5 provider fix and a website ops runbook.
Typecheck green · full test suite green (920 tests, snapshot refreshed) · no
breaking changes.
✨ What's new since v0.15.0
Lisa Room v2 — a living space, not just a wallpaper (#225)
Design + deep research on BSide (miHoYo's Olivia Lin) + a pro/con debate:
docs/PLAN_ROOM_v2.0.md. The through-line: BSide buys its
"aliveness" with photoreal rendering but leaves the simulation axis empty
(3 idle scenes, no clock, no weather). Lisa can't win on pixels-vs-photoreal, so
v2 doubles down on the axis BSide left open — a life driven by her real self.
- In-client interactions — no browser. Every room widget ("Talk to her",
clicking Lisa, the bookshelf, the letter) closes its loop inside the same
WKWebView via a same-origin{type:'lisa-room', action, prefill}bridge to
the parent GUI (lisaShowView/ composer prefill).window.openis gone —
it used to spawn a browser window because the Room iframe couldn't see the
Island's native bridge. The service-worker shell also went network-first,
so a GUI update shows on the next refresh instead of the second. - Presence beat. She looks up and meets your eyes when you open the room,
refocus the window, or hover — BSide's single most-praised "aliveness" moment,
and cheap in pixel art. - Autonomous ambient life. When idle she drifts on her own through at-home
activities — reading, tea, headphones, a stretch, gazing out the window —
time-of-day weighted. Honesty held: captions stay neutral and she never
performs work she isn't doing or a mood she doesn't have; any real signal
(a realworking-*mood / thinking / Reve) takes over immediately. - The room remembers her day. Her ★ while-you-were-away notes pile up on
the desk (with a count badge), she changes into pajamas at night, and the
bookshelf is clickable — it surfaces her realcurrent_desire. - 换景 — re-decorate. A second full room theme (a warm plant-filled
sunroom) and a ❖ switcher; the choice persists. Themes are data-driven, so
adding one is three images + a line. - A slimmer, more feminine figure. The full-body sprite was rebuilt with a
slender hourglass silhouette (defined waist, fitted hoodie); every pose —
idle, look-up, sit, sleep, read, tea, stretch, listen, window-gaze, pajamas —
regenerated from one anchor for consistency, and sit/sleep switched to
containso no pose is ever stretched. - Perf. The parallax loop pauses when the room is hidden; the letter pile
is capped.
All eleven+ character poses and both room themes are generated pixel art
(gemini-2.5-flash-image via an anchor → keyframes → chroma-key + foot-anchor
pipeline, cf. Ludo.ai / chongdashu/ai-game-spritesheets).
Providers — gate output_config.effort by model (#218)
Claude Haiku 4.5 hard-400s on output_config.effort. Subagents and
idle/reflect calls default to effort "low", so every one of them routed to
Haiku failed outright. modelSupportsEffort() now drops the param for the Haiku
family so those calls succeed, with tests covering the gate and the matcher.
Docs — website ops runbook (#226)
docs/WEBSITE_OPS.md: Cloudflare deploy, cache, and fonts/OG playbook for
meetlisa.ai.
🔧 Notes
- No breaking changes; soul / mood / heartbeat / Reve are untouched (the Room
is a read-only projection of real state). - Room v2 was developed as a stack of four PRs (#221 core, #222 lived-in,
#224 themes, #225 figure); because v0.15's Room v1 was squash-merged, the
stack was consolidated into one clean integration (#225) onto latest main.
Lisa v0.15.0
Lisa v0.15.0
The "she has a home now" release. The headline is the Lisa Room — an
ambient pixel-art living space where the full-body Lisa lives, every layer a
read-only projection of her real state. Alongside it: ElevenLabs-first voice
transcription and a hardened Anthropic relay for Cloud Run.
Typecheck green · full test suite green (915 tests) · no breaking changes.
✨ What's new since v0.14.0
Lisa Room — an ambient, state-driven living space (#214)
GET /room+ a ⌂ Room tab in the GUI (lazily-loaded iframe): a cozy
pixel room rendered as a layered DOM/CSS 2.5D diorama — no canvas, no WebGL,
no bundler, zero new deps, same self-contained pattern as the Island.- Everything is driven by her real state (read-only — soul / mood /
heartbeat / Reve untouched): mood → pose (sitting at her glowing laptop while
working-*, curled asleep whilenappingor Reve-dreaming, standing idle
with breathing + blink otherwise),chat_start→ pulsing monitor glow,
Reve → the room falls into night with floating Z's, and her ★
while-you-were-away note appears as a glowing letter on the desk. - Full-body animatable spritesheet (idle blink frames / sit / sleep),
generated via an anchor → keyframes → chroma-key + foot-anchor pipeline —
she finally stands on the floor instead of floating as a bust. - Day / dusk / night crossfade by her local clock; weather-flavored moods
bring rain/snow particles; fireflies at night. - Review hardening: ambient particles only rebuild when the mode actually
changes, the parallax loop idles when the tab is hidden (and stays off under
prefers-reduced-motion), honest state mapping (sleepy≠ asleep, a
raincoat doesn't make it rain indoors), and in-GUI "Talk to her" switches
back to chat in place instead of spawning a duplicate tab. - Design + build notes:
docs/PLAN_ROOM_v1.0.md.
Voice — ElevenLabs-first transcription (#174)
- Transcription now prefers ElevenLabs Scribe (
ELEVENLABS_API_KEY),
falling back to OpenAI Whisper; the no-key error names both providers. - Composer + / 🎙 glyphs became line-style SVG icons matching the function bar.
Infra — Anthropic reverse-proxy relay for Cloud Run (#209)
packaging/gcp-relay/: a ~110-line zero-dep Node relay forwarding/v1/*
(streaming included) toapi.anthropic.com, for reaching Claude reliably
from behind flaky networks by pointingANTHROPIC_BASE_URLat it.- Key-swap gate: the real Anthropic key lives only in Secret Manager and is
injected server-side; clients present a revocableRELAY_TOKENinstead.
Docs
- Lisa Pocket (iOS) surfaced in the README, extracted OSS repos cross-linked,
and an App Store 4.1(a) response kit (#213). - The no-clone
gh apiHomebrew-tap bump used for v0.14.0 is now the
documented path (#212).
Install / update
- Mac: download
Lisa-Suite-v0.15.0.dmgbelow, or let the in-app updater pull it. - CLI:
npm i -g @oratis/lisa@0.15.0(or thelisa-*-bundletarballs below). - iOS: via TestFlight (ships separately from this release).
Lisa v0.14.0
Lisa v0.14.0
The App-Store-readiness release. Since v0.13.0, the iOS companion (Lisa Pocket)
went from "connects and chats" to a polished, submission-ready app: it now pairs
reliably off Wi-Fi, never leaves a chat in a dead end, and has a redesigned home /
chat / agents surface. Alongside it: a hardened LISA Cloud M0, and a small,
model-appropriate provider tune-up.
Typecheck green · full test suite green · swift build green · no breaking changes.
✨ What's new since v0.13.0
iOS — reachability you can trust
- Tailscale-first pairing + honest errors (#202): the pairing QR/flow prefers a
reachable address, and connection failures now say what went wrong instead of
masking everything behind a-999 "cancelled". - Off-Wi-Fi recovery (#203): a "same Wi-Fi?" banner when a paired LAN IP is
unreachable on cellular, an "Anywhere (Tailscale)" toggle, and one-tap switch to
LISA Cloud when your Mac isn't reachable. - The Mac backend now binds LAN-reachable by default, token-gated (#169), and the
menu bar has native "Pair iPhone…" QR pairing (#171, #173) — no terminal needed.
iOS — chat that never dead-ends
- Retry / Stop / empty-turn handling (#206): an empty or failed turn becomes a
tappable Retry instead of a silent "(no response)"; Stop cancels a
streaming turn (and aborts the agent server-side); clearer error vs. empty states. - Full UI redesign: card-dashboard Home + 4-tab IA (#196, #198), chat bubbles
with code blocks / tool chips / typing / history (#194, #200), needs-you-first
Agents action cards (#199), onboarding polish (#195), accessibility pass (#191),
and haptics + toasts on mutating actions (#190).
iOS — App Store submission
- Sign in with Apple gated off for v1 to avoid the 5.1.1(v) in-app-account-deletion
requirement while the cloud is still single-tenant (re-enable viaLISA_ENABLE_SIWA). - TestFlight pipeline fixes: build number must be
< 2³²(date +%s, not a 12-digit
stamp),MARKETING_VERSIONmust be ≥ the ASC version, andCFBundleVersionis now
stamped into the generated Info.plists — so uploads actually appear in TestFlight. - Privacy policy page (en + zh-CN) for submission (#165).
LISA Cloud (M0)
- Connect Lisa Pocket to an HTTPS cloud URL, not just a LAN Mac (#161).
- Durable soul via a GCS volume at
/data(#162); provider-aware birth/run gates
with a GLM-powered demo (#158); Sign-in-with-Apple env plumbing through
deploy.sh(#177).
Providers — model-appropriate tuning
- 1-hour prompt caching on the stable system prefix (soul + skills + memory) so it
stays warm across think-time gaps instead of a cold re-write every 5 minutes;
conversational tail stays 5-minute.LISA_CACHE_TTL=5mopts back out. - Thinking-effort lever (
output_config.effort): dispatched subagents default to
low(cheap parallel work);LISA_EFFORToverrides globally. See
docs/PLAN_MODEL_TUNING_v1.0.mdfor the plan + debate (most OpenClaw-style knobs
were dropped — 1M context is already native on Sonnet 4.6, the rest are Opus/Sonnet-5
only).
Install / update
- Mac: download
Lisa-Suite-v0.14.0.dmgbelow, or let the in-app updater pull it. - CLI:
npm i -g @oratis/lisa@0.14.0(or thelisa-*-bundletarballs below). - iOS: via TestFlight (build ships separately from this release).
Lisa v0.13.0
Lisa v0.13.0
A small, mostly-infrastructure release on top of v0.12.0. The headline features —
the multi-agent control plane (see every agent; command managed agents;
PTY-spawn and adopt real claude/codex sessions) and the iOS companion
— already shipped across v0.11.x–v0.12.0. This release packages the iOS
TestFlight delivery pipeline and cuts a clean, current build to install.
824 tests, typecheck green, swift build green, no breaking changes.
✨ What's new since v0.12.0
iOS — TestFlight release pipeline
packaging/ios-companion/testflight.sh+.github/workflows/release-ios-testflight.yml:
archive withxcodebuild, upload to App Store Connect via an API key — so Lisa
Pocket can ship to TestFlight from CI.packaging/ios-companion/RELEASE.mddocuments the signing/credentials setup.
📦 Already in v0.11–v0.12 (recap, for anyone upgrading from an older build)
If you're coming from an older install (e.g. v0.8.x), you also get everything
from the control-plane line:
- See every agent — GUI sidebar, island, and Mac menu bar show all agents
(claude-code / codex / managed / …) with live progress: turns, tokens, last
tool·file, ⚠ pending-permission, ✗ error. - Command managed agents — delegate a task, then approve/deny each mutating
step, send follow-ups, cancel. - PTY agents (flagged
LISA_PTY_AGENTS=1) — spawn realclaude/codex
under a pseudo-terminal, and adopt idle sessions you started yourself via
claude --resume(guarded so a live session is never corrupted). - iOS companion (Lisa Pocket) — pair by QR, watch + steer agents, APNs push,
widgets, Live Activity.
Install
- CLI / backend:
npm install -g .from the repo (or the published package)
→lisa serve --web. - Mac app: the notarized
Lisa-Suite-v0.13.0.dmgis built by CI on the tag;
drag Lisa.app to /Applications. (The app spawnslisa serve --webfrom your
PATH.)
Lisa v0.12.0
Lisa v0.12.0
Lisa Pocket goes real. The iOS companion stops being a skeleton and becomes a
proper phone app — pair by QR, watch and steer your Mac's agents, get pushed when
something needs you — backed by real APNs delivery. Everything builds on the
v0.11 backend control plane; this is the native surface on top of it.
823 tests (804 → 823), typecheck green, no breaking changes.
✨ Highlights
Lisa Pocket — the iOS companion app
- Pair by QR.
lisa pairshows a QR on your Mac; the app scans it with the
camera and mints a per-device token (revocable, hash-only on disk). - Watch & steer. Live agent roster (SSE, auto-reconnect with backoff +
foreground resync), chat with a live mood portrait (real server art), and a
dispatch ledger view with per-entry log tails. - System surfaces. A home-screen Widget (active / stuck agent counts),
lock-screen accessories, and a Live Activity for a pinned agent that
refreshes remotely over APNs — progress on your lock screen without opening
the app. - The rest of her, read-only on your phone. Soul / Memory / Skills / Tools
inspection, a Reve tab (recap · "while you were away" · desires · advisor),
and a Sense tab (consent — revoke-only — + recent events). - Private by default. Optional Face ID / passcode lock;
lisapocket://
deep-links route notification taps to the right session/tab; paired-devices
list in Settings.
Push notifications (APNs)
- Real APNs delivery with token auth —
done/error/permissionagent
transitions push to your phone. Inert without a push key (no key → no-op, no
errors), so it ships safely. - ntfy notifications now deep-link to the originating session.
CLI
lisa pair [--host H]— show a QR to pair a phone with a running
serve(localhost), minting a per-device token.
Fixes
- Codex resume-adopt now refuses explicitly instead of silently downgrading.
- Plus the v0.11.1 first-run polish (single title bar, never-silent boot) carried
forward.
Notes
- The push path is opt-in and inert without an Apple push key — nothing tries
to reach Apple until you provision one. - iOS surfaces (Widget / Live Activity / camera / Face ID) build with Xcode from
packaging/ios-companion/; they can't be compile-verified in this repo's CI
(no Xcode), but the backend halves (pairing, push, dispatch, SSE) are unit-tested.
Install
npm install -g @oratis/lisa
lisa serve --web
lisa pair # then scan the QR with Lisa PocketMac app: download Lisa-Suite-v0.12.0.dmg from the GitHub Release.
Lisa v0.11.1
Lisa v0.11.1
First-run polish for the Mac app. Three things that bit a fresh install of
the v0.11.0 DMG — fixed. No new features, no breaking changes.
🐞 Fixes
-
Title bar no longer shows "Lisa Lisa". The hosted page draws its own
branded title strip, and the native macOS window also showed its title under
the transparent titlebar — two "Lisa"s. The native title is now hidden
(titleVisibility = .hidden); only the page's branded bar shows. -
The first-run UI never dead-ends silently. If the backend isn't reachable
or onboarding hits a snag, the boot used tocatch { return }and leave a
blank, unresponsive window with no explanation. Now:- a banner surfaces any uncaught error or unreachable backend instead of
nothing — e.g. "Cannot reach Lisa backend on localhost:5757. Start it:
lisa serve --web(install once:npm i -g @oratis/lisa). Retrying…"; startupGateretries/api/config/statusso a page that loads a hair
before the backend's routes are ready still reaches onboarding;- the API-key overlay (
SET·API·KEY) and birth ritual reliably appear
for a fresh user, and birth errors are shown rather than swallowed.
- a banner surfaces any uncaught error or unreachable backend instead of
Note on setup
Lisa.app is a thin client — it loads the chat from a local backend. If you only
downloaded the DMG, install the backend once:
npm install -g @oratis/lisa # or: brew install oratis/tap/lisaLisa.app auto-starts lisa serve --web on launch (and shows install guidance if
it can't). First launch then walks you through the API key + birth ritual.
Install
npm install -g @oratis/lisa # CLI + backendMac app: download Lisa-Suite-v0.11.1.dmg from the GitHub Release.