neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
A free, open-source native iPhone and iPad client for your self-hosted Hermes Agent.
Developer toolsSwift · PythonGitHub @kaishi00OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Conduit — native SwiftUI iOS client for Hermes Agent
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A native iOS client for Hermes Agent. Free, no ads, no tracking.
Conduit connects directly to your self-hosted Hermes dashboard. Same sessions, same profiles, same capabilities as the desktop client. No relay service, no extra processes, no middleman.
Start a conversation on desktop, pick it up on your phone. The session list is the same because it is the same database.Read the full README ↗Qwen Live is an independently selectable provider alongside Gemini Live. See setup and validation limits.
A native iPhone, iPad and Apple Watch app for Hermes Agent. Free, no ads, no tracking.
More on hermesconduit.app: live voice, Apple Watch, CarPlay and privacy.
Want new features sooner? The TestFlight beta gets newer builds before they reach the App Store.
Conduit is a touch-first app for your own Hermes agent on iPhone, iPad and Apple Watch, with CarPlay, widgets and Live Activities. It signs in to the Hermes dashboard you run, so your sessions, profiles, bots, tools and scheduled jobs are the same ones you use on desktop. Start a conversation on desktop and pick it up on your phone: the session list is the same because it is the same database.
The app works with any Hermes dashboard on its own. The free Hermes Conduit Notifier plugin on your host adds notifications, live voice, Apple Watch calls, rich cards and the phone features below.
Chat
Voice
Tasks, bots and groups
Your phone, if you allow it
Each is off until you turn it on, and goes only to your own Hermes host, encrypted end to end. The keys are agreed over your dashboard connection, so use HTTPS or a private tunnel such as Tailscale to keep anyone on the network from stepping into that exchange:
Notifications and control
If Hermes is already running, that's all you need. Conduit talks to the web dashboard that comes with Hermes (hermes dashboard, port 9119 by default). There is no Conduit server or container to install. The companion plugin is optional but unlocks notifications, live voice and the phone features, and it installs with one command.
You need three things from your Hermes host: the dashboard running with a username and password, a way for your phone to reach it, and the address to type into Conduit. Your Hermes agent can set all of that up for you.
I want to use the Hermes Conduit app on my iPhone to talk to you. Conduit signs in to the Hermes web dashboard (the one started by `hermes dashboard`, default port 9119). Please set everything up and then tell me what to enter in the app.
1. Check whether the Hermes dashboard is running and which port it uses. If it isn't, start it, and make sure it starts again after a reboot.
2. Make sure the dashboard requires a sign-in. Never turn authentication off. If no username and password are set up yet, create them (HERMES_DASHBOARD_BASIC_AUTH_USERNAME and HERMES_DASHBOARD_BASIC_AUTH_PASSWORD in the Hermes .env file), and set HERMES_DASHBOARD_BASIC_AUTH_SECRET to a long random value so I stay signed in when the dashboard restarts.
3. Set up remote access with Tailscale Serve: check that Tailscale is installed and signed in on this machine, then run `tailscale serve --bg 9119` (with the dashboard's real port) and set dashboard.public_url in config.yaml to the https://<machine>.<tailnet>.ts.net address that Serve gives you. If the dashboard only listens on 127.0.0.1, leave it that way. Never open the dashboard port to the internet.
4. Install the Conduit companion plugin: `hermes plugins install kaishi00/hermes-conduit-notifier --enable`
5. If something needs me (installing or signing in to Tailscale, turning on HTTPS certificates for my tailnet, or a step on the host because you run inside a Docker container or on a NAS and can't make the change yourself), stop and tell me exactly what to do or which commands to run, then continue once I've done it.
6. When it's ready, tell me the address to enter in Conduit, the username and the password. Also make me a sign-in link: conduit://connect?url=ADDRESS&username=USERNAME&password=PASSWORD with each value percent-encoded and the full https:// address, never localhost. If we're talking in a terminal, show the link as a QR code there so the password stays out of chat history.
7. Last, restart the gateway and the dashboard so the plugin and the new settings load. Do this only after you've sent me everything from step 6, because the restart may end this conversation.
Only using Conduit at home on the same Wi-Fi? You can skip Tailscale: replace step 3 with "Make the dashboard reachable from other devices on my local network and tell me this machine's local IP address and the dashboard port." That address only works at home.
Conduit also has this built in: on the sign-in screen, Need help connecting? walks through the same questions and gives you a ready-to-copy prompt for each step.
Conduit works the same when Hermes runs in a container: all it needs is the dashboard. The differences:
HERMES_DASHBOARD=1 is set, and the port must be published (-p 9119:9119). If you can open the dashboard in a browser already, this part is done.HERMES_DASHBOARD_BASIC_AUTH_USERNAME, HERMES_DASHBOARD_BASIC_AUTH_PASSWORD and HERMES_DASHBOARD_BASIC_AUTH_SECRET on the container (or in the .env file in its data folder).tailscale serve --bg 9119 on the NAS and set dashboard.public_url in the mounted config.yaml to the https://….ts.net address it prints. The agent inside the container can't do this part, so the prompt above asks it to tell you the steps.docker exec -it hermes hermes plugins install kaishi00/hermes-conduit-notifier --enable, then docker restart hermes. Plugins live in the data volume (/opt/data), so they survive image updates.A minimal example (pick your own username and password; the secret can be any long random string, such as the output of openssl rand -base64 32):
docker run -d --name hermes --restart unless-stopped \
-v ~/.hermes:/opt/data \
-p 9119:9119 \
-e HERMES_DASHBOARD=1 \
-e HERMES_DASHBOARD_BASIC_AUTH_USERNAME=me \
-e HERMES_DASHBOARD_BASIC_AUTH_PASSWORD='a-strong-password' \
-e HERMES_DASHBOARD_BASIC_AUTH_SECRET='a-long-random-string' \
nousresearch/hermes-agent gateway run
On your home network the address is then http://<nas-ip>:9119; through Tailscale Serve it is the https://….ts.net address. See Hermes' Docker guide for the full set of options.
~/.hermes/.env (the secret keeps you signed in across restarts):
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=me
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=a-strong-password
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-string
127.0.0.1:9119, run tailscale serve --bg 9119, and set dashboard.public_url in ~/.hermes/config.yaml to the https://<machine>.<tailnet>.ts.net address Serve prints (Hermes needs this to keep the sign-in on for Tailscale visitors). Install Tailscale on the phone with the same account. The address for Conduit is that https://….ts.net URL.hermes dashboard --host 0.0.0.0 --port 9119 --no-open. The address is http://<server-ip>:9119 and works only on that network.http://127.0.0.1:9119 and set dashboard.public_url to your HTTPS address.Note: Conduit connects to the native Hermes dashboard, not the separate Hermes WebUI project. The default port is 9119.
Plain HTTP over Tailscale (MagicDNS .ts.net domains and 100.64.0.0/10 tailnet IPs) is supported, since that traffic is already WireGuard-encrypted.
Conduit only needs Tailscale Serve, which shares the dashboard with devices on your own tailnet. It doesn't need Tailscale SSH, so leave that off unless you use it for something else, and keep Tailscale updated on every device, including older ones like an iPad or Apple TV. Tailscale posts fixes on its security bulletins page.
If the dashboard is behind Cloudflare Access, enable the optional service token on the login screen or in Settings > Connection (the first row, under your profile name). Conduit stores the client secret in Keychain (scoped to the gateway origin), and injects both Access headers into native authentication requests, WebSocket handshakes, and all in-page WebKit fetches via a document-start user script. Credentials are bound to the gateway URL and cleared when switching to a different host.
Native OAuth limitation: service-token headers cannot be attached to the system Safari navigation that opens /auth/native/authorize. Native OAuth therefore requires that browser authorization route to be reachable through an interactive Cloudflare policy or without a service-token challenge. The token exchange, refresh, REST, and WebSocket-ticket requests still use the configured service-token headers. A service-token-only challenge in front of the authorize route cannot be bypassed by Conduit and must not silently fall back to embedded Google OAuth.
Push notifications need a small relay because iOS does not let apps keep a background connection open. Live voice, Apple Watch calls, cards and the phone features need the notifier plugin on your Hermes host. One install covers all of it; the relay and plugin source live in hermes-conduit-notifier.
Install the notifier plugin on your Hermes instance:
hermes plugins install kaishi00/hermes-conduit-notifier --enable
hermes gateway restart
Then turn on notifications under Settings > Notifications; Conduit pairs the signed-in profile by itself when no other iPhone receives its notifications; if one does, Settings > Notifications offers to move them to this one. Settings > Conduit plugin shows the installed version and can update it.
The app uses a shared relay by default (push.milim.dev) so notifications work out of the box with no extra setup.
End-to-end encryption. With notifier 0.5 or later, Conduit gives each pairing its own key over your dashboard connection (never through the relay) and turns encryption on by itself. Notification text, session and profile names, approval and clarify cards, and your clarify answers are then encrypted between your Hermes host and this iPhone; a Notification Service Extension decrypts them on the phone. The relay and Apple only see routing data such as the event type and timing. With notifier 0.71 or later the keys rotate, or when you tap Rotate encryption keys in Settings > Notifications; the old key still opens notifications already on their way for 7 days. With notifier 0.72 or later they rotate every 7 days through a key exchange inside the encrypted channel, so a new key normally never crosses your dashboard connection (if a rotation can't finish, Conduit falls back to handing over a new key through that connection, then replaces it through the exchange); on iOS 26 that exchange uses ML-KEM-768 with X25519 and is quantum-safe, shown with a shield instead of the padlock. Settings > Notifications shows which pairings are encrypted, and a padlock marks a saved dashboard whose hosts all confirmed they seal with this iPhone's current key.
Running your own relay. Apple only delivers notifications for the App Store build when they are signed with its developer's APNs key, so a relay you run yourself can't reach the App Store app, even if you enter its URL under Settings > Notifications > Push relay. A self-hosted relay works with a Conduit build you sign with your own Apple developer account and bundle id (see Building from source and the relay's self-hosting guide). Such a build registers under its own bundle id, and can make your relay its default with the CONDUIT_DEFAULT_RELAY_URL build setting (an https URL, e.g. xcodebuild CONDUIT_DEFAULT_RELAY_URL=https://push.example.com …), so nobody has to type it into Settings. If your goal is that the relay can't read your notifications, end-to-end encryption already covers that on the shared relay.
git clone https://github.com/kaishi00/hermes-conduit.git
cd hermes-conduit
brew install xcodegen
xcodegen generate
open Conduit.xcodeproj
Select your team in Signing & Capabilities, then build and run on your device.
Requirements:
macos-26 runners)See the iOS release workflow for the TestFlight and App Store release process.
Conduit is SwiftUI, generated with xcodegen from project.yml. Targets: the iPhone and iPad app, the Watch app and its widgets, Home Screen widgets and Live Activities, a Notification Service Extension (decrypts end-to-end encrypted notifications), a Location Push extension, and a share extension.
The app connects to the Hermes dashboard's WebSocket (/api/ws) and REST routes after authenticating through the dashboard, as the desktop client does. Plugin features use the notifier's routes under /api/plugins/conduit_push/, behind the same dashboard auth.
Key places:
Conduit/Services/HermesClient.swift - WebSocket client and RPC layerConduit/Services/AppState.swift (and its AppState+*.swift extensions) - state and session lifecycleConduit/Views/V2/ - the app shell: Chats, Tasks, Bots, SettingsConduit/Voice/ - Classic voice, dictation and the live voice engines (Gemini Live, Qwen Live, GPT-Live, Grok Live, Local Live)Conduit/Health, Conduit/Location, Conduit/Phone - opt-in phone data syncConduitWatch/ - the Apple Watch appShared/ - code shared with the extensions and the Watchdocs/FEATURE_MAP.md - features that must change together, such as one behavior across the voice modes, the Watch and CarPlay (CONTRIBUTING.md says how to use it)Conduit has no analytics, telemetry, crash-reporting or ad SDKs, and its developer never receives your conversations, voice or phone data. After a crash or freeze, Conduit asks once whether to send that report (call stacks and codes, the version, iOS version and device model) to its developer, through the developer's push relay; it goes only if you tap Send. Chats, attachments and opt-in phone data go to your own Hermes host. Live voice calls go to the voice provider you choose (Google, Alibaba Cloud, OpenAI or xAI) or your own speech server. The optional push relay delivers notifications and calls through Apple; with end-to-end encryption on, it sees only their routing data, not their content. A crash report you send isn't end-to-end encrypted: the developer's relay keeps what it says.
The full privacy policy says what each party receives.
MIT
The live voice orb uses the shader from Liquid Orb Editor by LerSent001 (MIT); its notice is in Conduit/Views/LiquidOrb/LiquidOrb.metal.
Hermes Conduit is an independent project and is not affiliated with or endorsed by Nous Research.