Inspiration

Everyone's heard "sleep on it before you buy", but doing that alone rarely works, because there's no one to actually answer to. What does work is the same thing that keeps you honest about anything else: other people's opinions. Marinate turns the classic cooling off trick into a social one. Instead of just waiting, you post the purchase, your friends weigh in, and the wait itself scales with how much damage the buy could actually do.

What it does

You post a tempting purchase, targeted at everyone, a specific group, or specific people, and it drops into their Blend feed (a TikTok/Reels-style vertical scroll). Friends vote Approve or Object with a reason once a price-scaled timer starts (bigger price, longer wait). Once the timer ends, you open a chest to reveal the verdict and decide: buy anyway or skip. If you buy against an Object, you self-declare a dare as your forfeit. A monthly Loserboard, scored per group, ranks who racked up the most Objections. A companion Chrome extension lets you post a product straight from an Amazon page without leaving the tab.

How we built it

React + Vite frontend, Supabase for auth/Postgres/row-level security (no custom backend for the core loop), deployed on Vercel. The domain rules, timer tiers, vote tallying, feed shuffling, Loserboard math, live as pure, framework-free JS modules with plain-Node self-check scripts, so they could survive a full UI rewrite untouched. The Chrome extension is deliberately bundler-free: raw fetch straight to Supabase, with original-tag scraping and selector fallbacks for product data

Challenges we ran into

Mid-build, we pivoted from a courtroom/case-list UI to a full vertical Reels feed, complete UX rebuild that only worked because the domain logic was already decoupled from rendering. Getting hidden-until-reveal voting to actually be secure (not just hidden in the UI) meant leaning on Postgres RLS instead of client-side trust. And making forfeits feel meaningful without turning them into a nagging enforcement system, we landed on self-declared, no-proof dares to keep the accountability social rather than punitive.

Accomplishments that we're proud of

Row-level security doing real work, votes are invisible pre-reveal and inserts are self-scoped at the database level, not the UI. A feed architecture clean enough that we rebuilt the entire interaction model mid-hackathon without touching the schema. A zero-build Chrome extension that still writes safely and directly to a real database. And a design system that reads like an actual social app.

What we learned

Keeping domain logic pure and separate from components is what made the mid-hackathon pivot doable, the rules didn't have to move when the UI did. We also learned to trust Postgres RLS as the real security boundary instead of re-checking permissions in the client. And, the core insight held up in practice: the timer isn't what stops impulse buys, it's the window it opens for someone else's opinion to land before you act.

What's next for Marinate

Real-time notifications when a friend Objects or your chest is ready; restoring the full price-scaled timer tiers (currently shortened for demo purposes) and re-enabling email confirmation; production polish like loading/error states; extending the extension past Amazon; and possibly bringing back photo-proof for forfeits.

Built With

Share this project:

Updates