Clutter
Inspiration
Most of our best ideas show up while we're talking: on a walk, on a call, halfway through explaining something else. Then they're gone, or they end up in a notes app as one line we can't make sense of a week later.
And when we turned to AI for help, it kept handing us its own ideas. That's fast, but it isn't ours anymore. We wanted the opposite: something that listens while you think out loud, keeps track of everything you said, and pushes back the way a good mentor would. It asks "how will you actually do that?" instead of telling you what to build.
What it does
Tap the mic and start talking. As you go, Clutter sorts what you say into tracks: one for the app idea, one for the pitch, one for the thing you keep circling back to. Each track keeps your own words and a short summary of where your thinking stands. Change subjects and it starts a new track. Go back to an old one and it picks that one up again.
Clutter stays quiet while you think. It only answers when you turn to it, like "what do you think?" or "do you feel me?". When it does, it asks grounding questions instead of cheering you on, and it only praises something it can back up with your own portfolio, links or past work.
Every session is saved to Studio with its tracks and transcript, so you can pick it back up later and keep talking where you left off.
On your Profile you add who you are, your links, your GitHub repos and your documents. That's all Clutter knows about you. You can turn off learning from conversations at any time, and you can open Adobe Express right there to design something and save it back into Clutter.
Never your ideas, only yours
Clutter never makes up ideas for you. Everything it says about you comes from something you gave it: your profile, a link, a file, or something you said. If it doesn't know, it asks. Recordings aren't stored, only the words. Each user's data sits in its own database schema, and deleting your account drops the whole thing.
How we built it
- Listening and talking. The browser talks straight to Grok's realtime voice API over a WebSocket. A short-lived token from our server means the real API key never reaches the page. An AudioWorklet downsamples the mic to 16 kHz PCM and sends it in 50 ms chunks.
- Sorting into tracks. The voice model only talks. Every two seconds, the new transcript goes to a fast Grok text model with nine function tools:
create_track,add_to_track,update_summary,switch_track,move_thought,edit_thought,merge_tracks,note_peopleandreply_to_user. The calls it returns are the changes to the board, so tracks grow while you're still mid-sentence. - Staying quiet. Grok's realtime voice answers at every pause, so we put a gate in front of it. A reply plays straight away only if you obviously asked. Otherwise it's held while the track sorter decides whether you were asking (
reply_to_user). If you weren't, the reply is dropped and removed from the conversation, so Clutter never builds on something you never heard. - Knowing you, honestly. Your profile, links, GitHub READMEs (through the GitHub API) and documents (PDFs through xAI's Files API, Word files through mammoth) are turned into a short picture of you. Each fact keeps its source. The relevant parts go straight into the voice conversation, so Clutter can quote your own work back to you.
- One schema per user. Postgres creates a separate schema and role for every Auth0 user. The app's database role owns no tables, so row-level security always applies on top of the schema split. xAI has no embeddings, so memory search uses Postgres full-text search.
- Adobe Express. The Express Embed SDK opens the full editor over the Profile page. "Save" brings the design back as an image, and it's stored like any other document.
Stack
- Next.js 16 + React 19 + TypeScript: the app and its API routes, deployed on Vercel.
- Auth0: sign-in, and the identity every user's schema is built from.
- Supabase Postgres + Drizzle: a schema per user, row-level security, full-text memory search and private file storage.
- xAI Grok: realtime voice, track sorting, learning from conversations and reading files.
- Adobe Express Embed SDK: designing inside Clutter.
- Exa: a search route that only answers when you say you're stuck and ask.
Challenges we ran into
Running out of Gemini. We started on Gemini Live. Sorting tracks every two seconds burned through the quota on day one, so we moved voice, sorting and file reading to xAI Grok in the middle of the hackathon.
An AI that talks too much. Grok's realtime voice replies at every pause, and we wanted the opposite. The reply gate, which holds, plays or drops each reply, took more rounds than any other feature.
Slow sign-ins. Pages started taking seconds, then minutes. Every request was re-running the per-user database setup and taking locks on all of that user's tables. Requests killed mid-way left connections holding those locks. We added a version gate so the setup only runs when it needs to, timeouts for stuck transactions, and a sign-in path that doesn't lock at all.
Adobe access. We planned to read users' Creative Cloud Libraries, but that API isn't open to personal developer accounts. We switched to Express Embed, so you can make new designs inside Clutter.
Accomplishments that we're proud of
- Tracks appear on screen while you're still talking, in your own words.
- Clutter knows when to keep quiet, and when it does speak it pushes back instead of agreeing.
- Every user's data is isolated at the database level, not just filtered in code.
What we learned
- Holding back is harder to build than generating. We spent more effort deciding when Clutter shouldn't speak than on what it says.
- Splitting the work helps. One model talks, another sorts, and the sorter's tool calls are simple enough to check and replay.
- Locks and timeouts matter more on serverless than we expected. A request that dies mid-transaction can quietly hold up everyone behind it.
What's next for Clutter
- Breaking a track down into features and tasks, so a ramble can turn into a plan.
- Turning on Exa search in the app for when you say you're stuck, seeded with your own work.
- Moving to our own domain, clutterup.space.
Set up
GitHub: https://github.com/ToluwaniEsan/BrainStorm
npm install
npm run db:migrate
npm run dev
Copy .env.example to .env.local and fill in the Auth0, xAI, Supabase and Adobe Express values (Exa and GitHub are optional). npm run check:xai, check:db, check:storage and check:exa confirm each key works.
Built With
- adobe-express
- auth0
- drizzle
- exa
- grok
- next.js
- postgresql
- react
- supabase
- typescript
- vercel
- xai
Try it out
Built With
- auth0
- css
- drizzle
- exa
- grok-api
- javascript
- nextjs
- supabase
- typescript
Log in or sign up for Devpost to join the conversation.