Inspiration

A footstep, a rustling sheet of paper, or a strange little hum can change how a scene feels. I wanted to make that part of filmmaking something a room could try together. Foley gives people a short original movie and three sound roles, so they can get to the creative choice without learning a video editor.

The intended audience is a small group playing around a shared TV. I have not yet run a group playtest or measured whether people want a second cut.

What it does

The director starts a studio on the TV. Contributors join from a browser using its pairing code, then record or upload short sounds. Microphone access starts only after an explicit action. A take can be previewed, discarded, or sent to the studio.

The director casts the takes as footsteps, weather, and creature, adjusts their volumes, and starts the twenty-second premiere. The original film follows a small creature through a storm toward a cabin. Its credits name the contributors whose takes were cast. Change a role and the same picture gets another soundtrack.

The TV interface has visible D-pad focus, stage navigation, Back and studio resume. It starts with a lightweight 2D picture; 3D is an explicit choice. The phone supplies the microphone, so the TV launcher requests no microphone permission.

How I built it

React, TypeScript and Vite provide the interface. An Android WebView launcher opens the TV route at the configured HTTPS origin. MediaRecorder handles contributor recording, while Web Audio schedules the sound cues and film on one clock. Three.js supplies the optional miniature set.

The Node.js and Express backend validates permissions and stores studios, takes and cast choices in SQLite. FFmpeg and ffprobe check uploaded audio, normalize it to mono WAV, and calculate a waveform from its samples. Studio revisions prevent an old cast screen from silently replacing newer choices.

The backend runs on Amazon Lightsail in Mumbai. Docker Compose runs the application behind Caddy, which provides publicly trusted HTTPS. Named volumes retain the SQLite data and certificate state. The deployed checks passed pairing, audio normalization and private retrieval, casting, origin restrictions, persistence after replacing the app container, and recording removal when a studio ended. The AWS integration is Lightsail hosting; Foley does not call Bedrock or use AI inference.

I used Codex during implementation, Claude desktop for independent code review, and Deepgram Aura 2 Thalia for the demo narration. The current reviewed application suite passes 23 tests.

Challenges I ran into

Microphone work can finish after the user has left the screen. I added checks so a late permission grant stops its stream, interrupted recordings do not become partial takes, and a failed upload preserves the take for retry.

Native testing found a focus problem: disabling Premiere moved focus to navigation and scrolled the picture out of view. Playback now moves focus to the picture and then to Stop. A slow local software-rendering result also led me to make 2D the TV default.

During Lightsail setup, my bootstrap assumed Bash, but user-data ran under /bin/sh and rejected pipefail. Running the prepared bootstrap explicitly with Bash fixed that setup error.

Accomplishments

The public-origin native Android TV emulator tests verify the exact installed APK checksum, D-pad controls, Back/resume and the upload-to-playback path through the hosted backend. The original run reached the full film and credits with one generated tone assigned to all three roles. The additional 3 October run passed two full premieres, including a second cut with distinct percussion, filtered noise and a rising chirp from the API test crew. These establish emulator integration behavior. Physical phone recording, Fire TV hardware and a group performance remain unverified.

The public backend also retained the studio, cast and identical normalized audio after its application container was replaced. That matters for a room that has already spent time making its takes.

What I learned

A visible playback clock cannot tell me whether a mix sounds good. Native controls, uploaded audio, heard output, and group enjoyment each need their own check. I also learned that focus is part of the viewing experience: a correct film loses its purpose if the interface scrolls it offscreen.

What's next

I want to test distinct sounds with a small group, listen for recognizable cues, and observe how often people choose another cut. Physical phone and TV combinations need their own microphone, WebView and audio checks. Before wider use, the single-instance service needs an operational backup and recovery plan.

Try it

The hosted TV interface, judging APK and MIT-licensed source are available. The repository contains the Android launcher, deployment configuration and test instructions. A desktop TV preview is separate from the native Android TV emulator demonstration.

To run locally, install Node.js 22.13 or newer, npm, FFmpeg and ffprobe, then run npm ci, npm run build and npm start. Open http://localhost:4331. A separate physical phone needs the hosted HTTPS origin. New studios start empty; the native test's synthetic recordings are not preloaded into the product.

Demo evidence

The current 89-second English demo combines native remote navigation from the original run with the additional run's distinct-sound movie. The main premiere preserves captured emulator picture and sound at normal speed. Its synthetic inputs are labeled, and the contributor browser scene is separately labeled as edited stills. Spoken narration uses Deepgram Aura 2 Thalia. It does not demonstrate physical phone capture or a physical Fire TV.

Built With

Share this project:

Updates

Submission history