Releases: FanyinLiu/Nexus
Release list
v0.4.1
Nexus v0.4.1 — Companion UI, Settings, and Reliability Hardening
v0.4.1 is the first stable follow-up to the v0.4 desktop companion awareness
foundation. It does not turn Nexus into an autonomous work agent and it does not
start the v0.5 desktop-pet window-control line. This release focuses on making
the companion surface, Settings, release checks, and privacy boundaries easier
to trust before the next product layer ships.
Highlights
- Companion UI source organization — the panel, composer, message, dial,
collapsed, rhythm, motion, and visual-lock styles are split into focused
source files so the companion surface can keep evolving without turning the
main stylesheet into one large edit point. - Settings surface hardening — Settings gets clearer source structure,
source-only surface audits, and an explicit options architecture document so
the Settings UI can follow the chat surface without hiding too much behavior
in one component. - Settings drawer performance guard — the Settings drawer entry stays lazy.
Styles load as a dedicated CSS chunk and the lazy JS entry remains tiny, so
opening Settings does not reintroduce raw CSS string injection or push large
Settings rules onto the startup path. - Image4 companion field guardrails — Image4 panel state, signal rendering,
activity labels, composer state, visual rhythm, and color boundaries now have
source-level contracts and tests. - Custom companion-name wake word sync — companion-name changes now have a
dedicated wake-word synchronization layer so future voice wake behavior can
track user naming choices without importing app-level code into feature
modules. - Runtime privacy and redaction hardening — desktop context, message
privacy, vault, support logs, runtime log sanitization, memory-vector support
buffers, and network-error redaction are covered by stricter source-only
audits. - Release upload prep —
docs/GITHUB_UPLOAD_PREP.mdrecords the intended PR
framing, review order, performance baseline, and verification commands for
this large v0.4.1 review branch.
What Changed
UI and Settings
- Split the companion panel CSS into focused modules under
src/app/styles/panel-companion*.css. - Added the Image4 companion field, rhythm grid, signal, activity label, chat
preview, companion state, and composer state modules. - Added Settings surface reference docs, options architecture docs, and source
audits for Settings, chat, composer, forms, focus management, streaming, and
agent-activity surfaces. - Kept local UI QA screenshots and metrics out of the repository through the
docs/ui-qa/ignore rule; source-backed review docs stay committed instead.
Performance
- Changed
src/app/settingsDrawerEntry.tsso Settings styles are imported as
normal lazy CSS resources rather than bundled as raw CSS strings in JavaScript. - Expanded
scripts/performance-baseline.mjswith separate budgets for:- total CSS
- largest CSS chunk
- initial CSS chunk
- Settings drawer lazy CSS
- Settings drawer lazy JS entry
- Added failure checks when the Settings lazy CSS or lazy JS entry disappears,
because that usually means Settings styles moved back into the startup path. - Updated
docs/PACKAGE_STARTUP_OPTIMIZATION.mdwith the new baseline:
Settings drawer lazy CSS at about 554 KB and Settings drawer lazy JS entry at
about 0.1 KB.
Companion Awareness and Voice Boundaries
- Kept desktop companion awareness focused on coarse, privacy-bounded summaries.
- Preserved the v0.4 rule that time language should feel approximate and
companion-like, not stopwatch-like. - Added or tightened tests for coarse time labels, localized exact-time leak
detection, check-in policy behavior, summary storage, and transparency view
models. - Added a companion wake-word synchronization layer for custom companion names.
Privacy, Security, and Release Checks
- Added runtime log sanitization and memory-vector support log buffering with
redaction-focused tests. - Split error-redaction audit phrases and rules into focused source files.
- Extended message privacy, desktop context privacy, vault security, and network
error-redaction audits. - Added or expanded source-only release, storage, IPC, architecture, and
boundary audit fixture tests. - Updated
verify:prso the new UI, privacy, performance, and release gates run
together.
Still Out of Scope
v0.4.1 does not include:
- external proactive notifications
- message sending
- tool execution without explicit user action
- productivity scoring
- raw desktop activity timelines
- new sensing sources
- pet mouse-following, typing-following, or desktop-window control
- a new public release process beyond the
v0.4.1tag and GitHub Release
Those remain later v0.4.x or v0.5 work.
Distribution Notes
Until Nexus has signed installers and notarized macOS distribution, manual
installs may still show platform trust prompts:
- macOS may show Gatekeeper or quarantine warnings. If you intentionally
downloaded Nexus from the official GitHub Release, remove quarantine only for
that downloaded app bundle. - Windows may show SmartScreen warnings because the installer is not yet backed
by broad code-signing reputation.
Do not download installers from mirrors or reposted archives.
Verification
The local upload-prep checks for this branch passed before promotion to the
v0.4.1 candidate:
git diff --check
npm run source-size:audit
npm run performance:baseline
npm run distribution:audit
npm run verify:pr
npm audit --omit=devBefore publishing the final GitHub Release, run the release gates on the final
pushed commit:
npm run verify:release
npm run prerelease-check -- v0.4.1
npm run package:dir:smokev0.4.0
Nexus v0.4.0 — Desktop companion awareness foundation
Stable. This release starts the v0.4 desktop companion awareness line with
a quiet observation foundation. It keeps the companion continuity path
privacy-bounded and deliberately does not expand into proactive check-ins or
v0.5 desktop pet behavior.
What changes for users
Nexus can keep quiet companionship continuity
When desktop context awareness is enabled, Nexus is open, and the user is
active elsewhere instead of directly chatting with Nexus, Nexus can keep a
short-lived companion awareness summary.
That summary is deliberately small:
- a broad activity class
- a rough elapsed-time bucket
- whether the user appears focused
- whether Nexus should stay silent
The purpose is companionship continuity. Nexus should not behave like a
stopwatch, productivity monitor, screen recorder, or autonomous work agent.
The summary is session-bound
The recent companion summary is scoped to the current app session and renderer
lifecycle. Nexus drops the stored summary if it belongs to another session,
was written by a previous renderer lifecycle, predates the current session, is
older than the hard 24-hour safety cap, appears to come from the future, or
fails schema validation.
This prevents a previous desktop activity stretch from being replayed later as
current context.
Settings keeps the privacy boundary visible
Memory settings explains:
- what desktop companion awareness can observe
- what is stored locally
- what reaches the model
- how to pause companion awareness
- how to clear the recent companion summary
Pausing companion awareness, disabling context awareness, or clearing the recent
summary removes the local recent summary.
Privacy boundary
Allowed:
- sanitized companion summaries
- broad activity classes
- rough time buckets
- short-lived recent summary metadata
Not allowed:
- raw screenshots
- full OCR dumps
- full clipboard contents
- private message bodies
- private file paths
- exact timers or timestamp trails
- hidden activity logs
- productivity scoring
Out of scope
This stable release does not include:
- proactive check-in expansion
- new desktop sensing sources
- mouse-following, typing-following, or desktop pet window control
- productivity dashboards or raw activity timelines
- automatic mouse or keyboard control
- file reading, app opening, message sending, or settings changes without
explicit user action
Distribution notes
Until Nexus has signed installers and notarized macOS distribution, local
manual installs may still show platform trust prompts:
- macOS may show Gatekeeper or quarantine warnings. If you intentionally
downloaded the app from the official GitHub Release, remove quarantine only
for that downloaded app bundle. - Windows may show SmartScreen warnings because the installer is not yet backed
by broad code-signing reputation.
Do not download installers from mirrors or reposted archives.
Validation focus
This stable release is prepared against:
npm run verify:releasenpm run package:dir:smokenpm run desktop-context-privacy:auditnpm run message-privacy:auditnpm run error-redaction:auditnpm run ipc:auditnpm run distribution:auditnpm run prerelease-check -- v0.4.0
The stable handoff is
Nexus v0.4.0 Stable Release Checklist.
v0.4.0-beta.1
Nexus v0.4.0-beta.1 — Desktop companion awareness begins.
Beta. This is the first v0.4 desktop companion awareness beta. It starts
the quiet loop that lets Nexus understand that time passes after the user
opens Nexus and then works elsewhere. It is for validation before a stable
v0.4 release.
What changes for users
Nexus can stay quietly aware while open
When desktop context awareness is enabled and Nexus is open but not being used
directly, Nexus can form a short-lived companion summary:
- whether the user has not interacted with Nexus recently
- a broad activity class such as coding, reading, browsing, idle, or switching
- a rough elapsed-time bucket such as "a while" or "about half an hour"
- whether Nexus should stay quiet because the user appears focused
The point is companionship continuity, not surveillance or productivity
scoring.
Time language is deliberately rough
v0.4 starts with companion-like time wording:
- just started
- a while
- about half an hour
- about an hour
- two hours or more
Nexus should not speak like a stopwatch. Exact minute and second durations stay
out of companion copy.
Check-ins are policy-gated
The first check-in policy is intentionally conservative. It can reason about:
- long continuous activity
- frequent switching
- long idle after activity
- returning to Nexus after being away
It also respects pause, cooldowns, focus, and quiet hours. The beta should help
validate whether the timing feels caring, too early, too late, or too frequent.
Settings explains the privacy boundary
Memory settings now includes desktop companion awareness transparency:
- what Nexus can observe
- what it stores
- what reaches the model
- how to pause awareness
- how to clear the recent companion summary
The visible summary stays coarse and does not show raw desktop content.
Pausing companion awareness or turning desktop context awareness off clears the
recent local companion summary so old awareness state does not linger in
Settings.
Privacy boundary
Allowed:
- sanitized companion summaries
- broad activity classes
- rough time buckets
- short-lived recent summary metadata
Not allowed:
- raw screenshots
- full OCR dumps
- full clipboard contents
- private message bodies
- private file paths
- exact second-level timers
- hidden activity logs
What stays out of this beta
- No v0.5 desktop pet mouse-following or typing reactions yet.
- No automatic mouse or keyboard control.
- No file reading or message sending without explicit user action.
- No productivity dashboard or raw activity timeline.
- No new autonomous work-agent behavior.
Beta validation focus
Please use the GitHub Beta Validation Report template and include:
- whether Nexus was open but unused
- whether you were actively chatting with Nexus
- what broad desktop activity was happening
- whether the time wording felt natural
- whether any check-in felt caring, cold, nagging, or monitoring-like
- whether pause and clear controls were easy to find
- whether OS permissions were confusing
Do not attach raw screenshots, clipboard contents, private window titles,
private message text, or private file paths unless they are safe test fixtures.
Known issues
- The beta still needs real-world validation across macOS, Windows, and Linux
permission flows. - Copy may need tuning per locale after beta feedback.
- v0.5 desktop pet behavior is intentionally deferred until this awareness loop
is stable and trusted.
v0.3.5
Nexus v0.3.5 — Memory is no longer a black box
The memorable upgrade: Nexus can now show which memories shaped a reply,
then take you back to those memory records so you can inspect, pause, edit, or
delete them.This release keeps Nexus pointed at companionship, not autonomous work
execution. The trust work around first-run setup, IPC, release posture, and
SQLite rehearsal exists to make memory local, visible, reversible, and under
the user's control.
What changes for users
Memory is no longer hidden background magic
This is the companion-memory headline for v0.3.5. Existing memory still lives in
renderer localStorage by default, and nothing is deleted.
- Assistant replies can show a small memory-source hint when memory shaped the
response. - Expanding that hint resolves the stored source IDs against the current memory
state, marks missing or paused sources, and opens Settings directly to Memory. - Opening Memory from a reply highlights the relevant memories and diary
fragments, including older diary entries outside the recent preview. - The Memory settings page now shows whether recall and learning are active,
how many long-term memories and daily fragments are available, and which
storage boundary is still authoritative. - Users can pause all memory or pause individual long-term memories without
deleting them. - A new content-free memory dry-run inspects long-term, legacy, and daily memory
localStorage shapes before any SQLite memory migration is attempted.
First conversation is easier to reach
- The first-run model setup now catches common Ollama, DeepSeek, and
OpenAI-compatible mistakes before a real request is made. - Safe repairs can fill built-in Base URL and model defaults without touching
API keys. - The final onboarding step shows whether the current setup is ready for the
"first conversation within 5 minutes" target. - Settings can export a local first-run QA report with launch checks and timing
evidence, but no chat content, model output, API keys, or provider secrets.
Release trust is more explicit
- Local release audits now check macOS, Windows, and Linux signing/update
assumptions from repo config and docs. - Unsigned macOS builds use a manual-download update posture until Developer ID
signing and notarization are enabled. - SQLite availability is smoke-tested before release-style packaging.
Chat memory is moving carefully, not suddenly
This is the companion-memory groundwork for v1.0. Existing chat history still
lives in renderer localStorage by default, and nothing is deleted.
- A hidden dry-run can inspect local chat storage without sending message text
over IPC. - A hidden, explicitly confirmed migration path can write normalized chat
sessions to main-process SQLite. - A hidden runtime mirror can copy the current live chat session into SQLite
while localStorage remains authoritative. - A hidden comparison preview can compare local chat-session metadata with
SQLite metadata and show aggregate differences. - Rollback deletes only the SQLite chat-session records written by this path;
localStorage chat history remains untouched.
Under the hood
- Added source-only IPC contract auditing and brought the current preload/main
handler surface to zero warnings. - Hardened high-risk IPC families with schema validation, trusted-sender checks,
metadata-only audit records, and confirmation/permission hints. - Added the main-process local-data foundation under
userData/local-data/nexus.sqliteusing Electron/Node's built-in
node:sqlite. - Added metadata-only local-data status, onboarding mirror, chat migration
status, chat runtime mirror, and chat comparison preview paths. - Added content-free memory storage dry-run reports for future long-term memory
SQLite migration design. - Kept renderer access to plaintext secrets blocked through the safeStorage
vault/ref pattern.
Product boundary
Nexus is still a desktop companion. This release does not add a Codex-style
agent, task planner, autonomous executor, or background work system. The storage
and audit work exists so future memory feels local, visible, reversible, and
under the user's control.
Known issues
- macOS packages are still unsigned in local smoke builds. Gatekeeper may keep
the quarantine bit, so first launch may require the usual right-click -> Open
flow or, for advanced users, removing quarantine withxattr. - Windows signing gates are prepared but final installer trust still depends on
a real signing certificate; unsigned builds may show SmartScreen warnings. node:sqlitestill emits an ExperimentalWarning in this Node/Electron line.- Optional KWS/SenseVoice models may be missing in local smoke environments.
- Torch-backed Python sidecars remain disabled when torch is not installed.
- Desktop message awareness remains macOS-first; Windows support is still not
equivalent.
Notes & limitations
- This is a stable release candidate for manual GitHub release publishing.
- Signed macOS and Windows release gates are prepared but still require real
signing credentials before trusted auto-update can be enabled.
v0.3.4
Nexus v0.3.4
Stable — v0.3.4 beta line promoted for general downloads. This release
promotes the testedv0.3.4-beta.4code line to the stable update channel.
It includes the v0.3.4 beta improvements around message awareness, companion
emotion behaviour, the default Live2D face, Telegram/Discord bridge polish,
local TTS fallback, and stage-direction rendering.
What changes for users
Desktop message awareness and bridge polish
- macOS desktop message awareness can surface incoming communication context
from Notification Center after the user grants the required system
permission. By default, Nexus treats this as gentle context and keeps the
interaction bounded. - Telegram and Discord bridge work from the beta line is included, including
the paired authorization flow and reply path improvements fromv0.3.4-beta.1
andv0.3.4-beta.2.
Companion behaviour
- The companion emotion loop from
v0.3.4-beta.3is included: recent user
affect and real runtime events can shape tone and whether Nexus chooses a
gentle check-in or stays quiet. - 星绘 is the default Live2D face for fresh installs. Existing pet/avatar choices
are preserved. - Missed desktop-message context can be mentioned gently in a later
conversation, within cooldown and quiet-time limits.
Reply rendering and voice
- Short parenthetical stage directions are handled by shape, not by a fragile
keyword list. Recognized expressions drive the avatar and are not shown or
spoken; unrecognized asides render as quiet script notes instead of leaking
as broken-looking chat text. - Streaming speech also skips these asides, so Nexus does not read stage
directions aloud mid-response. - Local TTS support from the beta line remains available, with cloud TTS still
required for some voice-note formats.
Validation
- This stable promotion is based on the
v0.3.4-beta.4code line. - Local release verification should pass before tagging:
npm run verify:releaseandnpm run prerelease-check -- v0.3.4 --quick. - No additional real-machine macOS Notification Center, Telegram, or Discord
live validation was added afterv0.3.4-beta.4. Treat those integrations as
useful but still environment-sensitive.
Known issues
- macOS desktop message awareness depends on Full Disk Access and Notification
Center database readability. Permission prompts and OS privacy behaviour can
vary by machine. - Telegram voice-note replies still need a cloud TTS provider for mp3/ogg/m4a
output. Local TTS outputs WAV. - Discord inbound voice transcription is not included.
- Windows message awareness remains adapter/script based rather than a native
Notification Center equivalent. - Emotion behaviour is intentionally subtle and does not expose a dashboard.
Notes and limitations
- macOS unsigned build. If Gatekeeper blocks first launch, right-click the
app and choose Open. If quarantine metadata remains attached after manual
download, remove it withxattr -dr com.apple.quarantine /Applications/Nexus.app. - Windows unsigned build. SmartScreen may warn because the installer is not
signed. Use More info -> Run anyway only if you downloaded the installer from
the official GitHub release. - Stable users on earlier releases can receive this through the stable update
channel after the GitHub release is published.
v0.3.4-beta.4
Nexus v0.3.4-beta.4
Beta — her little expressions reach her face, not the chat text. Fourth beta of the
v0.3.4line, on top ofv0.3.4-beta.3. The companion narrates small expressions in passing — 「(眼睛亮了)」, 「(歪头)」 — meant to animate her avatar, not to be read as words. Occasionally one of those slipped into the visible reply as raw text. This release makes those stage directions behave consistently by SHAPE, not by a hand-maintained list, so the ones we recognise drive her face and the novel ones she invents read as quiet script asides instead of looking like leaked text — and she never speaks any of them aloud. As a pre-release it is for manual validation only; stable users are not auto-upgraded.
What changes for users
Her expressions land on her, not in the text
She often adds a small parenthetical to colour a reply — her eyes lighting up, a tilt of the head. Those are stage directions for her avatar, not lines to be shown or spoken. Sometimes one leaked into the chat as raw text and looked like a glitch.
- Recognised expressions are just expressions. When she writes something we understand — 「(眼睛亮了)」, 「(微笑)」, 「(歪头)」 — it now drives her avatar and is kept out of both the text and the voice, exactly as before. You feel it on her face, you don't read it.
- Novel asides read as intentional, never as a leak. When she invents an aside we don't have a face for — a playful 「(突然蹦出一只企鹅)」 — it stays in the reply but is rendered as a quiet, italic script note, clearly an aside rather than a stray line. So nothing she does looks broken, even the things we've never seen.
- She never speaks an aside. Whether recognised or not, a parenthetical aside is no longer read aloud — including mid-sentence while the voice is streaming.
- Notes still show normally. A genuine parenthetical with a colon — 「(注:周一照常)」 — is treated as content, shown and spoken as usual.
The point: this is decided by the shape of what she writes, so a brand-new expression on someone else's screen is handled the same way, without anyone adding it to a list.
Under the hood
- Replaced the recognised-keyword gate for stripping stage directions with a shape rule (a colon marks structured content; everything else short and bracketed is an aside). Added a streaming-TTS twin so the voice never speaks an aside even mid-stream, and dropped the now-orphaned silent/generic keyword tables.
Known issues
- Live bridge + real-machine validation still pending (carried from the earlier betas): the messaging and awareness flows are covered by protocol and unit tests, but real-network behaviour and the Full Disk Access grant flow need a real machine — that's what this validation window is for.
- The muted styling for an unrecognised aside only appears for the rare asides we don't recognise; most expressions are invisible (they drive her face). Worth an eyeball during validation.
- Emotion changes are deliberately invisible (no dashboard, by design) — you feel them in her replies over days of use, not in a panel.
- Desktop message awareness is macOS-only; the Windows adapter remains an external script.
- Local TTS outputs WAV, so Telegram voice-note replies still need a cloud TTS provider (mp3/ogg/m4a). Discord inbound voice isn't transcribed yet (Telegram only).
- Carried over: Screen Recording permission quirks on the unsigned macOS build.
Notes & limitations
- Unsigned distribution (macOS arm64). First launch needs the usual right-click → Open; granting Microphone / Screen Recording / Full Disk Access follows the in-app prompts. Unchanged in
v0.3.4. - This is a pre-release: download manually from GitHub Releases for validation. Stable users are not auto-upgraded.
v0.3.4-beta.3
Nexus v0.3.4-beta.3
Beta — the companion's emotions finally drive her, not just describe her. Third beta of the
v0.3.4line, on top ofv0.3.4-beta.2. The headline is a four-step deepening of the emotion engine: she now reads how you feel from the whole conversation, her own mood is shaped by genuine events (a failed reply, a long absence, your low days), and that mood actually changes how — and whether — she reaches out. Plus the Live2D character is now the default face, message awareness collapses to one toggle, and a gentle follow-up on messages you missed while away. As a pre-release it is for manual validation only; stable users are not auto-upgraded.
What changes for users
The companion feels more like a person
This release closes the emotion loop end to end — perception → her inner state → her tone and behaviour. None of it is a dial you set; it just happens, quietly.
- She reads how you feel. Using the whole conversation (not keyword matching), she now picks up on moods that have no obvious keyword — 「我今天被裁了」 carries no "sad" word, but she'll notice. This shapes her tone and, over time, how she checks in.
- Her mood is shaped by real events. A failed reply leaves her a little concerned. A long stretch of you being away — she starts to miss you, and there's a genuine warm lift when you come back. Your stretch of low days softens her (more warmth, more care). These were defined long ago but never actually fired until now.
- Her mood changes what she does. When she's worried she leans toward a gentle check-in; when she's tired she'd rather stay quiet; when she's bright she might share something playful. This never overrides quiet hours, away/locked, or cost limits — it only colours the moments that were already going to happen. She never gets chatty just because her mood is good.
- Her warmth follows the relationship. The same feeling shows more reservedly while you're still getting to know each other, more openly once you're close.
Avatar
- The Live2D character (星绘) is now the default face. Her soul and her model finally match out of the box. The lightweight sprite pets (Pip and friends) remain a fully-supported option in the picker — they're just no longer the default. (Fresh installs only; if you already chose a pet, your choice is kept.)
Desktop message awareness
- One toggle now. Turning on "Desktop message awareness" (macOS) auto-enables the notifications it depends on — so it's a single flip plus the (Apple-mandated) Full Disk Access grant, nothing else to configure.
- She follows up on what you missed. A message that arrived while you were away can surface, gently, in your next conversation — 「下午张三在微信找过你,后来处理了吗?」 Asks, never assumes (she can't see whether you replied in the other app); once per conversation, at most twice a day, and silent if it would feel forced.
Under the hood
- A never-wired pair of agent tool definitions removed (dead scaffolding, no behaviour change).
Known issues
- Live bridge + real-machine validation still pending (carried from the earlier betas): the messaging and awareness flows are covered by protocol and unit tests, but real-network behaviour and the Full Disk Access grant flow need a real machine — that's what this validation window is for.
- Emotion changes are deliberately invisible (no dashboard, by design) — you feel them in her replies over days of use, not in a panel.
- Desktop message awareness is macOS-only; the Windows adapter remains an external script.
- Local TTS outputs WAV, so Telegram voice-note replies still need a cloud TTS provider (mp3/ogg/m4a). Discord inbound voice isn't transcribed yet (Telegram only).
- Carried over: Screen Recording permission quirks on the unsigned macOS build.
Notes & limitations
- Unsigned distribution (macOS arm64). First launch needs the usual right-click → Open; granting Microphone / Screen Recording / Full Disk Access follows the in-app prompts. Unchanged in
v0.3.4. - This is a pre-release: download manually from GitHub Releases for validation. Stable users are not auto-upgraded.
v0.3.4-beta.2
Nexus v0.3.4-beta.2
Beta — the companion notices all your messages. Second beta of the
v0.3.4line, on top ofv0.3.4-beta.1. The headline: desktop-wide message awareness — Nexus now reads the macOS Notification Center so your companion knows when WeChat, QQ, mail or any other app gets a message, behind a single settings toggle. Plus pairing codes that replace hand-typed allowlist IDs, MiniMax Token Plan web search, region tabs in the settings model picker, and ~2,100 lines of dead code removed. As a pre-release it is for manual validation only; stable users are not auto-upgraded.
What changes for users
Desktop message awareness (macOS) — new
- Your companion now notices messages from every app. Enable it under Settings → Autonomy → Notifications → "Desktop message awareness": Nexus reads the system Notification Center history, so a WeChat/QQ/DingTalk/mail banner becomes something the companion knows about — announce (optional), inbox, and into the conversation so she can react ("张三在微信找你了").
- One toggle replaces the manual adapter script. This previously required running an external node script by hand; it now runs inside the app. Requires granting Nexus Full Disk Access (the card shows a "needs permission" status with a one-click jump to System Settings while the grant is missing). Enabling never replays old notifications.
- Privacy follows the existing model: by default the companion only learns source + sender (「微信 · 张三 发来了新消息」); message content is included only with the existing read-content opt-in. Ten rapid pings from one conversation become a single companion reaction, not ten.
- Source filter: choose which apps count as messengers (keyword field; empty uses the built-in list covering WeChat/QQ/WeCom/DingTalk/Feishu/Telegram/Discord/Slack/Teams).
- Honest scope: this reads what apps put in notification banners — muted chats, apps with notifications off, and content hidden by your notification-preview settings stay invisible. It also cannot reply back to those apps (replies remain a Telegram/Discord bridge capability).
Messaging bridge
- Pairing codes replace hand-typed IDs. With the deny-by-default allowlist, allowing even yourself meant digging up a numeric chat ID. Now: message the bot once → it replies with a one-time 6-digit code (1 h expiry, max 3 pending, repeats silent) → approve the request in Settings → Integrations. Approving a Telegram private chat also marks it as the owner; group chats and Discord channels enter the allowlist only.
- Reminder broadcasts hardened: scheduled reminders now go only to your own chats (owner Telegram chats + allowlisted Discord channels) and pass the same permission gate as every other send — previously they went to every remembered sender with no check.
Search & setup
- MiniMax web search: 9th search provider — the same MiniMax Token Plan key you may already use for chat doubles as a search key (ordinary model keys are not accepted by MiniMax's search endpoint). CN endpoint by default, base-URL override for global.
- Region tabs in the settings model picker: the provider grid now filters by 国内 / 海外 / 本地, and a cross-region brand (MiniMax/Moonshot/Qwen/SiliconFlow) selects the right regional variant depending on which tab you click it from. Matches the onboarding picker from the previous beta.
Under the hood
- ~2,100 lines removed: 303 unused translation keys deleted across all five locales (detection guarded against dynamically-built keys).
- The optimization roadmap (
docs/EXECUTABLE_OPTIMIZATION_TASKS.md) reconciled with shipped reality.
Known issues
- Live bridge validation is still pending (carried from beta.1) — the Telegram/Discord reply loop and the new awareness flow are covered by protocol-level and unit tests, but real-network/real-grant behaviour is what this beta's validation window is for. The Full Disk Access grant flow in particular needs a real machine.
- Local TTS outputs WAV, so Telegram voice-note replies still require a cloud TTS provider (mp3/ogg/m4a).
- Discord inbound voice messages are not transcribed yet (Telegram only).
- Desktop message awareness is macOS-only in this beta (Windows adapter still available as an external script).
- Carried over: Screen Recording permission quirks on the unsigned macOS build; a small tail of dead exports pending cleanup.
Notes & limitations
- Unsigned distribution (macOS arm64). First launch needs the usual right-click → Open; granting Microphone / Screen Recording / Full Disk Access follows the in-app prompts. Unchanged in
v0.3.4. - This is a pre-release: download manually from GitHub Releases for validation. Stable users are not auto-upgraded.
v0.3.4-beta.1
Nexus v0.3.4-beta.1
Beta — the messaging bridge actually talks back. First beta of the
v0.3.4line on top ofv0.3.3. The headline: the Telegram/Discord bridge finally closes the loop — your companion now replies back to the chat you messaged it from, optionally as a voice note, and Telegram voice messages get transcribed into the conversation. Plus a free fully-offline TTS option, a security pass on the messaging surface, and first-run onboarding polish. As a pre-release it is for manual validation only; stable users are not auto-upgraded.
What changes for users
Messaging bridge (Telegram / Discord)
- The companion replies back. Message your companion from Telegram or Discord and the reply now routes back to that same chat/channel automatically — previously the bridge was receive-only and answers appeared only on the desktop. Replies go only to your own (owner) messages, never to other contacts, so nobody can use your companion as a relay. A new per-gateway toggle controls this (on by default;
read-onlypermission mode still blocks all sending). - Voice replies. Optionally have replies arrive as a TTS voice note: Telegram gets a real voice bubble (with mp3/ogg/m4a-capable TTS providers), Discord gets a playable audio attachment. Three modes: off / always / only-when-they-sent-voice (the last one mirrors your modality — speak to it and it speaks back, type and it types).
- Telegram voice messages are understood. Incoming voice notes are downloaded and transcribed with your configured cloud speech-recognition provider, then reach the companion like any text message. Without an API STT configured they fall back to the old announce-only behaviour. Media messages (photos/stickers/voice/…) are also announced now instead of being silently dropped.
- No more silently lost messages. Bridge messages that used to vanish when the assistant was mid-reply are now queued and retried; a Telegram reconnect no longer replays the previous message batch; and the panel's manual reply box no longer pretends a failed send succeeded.
- Allowlist is now deny-by-default. An empty allowed-IDs list used to accept everyone — bot usernames are publicly searchable, so a freshly configured bridge was open to strangers. It now accepts nobody until you add your chat/channel IDs. Action needed: if your bridge worked with an empty allowlist, add your IDs in Settings → Integrations.
NEXUS_TELEGRAM_API_BASEenvironment variable for routing Bot API traffic through a reverse proxy where api.telegram.org is unreachable.
Voice
- Free offline text-to-speech. New "Local TTS" speech-output provider (MeloTTS, bilingual zh/en) running fully offline through the bundled sherpa-onnx runtime — no API key, no per-character billing. Download the ~165 MB model in Settings → Local Models before first use. Note: its WAV output means Telegram voice bubbles fall back to text-only; desktop playback and Discord attachments work fully.
First-run setup
- Provider region tabs. The first-run model picker now filters providers by 国内 / 海外 / 本地 segments (defaults to your UI language's region; the selected provider stays pinned across tabs), with first-success providers ordered up top.
- Friendlier chat errors. A failed chat send now shows actionable, localized advice ("check the API key in Settings → Model") instead of raw provider/network errors; secrets and file paths are scrubbed from anything user-visible.
Security
- Webhook hardening. The local notification webhook (127.0.0.1) now uses constant-time token comparison, rate-limits failed auth attempts (no localhost exemption — browser pages can reach 127.0.0.1 too), and no longer sends CORS headers, so web-page JavaScript can't talk to it at all.
- Honest copy: FEATURES/READMEs no longer promise "bidirectional messaging" beyond what ships; the docs now describe exactly what the bridge does.
Under the hood
- Protocol-level integration tests for the Telegram gateway against a mock Bot API server (long-poll, offset bookkeeping, multipart voice upload, allowlist, reconnect semantics); the gateway no longer requires an Electron runtime to load.
- Research docs added under
docs/: bridge survey + upgrade plan, auto-update survey, OpenClaw/Hermes comparison, competitor landscape.
Known issues
- The bridge has not been validated against live Telegram/Discord servers yet — protocol behaviour is covered by the mock-server suite, but real-network behaviour (TLS, proxies, Telegram-side validation, STT quality on real voice notes) is exactly what this beta's validation window is for.
- Local TTS outputs WAV, so Telegram voice-note replies require a cloud TTS provider (mp3/ogg/m4a) for now.
- Discord inbound voice messages are not transcribed yet (Telegram only).
- Carried over from v0.3.3: Screen Recording permission quirks on the unsigned macOS build; ~291 unused i18n keys pending cleanup.
Notes & limitations
- Unsigned distribution (macOS arm64). First launch needs the usual right-click → Open; granting Microphone / Screen Recording follows the in-app prompts. Unchanged in
v0.3.4. - This is a pre-release: download manually from GitHub Releases for validation. Stable users are not auto-upgraded.
v0.3.3
Nexus v0.3.3
Stable — maintenance & polish. Promotion of
v0.3.3-beta.1after its validation window; cumulative changes on top ofv0.3.2. A reliability, behaviour-polish, and slimming release. It makes imported character cards actually drive chat, adds a cloud→local voice-recognition fallback, fixes a cluster of voice/notification/persona bugs, changes a couple of pet defaults for the better, and removes ~2,500 lines of dead/dormant code. No major new feature surface — the bigger autonomy work is tracked separately for v0.4. Stable and beta users auto-upgrade on next launch.
What changes for users
Desktop pet
- Default pet renamed to “Pip.” The bundled sample sprite pet (previously shown as “Terminal Pet”) is now Pip, and its description makes clear it’s a sample/test pet demonstrating the sprite-pet system — still a fine default to start from.
- Pets now show their scene backdrop by default. Sprite pets used to default to free-roam mode (transparent background, character only). They now default to fixed mode with the time-of-day backdrop. The transparent “roam the whole desktop” mode is now opt-in — toggle it from the new setting (Settings → pet) or the pet’s right-click menu. (If you previously relied on the transparent default, just switch the toggle on.) Pets you had explicitly set are unaffected.
- A new in-app free/fixed toggle for sprite pets (previously only available on the right-click menu).
- The “spawn clone (分身)” feature was removed. The right-click options to spawn/dismiss extra roaming pet windows are gone; the single companion is unaffected.
- Hidden pets no longer burn CPU/battery — locomotion is paused while the window is hidden.
Voice
- Cloud→local speech-recognition fallback. When cloud transcription fails and you’ve enabled failover, Nexus now falls back to the fully-offline local SenseVoice model for that utterance (continuous/VAD path).
- A long continuous utterance no longer gets silently dropped (and no longer leaves voice stuck) — it’s flushed and transcribed.
- Barge-in no longer mistakes the assistant’s own tail audio for new user speech.
Persona & character cards
- Imported Character Cards can now drive chat. Previously an imported card only shaped the autonomy/letters surface; the chat replies still used the global persona. With the new per-profile-persona setting enabled, the active card’s soul/personality drives chat too.
- An imported card no longer leaks a
[Character card: …]placeholder into the prompt — the real assembled persona is used. - Live2D models now keep their authored
surprised/confused/embarrassedexpressions (they were being silently dropped). Added docs on the Live2D auto-discovery naming/order conventions.
Notifications
- Chinese urgency keywords (立即 / 紧急 / 重要 / 立刻) are now correctly prioritized — they were always being downgraded to normal priority.
Reliability fixes
- Chat requests now retry once on a transient
429/5xxbefore surfacing a failure (helps under provider rate-limits). - SSRF redirect-following is now revalidated per hop on the chat/voice connection-test and model/voice-list probes.
- Fixed a regression where the panel-sent always-on-top / click-through toggles silently no-op’d.
- Fixed timezone-dependent flakiness in the usage/cost history.
Under the hood
- ~2,500 lines of dead/dormant code removed: orphaned test-only modules and barrels, the dormant realtime-voice backend (gated behind an off-by-default flag), the unused agent-workspace fs-tools stack, a dead inter-plugin delivery path, and duplicate/stub files.
- Dropped the unused
protobufjsdependency.
Known issues
- Screen Recording permission on the unsigned build. Because the app isn’t code-signed, macOS TCC may not list Nexus under System Settings → Privacy → Screen Recording until it actually requests capture. The default-off “desktop awareness” (screen OCR) is the only thing that requests it; turn that on (or use right-click → Open + remove the quarantine attribute) to get the prompt. Microphone behaves the same. Deferred to a future signed build.
- Deferred internal cleanup (no user impact): ~291 unused i18n keys and a small tail of dead exports are not yet pruned; planned for a follow-up.
Notes & limitations
- Unsigned distribution (macOS arm64). First launch needs the usual right-click → Open; granting Microphone / Screen Recording follows the in-app prompts. Unchanged in
v0.3.3. - The “Codex pet” gallery/import/creator feature keeps its name — it integrates with the external
codex-pet.org/CodexPets.netcommunity ecosystem and is not Nexus-branded. - Identical content to
v0.3.3-beta.1— no code changes between the beta and this stable tag. The larger messaging-bridge work that landed after the beta cut ships separately in thev0.3.4beta line.