KamoCRM

Audio lessons — upload a recording, and learners can really navigate it

Featurekamo-internal
Shipped
September 23, 2026 at 8:26 AM UTC
Author
Kamo
Commit
21e97e2

Authors (/hr/training course editor) - "Upload file" on every slide, beside "Choose media": audio (MP3, M4A, AAC, WAV, OGG/Opus, FLAC), video or an image, through the imaging pipeline into HR Resources, attached the moment it is stored. The library picker knows audio too (badge, waveform thumbnail), and the course-cover picker now offers images only. - An audio slide gets its own editor: a required description (the accessible name), the lesson playing exactly as a learner meets it, chapters (add one at the playhead, edit times as m:ss or h:mm:ss, play from any, or paste a list in the usual "00:00 Title" shapes), and a transcript that follows along. A finished job never overwrites text typed while it ran (it is offered instead), and one found running when the slide is reopened is offered the same way. - The recording is measured once, on attach: length and waveform come from ConversionService and are stored on the slide (media_meta_json), so no learner waits for them. "Listen to the recording" is the audio wording of the play-through rule. Learners (the course player) - A waveform scrubber showing what has been played, what has actually been HEARD, the chapters, their bookmarks and an A–B repeat; click, drag or arrow through it, with a time-and-chapter preview on hover. - Chapters with per-chapter heard progress, previous/next chapter, and "repeat this chapter". - A transcript that follows the recording, jumps anywhere on click, and searches with next/previous through the matches; captions of the line being spoken under the waveform. - Bookmarks with notes, kept in the member's own preferences so they follow them between devices (never written before the saved list has loaded, which would replace it; a pending note is sent, not dropped, when the slide closes). - Speed from 0.5× to 2× (and the time left at that speed), ±10 s, volume, the member's chosen speaker, the operating system's media keys, and a keyboard map (Space/K, J/L, arrows, Shift+arrows or P/N, < >, 0–9, M, B, A, C, /, ?) with a help sheet. - It resumes where they stopped on this device, and offers the first part they have not heard. - The play-through requirement counts only stretches actually played: a seek (scrubber, skip, loop, devtools, or a tick that lands mid-seek) earns nothing, and neither does faster than 2×. Unlike the video rule it credits a background tab's long tick, because audio is what people play in one. Heard to within half a second of the end counts as the whole recording: the stored form rounds to 0.1 s and the duration does not, and 100% used to read as 99% forever. - The escape hatch for a file the browser cannot play appears once the recording's length has passed, as it does for video; shortcuts work wherever focus is inside the player's dialog. Fixed on the way, for video as much as audio - The play-through gate measured against the version's frozen duration, which publishing never wrote: every video version carries null, so watching could never meet the requirement. The gate now uses the element's own duration. - What a member had watched reached the server only when they pressed Next, so closing the course mid-lesson lost it. It is saved every 20 s, on pause and on close, with the percent the completion manifest reads (it was never sent, so every manifest recorded 0% coverage). - Slide media, question pictures and the lesson itself now load through the member's own assignment **************** instead of the imaging stream, which requires VIEW_DOCUMENTS — a right 32 of 149 members did not hold. - The editor keyed slide cards by uid, which every autosave replaces, so each save remounted every card — and would have stopped the audio an author was listening to while typing a chapter. An upload in flight follows its slide through a move or a delete. - The member media route answers with a sandboxing CSP and nosniff: a slide picture can be an SVG, which opened directly would otherwise run script in this origin. Needs DocsService (media endpoint, media_meta_json) and ConversionService (peaks, transcripts) deployed alongside; the English is on kamo-translation-dictionary a4c6f856.

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing