Repository navigation
Conversation
…ch it (#21) SMS sender numbers can be spoofed, so a stranger faking the owner's number could use Hermes and its tools through owner passthrough. - hermes.passphrase (6–64 characters, optional): with it set, only texts from the owner's number that start with it are relayed. Case is ignored, a space, colon or comma must follow, and Hermes gets the text without it. Other texts stay in Messages. - Five texts from the owner's number without it within an hour pause the relay, so a short passphrase can't be guessed by texting. Misses and pauses go to the on-device event log and the Hermes screen. - Queued owner texts are bound to the passphrase requirement at receipt; changing or clearing the passphrase cancels them, like an owner or connection change. - The device API's /v1/texts (recent_texts) leaves the passphrase out of the owner's texts, so Hermes never sees it. - Hermes → Your texts to Hermes has the passphrase field and explains the trade-off. Docs and release notes for 0.6.10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014p2tHgu89Vj7BouaizkGX7
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #21.
Owner passthrough forwarded any text whose sender matched the owner's number to the full Hermes agent. SMS caller ID can be spoofed, so anyone faking that number could use Hermes and its tools.
What changes
hermes.passphrase, optional, 6–64 characters). With one set, only texts from the owner's number that start with it are relayed, for exampleotter-42 what's on today?. Case is ignored (keyboards capitalize the first word), and a space, colon or comma must follow it, sootter-420 …doesn't match. Hermes gets the text without the passphrase. Other texts stay in Messages with the usual generic notification. A text that is only the passphrase asks nothing and isn't relayed.GET /v1/texts(recent_texts, direct and hub-backed) returns the owner's incoming texts without the passphrase. Otherwise Hermes, or a prompt injection in someone else's text, could read it back out of the owner's conversation.ConfigJsonand can be pushed with the adb config receiver on a direct R1. As with every otherhermes.*key, a paired R1 refuses it over adb.docs/releases/v0.6.10.md.The passphrase is optional: existing relays keep working until one is set, and the settings note spells out the risk. Two other options from the issue aren't in this PR. An hourly cap on relayed texts mostly matters once a passphrase has leaked. A narrower Hermes toolset for the SMS session is configured on the Hermes host.
Tests
HermesTextsTest:DeviceApiTest:/v1/textsleaves the passphrase out of the owner's texts, in both the thread and the conversation list, and leaves others' texts unchanged.HermesActivityTest: the screen rejects a short passphrase, trims, saves, prefills and clears it.ConfigJsonTest: round trip, merge preservation, clearing, and rejection of short, padded, multi-line or over-long values.ConfigReceiverTest: a paired R1 refusespassphraseover adb.Locally:
:app:testDebugUnitTestpassed (399 tests, 0 failures), and:app:assembleDebugand:app:lintDebugsucceeded. Not yet tried on an R1 with real SMS.🤖 Generated with Claude Code
https://claude.ai/code/session_014p2tHgu89Vj7BouaizkGX7
Generated by Claude Code