Describe a vibe. Get an endless stream of original AI-generated songs — lyrics, cover art, and audio, all created on the fly.
Features · Screenshots · How It Works · Tech Stack · Quick Start · Architecture
- Endless Generation — describe a mood, genre, or artist and songs keep appearing in real-time
- Prompt Steering — change direction mid-stream without losing history
- One-Off Requests — drop in a specific song idea and it gets generated next
- Album Mode — generate an entire album from a single track
- Oneshot Mode — generate a single standalone song with full control
- Song Library — browse all generated songs with genre, mood, energy, and era filters
- Playlist Management — star favorites, search, filter by mode (endless/oneshot)
- Multi-Device Rooms — synchronized playback across devices (Sonos-style)
- Terminal Daemon Control — run local playback as a background daemon and control it with
inficommands - Gapless Playback — next song preloads in background, zero gaps between tracks
- Rating & Feedback — thumbs up/down to influence future generation
- Cover Art — AI-generated vinyl-style album covers for every song
- Configurable AI — switch between local (Ollama), cloud (OpenRouter), and OpenAI Codex (ChatGPT subscription) for LLM generation
The main player with now-playing display, generation controls, prompt steering, and the song queue.
Browse all generated songs with cover art. Filter by genre, mood, energy level, and era.
Star your favorites, search by name or prompt, filter by endless or oneshot mode.
Describe your music, pick a provider and model, and start listening.
Generate a single standalone song with full prompt control and advanced settings.
Live dashboard showing LLM, image, and audio pipeline status with active/waiting/error counts.
More screenshots
Configure service endpoints (Ollama, ACE-Step, ComfyUI), API keys, and model preferences.
Create rooms for synchronized multi-device playback. Name your devices, join as player or controller.
1. Describe your music — "2010 techno beats with English lyrics, S3RL energy, heavy 808 bass"
2. Hit Start — the unified backend kicks off the pipeline: LLM writes metadata + lyrics, ComfyUI renders cover art, ACE-Step synthesizes audio
3. Listen endlessly — songs appear in real-time. Rate them up/down to steer the direction. Request one-offs or generate entire albums from a single track.
Each song flows through: pending → generating_metadata → metadata_ready → submitting_to_ace → generating_audio → saving → ready → played
The unified server runs a per-song worker pipeline with concurrency queues managing throughput across three lanes: LLM (metadata/lyrics), Image (cover art), and Audio (ACE-Step synthesis).
Infinitune includes integrated room management for synchronized playback — think Sonos or Spotify Connect, but for AI-generated music.
- Roles — devices join as player (outputs audio) or controller (remote control only)
- Sync — all players stay locked to the same song and position
- Per-device control — adjust volume or pause individual players independently
- Clock sync — NTP-style ping/pong calibration, synchronized within ~50ms across LAN
- Gapless — next song preloads in background while current one plays
Use the terminal daemon when you want room playback without keeping the browser open.
# Start daemon manually
pnpm infi daemon start
# Pick playlist + play (auto-creates room when needed)
pnpm infi play
# Playback controls
pnpm infi stop
pnpm infi skip
pnpm infi volume up
pnpm infi volume down --step 0.1
pnpm infi mute
# Interactive selectors
pnpm infi room pick
pnpm infi song pick
# Status
pnpm infi status
# Persist CLI defaults (server/device/step)
pnpm infi config --server http://localhost:5175
pnpm infi config --device-name "DESK SPEAKER"
pnpm infi config --daemon-host 127.0.0.1 --daemon-port 17653
pnpm infi config
# Daemon HTTP endpoints (for Waybar/custom scripts)
curl -s http://127.0.0.1:17653/status | jq
curl -s http://127.0.0.1:17653/queue | jq
curl -s http://127.0.0.1:17653/waybar | jqInstall a local command wrapper:
pnpm infi install-cliInstall the CLI man page:
pnpm infi install-manThen use:
infi play
infi stop
infi man
man infiInstall daemon as a systemd user service:
pnpm infi service install
pnpm infi service restart
pnpm infi service uninstall| Technology | |
|---|---|
| Frontend | React 19 · TanStack Router · React Query · Tailwind CSS 4 |
| Backend | Hono (unified server — API + worker + rooms on one port) |
| Database | SQLite (better-sqlite3, WAL mode) · Drizzle ORM |
| Rooms | Integrated WebSocket room service · multi-device sync · REST API |
| Worker Pipeline | Event-driven background pipeline · per-song workers · concurrency queues |
| Audio | ACE-Step 1.5 (text-to-music synthesis) |
| Cover Art | ComfyUI (image generation) |
| LLM | Vercel AI SDK (Ollama/OpenRouter) + Codex App Server (openai-codex, ChatGPT subscription auth) |
| Build | Vite 7 · TypeScript 5.7 · Biome (lint/format) · pnpm monorepo |
# Install dependencies
pnpm install
# Start everything (web + unified server) with Portless stable local domains
pnpm dev:all
# Fixed-port fallback (Vite :5173, server :5175)
pnpm dev:all:fallbackDefault local dev uses Portless: web at
http://web.localhost:1355, backend API athttp://api.localhost:1355, withVITE_API_URLandAPP_ORIGINset automatically by scripts. Fallback mode: usepnpm dev:all:fallbackto run web on:5173and the unified backend on:5175(VITE_API_URL=http://localhost:5175). Backend-only local dev should usepnpm dev:server;pnpm serveris a pnpm built-in command name, not a reliable script entry point.
Set T3Code's "Run automatically on worktree creation" command to:
bash scripts/t3code-worktree-setup.shInfinitune requires external AI services running on your network:
| Service | Role | Default Port |
|---|---|---|
| ACE-Step 1.5 | Text-to-music synthesis | :8001 |
| Ollama | Local LLM (metadata, lyrics) | :11434 |
| ComfyUI | Cover art generation | :8188 |
| OpenRouter (optional) | Cloud LLM access | — |
| Codex CLI (optional) | OpenAI Codex provider bridge (codex app-server) |
— |
Configure in apps/server/.env.local:
# AI service endpoints (replace with your server addresses)
OLLAMA_URL=http://<your-server>:11434
ACE_STEP_URL=http://<your-server>:8001
COMFYUI_URL=http://<your-server>:8188
# Optional — cloud LLM via OpenRouter
OPENROUTER_API_KEY=sk-or-v1-...
# Optional — override Codex turn timeout (default: 360000 / 6 minutes)
CODEX_TURN_TIMEOUT_MS=360000
# Where to store generated audio files
MUSIC_STORAGE_PATH=/path/to/your/music/storageUse this when you want LLM generation to run through your ChatGPT subscription instead of API-key billing.
- Install the Codex CLI and verify it is on your
PATH(codex --version). - Open
Settings→Network→OPENAI CODEX (CHATGPT SUBSCRIPTION). - Click
START DEVICE AUTH, open the verification URL, and enter the one-time code. - Wait for status
Authenticated with ChatGPT. - Pick
OPENAI CODEXas provider in playlist creation or oneshot mode, then select a Codex model.
Notes:
- This project uses
codex app-serverfor theopenai-codexprovider (not the Vercel AI SDK transport). openai-codexcovers text generation (metadata, lyrics, persona). Cover art and audio still use ComfyUI + ACE-Step.
- Endless playlists move from
active→closingafter ~90s without heartbeat. - Opening an endless playlist page sends heartbeat and now reactivates both
closingandclosedplaylists, then refills the song buffer. - Oneshot playlists remain closed after completion and are not auto-reactivated by heartbeat.
Browser (React 19 + TanStack Router + React Query)
↕ HTTP fetch + WebSocket event invalidation (/ws)
↕ WebSocket room protocol (/ws/room)
Unified Server (Hono on :5175)
├── SQLite (better-sqlite3, WAL mode)
├── In-memory typed event bus
├── Service layer (song, playlist, settings)
├── Event-driven worker (metadata → cover → audio pipeline)
├── Room manager (multi-device playback)
├── WebSocket bridge → Browser (event invalidation)
└── External services:
├── LLM (Ollama/OpenRouter via Vercel AI SDK + OpenAI Codex via Codex App Server)
├── ComfyUI → cover art
└── ACE-Step 1.5 → audio synthesis
One server process handles everything: API routes, worker pipeline, room management, event broadcasting. No message queues. No inter-process HTTP. Single port.
Event-driven: Service mutations emit events → worker handlers react instantly → no polling. Song completion triggers buffer deficit check → creates new pending songs → triggers metadata generation → self-sustaining loop.
infinitune/
packages/
shared/ # @infinitune/shared — types, protocol, pick-next-song
room-client/ # @infinitune/room-client — room hooks
apps/
web/ # React frontend (Vite + TanStack)
server/ # Unified backend (Hono — API + worker + rooms)







