You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 544fa7f
Browse filesBrowse the repository at this point in the historyBrowse files
- fix(config): a missing llm.api_key is filled from the provider's own variable —
DEEPSEEK_API_KEY for *.deepseek.com, OPENAI_API_KEY for every other host — so a
config pointed at OpenAI never goes out with DeepSeek's key.
- ci(android): attach the APK to a release only when it was signed with the release
key; a debug-signed build stays a workflow artifact.
- version 0.6.0 in pyproject, __init__, package.json, CITATION.cff, Android
versionName/versionCode (600); Development Status :: 4 - Beta; CHANGELOG.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+13-2Lines changed: 13 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,8 +4,13 @@ All notable changes to OpenMuse. The format follows [Keep a Changelog](https://k
4
4
5
5
## [Unreleased]
6
6
7
+
## [0.6.0] — 2026-09-23
8
+
9
+
The app as Meta Muse looks, and an Android app. A plush avatar that moves while it works, one blue accent, a feed written for you, a stop button — and `openmuse.apk` on every release, so the phone gets notifications with the app closed.
10
+
7
11
### Added
8
12
13
+
- **An Android app.** `android/` is a native shell around the web app: connect by scanning the QR code `openmuse serve` prints (or paste the link), then the same app in a WebView — with the file picker for attachments, downloads to the phone, links opening in the real browser, and plain HTTP on the LAN. What the browser could not do: a foreground service keeps one WebSocket open to your server while the app is closed, so approvals, questions and the last word of background work arrive as notifications that open the right chat; a resolved approval takes its notification down; reconnects after a network change or a reboot. Inside the app, *Settings → Notifications* shows the phone's switch instead of Web Push, and *About* has *Disconnect from this server*. Built by `.github/workflows/android.yml` and attached to each release as `openmuse-<version>.apk` and as `openmuse.apk`, so `https://github.com/OpenMuseAgent/OpenMuse/releases/latest/download/openmuse.apk` always points at the current one (Android 8.0+). See [docs/android.md](docs/android.md).
9
14
-**A feed written for you.** The Feed tab opens with *Feed instructions* — one prompt in your words: topics to follow, nudges on your goals, a morning plan, the tone — and posts the agent writes from that and what it knows about you (memory, goals, today's calendar, the last conversation): a few short Markdown posts a day, in your language, each with a follow-up you can send to the chat. A new batch is written once a day while background work is on and outside quiet hours, or on demand (*New posts*); the phone gets one notification per batch. What happened while you were away stays below, as before. `GET /api/feed/posts`, `PUT /api/feed/instructions`, `POST /api/feed/posts/refresh`, `DELETE /api/feed/posts/{id}`.
10
15
-**A stop button.** The status sheet (tap the avatar) shows *Stop* while a run is on: the run ends, a card waiting on you expires, what was queued behind it is dropped, and the transcript is left in a shape the model can continue from. `POST /api/threads/{id}/stop`.
11
16
-**Plush avatars.** Six dolls to pick from in setup and in Settings, with an idle breath, a sway while working and a hop while waiting for you (still under *reduce motion*); tap one and it wiggles. An emoji on a colour is still there for anyone who prefers it. `profile.avatar` in the settings API; old profiles keep their emoji.
@@ -14,8 +19,13 @@ All notable changes to OpenMuse. The format follows [Keep a Changelog](https://k
14
19
15
20
-**The look, after Meta Muse.** Near-white and near-black surfaces, one blue accent, grey bubbles for the agent and light-blue for you with the time between groups of messages, a floating icon-only tab bar, a centred avatar header with the live status line, and a single *+ Message* composer. Type is [Figtree](https://github.com/erikdkennedy/figtree) (OFL), bundled. Goals list as *Tracking* / *Goals* rows with a check circle and one line of status; Ideas are rows grouped by area; the approval card reads "*{name} wants to … at host*" with *Deny* / *Allow*; artifact cards and the Library show live previews of pages and pictures; the status sheet has a four-way control (Approvals, Activity, Permissions, Upcoming).
16
21
-**It is called OpenMuse.** The default agent name, the CLI prompt, the console, push notifications and every screen say *OpenMuse* unless you named it; "Meta Muse" is used only when comparing with the original.
22
+
-**The README** is short and scannable: a start-here table, what it can do, install, a three-command quick start, the Android download, deploy, then the details. Screenshots are of the new look; links are absolute so PyPI renders them. The package is marked Beta.
23
+
24
+
### Fixed
17
25
18
-
-**An Android app.**`android/` is a native shell around the web app: connect by scanning the QR code `openmuse serve` prints (or paste the link), then the same app in a WebView — with the file picker for attachments, downloads to the phone, links opening in the real browser, and plain HTTP on the LAN. What the browser could not do: a foreground service keeps one WebSocket open to your server while the app is closed, so approvals, questions and the last word of background work arrive as notifications that open the right chat; a resolved approval takes its notification down; reconnects after a network change or a reboot. Inside the app, *Settings → Notifications* shows the phone's switch instead of Web Push, and *About* has *Disconnect from this server*. Built by `.github/workflows/android.yml` and attached to each release as `openmuse-<version>.apk` (Android 8.0+). See [docs/android.md](docs/android.md).
26
+
-**Sandboxed commands failed from a relative workspace.** With the config's default `workspace = "./workspace"`, bubblewrap was told to change into `workspace`*after* pivoting to the new root, where no such directory exists — every `shell` and `python_execute` call ended in "Can't chdir to workspace" while the sandbox self-check (which uses `/`) passed. The directory is now made absolute first.
27
+
-**The wrong provider's key was never sent.** With `llm.api_key` empty, `DEEPSEEK_API_KEY` used to stand in whatever the `base_url` — a config pointed at OpenAI could go out with DeepSeek's key. Now DeepSeek's variable is used for `*.deepseek.com` only and `OPENAI_API_KEY` for every other host (OpenAI, OpenRouter, a gateway, vLLM).
28
+
-**The approval card said "at df".** The host line is shown for network tools only, a recipient line for mail; the chat header's status line is about the open chat, not whichever thread happens to be working.
19
29
20
30
## [0.5.0] — 2026-09-23
21
31
@@ -118,7 +128,8 @@ First public release.
118
128
- Mobile-first web app built with React, Vite and Tailwind, shipped inside the package.
119
129
- Docker image and Compose file; GitHub Actions CI; PyPI publishing through Trusted Publishing.
Copy file name to clipboardExpand all lines: docs/android.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,7 +13,7 @@ Everything else is the same web app, served by your `openmuse serve`.
13
13
14
14
## Install
15
15
16
-
Download `openmuse-<version>.apk` from the [latest release](https://github.com/OpenMuseAgent/OpenMuse/releases/latest)and open it on the phone. Android asks once to allow installs from your browser or file manager. Android 8.0 (API 26) or newer, any CPU.
16
+
Download [`openmuse.apk`](https://github.com/OpenMuseAgent/OpenMuse/releases/latest/download/openmuse.apk) (always the current release; the same file is also there as `openmuse-<version>.apk`) and open it on the phone. Android asks once to allow installs from your browser or file manager. Android 8.0 (API 26) or newer, any CPU. Every release is signed with the same key, so a newer APK installs over the old one and keeps its connection.
17
17
18
18
Then:
19
19
@@ -65,7 +65,7 @@ The same four values can come from the environment as `OPENMUSE_STOREFILE`, `OPE
65
65
66
66
## Releases
67
67
68
-
`.github/workflows/android.yml` builds the APK on every change under `android/` and, on a `v*` tag, attaches `openmuse-<version>.apk` to the GitHub release. For a properly signed release APK the repository needs four secrets: `ANDROID_KEYSTORE_B64` (the `.jks` file, base64), `ANDROID_KEYSTORE_PASSWORD`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`. Without them the workflow still produces an APK, signed with a throwaway debug key.
68
+
`.github/workflows/android.yml` builds the APK on every change under `android/` and, on a `v*` tag, attaches `openmuse-<version>.apk`and `openmuse.apk`to the GitHub release — but only when it could sign with the release key, which the repository gets from four secrets: `ANDROID_KEYSTORE_B64` (the `.jks` file, base64), `ANDROID_KEYSTORE_PASSWORD`, `ANDROID_KEY_ALIAS`, `ANDROID_KEY_PASSWORD`. Without them the workflow still builds an APK signed with a throwaway debug key and keeps it as a workflow artifact; the maintainer then attaches the APK built locally with the real key. A debug-signed APK never goes on a release, because it could not be updated by a properly signed one.
69
69
70
70
The `versionName` in `android/app/build.gradle.kts` must match the tag, like the Python package's version does.
|`DEEPSEEK_API_KEY`, `OPENAI_API_KEY`| used as `llm.api_key` when it is empty |
22
+
|`DEEPSEEK_API_KEY`, `OPENAI_API_KEY`| used as `llm.api_key` when it is empty — DeepSeek's for a `*.deepseek.com``base_url`, OpenAI's for every other host (OpenAI itself, OpenRouter, a gateway, vLLM) |
description = "Open-source version of Meta's Muse: a personal agent with a phone app, a Sentinel gatekeeper, a credential vault, memory and goals. Bring your own model."
0 commit comments