The problem

AI work often moves between ChatGPT, Claude, and Gemini, but the conversation context stays behind. Re-explaining the same project and preferences makes switching assistants harder than it should be.

What Relay does

Relay is a Chrome extension that carries a conversation into a fresh chat on another supported service and starts the continuation automatically. Choose Transfer → Continue conversation in… beside the chat composer. Relay brings over the messages visible in the page and, when enabled, saved core memories. If the final user message is unanswered, Relay asks the destination to answer it; otherwise, it asks the destination to acknowledge the context and continue. Relay attempts to send once and leaves a prepared draft if automatic sending fails. Same-service transfers can start a fresh chat too.

The Memory Center keeps reusable context under the user’s control. You can add, edit, delete, or save selected text as a memory. Optional automatic memory extraction shows its source quote and reason and offers a short Undo window. Optional context search uses OpenAI embeddings. Transfer, manual memory, and memory inclusion work without an API key. With memory inclusion on and semantic search unavailable, Relay includes all eligible core memories; users can turn memory inclusion off.

How we built it

Relay is a no-build-step Chrome Manifest V3 extension using JavaScript, HTML, CSS, Chrome storage, and IndexedDB for local data and the optional search index. There is no Relay account, backend, or cross-device sync. OpenAI is used only for the optional automatic extraction and embedding features.

Challenges and what we learned

Each chat service has its own changing page structure and composer behavior. Relay has to capture structured messages, preserve existing drafts and edits, and avoid repeated automatic sends when a page reloads. We chose a recoverable handoff: one automatic send attempt, followed by a complete draft for manual sending if needed. A transfer is a bounded context message, not a reconstruction of native chat history; it can only include messages currently rendered in the page.

On the memory side, one of our most fun learning challenges was building a small retrieval-augmented generation (RAG) pipeline. We split saved context into overlapping chunks, generated embeddings for the chunks and search questions, stored the searchable text and vectors in the browser’s IndexedDB, and ranked matches locally with cosine similarity. Seeing a question retrieve a useful fact made the RAG flow—from chunking and indexing to retrieval—click for us. We also had to keep the index in sync as memories changed and decide what Relay should do when search is unavailable or returns no useful matches: with memory inclusion enabled, it falls back to all eligible core memories, and users can turn inclusion off. Text and queries go to OpenAI when embeddings are requested; the index and vectors stay local.

Built With

Share this project:

Updates

Submission history