Skip to content

I vibe-coded a group chat for my friends, with voice calls, GIF stickers it draws itself and an accessibility mode

Lukas Stene Smestad@smestad

2026-10-24 · Posted with Claude Code

Follow

For a school assignment on vibe coding, I turned down a dozen app ideas before settling on a chat app for my friend group. I steered Claude Code with short, often messy prompts and a few screenshots, and in about a day it became Gjeng: groups, friends and DMs, voice calls, profiles, privacy settings, themes, search, GIF stickers, password accounts and an accessibility mode. The demo runs on my laptop with seven made-up friends you can jump in as.

Save

What made it work

  • Short, messy prompts were enough: it was fast, and it understood what I meant even when I didn't say it well
  • Showing beat describing: a screenshot of a call screen I liked, or arrows drawn on my own layout, became the feature
  • Every feature came with tests in two real browsers, including a fake microphone to prove sound reaches the other person
  • It screenshotted its own work after each change and caught layout bugs before I saw them
  • Asking "should we?" instead of "do it" got honest answers, like why accessibility mode should use dark text on light

The screens

Cover: the Gjeng logo and title above two screens, a group call and accessibility mode, with three pills: voice calls browser to browser, accessibility mode, 92 automated tests
Cover: the Gjeng logo and title above two screens, a group call and accessibility mode, with three pills: voice calls browser to browser, accessibility mode, 92 automated tests
A group call in the Gym crew chat: Jonas has a green talking ring, Sara and Emma are darkened with red mute icons, and mute, deafen and leave buttons below
A group call in the Gym crew chat: Jonas has a green talking ring, Sara and Emma are darkened with red mute icons, and mute, deafen and leave buttons below
The Gym crew group chat with reactions, a typing indicator, folder-style group icons on the left and the member list split into online and offline
The Gym crew group chat with reactions, a typing indicator, folder-style group icons on the left and the member list split into online and offline
Sara's profile card with a purple banner, about me, member since, shared groups and one mutual friend
Sara's profile card with a purple banner, about me, member since, shared groups and one mutual friend
The GIF tab above the message box, with animated stickers like GG, LOL and Leg day, plus search, recent and favourites
The GIF tab above the message box, with animated stickers like GG, LOL and Leg day, plus search, recent and favourites
Appearance settings in the Midnight theme: nine theme choices and colour wheels for background, details and text
Appearance settings in the Midnight theme: nine theme choices and colour wheels for background, details and text
Accessibility mode: near-black text on a warm off-white background with bigger, wider text and clear outlines
Accessibility mode: near-black text on a warm off-white background with bigger, wider text and clear outlines

Build your own version

Yours goes up next to @smestad’s as a vibe off, and @smestad is told. Credit for the idea stays with them.

Build your own version
How it was madeThe prompt, tools, time, what’s left to make it real, links.

What’s left to make it real

Next: putting it online. Calls only work on the same network today, because calling across the internet needs a relay server (TURN), and I left those out since they're run by outside companies. Storage is one JSON file, with uploaded files inside it (1 MB each), so it needs a real database and file storage before more than a class uses it. Accounts have no email, so there's no password reset yet. In a call everyone connects to everyone, which is fine for about six people; bigger calls need a media server in the middle.

Made with
Claude Code, VS Code, React, Vite, Node.js, Socket.IO, WebRTC, Playwright, Vitest
Took
about a day
How
Claude Code (Opus 5.5) in VS Code. React and Vite in the browser, Node.js with Express and Socket.IO on the server, WebRTC for voice calls, and a JSON file for storage. I gave feedback after every round; Claude wrote the code, ran 62 unit tests and 30 Playwright browser tests, screenshotted every screen to find layout bugs, and kept a build log of each prompt and fix.
The prompt
Let's improve the settings with a few more options a user would want. Privacy: "Who can add me as a friend" (everyone / no one) and "Who can see my friends and mutual friends" (anyone / friends of friends / friends / no one). Appearance: a colour wheel for the general background colour that keeps the contrast between backgrounds but changes the base colour from grey to any colour, a similar wheel for the orange details, and one for text that forces enough contrast if the colours are too similar. Plus some base themes, for example dark, light, retro, retro dark and cream. Accessibility: a settings page, and also a clear "Enable accessibility mode" toggle when registering. (Lightly edited for spelling and clarity.)
In Claude Code, VS Code, React, Vite, Node.js, Socket.IO, WebRTC, Playwright, VitestModel Claude Opus 5.5Took about a day
Try it
Read the code

Building on it rather than answering it? Post a remix and it links back here.

Share it

Comments

Nothing yet. Ask @smestad how they got it to work, or say what you liked.

Sign in to comment — you come straight back here.

More builds

Post a build

Have your AI post it

Give this line to your AI, like Claude Code or Cursor. Nothing publishes until you say so.

  1. 1Paste it to your AI
  2. 2It sends you a link
  3. 3Check it, pick a username, publish
Prefer a form? Post yours · How it works