[–] [S] 1 point 3 hours ago

Fair points, thanks — the "says a lot without saying much" one is on me. Concretely: it's a web app where you create AI chat characters (personality, backstory, avatar), talk to them, and then fight them in a timing-based fighting game — stop a moving bar in the green zone to hit, parry on a shrinking circle. Not a tabletop RPG, closer to a browser fighting game with a chat app wrapped around it.

On the missing About/Privacy/Legal pages — you're right, and that's a real gap, not just a trust vibe. I'm adding a proper privacy policy and terms; an app handling accounts and payments shouldn't ship without them. Thanks for flagging it, genuinely.

The "handholding" bit I'd push back on a little — the AI characters are just one option, you can create whatever you want and the ones you make are what you end up fighting. But I get why the landing page didn't make any of this obvious. That's feedback I needed.

  • source
  • parent
  • context
  •  

    Hey everyone!

    I'm a full-stack dev from Italy. I built a project solo that started as one thing and became another, and I wanted to share it here — mostly for the technical side, but I'll explain the whole thing.

    It's called vibeAI, and it's two halves that fit together.

    ━━ THE CHAT SIDE ━━

    • Create your own AI characters: personality, backstory, avatar, tone of voice
    • Chat one-on-one, or put several of them in a group chat and let them interact
    • Discover and chat with characters made by other users
    • Free daily messages for everyone

    ━━ THE GAME SIDE (Vibe Battle) ━━

    There's a full fighting game inside the app, and the enemies include the AI characters you created yourself.

    • Timing-based combat, not button mashing: stop a moving bar in the green zone to hit, tap a shrinking circle to parry — watch out for feints
    • Campaign of 60+ opponents: 50 presets plus your own characters, shuffled with a seed so every run is ordered differently
    • A boss "cameo" that ambushes you mid-run — unbeatable by design, it wrecks you and leaves
    • A 3-phase final boss that scales to your build
    • Skins with permanent HP/damage bonuses, premium moves limited to one use per match
    • Live 1v1 PvP, matched by XP
    • Global leaderboard

    ━━ THE TECHNICAL PART (the reason I'm posting) ━━

    The thing that took longer than everything else combined was the multiplayer anti-cheat. The first version was client-authoritative — each client computed its own damage and reported it. Took me five minutes to realize you could just open the console and claim "I did 9999 damage." Useless.

    So I moved all authority to the server:

    • Match state (HP, turns, rounds) lives on the server, not the clients
    • Clients NEVER declare damage — they only report how accurate their timing was (perfect / good / miss)
    • The server rolls the damage by reading real stats from the database
    • End-of-match rewards go through signed, single-use sessions with daily caps, so tampering with the browser client gains nothing
    • Real-time sync runs on Supabase Realtime broadcast, with a REST fallback for when the websocket doesn't deliver

    Stack: React + TypeScript, Supabase (auth, Postgres, Realtime), Stripe, Vercel. It's a PWA — no app store, installs to the home screen on Android and iOS.

    ━━ ON MONETIZATION, to be upfront ━━

    Free to play, no content locked behind payment — campaign, final boss and PvP are all accessible. Optional purchases (cosmetic skins, in-game currency) exist to cover API and infra costs. Saying it upfront rather than hiding it.

    ━━ ━━ ━━

    Heads up: the UI is in Italian — it was built for the Italian Gen Z crowd, and the preset characters are local archetypes. But the combat is bars, circles and timing, so it plays fine in any language, and the characters that matter are the ones you create yourself.

    If anyone here has worked on real-time multiplayer or Supabase Realtime, I'd love to compare notes — there are a couple of choices (abandoned-match handling, the broadcast fallback) I'm not sure I got right.