Download Latest Version nanoMuse-Desktop-1.0.9-win-x64.exe (281.8 MB)
Home / v1.0.8
Name Modified Size InfoDownloads / Week
Parent folder
nanoMuse-Desktop-1.0.8-win-x64.exe.blockmap 2026-10-29 292.5 kB
nanoMuse-Desktop-1.0.8-win-x64.exe 2026-10-29 281.8 MB
nanoMuse-Desktop-1.0.8-mac-x64.zip 2026-10-29 350.1 MB
nanoMuse-Desktop-1.0.8-mac-x64.dmg 2026-10-29 473.7 MB
latest.yml 2026-10-29 365 Bytes
nanoMuse-Desktop-1.0.8-linux-x64.AppImage 2026-10-29 323.5 MB
nanoMuse-Desktop-1.0.8-linux-x64.deb 2026-10-29 251.8 MB
nanoMuse-Desktop-1.0.8-linux-x64.tar.gz 2026-10-29 302.5 MB
nanoMuse-Desktop-1.0.8-mac-arm64.dmg 2026-10-29 499.6 MB
nanoMuse-Desktop-1.0.8-mac-arm64.zip 2026-10-29 334.1 MB
SHA256SUMS-desktop.txt 2026-10-29 1.0 kB
dsh-nanomuse-1.0.8.tgz 2026-10-29 2.8 MB
SHA256SUMS-harness.txt 2026-10-29 89 Bytes
nanoMuse-1.0.8-arm64.apk 2026-10-29 39.5 MB
nanoMuse-1.0.8-arm64.apk.sha256 2026-10-29 91 Bytes
nanoMuse 1.0.8 _ Crew source code.tar.gz 2026-10-29 54.2 MB
nanoMuse 1.0.8 _ Crew source code.zip 2026-10-29 56.6 MB
README.md 2026-10-29 93.3 kB
Totals: 18 Items   3.0 GB 0

nanoMuse 1.0.8 · Crew

🐉 nanoMuse 1.0.8 “Crew”: four days after Logbook, your devices keep each other posted. A scheduled task on the computer that needs a yes asks on your phone; every device reads the step another is on and says when it is waiting for you; the wait before a first token is spoken of, with your place in the queue; a thumb on a reply or the reason for a Stop goes to the account's record as one word, and the operator reads the record question by question. The phone no longer crashes when you stop talking, the iPhone no longer stops your music, the desktop's Library takes documents of your own, and the runtime behaves on Windows.

1.0.7 went out on 2026-10-25. Since then seventy-two pull requests were merged, and this version is the fifth look at the whole project, with one change at its centre: the devices keep each other posted. Until now a task that ran on one device was a closed box to the others: the phone saw Mac is working… until the reply came, a scheduled task on the computer that hit a step needing a yes waited for someone at the keyboard, and a person at the back of the relay's queue saw the typing dots and nothing else. Now a scheduled run on nanoMuse Desktop sends its permission card to the account's phones, payment steps included, with Allow once, Always in this task and Deny; the first answer on the computer or on any phone decides and the other cards close, and the grant stays on the computer (#652, #672 by @cutey-none, with the grants per chat and per task of #642). Every tool call tells the relay the step, in the model's own words when it gave them, so the line under another device's prompt reads Pixel 8 is working: 打开携程网站 and Pixel 8 is waiting for you while a card holds its run (#617 by @z1010223zero-pixel, #635, for #610). The relay tells a streamed turn where it stands while it waits for a provider slot and keeps the line alive while the provider thinks, and the apps draw the wait under the typing dots: The model is busy, 15 s so far with Cancel, or 3 ahead of you; the phones also compact a conversation at 32k tokens instead of 108k and carry about an eighth less in every call, since the time to the first token grew with the prompt (#626). Around the record that 1.0.7 opened: every call says who started it (a person, a scheduled task, the feed, a goal's check, another device) and where it sits in the conversation, a turn on a key of your own joins the training view when Help improve is on, what happened around a turn reaches the relay as codes and never as words (what the Sentinel decided, how an approval went, why a reply was stopped, a thumb up or down), and the operator's console counts the record by questions rather than calls and lays each question out once (#653, #654, #655, #660, #661, #662, #663); its figures read an index instead of every body, which on the hosted relay's 30 GB turned half a minute into a third of a second (#680, #681). The rest is what a check and the people using it found. @Yicheng-Mark made the runtime at home on Windows: a private file stays its owner's, a config.toml Notepad or PowerShell wrote is read, a file is written with the lines the model gave it and read the way a command's output is read, a listing says when it was cut, the ChatGPT token refresh is locked, and the mirror scripts, the web's and the console's line endings and the catalogue check hold there too (#625, #630, #633, #644, #645, #646, #658, #656, #632, #669, #608, #623); web_fetch reads compressed pages again (#649, #641). @z1010223zero-pixel made the web console's send disc stop a run and its naming chooser take a typed name (#615, #613) and the Feed say what it dropped (#639); @ZxlDragonDoctor made it explain its daily limit (#584); @yatping gave a folded thinking row its width back and the iPhone its whole Traditional Chinese (#684, #671); @cutey-none kept the iPhone from pausing another app's music (#690); @Felixkw12, @bayuh85 and @DennyHo0917 put Opper, AtmoRouter and API Route in the own-key catalogue (#648, #688, #603) and @ilya-bogin-keenable Keenable in the web search (#665); @jtboy80826 found the relay misreading a Gemini-shaped error (#611); @Longfellow1 turned the goals' recovery cases into one rule-based check (#634, #682); @cugbtang covered the session's last turn and the calendar's line folding (#675, #694). On Android, voice input through a provider's speech model no longer crashes the app when you stop talking (#627, #602), a failed feed run no longer writes yesterday's posts again (#650), the face and its clips can be saved to the gallery (#667) and a video model you added by hand shows in the picker (#666); on the desktop, the Library takes a blank document or Markdown files of your own (#692) and an embedding of the runtime can bring its own browser (#678). Nothing moves for a person upgrading: the Android package installs over 1.0.7 and keeps everything, the desktop keeps its settings and re-points its nanoMuse Cloud provider row on the first start, and a 1.0.7 client works against the relay (0.31.0); what is new is what the devices tell each other and the record, and the privacy policy says so in the same words.

Highlights

  • A scheduled task's cards reach your phone, and the first answer decides. A scheduled run on nanoMuse Desktop asks while nobody may be at the computer. With a relay that takes pushed events (0.31), its permission cards also go to the account's Android and iPhone apps, payment steps included: the phone shows Allow once, Always in this task and Deny (a notification in the background), the first answer on the computer or on any phone decides, the other cards close, and the grant is kept on the computer. Behind it the hub takes an event without an id, to one device or to "*", and passes it only to devices whose hello announces approve.any, never back to the sender; only the approval and approval_result stages pass, 30 a minute per device, 16 KB each; welcome.server.features lists event_push so a client knows it may push, and older relays and apps are untouched (#652, #672, #631). On the desktop a step of the hands can be allowed for good in one chat, in one app or in one scheduled task, and Settings → Permissions, the Computer use page and the agent page say where each grant holds (#642).
  • Every device reads what the others are doing. A turn used to tell the account's other devices only that it started and that it ended. Now every tool call posts the step (the model's own words when it gave them, else the command, the path or the query), a card that waits for you posts waiting for you, and the model writing its answer posts plain working, at most once every two seconds per chat and nothing after the turn ends: POST /v1/sync/working takes state (working | waiting) and detail (160 characters at most), kept in memory with the same ten-minute TTL, and rides them on the hub working frame (0.31). The line under another device's prompt reads Pixel 8 is working: 打开携程网站 or Pixel 8 is waiting for you on Android, the iPhone, the desktop and the web console, and plain is working… from a device on an older version (#617, #635, #610).
  • The wait before the first token is spoken of, and the prompts are smaller. The relay lets twelve requests reach the model at once and held the rest in silence. A streamed turn now hears where it stands: a chunk with no choices and nanomuse: {phase: "queued", ahead, waited_ms} every five seconds while it waits, phase: "working" when the slot is its own, and an SSE comment line every ten seconds while the provider is quiet before its first bytes; both are shapes every shipped client already skips, the slots go in arrival order, and a request that gives up while queued leaves no hole. Under the typing dots the phones draw nothing for ten seconds, then The model is busy, 15 s so far with Cancel, or 3 ahead of you and You are next as soon as the relay says so; the desktop says how long. Over the hosted model's last week the time to the first token grew with the prompt (4.7 s at the median under 12k tokens, 25 s between 24k and 40k, 54 s above, with 38 % of calls over 16k), so the phones compact a conversation at 32k tokens now on every window from 64k up, move old big tool results to disk from 28k, and word the two fattest parts of the baseline densely, about 5k characters less per call; the desktop holds the hands' screenshots to 2 MiB, the newest four to eight, where 5 MiB let a turn carry up to 23. The iPhone waits 300 seconds for a relay stream before it sends the turn again, as the desktop does (#626, #609).
  • The record says who started each call, and what you thought of the reply. Every chat request and every own-key turn sent up carries who started it (X-NanoMuse-Run: a person, a scheduled task, the feed's routine, a goal's check, another device through the hub, the memory tidy-up), its turn and step in the conversation, the hands' run and step while a screen is operated, and X-NanoMuse-Platform; the relay keeps them in the record's row, the kept turn's meta, the call's telemetry row and the training view's shape, and notes one word for the script of what the person wrote. A turn on a key of your own joins the training view when Help improve is on, in the same shape as a Cloud turn's, never the system prompt and never what a tool returned. Under the newest reply on Android, the iPhone, the desktop and the web console sit a thumb up and a thumb down; a thumb down opens five one-word reasons and Skip; right after Stop one card asks Why did you stop it?. Each answer, and what the Sentinel decided about a tool call, how an approval went, how a step of the hands went, reaches the relay through POST /v1/events as codes and numbers tied to the turn's id, never a message; the relay drops any value that looks like prose and deletes them with the kept turns and with the account. Deleting kept data or the account writes the account's export pseudonym to a ledger (GET /v1/admin/deletions), so a training set built from an earlier export drops those subjects (#653, #654, #655, #660, #661, #662).
  • The operator reads the record question by question, and the figures read an index. One message often takes the agent several model calls, and the record counted each as a turn; each row now says whether it opened a question and which row did, older rows get theirs from a backfill, and GET /v1/admin/record and /v1/admin/data count questions beside calls everywhere, with how many calls each took. A new Question by question page (GET /v1/admin/record/turns) lays each question out once: the person's message with its pictures inline, a step per model call with the tools it called, what came back before the next call with every screenshot where it was sent, the final reply marked, the whole call one click away; an account's Kept turns tab links to it. The figures read a covering index of the record (turns_figures, built at the first start after the upgrade) instead of walking every request body, the backfill goes a hundred rows a page and pauses after each page for as long as it took, and the question page fetches its calls by the key index on the read-only connection, so an open page no longer stalls the relay; the Usage page says how much of the prompts the provider's cache served (#663, #680, #681, #620, #677).
  • The runtime, on Windows and elsewhere. A private file (the settings, the vault, the channel tokens, the ChatGPT token, the calendar and contacts caches) stays its owner's alone on Windows, where chmod cleared nothing but a read-only flag; a config.toml Notepad saved with a byte-order mark or PowerShell wrote as UTF-16 is read instead of stopping every command; a file is written with the lines the model gave it and read the way a command's output is read (a byte-order mark decides, then UTF-8, then the console's code page), and a command's output on a Chinese console reaches the model readable; a listing or a search says when it stopped early; the ChatGPT token refresh is locked on Windows too, so two chats no longer spend the same refresh token, all by @Yicheng-Mark (#625, #630, #633, #644, #645, #646, #658). web_fetch reads compressed pages once instead of failing on every gzip response (#649, #641); a program that embeds the runtime can give the Browser tool a backend_factory and drive, show and take over its own browser with the Sentinel in front of every URL (#678, #676); POST /api/threads/{id}/feedback takes a thumb or a stop reason. The own-key catalogue has twenty-five providers with Opper (EU-hosted, 700+ models at the providers' rates) by @Felixkw12, AtmoRouter (route-prefixed ids, cc/claude-sonnet-4-6 by default) by @bayuh85 and API Route (gpt-6.1-sol by default) by @DennyHo0917 (#648, #688, #603, #647, #687, #564); Keenable answers web searches with or without a key, 1,000 an hour per address without, by @ilya-bogin-keenable (#665, #643); DuckDuckGo stays the default.
  • The web console and the desktop. The composer's send disc becomes a stop disc while the agent works and the naming chooser takes a typed name, both by @z1010223zero-pixel (#615, #613). On the desktop the Library has, beside Create document, a menu with Blank document (an empty Untitled.md in the Library folder, opened in the editor) and Import Markdown files… (.md, .markdown and .txt copied into the folder and listed under Documents; a taken name gets a number, a file over 2 MB or of another kind is named as skipped; no model involved) (#692, #689); a folded Thinking row shows its title and summary again instead of an empty grey pill, by @yatping (#684, #683); the first start after an in-app update on Windows waits out the installer's hold on the profile's plugin link instead of failing with ENOTEMPTY, by @Yicheng-Mark (#623, #618); every model call goes through a loopback door of the plugin's own that adds the provenance headers and forwards only with the account's key; a refused sign-in is explained in the app's language.
  • Android. Voice input through a provider's speech model no longer crashes the app the moment a take falls silent: the engine stopped the microphone from inside the voice detector's own callback while the detector freed its native object; the fix is upstream OpenMinis 1.14's ReentrantSafeRelease, carried over with its tests (#627, #602). A scheduled feed run that failed used to write yesterday's posts again under today's date; a turn's reply now counts only when it follows the turn's own prompt, a draft already posted in the last 30 days is dropped, and the Feed says when its 12 posts a day are full (#650, #639 by @z1010223zero-pixel, #584 by @ZxlDragonDoctor, #637, #574). A model call from the sandbox is retried after a transport blip as the chat's are (#640); the avatar workbench's menu has Save to gallery for the base picture, the mood stills, the candidates and your own clips (#667, #664); a video model you list on a provider yourself shows in the picker and the remembered answer is checked again when the candidates change (#666, #508). The phone takes part in everything above: the computer's cards, the step line, the wait line, the thumbs, the provenance and the events, in every language the app has.
  • The iPhone. Opening the app no longer stops music playing in another app: the avatar's muted clip still started the audio session in iOS's default category, which does not mix, so the session is put in .ambient before a clip plays and goes back to it after a reply is read aloud, by @cutey-none (#690, #686); 403 strings that had only a Simplified Chinese value read in Traditional Chinese now, by @yatping (#671); a slow answer through nanoMuse Cloud is waited for up to 300 seconds instead of being sent again at 120. The iPhone takes part in the computer's cards, the step line, the wait line, the thumbs, the provenance and the events, in all nine languages.
  • The relay, in detail. A provider's 400 reaches the app in the provider's words when the body is a list, as Gemini's OpenAI-compatible endpoint sends it, from @jtboy80826 (#611); a number the carrier has already sent enough codes to hears 429 code_too_often, not "the relay failed"; the hub logs a refused socket; self-host.sh --local --bind 0.0.0.0 writes the machine's LAN address into PUBLIC_BASE, the invitation link and the URLs it prints, after @cugbtang's #673 (#674); the hosted relay's backup can go off the box, encrypted to an age public key, into a COS bucket under a write-only key (#621); a console build on Windows no longer rewrites its HTML for nothing, by @Yicheng-Mark (#669).
  • The project. The goals' 43 recovery cases are one rule-based safety check, by @Longfellow1 (#634, #682); the session's last turn and a long Chinese line's folding in an .ics file have tests, by @cugbtang (#675, #694); the mirror scripts, the zip check and the provenance wire's tests hold on Windows, by @Yicheng-Mark (#656, #657, #659); an iOS · Beta group workflow hands a TestFlight build to the external group and submits it for Apple's beta review (#619, #622); the harness bundle workflow builds a branch once.
  • TestFlight. Build 30 (1.0.7) was uploaded on 2026-10-25 and handed to the external group nanoMuse Beta for Apple's beta review; 1.0.8 goes up as build 31 and goes to the same group and review. A build reaches the public link once its review has passed, the internal testers before that.

Upgrade Notes

  • Android installs over 1.0.7 and keeps your data. nanoMuse-1.0.8-arm64.apk (Android 8.0+, arm64; versionCode 51) is signed with the same key as every version before it. Verify with sha256sum -c nanoMuse-1.0.8-arm64.apk.sha256. Nothing to set: the computer's cards, the step line under another device's prompt and the wait line under the typing dots appear on their own; the thumbs sit under the newest reply.
  • iPhone and iPad come through TestFlight. Build 31 (1.0.8) is handed to the external group when it is uploaded and reaches the public link once its review has passed, the internal testers before that; until then the link installs the newest build that passed.
  • The desktop installers are built by CI from the tag v1.0.8. The Mac packages are not notarized: the first time, open the app from System Settings → Privacy & Security → Open Anyway (or right-click → Open). The Windows package is not signed: click More info and Run anyway once. On Linux prefer the .deb; the AppImage needs FUSE (--appimage-extract-and-run without). They arrive a little after the APK, and SHA256SUMS-desktop.txt lists every checksum. A 1.0.7 desktop on Windows downloads this version in the background on an unmetered network, offers it in the corner menu and installs it on a real quit. Your settings stay where they were; on the first start the app re-points its nanoMuse Cloud provider row at a loopback door inside the plugin (http://127.0.0.1:<port>/v1), which forwards to the relay with the account's key, and rewrites the row's picture bound to 2 MiB. A scheduled task's cards reach the phones only once the phones are on 1.0.8 too.
  • The relay is 0.31.0; a 1.0.7 client works against it unchanged. For a person: the queue and wait lines, the step line and the computer's cards on the phone need both sides on this version; everything else is as before. For operators: the first start after the upgrade builds an index of the record (turns_figures) and holds the relay until it is done, about five minutes on the hosted relay's 30 GB, and a backfill then keys older rows in the background, a hundred rows a page, pausing after each page for as long as it took, about an hour for a hundred thousand calls. New since 0.30: POST /v1/events and the Data controls figures, GET /v1/admin/record/turns and /v1/admin/turns/{id}, GET /v1/admin/client-events with its export and summary, GET /v1/admin/deletions, the nanomuse field on queued chunks and the SSE comments, the hub's pushed event and event_push in welcome.server.features, state and detail on POST /v1/sync/working, calls.cached_tokens and turns.cached_tokens and the Usage page's cache figures, 429 code_too_often for the carrier's own limit, and an optional cos.env for the backup off the box. No new setting is required. docs/cloud.md (github.com), docs/hub.md (github.com), docs/self-hosting.md (github.com) and cloud/README.md (github.com) have the details.
  • The runtime's settings are the same. provider = "keenable" under [connectors.search] (or Connections → Web search) picks Keenable; Browser(backend_factory=…) is for a program that embeds the runtime. A private file the runtime writes on Windows gets an ACL for the one account on the next write. Nothing else in config.toml changes.
  • Where to get it.
Browser demo.nanomuse.dev, a nanoMuse on a simulated phone, after a sign-in; a demo, the apps below are the real thing
Android 8.0+, arm64 nanoMuse-1.0.8-arm64.apk
iPhone, iPad TestFlight, a beta that goes through Apple's review; build 31 (1.0.8) once its review has passed
Windows 10+ nanoMuse-Desktop-1.0.8-win-x64.exe (the desktop app, on DeepSeek Harness; not signed)
macOS 12+ nanoMuse-Desktop-1.0.8-mac-arm64.dmg / -mac-x64.dmg (or the .zip: unzip, drag to Applications; not notarized)
Linux x64 nanoMuse-Desktop-1.0.8-linux-x64.deb (preferred) / .AppImage (needs FUSE; --appimage-extract-and-run without) / .tar.gz (unpack anywhere, run ./nanomuse-desktop)
DeepSeek Harness Desktop you already run dsh-nanomuse-1.0.8.tgz, dsh plugin --profile desktop add … (how)
Docker ghcr.io/nano-muse/nanomuse:1.0.8 (also :latest), the runtime with the web console on port 8787
Your own relay bash scripts/self-host.sh, docs/self-hosting.md (github.com)

In our measurements GitHub's own downloads are quick from China as well; if they fail where you are, the same files are on nanomuse.cn/dl/v1.0.8/ within fifteen minutes.

Community

nanoMuse is open source, free and non-profit. Sign in with a phone number or an e-mail and you get a starting allowance; the developer pays for it. The account page shows what is left and how to add more. When it is gone, use your own key or a plan you already pay for (how); the key you add can take over the chat and the screen, and pictures and clips are its from the start; the account can be switched off as a model source while you keep it for sync and your devices. With an account, nanoMuse Cloud keeps the record of your conversations with its models and the turns your own key answered, and from this version the apps also tell it, as codes and never as words, what was decided around each turn and what you thought of a reply; your devices and the person running the relay can read it, nobody else; one tap under Data controls deletes it, and nothing is sold (privacy policy); delete the account whenever you want. The same relay runs on a server of yours: docs/self-hosting.md (github.com).

Thanks to @cutey-none for the pushed cards, the grants per chat and task and the iPhone's music (#652, #672, #642, #690), to @Yicheng-Mark for the runtime on Windows and the desktop's update start (#625, #630, #633, #644, #645, #646, #658, #623, #607, #608, #624, #632, #656, #657, #659, #669), to @z1010223zero-pixel for the step in the presence, the stop disc, the typed name and the Feed's drops (#617, #615, #613, #639), to @yatping for the thinking row and the Traditional Chinese (#684, #671), to @ZxlDragonDoctor for the Feed's limit (#584), to @Felixkw12, @bayuh85 and @DennyHo0917 for Opper, AtmoRouter and API Route (#648, #688, #603), to @ilya-bogin-keenable for Keenable (#665), to @jtboy80826 for the Gemini-shaped error (#611), to @Longfellow1 for the goals' recovery check (#634, #682), to @cugbtang for the session and calendar tests and the LAN-bind report (#675, #694, #673), and to everyone who reported #508, #564, #574, #602, #610, #618, #631, #637, #640, #641, #643, #647, #664, #676, #683, #686, #687 and #689. The roadmap says where help is wanted, and docs/parity.md (github.com) says what each client has. Open an issue · send a pull request · Discussions · Discord · star the repo; if it is useful to you, a star helps others find it.

Based on OpenMinis 1.13 (GPL-3.0), modified since 2026-09-24. The complete corresponding source of this build is tag v1.0.8 plus the android/deps/proot submodule (nano-muse/proot); the desktop installers and the Docker image are built by CI from the same tag. The whole repository is GPL-3.0-or-later. nanoMuse Desktop carries DeepSeek Harness unmodified, with its licence files inside; harness in the name is the word, not DeepSeek's. The chat apps follow nanobot's design (MIT); the desktop's operator is ported from UI-TARS-desktop (Apache-2.0; THIRD_PARTY_NOTICES.md). nanoMuse is not affiliated with Meta; Muse is a trademark of Meta Platforms, Inc. The desktop follows what Muse's app looks like and does, written down from using it; none of Meta's assets, code or content is in it.

What's Changed

New Contributors

Contributors

@bayuh85 · @cugbtang · @cutey-none · @DennyHo0917 · @Felixkw12 · @ilya-bogin-keenable · @jtboy80826 · @lgy0404 · @Longfellow1 · @yatping · @Yicheng-Mark · @z1010223zero-pixel · @ZxlDragonDoctor

And the bots: @dependabot, @github-actions.

Full Changelog: https://github.com/nano-muse/nanoMuse/compare/v1.0.7...v1.0.8

简体中文 🐉 **nanoMuse `1.0.8`「Crew」**:Logbook 之后四天,你的几台设备开始互通消息。电脑上的定时任务碰到要你点头的一步,会到手机上来问;每台设备都能看到另一台走到了哪一步、什么时候在等你;第一个字出来之前会说排在第几位;对回答点的赞或踩、按停止的原因,以一个词进入账号的记录,运营者按问题逐条看记录。手机停止说话不再闪退,iPhone 不再打断你的音乐,桌面端资源库能放你自己的文档,运行时在 Windows 上也规矩了。 1.0.7 在 2026-10-25 发布。之后合进来七十二个 PR,这个版本是对整个项目的第五次通读,中心只有一件事:**几台设备互通消息**。在此之前,一台设备上跑的任务对其他设备是个黑盒:手机上只看得到「Mac 正在工作…」直到回答出来,电脑上的定时任务碰到要点头的一步就等着有人坐到键盘前,排在中继队尾的人看到的是打字的点点,别的什么都没有。现在 nanoMuse [桌面端的定时运行会把它的权限卡片发到账号下的手机上,付款步骤也包括,手机上是「允许一次」「在这个任务里始终允许」「拒绝」;电脑或任何一部手机上先答的算数,其他卡片关掉,授权留在电脑上([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[#672](https://github.com/桌面端的定时运行会把它的权限卡片发到账号下的手机上,付款步骤也包括,手机上是「允许一次」「在这个任务里始终允许」「拒绝」;电脑或任何一部手机上先答的算数,其他卡片关掉,授权留在电脑上([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[/issues/672)](https://github.com/nano-muse/nanoMuse/pull/672),@cutey-none 做的,连同 [#642](https://github.com/nano-muse/nanoMuse/pull/642) 的按对话、按任务授权)。每次工具调用都把这一步告诉中继,模型自己说了就用它的原话,所以另一台设备的提示下面那行读起来是「Pixel 8 正在工作:打开携程网站」,卡片卡住运行时是「Pixel 8 在等你」([#617](https://github.com/nano-muse/nanoMuse/pull/617),@z1010223zero-pixel 做的;[#635](https://github.com/nano-muse/nanoMuse/pull/635);对应 [#610](https://github.com/nano-muse/nanoMuse/issues/610))。中继在一轮流式回答等服务商位子的时候告诉它排在哪,服务商在想的时候让连接保持活着,App 把这段等待画在打字的点点下面:「模型比较忙,已等待 15 秒」和「取消」,或者「前面还有 3 个」;手机还把对话压缩的阈值从 108k 降到 32k,每次调用少带大约八分之一的内容,因为到第一个字的时间是随提示词长度涨的([#626](https://github.com/nano-muse/nanoMuse/pull/626))。围绕 1.0.7 开始的记录:每次调用都说明是谁发起的(人、定时任务、动态、目标检查、另一台设备)和它在对话里的位置,开着「帮助改进」时用自己 key 跑的一轮也进入训练视图,一轮前后发生的事以代码而不是文字到达中继(Sentinel [怎么判的、审批怎么答的、为什么停、点赞还是踩),运营者控制台按问题而不是按调用计数,每个问题只铺开一次([#653](https://github.com/nano-muse/nanoMuse/pull/653)、[#654](https://github.com/nano-muse/nanoMuse/pull/654)、[#655](https://github.com/nano-muse/nanoMuse/pull/655)、[#660](https://github.com/nano-muse/nanoMuse/pull/660)、[#661](https://github.com/nano-muse/nanoMuse/pull/661)、[#662](https://github.com/nano-muse/nanoMuse/pull/662)、[#663](https://github.com/怎么判的、审批怎么答的、为什么停、点赞还是踩),运营者控制台按问题而不是按调用计数,每个问题只铺开一次([#653](https://github.com/nano-muse/nanoMuse/pull/653)、[#654](https://github.com/nano-muse/nanoMuse/pull/654)、[#655](https://github.com/nano-muse/nanoMuse/pull/655)、[#660](https://github.com/nano-muse/nanoMuse/pull/660)、[#661](https://github.com/nano-muse/nanoMuse/pull/661)、[#662](https://github.com/nano-muse/nanoMuse/pull/662)、[/issues/663)](https://github.com/nano-muse/nanoMuse/pull/663));统计走索引而不是翻每一条正文,托管中继 30 GB [的记录上从半分钟变成零点三秒([#680](https://github.com/nano-muse/nanoMuse/pull/680)、[#681](https://github.com/的记录上从半分钟变成零点三秒([#680](https://github.com/nano-muse/nanoMuse/pull/680)、[/issues/681)](https://github.com/nano-muse/nanoMuse/pull/681))。剩下的是体检和用的人发现的。@Yicheng-Mark 让运行时在 Windows 上像在家一样:私密文件只属于主人,记事本或 PowerShell 写的 `config.toml` 读得了,文件按模型给的换行写、按命令输出的方式读,列表截断时会说,ChatGPT [令牌刷新加了锁,镜像脚本、网页和控制台的换行、目录检查在那边也都成立([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[#658](https://github.com/nano-muse/nanoMuse/pull/658)、[#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#632](https://github.com/nano-muse/nanoMuse/pull/632)、[#669](https://github.com/nano-muse/nanoMuse/pull/669)、[#608](https://github.com/nano-muse/nanoMuse/pull/608)、[#623](https://github.com/令牌刷新加了锁,镜像脚本、网页和控制台的换行、目录检查在那边也都成立([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[#658](https://github.com/nano-muse/nanoMuse/pull/658)、[#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#632](https://github.com/nano-muse/nanoMuse/pull/632)、[#669](https://github.com/nano-muse/nanoMuse/pull/669)、[#608](https://github.com/nano-muse/nanoMuse/pull/608)、[/issues/623)](https://github.com/nano-muse/nanoMuse/pull/623));`web_fetch` [又能读压缩网页了([#649](https://github.com/nano-muse/nanoMuse/pull/649)、[#641](https://github.com/又能读压缩网页了([#649](https://github.com/nano-muse/nanoMuse/pull/649)、[/issues/641)](https://github.com/nano-muse/nanoMuse/issues/641))。@z1010223zero-pixel [让网页控制台的发送键在跑的时候变成停止键、起名卡片能手输名字([#615](https://github.com/nano-muse/nanoMuse/pull/615)、[#613](https://github.com/nano-muse/nanoMuse/pull/613)),让动态页说出它丢了什么([#639](https://github.com/让网页控制台的发送键在跑的时候变成停止键、起名卡片能手输名字([#615](https://github.com/nano-muse/nanoMuse/pull/615)、[#613](https://github.com/nano-muse/nanoMuse/pull/613)),让动态页说出它丢了什么([/issues/639)](https://github.com/nano-muse/nanoMuse/pull/639));@ZxlDragonDoctor 让它解释每天的上限([#584](https://github.com/nano-muse/nanoMuse/pull/584));@yatping 把折叠的思考行的宽度找了回来,给 iPhone [补齐了繁體中文([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[#671](https://github.com/补齐了繁體中文([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[/issues/671)](https://github.com/nano-muse/nanoMuse/pull/671));@cutey-none 让 iPhone 不再暂停别的 App 的音乐([#690](https://github.com/nano-muse/nanoMuse/pull/690));@Felixkw12、@bayuh85、@DennyHo0917 把 Opper、AtmoRouter、API Route 加进了自有 key [目录([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[#603](https://github.com/目录([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[/issues/603)](https://github.com/nano-muse/nanoMuse/pull/603)),@ilya-bogin-keenable 把 Keenable 加进了网页搜索([#665](https://github.com/nano-muse/nanoMuse/pull/665));@jtboy80826 发现中继读错了 Gemini 形状的错误([#611](https://github.com/nano-muse/nanoMuse/pull/611));@Longfellow1 [把目标恢复用例收成了一条规则检查([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[#682](https://github.com/把目标恢复用例收成了一条规则检查([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[/issues/682)](https://github.com/nano-muse/nanoMuse/pull/682));@cugbtang [给会话的最后一轮和日历的折行补了测试([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[#694](https://github.com/给会话的最后一轮和日历的折行补了测试([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[/issues/694)](https://github.com/nano-muse/nanoMuse/pull/694))。Android [上,走服务商语音模型的语音输入在你停下说话时不再闪退([#627](https://github.com/nano-muse/nanoMuse/pull/627)、[#602](https://github.com/nano-muse/nanoMuse/issues/602)),失败的动态运行不再把昨天的帖子再写一遍([#650](https://github.com/nano-muse/nanoMuse/pull/650)),脸和短片能存到相册([#667](https://github.com/nano-muse/nanoMuse/pull/667)),自己手动加的视频模型会出现在选择器里([#666](https://github.com/上,走服务商语音模型的语音输入在你停下说话时不再闪退([#627](https://github.com/nano-muse/nanoMuse/pull/627)、[#602](https://github.com/nano-muse/nanoMuse/issues/602)),失败的动态运行不再把昨天的帖子再写一遍([#650](https://github.com/nano-muse/nanoMuse/pull/650)),脸和短片能存到相册([#667](https://github.com/nano-muse/nanoMuse/pull/667)),自己手动加的视频模型会出现在选择器里([/issues/666)](https://github.com/nano-muse/nanoMuse/pull/666));桌面端的资源库能新建空白文档或导入你自己的 Markdown [文件([#692](https://github.com/nano-muse/nanoMuse/pull/692)),嵌入运行时的程序可以自带浏览器([#678](https://github.com/文件([#692](https://github.com/nano-muse/nanoMuse/pull/692)),嵌入运行时的程序可以自带浏览器([/issues/678)](https://github.com/nano-muse/nanoMuse/pull/678))。升级的人什么都不用动:Android 安装包覆盖 1.0.7 并保留一切,桌面端保留设置、第一次启动时把「nanoMuse Cloud」那行服务商重新指一下,1.0.7 的客户端对着中继(0.31.0)照常工作;新的是设备之间、设备和记录之间互相说的话,隐私政策用同样的话说明了。 ### 亮点 - **定时任务的卡片到手机上来,谁先答算谁的。** nanoMuse 桌面端的定时运行会在没人守着电脑的时候问问题。中继接受推送事件(0.31)之后,它的权限卡片也会发到账号下的 Android 和 iPhone 上,付款步骤也包括:手机上显示「允许一次」「在这个任务里始终允许」「拒绝」(后台时是一条通知),电脑或任何一部手机上先答的算数,其他卡片关掉,授权留在电脑上。背后是 hub 接受一个不带 `id` 的 `event`,发给一台设备或 `"*"`,只转给 `hello` 里声明了 `approve.any` 的设备,从不发回发送方;只放行 `approval` 和 `approval_result` 两种,每台设备每分钟 30 条、每条最多 16 KB;`welcome.server.features` 里列出 `event_push`,客户端据此知道可以推,旧中继和旧 App [不受影响([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[#672](https://github.com/nano-muse/nanoMuse/pull/672)、[#631](https://github.com/不受影响([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[#672](https://github.com/nano-muse/nanoMuse/pull/672)、[/issues/631)](https://github.com/nano-muse/nanoMuse/issues/631))。桌面端上,动手操作屏幕的一步可以在一个对话里、一个应用里或一个定时任务里永久允许,「设置 → 权限」、电脑操作页和智能体页会说明每条授权在哪里生效([#642](https://github.com/nano-muse/nanoMuse/pull/642))。 - **每台设备都看得到其他设备在做什么。** 以前一轮对话只告诉账号的其他设备它开始了、结束了。现在每次工具调用都上报这一步(模型自己说了就用原话,否则是命令、路径或查询词),等你的卡片上报「在等你」,模型在写回答时上报普通的工作中,每个对话最多两秒一次,一轮结束后不再发:`POST /v1/sync/working` 接受 `state`(`working` | `waiting`)和 `detail`(最多 160 字符),和原来一样只在内存里留十分钟,随 hub 的 `working` 帧一起走(0.31)。另一台设备的提示下面那行在 Android、iPhone、桌面端和网页控制台上都读作「Pixel 8 正在工作:打开携程网站」或「Pixel 8 [在等你」,旧版本的设备还是普通的「正在工作…」([#617](https://github.com/nano-muse/nanoMuse/pull/617)、[#635](https://github.com/nano-muse/nanoMuse/pull/635)、[#610](https://github.com/在等你」,旧版本的设备还是普通的「正在工作…」([#617](https://github.com/nano-muse/nanoMuse/pull/617)、[#635](https://github.com/nano-muse/nanoMuse/pull/635)、[/issues/610)](https://github.com/nano-muse/nanoMuse/issues/610))。 - **第一个字出来之前的等待会被说出来,提示词也更小了。** 中继同时放十二个请求到模型那边,其余的原来只能默默等。现在一轮流式回答能听到自己排在哪:等位子时每五秒一个没有 `choices`、带 `nanomuse: {phase: "queued", ahead, waited_ms}` 字段的块,拿到位子时一个 `phase: "working"`,服务商吐出第一个字节之前每十秒一行 SSE 注释;这两种形状所有已发布的客户端本来就会跳过,位子按到达顺序发放,排队时放弃的请求不留空洞。打字的点点下面,手机十秒之内什么都不显示,之后是「模型比较忙,已等待 15 秒」和「取消」,中继说了就换成「前面还有 3 个」或「下一个就是你」;桌面端只说等了多久。托管模型最近一周里,到第一个字的时间随提示词涨(12k token 以下中位数 4.7 秒,24k 到 40k 是 25 秒,再往上 54 秒,38% 的调用超过 16k),所以手机现在在 64k 及以上的窗口都在 32k 处压缩对话,从 28k 起把旧的大工具结果挪到磁盘,并把基础提示词里最胖的两块改写得紧凑,每次调用少大约 5k 字符;桌面端把操作屏幕的截图限制在 2 MiB,也就是最新的四到八张,原来的 5 MiB 让一轮带到 23 张。iPhone 等中继的流等到 300 [秒才重发,和桌面端一样([#626](https://github.com/nano-muse/nanoMuse/pull/626)、[#609](https://github.com/秒才重发,和桌面端一样([#626](https://github.com/nano-muse/nanoMuse/pull/626)、[/issues/609)](https://github.com/nano-muse/nanoMuse/pull/609))。 - **记录里写着每次调用是谁发起的,以及你觉得回答怎么样。** 每次聊天请求和每条传上去的自有 key 轮次都带着发起者(`X-NanoMuse-Run`:人、定时任务、动态例程、目标检查、hub 上的另一台设备、记忆整理)、它在对话里的轮次和步骤、操作屏幕时的运行和步骤,以及 `X-NanoMuse-Platform`;中继把它们存在记录的行、留下的轮次的 meta、调用的遥测行和训练视图的形状里,并用一个词记下这个人写的是什么文字。开着「帮助改进」时,用自己 key 跑的一轮也进入训练视图,形状和 Cloud 轮次一样,从不包括系统提示词和工具返回的内容。Android、iPhone、桌面端和网页控制台最新回复的下面有一个赞和一个踩;踩会展开五个一个词的原因和「跳过」;按下停止之后一张卡片问「为什么停下?」。每个回答,连同 Sentinel 对工具调用的判定、审批的结果、操作屏幕每一步的结果,通过 `POST /v1/events` 以代码和数字到达中继,绑在那一轮的 id [上,从来不是一条消息;中继丢掉任何看起来像文字的值,并随留下的轮次、随账号一起删除。删掉留下的数据或账号时,账号的导出化名写进一本账(`GET /v1/admin/deletions`),早先导出的训练集下一次构建时据此去掉这些人([#653](https://github.com/nano-muse/nanoMuse/pull/653)、[#654](https://github.com/nano-muse/nanoMuse/pull/654)、[#655](https://github.com/nano-muse/nanoMuse/pull/655)、[#660](https://github.com/nano-muse/nanoMuse/pull/660)、[#661](https://github.com/nano-muse/nanoMuse/pull/661)、[#662](https://github.com/上,从来不是一条消息;中继丢掉任何看起来像文字的值,并随留下的轮次、随账号一起删除。删掉留下的数据或账号时,账号的导出化名写进一本账(`GET /v1/admin/deletions`),早先导出的训练集下一次构建时据此去掉这些人([#653](https://github.com/nano-muse/nanoMuse/pull/653)、[#654](https://github.com/nano-muse/nanoMuse/pull/654)、[#655](https://github.com/nano-muse/nanoMuse/pull/655)、[#660](https://github.com/nano-muse/nanoMuse/pull/660)、[#661](https://github.com/nano-muse/nanoMuse/pull/661)、[/issues/662)](https://github.com/nano-muse/nanoMuse/pull/662))。 - **运营者按问题逐条看记录,统计走索引。** 一条消息常常要智能体调用模型好几次,记录原来把每次调用都算一轮;现在每一行都写着它是不是开启了一个问题、属于哪个问题,旧行由回填补上,`GET /v1/admin/record` 和 `/v1/admin/data` [到处都在调用旁边数问题,还有每个问题花了几次调用。新的「逐问查看」页(`GET /v1/admin/record/turns`)把每个问题铺开一次:这个人的消息和它的图片、每次模型调用一步和它调用的工具、下一次调用之前回来的东西和每张截图在它被发送的位置、标出来的最终回复、一键看整次调用;账号的「留下的轮次」页链接到它。统计读记录的一个覆盖索引(`turns_figures`,升级后第一次启动时建立)而不是翻每一条请求正文,回填每页一百行、每页之后停和它花的时间一样久,逐问页用键索引在只读连接上取它的调用,打开一页不再卡住中继;「用量」页写着服务商的缓存服务了提示词的多少([#663](https://github.com/nano-muse/nanoMuse/pull/663)、[#680](https://github.com/nano-muse/nanoMuse/pull/680)、[#681](https://github.com/nano-muse/nanoMuse/pull/681)、[#620](https://github.com/nano-muse/nanoMuse/pull/620)、[#677](https://github.com/到处都在调用旁边数问题,还有每个问题花了几次调用。新的「逐问查看」页(`GET /v1/admin/record/turns`)把每个问题铺开一次:这个人的消息和它的图片、每次模型调用一步和它调用的工具、下一次调用之前回来的东西和每张截图在它被发送的位置、标出来的最终回复、一键看整次调用;账号的「留下的轮次」页链接到它。统计读记录的一个覆盖索引(`turns_figures`,升级后第一次启动时建立)而不是翻每一条请求正文,回填每页一百行、每页之后停和它花的时间一样久,逐问页用键索引在只读连接上取它的调用,打开一页不再卡住中继;「用量」页写着服务商的缓存服务了提示词的多少([#663](https://github.com/nano-muse/nanoMuse/pull/663)、[#680](https://github.com/nano-muse/nanoMuse/pull/680)、[#681](https://github.com/nano-muse/nanoMuse/pull/681)、[#620](https://github.com/nano-muse/nanoMuse/pull/620)、[/issues/677)](https://github.com/nano-muse/nanoMuse/pull/677))。 - **运行时,在 Windows 上和别处。** 私密文件(设置、保险库、渠道令牌、ChatGPT 令牌、日历和通讯录缓存)在 Windows 上也只属于主人,原来 `chmod` 在那里只清了个只读标记;记事本带 BOM 存的或 PowerShell 以 UTF-16 写的 `config.toml` 读得了,而不是让每条命令停在第一个字节;文件按模型给的换行写,按命令输出的方式读(BOM 优先,然后 UTF-8,然后控制台的代码页),中文控制台上的命令输出到模型那里是可读的;列表或搜索截断时会说;ChatGPT 令牌刷新在 Windows 上也加了锁,两个对话不再花掉同一个刷新令牌,都是 @Yicheng-Mark [做的([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[#658](https://github.com/做的([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[/issues/658)](https://github.com/nano-muse/nanoMuse/pull/658))。`web_fetch` 只解一次压缩,不再在每个 gzip [响应上失败([#649](https://github.com/nano-muse/nanoMuse/pull/649)、[#641](https://github.com/响应上失败([#649](https://github.com/nano-muse/nanoMuse/pull/649)、[/issues/641)](https://github.com/nano-muse/nanoMuse/issues/641));嵌入运行时的程序可以给 `Browser` 工具一个 `backend_factory`,用自己的浏览器,驱动、显示、接管都一样,每个 URL 前面都有 [Sentinel([#678](https://github.com/nano-muse/nanoMuse/pull/678)、[#676](https://github.com/Sentinel([#678](https://github.com/nano-muse/nanoMuse/pull/678)、[/issues/676)](https://github.com/nano-muse/nanoMuse/issues/676));`POST /api/threads/{id}/feedback` 接受赞踩或停止原因。自有 key 目录有二十五家服务商:@Felixkw12 加的 Opper(欧盟托管,700 多个模型按服务商原价)、@bayuh85 加的 AtmoRouter(模型 id 带线路前缀,默认 `cc/claude-sonnet-4-6`)、@DennyHo0917 加的 API Route(默认 <[inline_block>7)([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[#603](https://github.com/nano-muse/nanoMuse/pull/603)、[#647](https://github.com/nano-muse/nanoMuse/issues/647)、[#687](https://github.com/nano-muse/nanoMuse/issues/687)、[#564](https://github.com/inline_block>7)([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[#603](https://github.com/nano-muse/nanoMuse/pull/603)、[#647](https://github.com/nano-muse/nanoMuse/issues/647)、[#687](https://github.com/nano-muse/nanoMuse/issues/687)、[/issues/564)](https://github.com/nano-muse/nanoMuse/issues/564));Keenable 有没有 key 都能回答网页搜索,没 key 时每个地址每小时 1,000 次,@ilya-bogin-keenable [做的([#665](https://github.com/nano-muse/nanoMuse/pull/665)、[#643](https://github.com/做的([#665](https://github.com/nano-muse/nanoMuse/pull/665)、[/issues/643)](https://github.com/nano-muse/nanoMuse/issues/643));默认仍是 DuckDuckGo。 - **网页控制台和桌面端。** 智能体工作时输入框的发送键变成停止键,起名卡片能手输名字,都是 @z1010223zero-pixel [做的([#615](https://github.com/nano-muse/nanoMuse/pull/615)、[#613](https://github.com/做的([#615](https://github.com/nano-muse/nanoMuse/pull/615)、[/issues/613)](https://github.com/nano-muse/nanoMuse/pull/613))。桌面端的资源库在「创建文档」旁边多了一个菜单:「空白文档」(在资源库文件夹里新建空的 `未命名.md`,直接在编辑器里打开)和「导入 Markdown 文件…」(选中的 `.md`、`.markdown`、`.txt` 复制进这个文件夹,列在「文档」下;重名加序号,超过 2 MB [或别的格式会提示跳过;不经过模型)([#692](https://github.com/nano-muse/nanoMuse/pull/692)、[#689](https://github.com/或别的格式会提示跳过;不经过模型)([#692](https://github.com/nano-muse/nanoMuse/pull/692)、[/issues/689)](https://github.com/nano-muse/nanoMuse/issues/689));折叠的「思考」行重新显示标题和摘要,而不是一个空的灰色药丸,@yatping [做的([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[#683](https://github.com/做的([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[/issues/683)](https://github.com/nano-muse/nanoMuse/issues/683));Windows 上应用内更新后的第一次启动会等安装程序放开配置里的插件链接,而不是报 ENOTEMPTY 失败,@Yicheng-Mark [做的([#623](https://github.com/nano-muse/nanoMuse/pull/623)、[#618](https://github.com/做的([#623](https://github.com/nano-muse/nanoMuse/pull/623)、[/issues/618)](https://github.com/nano-muse/nanoMuse/issues/618));每次模型调用都经过插件自己的一扇回环门,加上来源头、只带账号自己的 key 转发;被拒的登录用 App 的语言解释。 - **Android。** 走服务商语音模型的语音输入在一段话停下的瞬间不再让 App 闪退:引擎在语音检测器自己的回调里停麦克风,而检测器正在释放它的原生对象;修法是上游 OpenMinis 1.14 的 <[inline_block>0,连测试一起搬过来([#627](https://github.com/nano-muse/nanoMuse/pull/627)、[#602](https://github.com/inline_block>0,连测试一起搬过来([#627](https://github.com/nano-muse/nanoMuse/pull/627)、[/issues/602)](https://github.com/nano-muse/nanoMuse/issues/602))。失败的定时动态运行原来会把昨天的帖子以今天的日期再写一遍;现在一轮的回复只有跟在它自己的提示之后才算数,最近 30 天发过的草稿会被丢掉,动态每天 12 [条满了会说([#650](https://github.com/nano-muse/nanoMuse/pull/650)、[#639](https://github.com/条满了会说([#650](https://github.com/nano-muse/nanoMuse/pull/650)、[/issues/639)](https://github.com/nano-muse/nanoMuse/pull/639),@z1010223zero-pixel 做的;[#584](https://github.com/nano-muse/nanoMuse/pull/584),@ZxlDragonDoctor [做的;[#637](https://github.com/nano-muse/nanoMuse/issues/637)、[#574](https://github.com/nano-muse/nanoMuse/issues/574))。沙盒里的模型调用遇到传输抖动会像聊天一样重试([#640](https://github.com/nano-muse/nanoMuse/issues/640));形象工作台的菜单里有「保存到相册」,底图、表情定格、候选图和你自己的短片都能存([#667](https://github.com/nano-muse/nanoMuse/pull/667)、[#664](https://github.com/nano-muse/nanoMuse/issues/664));你自己在服务商上列的视频模型会出现在选择器里,候选变了就重新核对一次([#666](https://github.com/nano-muse/nanoMuse/pull/666)、[#508](https://github.com/做的;[#637](https://github.com/nano-muse/nanoMuse/issues/637)、[#574](https://github.com/nano-muse/nanoMuse/issues/574))。沙盒里的模型调用遇到传输抖动会像聊天一样重试([#640](https://github.com/nano-muse/nanoMuse/issues/640));形象工作台的菜单里有「保存到相册」,底图、表情定格、候选图和你自己的短片都能存([#667](https://github.com/nano-muse/nanoMuse/pull/667)、[#664](https://github.com/nano-muse/nanoMuse/issues/664));你自己在服务商上列的视频模型会出现在选择器里,候选变了就重新核对一次([#666](https://github.com/nano-muse/nanoMuse/pull/666)、[/issues/508)](https://github.com/nano-muse/nanoMuse/issues/508))。手机参与上面的每一件事:电脑的卡片、步骤行、等待行、赞踩、来源和事件,App 有的每种语言都有。 - **iPhone。** 打开 App 不再停掉别的 App 正在放的音乐:形象的静音短片仍会以 iOS 默认的、不混音的类别启动音频会话,所以现在短片播放前会话先切到 `.ambient`,朗读回复之后再切回去,@cutey-none [做的([#690](https://github.com/nano-muse/nanoMuse/pull/690)、[#686](https://github.com/做的([#690](https://github.com/nano-muse/nanoMuse/pull/690)、[/issues/686)](https://github.com/nano-muse/nanoMuse/issues/686));403 条只有简体中文的字符串现在有了繁體中文,@yatping 做的([#671](https://github.com/nano-muse/nanoMuse/pull/671));经 nanoMuse Cloud 的慢回答等到 300 秒,而不是 120 秒就重发。iPhone 参与电脑的卡片、步骤行、等待行、赞踩、来源和事件,九种语言都有。 - **中继的细节。** 服务商的 400 在正文是列表时也按服务商的原话到达 App,Gemini 的 OpenAI 兼容端点就是这么发的,@jtboy80826 发现的([#611](https://github.com/nano-muse/nanoMuse/pull/611));运营商已经给够验证码的号码听到的是 `429 code_too_often`,不是「中继失败」;hub 记下被拒的连接;`self-host.sh --local --bind 0.0.0.0` 把机器的局域网地址写进 `PUBLIC_BASE`、邀请链接和打印的 URL,起因是 @cugbtang 的 [#[673](https://github.com/nano-muse/nanoMuse/pull/673)([#674](https://github.com/673](https://github.com/nano-muse/nanoMuse/pull/673)([/issues/674)](https://github.com/nano-muse/nanoMuse/pull/674));托管中继的备份可以用 age 公钥加密后、用只能写的 key 传到 COS 桶里([#621](https://github.com/nano-muse/nanoMuse/pull/621));Windows 上构建控制台不再平白改写它的 HTML,@Yicheng-Mark 做的([#669](https://github.com/nano-muse/nanoMuse/pull/669))。 - **项目本身。** 目标的 43 个恢复用例收成一条规则化的安全检查,@Longfellow1 [做的([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[#682](https://github.com/做的([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[/issues/682)](https://github.com/nano-muse/nanoMuse/pull/682));会话的最后一轮和 `.ics` 里长中文行的折行有了测试,@cugbtang [做的([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[#694](https://github.com/做的([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[/issues/694)](https://github.com/nano-muse/nanoMuse/pull/694));镜像脚本、zip 检查和来源传输的测试在 Windows 上成立,@Yicheng-Mark [做的([#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#657](https://github.com/nano-muse/nanoMuse/pull/657)、[#659](https://github.com/做的([#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#657](https://github.com/nano-muse/nanoMuse/pull/657)、[/issues/659)](https://github.com/nano-muse/nanoMuse/pull/659));一个「iOS · Beta group」工作流把 TestFlight 构建交给外部测试组并提交 Apple [的测试版审核([#619](https://github.com/nano-muse/nanoMuse/pull/619)、[#622](https://github.com/的测试版审核([#619](https://github.com/nano-muse/nanoMuse/pull/619)、[/issues/622)](https://github.com/nano-muse/nanoMuse/pull/622));harness 打包工作流每个分支只构建一次。 - **TestFlight。** 第 30 个构建(1.0.7)在 2026-10-25 上传并交给了外部测试组「nanoMuse Beta」送 Apple 测试版审核;1.0.8 以第 31 个构建上传,进同一个组、同一道审核。审核通过的构建就会给到公开链接,内部测试员在那之前就能用。 ### 升级说明 - **Android 覆盖安装 1.0.7,数据保留。** `nanoMuse-1.0.8-arm64.apk`(Android 8.0+,arm64;versionCode 51)和之前每个版本用同一把签名。校验:`sha256sum -c nanoMuse-1.0.8-arm64.apk.sha256`。不用设置什么:电脑的卡片、另一台设备提示下面的步骤行、打字点点下面的等待行自己会出现;赞踩在最新回复的下面。 - **iPhone 和 iPad 通过 TestFlight。** 第 31 个构建(1.0.8)上传后交给外部测试组,审核通过就给到公开链接,内部测试员在那之前就能用;在那之前链接装到的是最近一个通过审核的构建。 - **桌面安装包由 CI 从 tag `v1.0.8` 构建。** Mac 的包没有经过公证:第一次在「系统设置 → 隐私与安全性」里点「仍要打开」(或右键 → 「打开」)。Windows 的包没有签名:点一次「更多信息」和「仍要运行」。Linux 上优先用 `.deb`;AppImage 需要 FUSE(没有就加 `--appimage-extract-and-run`)。它们比 APK 晚一点到,`SHA256SUMS-desktop.txt` 列出了所有校验值。Windows 上的 1.0.7 桌面端会在非计费网络上后台下载这个版本,角落菜单给出,真正退出时安装。你的设置原地不动;第一次启动时 App 把「nanoMuse Cloud」那行服务商重新指向插件里的一扇回环门(`http://127.0.0.1:<port>/v1`),由它带着账号的 key 转发给中继,并把这一行的图片上限改写成 2 MiB。定时任务的卡片要等手机也升到 1.0.8 才会到手机上。 - **中继是 0.31.0,1.0.7 的客户端对着它照常工作。** 对用的人:排队和等待的提示、步骤行、手机上电脑的卡片,这几样要两头都是这个版本;其余照旧。给运维的人:升级后第一次启动会给记录建一个索引(`turns_figures`),建完之前中继不回答,托管中继 30 GB 的记录花了大约五分钟,之后一个回填在后台给旧行补键,每页一百行、每页之后停和它花的时间一样久,十万次调用大约一小时。0.30 之后新增:`POST /v1/events` 和「数据控制」里的数字,`GET /v1/admin/record/turns` 和 `/v1/admin/turns/{id}`,`GET /v1/admin/client-events` 及其导出和汇总,`GET /v1/admin/deletions`,排队块上的 `nanomuse` 字段和 SSE 注释,hub 的推送 `event` 和 `welcome.server.features` 里的 `event_push`,`POST /v1/sync/working` 的 `state` 和 `detail`,`calls.cached_tokens`、`turns.cached_tokens` 和「用量」页的缓存数字,运营商自己的限额对应的 `429 code_too_often`,以及备份外传可选的 `cos.env`。没有必须新增的设置。细节见 [docs/cloud.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/cloud.md)、[docs/hub.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/hub.md)、[docs/self-hosting.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/self-hosting.md) 和 [cloud/README.md](https://github.com/nano-muse/nanoMuse/blob/main/cloud/README.md)。 - **运行时的设置不变。** `[connectors.search]` 下的 `provider = "keenable"`(或「连接 → 网页搜索」)选用 Keenable;`Browser(backend_factory=…)` 给嵌入运行时的程序用。运行时在 Windows 上写的私密文件会在下一次写入时拿到只给这一个账号的 ACL。`config.toml` 里别的都不变。 - **去哪下载。** | | | |---|---| | 浏览器 | [demo.nanomuse.dev](https://demo.nanomuse.dev/),模拟手机里的一个 nanoMuse,登录后体验;这是演示,下面的应用才是正式版 | | Android 8.0+,arm64 | `nanoMuse-1.0.8-arm64.apk` | | iPhone、iPad | [TestFlight](https://testflight.apple.com/join/ZHexbDqc),走 Apple 审核的测试版;第 31 个构建(1.0.8)审核通过后即可安装 | | Windows 10+ | `nanoMuse-Desktop-1.0.8-win-x64.exe`(桌面 App,基于 DeepSeek Harness;未签名) | | macOS 12+ | `nanoMuse-Desktop-1.0.8-mac-arm64.dmg` / `-mac-x64.dmg`(或 `.zip`:解压后拖进「应用程序」;未公证) | | Linux x64 | `nanoMuse-Desktop-1.0.8-linux-x64.deb`(优先)/ `.AppImage`(需要 FUSE;没有就加 `--appimage-extract-and-run`)/ `.tar.gz`(解压到任意位置,运行 `./nanomuse-desktop`)| | 已在用 DeepSeek Harness Desktop | `dsh-nanomuse-1.0.8.tgz`,`dsh plugin --profile desktop add …`([怎么装](https://github.com/nano-muse/nanoMuse/blob/main/harness/README.md)) | | Docker | `ghcr.io/nano-muse/nanomuse:1.0.8`(也是 `:latest`),运行时加 8787 端口上的网页控制台 | | 自己的中继 | `bash scripts/self-host.sh`,[docs/self-hosting.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/self-hosting.md) | 实测从国内直接下 GitHub 也不慢;万一下不动,同样的文件十五分钟内会出现在 [nanomuse.cn/dl/v1.0.8/](https://nanomuse.cn/dl/v1.0.8/)。 ### 社区 nanoMuse 开源、免费、非营利。手机号或邮箱登录后有一份起始额度,钱是开发者出的;剩多少、怎么加,账号页里有数。用完可以换成自己的 key,或者用你已经在付费的套餐登录([教程](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/own-key.md));你加的 key 可以接手聊天和屏幕,图片和短片从一开始就是它的;账号也可以作为模型来源关掉,只留着做同步和管设备。登录后,nanoMuse Cloud 保存你和它的模型的对话记录和你自己的 key 回答的轮次,从这个版本起 App 还会以代码而不是文字告诉它每一轮前后做了什么判定、你觉得回答怎么样;你的设备和运营中继的人能读到,别人不能;「数据控制」里一下就能删掉,数据不卖([隐私政策](https://nanomuse.cn/privacy/));账号想删就删。同一个中继也能跑在你自己的服务器上:[docs/self-hosting.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/self-hosting.md)。 谢谢 @cutey-none 做的推送卡片、按对话和任务的授权和 iPhone [的音乐([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[#672](https://github.com/nano-muse/nanoMuse/pull/672)、[#642](https://github.com/nano-muse/nanoMuse/pull/642)、[#690](https://github.com/的音乐([#652](https://github.com/nano-muse/nanoMuse/pull/652)、[#672](https://github.com/nano-muse/nanoMuse/pull/672)、[#642](https://github.com/nano-muse/nanoMuse/pull/642)、[/issues/690)](https://github.com/nano-muse/nanoMuse/pull/690)),谢谢 @Yicheng-Mark 做的 Windows [上的运行时和桌面端的更新启动([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[#658](https://github.com/nano-muse/nanoMuse/pull/658)、[#623](https://github.com/nano-muse/nanoMuse/pull/623)、[#607](https://github.com/nano-muse/nanoMuse/pull/607)、[#608](https://github.com/nano-muse/nanoMuse/pull/608)、[#624](https://github.com/nano-muse/nanoMuse/pull/624)、[#632](https://github.com/nano-muse/nanoMuse/pull/632)、[#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#657](https://github.com/nano-muse/nanoMuse/pull/657)、[#659](https://github.com/nano-muse/nanoMuse/pull/659)、[#669](https://github.com/上的运行时和桌面端的更新启动([#625](https://github.com/nano-muse/nanoMuse/pull/625)、[#630](https://github.com/nano-muse/nanoMuse/pull/630)、[#633](https://github.com/nano-muse/nanoMuse/pull/633)、[#644](https://github.com/nano-muse/nanoMuse/pull/644)、[#645](https://github.com/nano-muse/nanoMuse/pull/645)、[#646](https://github.com/nano-muse/nanoMuse/pull/646)、[#658](https://github.com/nano-muse/nanoMuse/pull/658)、[#623](https://github.com/nano-muse/nanoMuse/pull/623)、[#607](https://github.com/nano-muse/nanoMuse/pull/607)、[#608](https://github.com/nano-muse/nanoMuse/pull/608)、[#624](https://github.com/nano-muse/nanoMuse/pull/624)、[#632](https://github.com/nano-muse/nanoMuse/pull/632)、[#656](https://github.com/nano-muse/nanoMuse/pull/656)、[#657](https://github.com/nano-muse/nanoMuse/pull/657)、[#659](https://github.com/nano-muse/nanoMuse/pull/659)、[/issues/669)](https://github.com/nano-muse/nanoMuse/pull/669)),谢谢 @z1010223zero-pixel [做的在线状态里的步骤、停止键、手输名字和动态的丢弃提示([#617](https://github.com/nano-muse/nanoMuse/pull/617)、[#615](https://github.com/nano-muse/nanoMuse/pull/615)、[#613](https://github.com/nano-muse/nanoMuse/pull/613)、[#639](https://github.com/做的在线状态里的步骤、停止键、手输名字和动态的丢弃提示([#617](https://github.com/nano-muse/nanoMuse/pull/617)、[#615](https://github.com/nano-muse/nanoMuse/pull/615)、[#613](https://github.com/nano-muse/nanoMuse/pull/613)、[/issues/639)](https://github.com/nano-muse/nanoMuse/pull/639)),谢谢 @yatping [做的思考行和繁體中文([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[#671](https://github.com/做的思考行和繁體中文([#684](https://github.com/nano-muse/nanoMuse/pull/684)、[/issues/671)](https://github.com/nano-muse/nanoMuse/pull/671)),谢谢 @ZxlDragonDoctor 做的动态上限提示([#584](https://github.com/nano-muse/nanoMuse/pull/584)),谢谢 @Felixkw12、@bayuh85 和 @DennyHo0917 加的 Opper、AtmoRouter 和 API [Route([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[#603](https://github.com/Route([#648](https://github.com/nano-muse/nanoMuse/pull/648)、[#688](https://github.com/nano-muse/nanoMuse/pull/688)、[/issues/603)](https://github.com/nano-muse/nanoMuse/pull/603)),谢谢 @ilya-bogin-keenable 加的 Keenable([#665](https://github.com/nano-muse/nanoMuse/pull/665)),谢谢 @jtboy80826 找到的 Gemini 形状的错误([#611](https://github.com/nano-muse/nanoMuse/pull/611)),谢谢 @Longfellow1 [做的目标恢复检查([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[#682](https://github.com/做的目标恢复检查([#634](https://github.com/nano-muse/nanoMuse/pull/634)、[/issues/682)](https://github.com/nano-muse/nanoMuse/pull/682)),谢谢 @cugbtang [补的会话和日历测试和局域网绑定的报告([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[#694](https://github.com/nano-muse/nanoMuse/pull/694)、[#673](https://github.com/补的会话和日历测试和局域网绑定的报告([#675](https://github.com/nano-muse/nanoMuse/pull/675)、[#694](https://github.com/nano-muse/nanoMuse/pull/694)、[/issues/673)](https://github.com/nano-muse/nanoMuse/pull/673)),也谢谢报告 [#[508](https://github.com/nano-muse/nanoMuse/issues/508)、[#564](https://github.com/nano-muse/nanoMuse/issues/564)、[#574](https://github.com/nano-muse/nanoMuse/issues/574)、[#602](https://github.com/nano-muse/nanoMuse/issues/602)、[#610](https://github.com/nano-muse/nanoMuse/issues/610)、[#618](https://github.com/nano-muse/nanoMuse/issues/618)、[#631](https://github.com/nano-muse/nanoMuse/issues/631)、[#637](https://github.com/nano-muse/nanoMuse/issues/637)、[#640](https://github.com/nano-muse/nanoMuse/issues/640)、[#641](https://github.com/nano-muse/nanoMuse/issues/641)、[#643](https://github.com/nano-muse/nanoMuse/issues/643)、[#647](https://github.com/nano-muse/nanoMuse/issues/647)、[#664](https://github.com/nano-muse/nanoMuse/issues/664)、[#676](https://github.com/nano-muse/nanoMuse/issues/676)、[#683](https://github.com/nano-muse/nanoMuse/issues/683)、[#686](https://github.com/nano-muse/nanoMuse/issues/686)、[#687](https://github.com/508](https://github.com/nano-muse/nanoMuse/issues/508)、[#564](https://github.com/nano-muse/nanoMuse/issues/564)、[#574](https://github.com/nano-muse/nanoMuse/issues/574)、[#602](https://github.com/nano-muse/nanoMuse/issues/602)、[#610](https://github.com/nano-muse/nanoMuse/issues/610)、[#618](https://github.com/nano-muse/nanoMuse/issues/618)、[#631](https://github.com/nano-muse/nanoMuse/issues/631)、[#637](https://github.com/nano-muse/nanoMuse/issues/637)、[#640](https://github.com/nano-muse/nanoMuse/issues/640)、[#641](https://github.com/nano-muse/nanoMuse/issues/641)、[#643](https://github.com/nano-muse/nanoMuse/issues/643)、[#647](https://github.com/nano-muse/nanoMuse/issues/647)、[#664](https://github.com/nano-muse/nanoMuse/issues/664)、[#676](https://github.com/nano-muse/nanoMuse/issues/676)、[#683](https://github.com/nano-muse/nanoMuse/issues/683)、[#686](https://github.com/nano-muse/nanoMuse/issues/686)、[/issues/687)](https://github.com/nano-muse/nanoMuse/issues/687) 和 [#689](https://github.com/nano-muse/nanoMuse/issues/689) 的每一位。[路线图](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/roadmap.md)写着哪里需要帮手,[docs/parity.md](https://github.com/nano-muse/nanoMuse/blob/main/docs/zh/parity.md) 写着每个客户端有什么。[提 issue](https://github.com/nano-muse/nanoMuse/issues/new/choose) · [发 PR](https://github.com/nano-muse/nanoMuse/blob/main/CONTRIBUTING.md) · [Discussions](https://github.com/nano-muse/nanoMuse/discussions) · [Discord](https://discord.gg/bkTySmm28X) · [点个 Star](https://github.com/nano-muse/nanoMuse);觉得有用,点个 Star,让更多人看到。 基于 [OpenMinis](https://github.com/OpenMinis/OpenMinis) 1.13(GPL-3.0),自 2026-09-24 起修改;本版本的完整对应源码是 tag `v1.0.8` 加子模块 `android/deps/proot`([nano-muse/proot](https://github.com/nano-muse/proot));桌面安装包和 Docker 镜像由 CI 从同一个 tag 构建。整个仓库以 GPL-3.0-or-later 发布。nanoMuse 桌面版原样携带 DeepSeek Harness 及其许可证文件;名字里的 *harness* 是普通词,不是 DeepSeek 的名字。聊天入口照 [nanobot](https://github.com/HKUDS/nanobot) 的设计(MIT);桌面端的操作器移植自 [UI-TARS-desktop](https://github.com/bytedance/UI-TARS-desktop)(Apache-2.0;`THIRD_PARTY_NOTICES.md`)。nanoMuse 与 Meta 无关,Muse 是 Meta Platforms, Inc. 的商标。桌面端照着 Muse 应用用起来的样子做,是用过之后写下来的;里面没有 Meta 的任何素材、代码或内容。
Source: README.md, updated 2026-10-29