Full self-hosted click track generator for cover bands. Core technical pieces implemented: - CTP (Click Track Protocol) TypeScript schema, Zod validator, and WAV renderer (44.1 kHz, 16-bit PCM, accented downbeats, ramp sections) - MusicBrainz API client with 1 req/s rate limiting - PostgreSQL schema (songs, tempo_maps, registry_sync_log) with triggers - Git registry sync logic (clone/pull → validate CTP → upsert DB) - Next.js 14 App Router: search page, track page, API routes (/api/songs, /api/tracks, /api/generate) - UI components: SearchBar, SongResult, TempoMapEditor, ClickTrackPlayer (Web Audio API in-browser playback + WAV download) - Docker Compose stack: app + postgres + redis + nginx + registry-sync - Multi-stage Dockerfile with standalone Next.js output - .env.example documenting all configuration variables - README with setup instructions, CTP format spec, and API reference Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
import type { Metadata } from "next";
|
|
import "./globals.css";
|
|
|
|
export const metadata: Metadata = {
|
|
title: {
|
|
default: process.env.NEXT_PUBLIC_APP_NAME ?? "ClickTrack",
|
|
template: `%s | ${process.env.NEXT_PUBLIC_APP_NAME ?? "ClickTrack"}`,
|
|
},
|
|
description:
|
|
"Self-hosted click track generator for cover bands. Search songs, view community tempo maps, and download metronomic WAV files.",
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
return (
|
|
<html lang="en">
|
|
<body className="min-h-screen bg-zinc-950 text-zinc-100 antialiased">
|
|
<header className="border-b border-zinc-800 px-6 py-4">
|
|
<div className="mx-auto flex max-w-4xl items-center justify-between">
|
|
<a href="/" className="text-xl font-bold tracking-tight text-green-400">
|
|
{process.env.NEXT_PUBLIC_APP_NAME ?? "ClickTrack"}
|
|
</a>
|
|
<nav className="flex gap-6 text-sm text-zinc-400">
|
|
<a href="/" className="hover:text-zinc-100 transition-colors">
|
|
Search
|
|
</a>
|
|
<a
|
|
href="https://github.com/your-org/clicktrack"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="hover:text-zinc-100 transition-colors"
|
|
>
|
|
GitHub
|
|
</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
<main className="mx-auto max-w-4xl px-6 py-10">{children}</main>
|
|
<footer className="border-t border-zinc-800 px-6 py-6 text-center text-xs text-zinc-600">
|
|
ClickTrack — open source, self-hosted. Tempo data from the community registry.
|
|
</footer>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|