Friends record short voice wishes. Each voice lights a candle.
Translation pending
SocialGitHub @RevalloOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗rea# Voice Gift
Friends record secret voice messages. When you send the gift, each one lights a candle.
A web app (no install) for group voice gifts, built as a prototype for collecting real Indonesian speech with captions the speakers corrected themselves. Works on phones and desktop.
Flow
/new: the occasion, who it's for, decorates the cake / bouquet / lanterns,
then logs in with Google to save it. /account lists their gifts on any phone./g/<gift> from WhatsApp, record up to 15 s, fix the caption, send./m/<gift>?k=<key> and, when ready (e.g. at 00:00), sends the
recipient their link /r/<gift>?k=<key> + the 4-digit PIN from there.npm install
npm run dev # http://localhost:3000 — data is saved in .data/
# without GOOGLE_CLIENT_ID in .env, add DEV_LOGIN=1 to log in with any email (local only)
The microphone needs localhost or https. To test on your phone over Wi-Fi, deploy to Vercel instead.
revallo/VoiceGift → Deploy.
No settings to change; vercel.json has them.https://<your-project>.vercel.app and test with three accounts: organizer, friend, recipient.Optional environment variables (Settings → Environment Variables, then redeploy):
| Variable | What it does |
|---|---|
ADMIN_KEY | Enables GET /api/export?key=…, a JSONL file of every message for the ML team, and GET /api/users?key=…, the list of accounts |
ASR_URL, ASR_API_KEY | Use the company's speech recognition API instead of the mock (see lib/asr.js) |
GROQ_API_KEY | Use Groq Whisper large-v3 for now, until the company API is ready (ASR_URL wins if both are set) |
GOOGLE_CLIENT_ID | Required: logging in is "Continue with Google" only. An OAuth Web application client id from Google Cloud Console, with https://voicegift-one.vercel.app (and http://localhost:3000) as authorized JavaScript origins, and the app published (in Testing only 100 accounts can log in) |
DEV_LOGIN | 1 = a plain email + name login instead of Google, for the e2e test and local work. Ignored on Vercel |
/api/audio,
and only with the recipient's link (or to the person who recorded it).lib/limits.js): 3 voices per account per gift, 20 recordings per account per day (each one is an
ASR call), 10 gifts per account per day.CLAUDE.md).api/ serverless functions (one file per endpoint)
lib/ storage (Vercel Blob / local folder), ASR seam, gift + account model, HTTP helpers
public/ the website: plain HTML + ES modules, no build step
assets/themes.js words per occasion + picks the scene
assets/cake.js birthday: the cake + candles
assets/bouquet.js graduation: the bouquet + flowers
assets/lanterns.js wedding: strings of lanterns
assets/stage.js shared scene scaffolding
assets/recorder.js records 16 kHz mono WAV in the browser
assets/auth.js accounts in the browser: who is logged in, the sign-up / log-in form
design/screens/ the designed screens this app is built from
tests/e2e.mjs end-to-end test with a fake microphone
dev.mjs local server that mimics Vercel
Ten weak spots found in a code + screen review, most important first. Fixed so far: 4, 5, 6.
MAX in lanterns.js, flowerSpots in bouquet.js). Voice 37/41 has no item,
so the recipient can't tap it. Fix: a cap per gift in api/message.js, shown on the friend's page ("the gift is full")./api/reveal has no limit on wrong PINs (only 10,000 options), and a wrong PIN
gets a different error than a wrong key, which tells the guesser the key is right. Fix: count wrong PINs per gift and lock for a while, like passwords.