Transcode and compare audio bitrates and encoders on the go. ABX Testing and bring your own music! https://greenear.nyahost.in
  • TypeScript 70.1%
  • CSS 26.7%
  • Dockerfile 1.3%
  • JavaScript 1.3%
  • HTML 0.6%
Find a file
2026-09-07 00:34:12 +05:30
docs/screenshots ref: Improve UI and refactor app.tsx 2026-08-12 07:50:26 +00:00
server ref: Reuse existing variants if codecs match 2026-08-10 06:20:14 +00:00
src ref: Improve UI and refactor app.tsx 2026-08-12 07:50:26 +00:00
tests ref: Reuse existing variants if codecs match 2026-08-10 06:20:14 +00:00
.dockerignore ci: Add dockerfile 2026-08-02 11:49:16 +00:00
.env.example ref: modify session cleaup interval to 1 hour 2026-08-02 11:47:39 +00:00
.gitignore feat(tests): add Playwright configuration screenshot automation for readme 2026-08-09 17:11:05 +00:00
docker-compose.yml chore: Update package metadata and fix versioning 2026-08-10 06:53:58 +00:00
Dockerfile ci: Add dockerfile 2026-08-02 11:49:16 +00:00
eslint.config.js feat: implement upload and transcode progress indicators 2026-08-10 05:35:18 +00:00
index.html init commit 2026-08-02 11:28:25 +00:00
package-lock.json chore: Update package metadata and fix versioning 2026-08-10 06:53:58 +00:00
package.json chore: Update package metadata and fix versioning 2026-08-10 06:53:58 +00:00
playwright.config.ts feat: implement upload and transcode progress indicators 2026-08-10 05:35:18 +00:00
README.md feat(tests): add Playwright configuration screenshot automation for readme 2026-08-09 17:11:05 +00:00
tsconfig.app.json init commit 2026-08-02 11:28:25 +00:00
tsconfig.json init commit 2026-08-02 11:28:25 +00:00
tsconfig.node.json init commit 2026-08-02 11:28:25 +00:00
tsconfig.server.json ref: modify session cleaup interval to 1 hour 2026-08-02 11:47:39 +00:00
vite.config.ts init commit 2026-08-02 11:28:25 +00:00

Green Ear

A small, self hosted audio comparison and blind ABX testing app.

Green Ear frontend

Stack

  • React + TypeScript + Vite
  • Tailwind CSS
  • Express
  • FFmpeg (ffmpeg-static)

Features

  • Upload WAV, FLAC, AIFF, or ALAC sources (up to 500 MB by default)
  • Transcode to MP3, AAC, and Opus at configurable bitrates
  • Audition the lossless reference and every encoded version
  • Run randomized, 10 trial blind ABX comparisons
  • Automatic server-side session cleanup after 1 hour

Development

npm install
npm run dev

Open http://localhost:5173.

Updating the README screenshot

The tracked frontend image above is generated from a real Chromium render of the local development app. Refresh it after a frontend change with:

npm run screenshots

The Playwright check verifies that the README continues to embed the generated docs/screenshots/frontend.png image before writing it.

Production

npm run build
npm start

Open http://localhost:3001.

Environment settings are documented in .env.example.

For public deployment, place the app behind HTTPS and a reverse proxy. Uploaded audio is stored in data/ for the session lifetime and should be placed on ephemeral/private storage.

Docker production deployment

The production image is a multi-stage build, runs as the unprivileged node user, and contains only production dependencies and compiled assets. Session data is held in a named Docker volume and is removed no later than one minute after its one-hour lifetime (including data left behind by a restarted container).

docker compose up --build -d

The Compose configuration exposes the service only on 127.0.0.1:3001; put an HTTPS reverse proxy in front of it for public access. To change the upload limit, edit MAX_UPLOAD_MB in docker-compose.yml. Do not publish the port directly to the internet.