-
-
A conversation that refactors who you are.
-
Two voices, three modes — choose how you want to think.
-
Refract refuses to solve. It surfaces the framework behind your problem first.
-
The framework reveal — the frame you're in, and the one you could be in.
-
Council of Time — your past self and future self, thinking with you at once.
-
After the reshape, your future self writes you a letter from inside the new frame.
What if the version of you who already outgrew this problem could speak back?
Most problems aren't problems. They're frames. Solve the stated problem and you stay inside the cage that produced it. Refract refuses to answer your question. It surfaces the framework producing it, names the assumption buried inside, offers an alternative frame where the constraint dissolves, validates that frame with a real-world example pulled from live search — and only then walks you to one concrete action you can take this week.
It does all of this in your own voice across time.
Inspiration
Every AI product races to be helpful. Refract is built on the inversion of that. The people I watched stay stuck weren't missing answers — they were missing the question. They'd carried a constraint so long they'd stopped seeing it was a choice of framing. "I can't quit my job because of money" isn't a money problem — it's a frame. I wanted a tool that refuses to solve the stated problem until it has surfaced and reshaped the frame producing it, and that does it in a voice you can't dismiss: your own.
What it does
Refract runs an 8-step ritual. It refuses to solve. It asks framework-surfacing questions. It names the framework, names the buried assumption, offers one alternative frame, pulls real-world precedent from live web search, and gives you one concrete action this week.
The killer feature is Council of Time. Six onboarding questions build two profiles of you — your past self and your future self: the same underlying voice, a different posture. Every reshape can be spoken by past self, future self, or both selves debating across time. There is a free-conversation Council mode with both selves at once, a Simple Reflective mode with one self, and after a reshape your future self can write you a letter from one year inside the new frame.
How I built it
Built end-to-end on MeDo. React + Vite + TypeScript + Tailwind frontend; six Supabase (Deno) edge functions proxying Gemini 2.5 Flash, Bing-style search, and image generation through MeDo's gateway. Anonymous, localStorage-only — your mirror never leaves your device.
The piece I am proudest of is the mid-stream multi-tag protocol. At the framework reveal the AI emits two inline tags in a single response — one carrying a web-search query, one carrying an image prompt. The frontend intercepts both mid-stream, strips them from the visible text, fires search and image generation in parallel, and re-injects the search results into the conversation so the AI continues coherently past the seam. MeDo generated that two-pipeline orchestration — edge functions, parallel calls, mid-stream tag stripping, SSE forwarding — in a single pass.
Challenges I ran into
- Turn discipline. A multi-turn ritual where the model must stop after each step and never skip ahead took a strict, turn-by-turn system prompt to hold.
- A self-aborting stream. The hardest bug: a useEffect cleanup that aborted the AI request was wired to fire on every isStreaming state change — so the stream killed itself the instant it began. Splitting it into an unmount-only effect fixed it.
- Voice consistency. Keeping past self and future self in the same underlying voice texture — a different posture, not a different character — across every turn.
What I learned
The discipline is the product. Refusing default LLM behavior — no emoji, no validation, no bulleted brainstorms, no answering before the frame is surfaced — is harder and more valuable than adding features. And orchestrating several AI integrations through one gateway is mostly about the seams the user never sees.
Built With
- deno
- gemini
- gemini-2.5-flash
- lucide-react
- lz-string
- medo
- radix-ui
- react
- supabase
- tailwindcss
- typescript
- vite
Log in or sign up for Devpost to join the conversation.