What it is

hi pet bye pet is a draw-and-caption party game that lives entirely inside a Reddit post. You draw a stupid little guy and publish it. Then everyone gets a feed of each other's guys. You look at one, say something about it, reveal what everybody else said, react to the funniest captions (funny / same / diabolical / aww), and swipe to the next guy.

Draw something stupid. Say something stupid.

Inspiration

I love Japanese ōgiri (大喜利), the improv game where people get a prompt and race to be the funniest. The funniest prompt of all is a weird drawing someone made in thirty seconds. Reddit already runs on captions and comment-section one-upmanship, so we built a game that turns that instinct into the whole loop: draw the prompt, then the whole subreddit riffs on it.

How I built it

  • Devvit (Reddit's Developer Platform) runs the app inside a post — webview client, serverless backend, and Redis.
  • A hybrid client: React 19 + Tailwind v4 owns the DOM and routing (the Vote / "Say Something" feed), while Phaser 4 is embedded for the home screen and the freehand pixel-art drawing editor (layers, a color wheel with hex entry, an optional pixel-art grid, symmetry, undo).
  • A Hono server exposes a small /api surface — draw/save/publish, feed assembly, captions, reactions, and moderation — all persisted in Redis.
  • House guys: 25 hand-drawn starter characters ship in code and merge into the feed at read time, so the game is never empty and a solo player always has something to caption.
  • Moderation is on write: names and captions are blocklist-filtered and length-capped, anyone can hide or report a guy or caption, and enough distinct reports auto-removes it from everyone.

Challenges we ran into

  • Two engines, one webview. Marrying React (routing + feed UI) with an embedded Phaser scene (the drawing editor) inside a single Devvit webview meant carefully handing off control and keeping one visual language across both — we built a shared "sticker" ink-and-shadow style so it reads as one app, not two.
  • Stable identity vs. redraws. Each player has one guy at a stable id ({username}:0). When someone redrew, the new drawing silently inherited the old one's captions and report history. We had to add an explicit "start fresh" reset that wipes captions and moderation state for that id.
  • Featuring constraints. Reddit's featuring rules want a single, no-scroll screen, so the whole caption-reveal-react-next loop had to fit one viewport with no scrolling.
  • Local iteration. Devvit playtest re-uploads on every change with no hot-reload, so we built a Vite sandbox that runs the real client against an in-memory mock of the /api — and had to keep that mock honest against the real server.

What we learned

Devvit is a genuinely different target — you're shipping a game into someone else's feed, under their moderation and featuring rules. We learned to embed Phaser inside a Devvit webview, model a social game in Redis, and design moderation as a first-class feature rather than an afterthought.

What's next

Player-customizable personalities and voices for your guy, caption leaderboards, and a daily featured guy.

Share this project:

Updates

Submission history