尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Hermsy: a private phone app for your own Hermes Agent. Chat, voice calls with on-device speech, an Inbox, a daily Brief and a Chief of Staff.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Hermsy is a phone app for your own Hermes Agent: chat, voice calls, an Inbox for what Hermes sends on its own, a Brief of your day, and a Chief of Staff that texts you only when something needs you. It talks to your Hermes over HTTPS. There is no Hermsy account and no Hermsy cloud.
Published on Google Play by illbytes as Hermsy (com.illbytes.hermsy_app). Website: hermsy.illbytes.com. This repo holds the Android app (Flutter), the server pieces it relies on, and the website.
Hermsy (phone) ──HTTPS + Hermes API key──▶ Your Hermes (its API server)
├─ chat, calls, chat titles, jobs ....... Hermes itself
└─ /api/platforms/hermsy/events ......... the Hermsy plugin
Inbox, Brief, phones, cloud voices, setup
Your Hermes ──"wake <push token>"──▶ push.hermsy.illbytes.com ──▶ Firebase ──▶ phone
(the plugin) (illbytes runs this once) the push carries nothing;
the phone asks its own Hermes
server/hermes-plugin, published as illBytes/hermsy-hermes) runs inside Hermes. It answers the app through Hermes's own API server, so there is no separate server, port or proxy route.server/push) is the one thing illbytes runs for everyone. Google only accepts pushes for the Play app from its publisher.With Hermes in Docker via hermes-spawn, one command does everything: it switches on the API server, installs the plugin, gives Hermes an HTTPS address (Caddy, Cloudflare Tunnel or Tailscale), and prints a QR code:
hermes-spawn connect <name>
In Hermsy, tap Scan QR code (first screen, or Settings › Hermes). Without hermes-spawn, follow the plugin README. To set someone else up, see docs/hermsy-for-anyone.md.
Chat and calls work with any Hermes whose API server is reachable over HTTPS. The Inbox, notifications, the Brief, cloud voices and the Chief of Staff need the plugin.
How a notification stays private. No message text, title or ID ever goes through Google:
deliver: hermsy). The Hermsy plugin stores it on your own Hermes.push.hermsy.illbytes.com) to wake your phone, giving only the phone's push token.{"type": "wake"}.| Sees | |
|---|---|
| Google / Firebase | That the app on a phone was woken, and when. Nothing else. |
| illbytes' push service | The phone's push token, and when it was woken. It stores neither. |
| Your Hermes | The messages (it wrote them). |
| Your lock screen | "Hermsy" only: notifications are private, so the text shows after unlocking. |
The timing is the one thing a push service can't hide. To send nothing to illbytes or Google at all, set HERMSY_PUSH_URL=off on Hermes: the Inbox then fills whenever you open the app.
On the phone:
No build carries a server or key, not even Hermsy Dev: every install starts empty, and you scan the QR code (or type the address and key) once.
You need Flutter (here at ~/development/flutter/bin, not on PATH in every shell) and an Android phone with USB debugging.
There are two flavors, which can be installed side by side:
| Flavor | App | ID | Build |
|---|---|---|---|
prod | Hermsy (Google Play) | com.illbytes.hermsy_app | release, signed with the illbytes upload key |
dev | Hermsy Dev | com.illbytes.hermsy_app.dev | debug |
flutter run --flavor dev -d <device> # plain `flutter run` fails: a flavor is required
flutter test # the app's tests
Both start with no server. Connect a fresh install with the QR code from hermes-spawn connect <name> (for an address you set up yourself, add --url https://…); it stays saved in secure storage across updates.
tool/build_play.sh | The signed Play bundle, refusing one with .env inside or the wrong signer. Publishing steps: store/README.md. |
tool/voice_models_to_phone.py | Puts the voice models on a phone over USB (--app <id> for Hermsy Dev, --shared for any build), so nobody downloads 1.5 GB twice. |
SHOTS_DIR=… flutter test tool/shots/shots_test.dart | Design screenshots of the real app, with a scripted Hermes. |
SHOTS_DIR=store/screenshots/dark flutter test tool/shots/store_shots_test.dart | The Play screenshots and feature graphic, with made-up content (SHOTS_THEME=light for the light set). |
tool/export_plugin.sh <folder> | Fills the public plugin repo from server/hermes-plugin. |
Push needs android/app/google-services.json from the illbytes Firebase project (git-ignored; see store/firebase-setup.md). Without it the app builds and runs, and Settings › Notifications says "Not set up in this build". To test the whole path, run hermes send -t hermsy "Hello" on Hermes.
POST /v1/chat/completions, streamed, without a model id (Hermes uses its configured model). Each chat keeps its own Hermes session through X-Hermes-Session-Id, and each send is one new user line./api/jobs.POST /api/platforms/hermsy/events with the same API key, one JSON op per request (hello, messages, brief, register_device, voices, speak, setup, …).When Hermes makes a picture or a voice file and replies with its path, the app fetches it through /files/… and /audio/… routes that Caddy serves from the Hermes home folder. hermes-spawn connect doesn't add those routes, so for people set up that way, such files don't load (chat, calls and dictation are unaffected). The old manual Caddy routes are in this README's Git history. The better fix is to serve those files through the plugin, with the API key properly checked.
| Folder | What | Where it runs |
|---|---|---|
server/hermes-plugin/ | The Hermsy plugin (2.x): Inbox, Brief, phones, voices, setup; ships a Hermsy skill, a Chief of Staff skill and observer scripts | Inside each person's Hermes. Publish with tool/export_plugin.sh, bump version in plugin.yaml and core.py |
server/push/ | The push service | Once, on the illbytes VPS: server/push/README.md |
Python tests (the plugin and the push service):
python3 -m venv server/.venv && server/.venv/bin/pip install -r server/requirements-dev.txt
server/.venv/bin/python -m pytest -q server/hermes-plugin/tests
server/.venv/bin/python -m pytest -q server/push/tests --rootdir server/push -c server/push/pytest.ini
| Symptom | Likely cause | Fix |
|---|---|---|
flutter: command not found | Flutter not on PATH | export PATH="$HOME/development/flutter/bin:$PATH" |
flutter run fails asking for a flavor | Two flavors exist | flutter run --flavor dev -d <device> |
| App Offline | Wrong address or key, or Hermes down | Settings › Hermes; open https://<address>/health in a browser |
| Settings › Hermes says the plugin is Not installed | Plugin missing, disabled, or Hermes older than 0.19 | hermes plugins list; hermes-spawn connect <name> --status |
| No notifications | Notifications off on the phone, or the plugin can't reach the push service | Settings › Notifications; Hermes's logs/agent.log (in its home folder) should show [Hermsy] Ready and no hermsy: waking … failed lines |
| A Brief arrives as an Inbox message | The job's reply couldn't be read as a Brief | The message says so, with the reply below; check the job's prompt and model |
Empty reply / reset on the API port | Hermes in Docker listening on 127.0.0.1 inside the container | API_SERVER_HOST=0.0.0.0 in its .env, then restart (hermes-spawn connect does this) |
| Reply cut off mid-sentence | A proxy closed the long-running stream | Caddy needs flush_interval -1 and long timeouts (hermes-spawn connect sets them) |
| Fingerprint missing | No PIN yet, or none enrolled | Set the PIN in the app; enroll a fingerprint in Android settings |
lib/
config/ the server address and key type, version
models/ chat messages, the Brief
presence/ the edge glow and orb (shaders, palette)
screens/ PIN, chat, call, Inbox, Brief, Settings, scanning, voice models
services/ Hermes and plugin clients, push, storage, encryption, delivery
state/ the chat controller (streaming, sessions)
voice/ calls, dictation, on-device models, audio routing
widgets/ the UI kit, glow, setup screens
server/ the Hermsy plugin and the push service
store/ Play listing, policy, data safety, screenshots, graphics
tool/ build, export, screenshots, voice models
docs/ setting up Hermsy for anyone
site/ hermsy.illbytes.com (built by site/build.py, published by .github/workflows/pages.yml)
MIT. See LICENSE.