We should go there sometime.

Your group chat has a restaurant link that got a fire emoji and vanished under 200 messages. Keena is the app I designed and built so couples and friend groups save those places in one list, rate them together, and actually go.

Weekend Crew0 places saved
  • Tap Save to Keena on a place in the chat
Weekend CrewAlex, Sam, you
213 unread

    What opened while you were away

    Pick when you last opened Keena, and the feed marks what opened since. Save any you like.

    Last opened
    Welcome back
    27 new placesopened across Perth since your last visit

    New in Perth

      The whole group rates the shortlist

      Each person scores the places, and Keena sorts the list by the group's average. Alex and Sam's scores arrive while you rate, the way they sync in the app.

      Rate all five: tap a star, or swipe right for 5 and left for 1

      Group priorityLive

        Rate a place and it appears here, sorted by the group's average score.

        Plan a day out from places you saved

        First, Keena filters your saved places down to the ones nearby and open at the right time. Only then does the AI put them in order, so it can't suggest anywhere you haven't saved.

        Pick a day out, then swap a stop. The other stops stay put.

        Describe your day out…

            "I don't mind, when works for you?"

            The organiser proposes a few days, everyone ticks the slots that work, and Keena finds the one that suits the most people.

            BreakfastLunchDinner

            YouAlexSam

            Tap the times you're free, then close the poll.

            176 places in my own list

            Screens from my own Keena: the list, the map and the new openings feed.

            Live ratings in private groups

            When Alex rates a place, it should show up on your phone straight away. Supabase's standard live updates couldn't deliver it without loosening the rules that keep each group's places private, so I built a different route that leaves those rules alone.

            AAlex rates FARRA★★★★★
            PostgresRow Level Security on every table
            Change feed, filtered by RLSTrigger → private broadcastBlocked: your phone isn't allowed to read Alex's rowSent only to group members, no rules loosened
            YYour phoneNothing arrivesFARRA moves up, live
            Built with
            Next.js 16, React 19 and TypeScript. Supabase: Postgres with Row Level Security, and Realtime broadcast. Google Places API and MapLibre GL. Claude, OpenAI and Gemini. Vercel Cron. Playwright and Vitest.
            Size
            130+ Postgres migrations and 160+ test files.

            Lessons from building it

            1. 01

              I built for two people, then rebuilt for groups

              Version one assumed exactly two people. Moving to groups of any size changed the data model, the security rules and the copy. Designing sharing first would have saved a rewrite.

            2. 02

              The planner improved when the AI decided less

              It got reliable once code made the hard decisions (area, opening hours, type) and the model only ordered and explained what was left.

            3. 03

              A draft stage touched half the app

              Adding a draft stage for plans sounded small. Then I had to make reminders, busy dates and invites skip every draft.

            I build business systems the same way: the rules sit in one place, and the automation only acts inside limits you set. Tell me about yours →