Inspiration
We kept going back and forth with ChatGPT to get the answer we actually wanted. You type "can you make me a resume for swe," get something generic, reply "no, I meant...", and repeat while the AI re-reads the whole chat and writes another long answer. Surveys back this up: only 17% of users say they never have to rewrite a prompt, 42% rephrase the same question to get better answers, and one study found 72% of dissatisfaction with ChatGPT answers stayed unresolved even after users tried to fix it.
The problem usually isn't the model. LLMs want requirements most people don't know to include. But for almost any task, someone has already written the prompt that works. We wanted to put those prompts one click away, right where you type.
What it does
runa is a browser extension for Chromium browsers (Chrome, Edge, Brave, Arc) that works on ChatGPT, Claude, Gemini, Grok, and Copilot. It adds a runestone button next to the send button in the chat box.
Type something vague like "can you make me a resume for swe" and click the runestone. A side panel opens with templates that match what you typed, grouped by your Collections first and then the Marketplace. For that prompt, it suggests a template like "Tech resume for a target role."
Pick a suggestion and fill in the bracketed blanks (like career level and your resume plus the job description). Accept stays locked until every blank is filled. runa inserts the finished prompt into the chat box but never presses send for you.
After you use a template, runa asks how it went: stars, whether it worked, and which model you used. Templates are ranked by those ratings, and each one can show which model it works best on, with a link that opens that model's chat with the template already in the box.
Collections are shared prompt libraries for friends, a class, or a team. You sign in with Google, create a collection, and share a 6-character invite code or link. Public collections show up in the Marketplace for anyone to join, and you can save a copy of any Marketplace template into your own collection.
runa ships with built-in templates across categories like writing, interview prep, and coding.
How we built it
- Extension: WXT, React, and TypeScript (Manifest V3). A content script docks the runestone next to each site's send button and writes the filled template into the chat box.
- Template matching with Gemini: when you click the runestone, the extension sends your prompt and candidate templates to a small FastAPI server. An embedding step shortlists the 20 closest templates so the request stays small, then Gemini Flash-Lite decides which ones actually fit what you're trying to do, ranks them best first, or says none fit. If Gemini is unavailable, the embedding ranking is used, and if the server is unreachable, the extension falls back to a keyword match in the browser. Gemini also picks an icon for each new collection from its name.
- SpacetimeDB on Maincloud: stores users, collections, templates, ratings, and the live counter, and pushes changes to every open panel in real time. Writes go through server-side reducers that require Google sign-in.
- Ranking: each template's score is a Bayesian average of its stars (so one 5-star rating can't beat twenty 4.5s), scaled by how often people said it worked.
- Landing site: Vite and React, with a live counter, install guide, and share pages for templates and collection invites.
- Testing: Playwright end-to-end tests run the built extension against a mock chat page that can impersonate each of the five sites.
Challenges we ran into
- We changed what runa is mid-hackathon. It started as a prompt optimizer that rewrote and compressed your prompt (LLMLingua-2 plus an LLM rewrite) and tracked tokens saved. We realized a rewriter still guesses what you meant, while a template someone already validated asks you for the missing details. In the last stretch we cut the rewrite, the savings tracking, and the popup, and refocused runa on Suggestions, Collections, and the Marketplace.
- SpacetimeDB vs. Chrome's security rules. The SpacetimeDB SDK builds its serializers with
Function(), which Manifest V3 blocks on extension pages. We moved the connection into a sandboxed iframe that holds the WebSocket and streams plain data to the side panel. - Five chat UIs, five editors. Each site uses a different input (plain textarea, React, ProseMirror, Quill). Setting the text directly often left the site thinking the box was still empty, so we insert with
execCommand('insertText')and fall back to a synthetic paste event so every editor registers it. - Suggesting nothing beats suggesting something wrong. Embeddings alone confuse near-duplicates and surface words (an error message mentioning "undefined" can match a template about undefined terms). So we let embeddings only build a shortlist and have Gemini read the prompt for intent and make the final call, including saying no template fits.
Accomplishments that we're proud of
- A complete flow on five AI platforms: type, click, pick, fill, insert.
- Gemini-powered matching that reads what you're trying to do, not just which words you used, and stays fast because it only ever sees a 20-template shortlist.
- Real-time shared collections: one person publishes a template and it appears on a teammate's panel without a refresh.
- Graceful degradation: runa still suggests templates with no API key, no ML models installed, or no server at all.
What we learned
- Most bad AI answers come from missing context, and templates with blanks are a surprisingly direct way to get people to supply it.
- Embeddings are great for narrowing hundreds of options down fast, but an LLM is much better at the final judgment of what someone actually means.
- Cutting a feature we'd already built (the rewriter) made the product clearer.
- Building on top of third-party sites means planning for their HTML to change under you.
What's next for runa
- Host the matching server. Right now it runs locally, so without it, suggestions fall back to keyword matching.
- Org collections for teams and schools.
- Measure the impact. Track whether templated prompts actually reduce follow-up turns, so we can put a number on fewer do-overs instead of only describing the mechanism.
- A Chrome Web Store listing so install doesn't require Developer mode.
Built With
- chrome
- fastapi
- gemini
- google-oauth
- node.js
- numpy
- playwright
- pytest
- python
- react
- scikit-learn
- sentence-transformers
- spacetimedb
- tailwindcss
- typescript
- vite
- vitest
- wxt
Log in or sign up for Devpost to join the conversation.