A PWA for bhajans and kirtans: a library of 35 bhajans by 15 acharyas, chords above the words with clickable diagrams for guitar / ukulele / keys, transposition, a word-by-word dictionary of spiritual meanings, and syllable lessons with a Web Audio harmonium.
Bhajans and kirtans are a living musical tradition learned by ear. Lyrics in Sanskrit and Bengali, chords passed hand to hand, sheet music existing at best as someone's phone recording. Ordinary music apps aren't built for this: no word-by-word translations, no meaning of words, no harmonium part.
"BhajanApp is for those who want to go deeper into the culture of bhajans and kirtans: a base of the acharyas' bhajans, lectures, translations, chords and lessons."

A library with search and author filters — 35 bhajans, 15 authors: Bhaktivinoda Thakur, Narottama dasa Thakur, Vishvanatha Chakravarti, Govinda dasa Kaviraja… Favourites and link sharing. Each bhajan is IAST-transliterated text with chords above the words, a "Translation" tab, an audio snippet and a lecture.
Chords are clickable: a diagram pops up for the chosen instrument — guitar, ukulele or keys (a keyboard diagram from notes for harmonium and piano). Transposition by any number of semitones recalculates the whole sheet.

// transposition: chord → semitones → chord, keeping the suffix (m, 7, sus…)
function transposeChord(chord: string, semitones: number): string {
const m = chord.match(/^([A-G][#b]?)(.*)$/);
if (!m) return chord;
const idx = NOTES.indexOf(normalize(m[1]));
return NOTES[(idx + semitones + 12) % 12] + m[2];
}
Every word in the text is clickable too. The dictionary returns transliteration, Russian and English translation and the spiritual meaning — why "Nanda-nandana" means more than "son of Nanda". The dictionary grows through AI translation with a confidence rating and is edited in the admin panel; proper nouns are flagged separately.

A bhajan can have a lesson: a sequence of steps "swara · note · syllable · duration", split into parts. The player highlights the key and the syllable, plays the note on a synthesised harmonium via Web Audio (no samples) and lets you slow the tempo. Lessons are built in the admin panel in a step editor, from a MIDI file, or from OCR of a sheet.
export type LessonStep = { part?: string; beat?: number; swara: string; note: string | null; lyric: string; duration: number };
// harmonium: triangle + sub-octave sine through a lowpass, soft attack and release
function playHarmoniumNote(ctx: AudioContext, frequency: number, durationMs: number) {
const osc1 = ctx.createOscillator(), osc2 = ctx.createOscillator();
const filter = ctx.createBiquadFilter(), gain = ctx.createGain();
osc1.type = 'triangle'; osc2.type = 'sine';
osc1.frequency.value = frequency; osc2.frequency.value = frequency / 2;
filter.type = 'lowpass'; filter.frequency.value = 850;
gain.gain.setValueAtTime(0, t0);
gain.gain.linearRampToValueAtTime(0.42, t0 + 0.06);
gain.gain.linearRampToValueAtTime(0, t0 + duration + 0.08);
osc1.connect(filter); osc2.connect(filter); filter.connect(gain); gain.connect(ctx.destination);
}
The bhajan base comes through a rate-limited GraphQL proxy; the dictionary and lessons live in PostgreSQL via Prisma. Admin: import from bhajanamrita.com with the Latin and Cyrillic tables merged into one record; batch AI word translation; a per-syllable lesson editor with playback of every step; MIDI upload → lesson.
Next.js · React · TypeScript · Tailwind · shadcn/ui · React Query · Prisma + PostgreSQL · Web Audio API · PWA (service worker) · Capacitor (iOS / Android) · Vercel
An app where a bhajan can be read, understood word by word, played on your own instrument in your own key and learned syllable by syllable — from a phone, with nothing to install.