Inspiration
Most AI products aren't slop because they don't work. They're slop because the fix hurts more than the problem did: finding it, signing up, learning the UI, building the habit, paying, keeping it up. If the problem doesn't hurt more than all of that, nobody switches, no matter how good it looks.
We kept seeing it in what people around us build, so we wanted a way to check an idea against that before anyone spends a weekend on it. Then we wanted the next step too: if someone else is working on the same problem, you should meet them.
## What it does You text SlopStop an idea, or what you're already building. In about 4 seconds it texts back:
- A score out of 100, with the two numbers under it: how much the problem hurts and how much the fix costs to adopt, each rated 0 to 10.
- A call (build it, sharpen it, or drop it), one line on why, and one thing to do in the next 24 hours.
The math is fixed and lives in code, not in the model:
$$ \text{score} = \min\big(100,\ \max(0,\ 10p - 5f)\big), \quad p, f \in {0, \dots, 10} $$
The problem $p$ counts twice as much as the fix $f$, because of loss aversion: people weigh giving up what they do now at about $2\times$. A fix that costs double the pain scores $0$. 70 and up means build it, 40 to 69 means sharpen it, under 40 means drop it or flip it. The same text always gets the same score.
If you're new and nobody is close to your idea yet, SlopStop asks one question, once, the one that changes the most (like "you in college?"), then comes back with the plays your answer unlocks.
When another builder texts an idea on the same problem, SlopStop offers an intro, and both of you have to say yes. The other person hears nothing until you do. Numbers are only swapped when both say yes, and then each side gets a contact card.
Every idea also grows live on a tree map. Each big branch is a kind of problem. Tap one to zoom into its smaller branches, tap again to read the ideas and their scores. A gold fruit is an idea worth building, a green leaf is one to sharpen, a dry leaf is one to drop. A new text grows its leaf on the tree as it lands. The map shows titles and scores only, never who sent them. Start a text with private: to keep an idea off the map.
There's no app and no signup. You already know how to text.
## How we built it
- iMessage through Photon's Spectrum (
spectrum-ts): read receipts, typing indicators, tapbacks, effects and contact cards. - Gemini rates the two inputs and writes the replies, with a JSON schema so it can't skip the ratings. A fast flash-lite model goes first (about a second), with fallback models behind it.
- The score is a few lines of TypeScript. The model only rates the inputs. Code does the math.
- Matching takes two steps: Gemini embeddings find candidate ideas, then a yes/no read by the model decides whether it's really the same problem.
- The tree map is an SVG you zoom into, fed live by a small Node server that also serves the score graph and handles joining. Photon's API registers your number and returns a link and QR code that open Messages already addressed to SlopStop.
- Storage is a JSON file behind a
Storeinterface, so it can move to a real database without touching the rest.
## Challenges we ran into
- A shared line. On Photon's shared line, the agent can only talk to registered numbers and can't text first. So joining became one step: type your number on the map, scan the QR code, and Messages opens with "my idea:" already started.
- Real texts broke things tests didn't. One text answered SlopStop's question and pitched a new idea at the same time, and the first idea got re-scored with the second idea's numbers. Now context can never rewrite what an idea is.
- Matching was too loose. A laundry tracker got matched to a notes app. Now embeddings only pick candidates, and a second read decides.
- Matching was too loose. A laundry tracker got matched to a notes app. Now embeddings only pick candidates, and a second read decides.
- The model claimed actions it hadn't taken. It would say it deleted something it hadn't. Now delete is a real command, and the model can't claim actions.
- "ok" isn't consent. Swapping numbers takes a clear yes from both people.
- Rate limits. The free Gemini key allows about 15 scored texts a minute per model. Backup models with their own limits, plus a short wait and retry, keep it up under load.
Accomplishments that we're proud of
- It passes its own test: nothing to download, nothing to learn.
- A real reply on a real phone in about 4 seconds.
- We ran 55 unusual texts through the live model (long voice dumps, one word, two ideas in one text, rude, off topic) and fixed what broke.
What we learned
The hard part of an AI product isn't the model. It's everything around it: what counts as consent, when to ask a question, when to stay quiet, and what the model is never allowed to claim. The product only felt right once our fix had less pain than the problem, which is the whole thesis.
What's next for SlopStop
- A dedicated line, so anyone can text one number without joining first.
- Clubs, classes and hackathons as the first maps, since rooms full of builders are where intros matter most.
- Smarter intros: same problem, different approach, the pairs most worth meeting.
Built With
- css3
- gemini
- gemini-api
- gemini-embeddings
- google-genai
- html
- imessage
- javascript
- node.js
- photon
- qrcode
- spectrum-ts
- tsx
- typescript
Log in or sign up for Devpost to join the conversation.