ChatRelay is an invisible macOS helper that moves conversation context between the native ChatGPT, Claude, and Gemini apps through one Markdown file in an Obsidian vault.
Type \handoff in one chat to save the current context. Type \resume in a new chat to continue from it.
- macOS 14 or newer
- Xcode Command Line Tools or Xcode
- Native ChatGPT, Claude, or Gemini for macOS
- An existing Obsidian vault
Clone and enter the repository:
git clone https://github.com/tanishsidhu/ChatRelay.git
cd ChatRelayBuild ChatRelay:
Scripts/build-app.sh releaseConfigure the Obsidian vault that should contain the handoff:
.build/app/ChatRelay.app/Contents/MacOS/chatrelayctl configure --vault "$HOME/Documents/Obsidian/Context"Replace the example path if your vault is somewhere else. ChatRelay creates Handoffs/CURRENT_HANDOFF.md inside that vault after the first successful handoff.
Install and launch the background app:
Scripts/install-app.shThe default installation is $HOME/Applications/ChatRelay.app. To install in /Applications instead:
CHATRELAY_INSTALL_DIR=/Applications Scripts/install-app.sh- Open System Settings.
- Go to Privacy & Security > Accessibility.
- Add and enable
ChatRelay.appfrom the installation directory. - Launch ChatRelay again.
ChatRelay has no window, Dock icon, or menu-bar item. It registers itself to start at login.
In an existing conversation, type exactly:
\handoff
Press Return. ChatRelay replaces the command with a structured context request. Keep that chat visible until you see the "Handoff saved" notification. When the marked response is complete and valid, ChatRelay atomically replaces Handoffs/CURRENT_HANDOFF.md.
In a fresh chat in another supported app, type exactly:
\resume
Press Return. ChatRelay inserts the saved handoff and submits it.
These triggers use a backslash prefix so they do not collide with provider slash-command menus. Other backslash-prefixed messages are ignored.
Do not use \handoff as the first message in an empty chat. There is no conversation to summarize, and a provider may fall back to its own saved memory.
"$HOME/Applications/ChatRelay.app/Contents/MacOS/chatrelayctl" doctorThe report shows permissions, supported app discovery, configured vault readiness, and whether a handoff file exists. It never prints conversation or handoff contents.
- ChatRelay runs locally and uses no model API, server, account token, or analytics.
- It monitors Return only in supported native app bundle identifiers.
- Responses stay in memory except for the validated current handoff.
- Partial or malformed responses never replace the previous valid file.
- The handoff directory should remain excluded from vault Git synchronization.
