Skip to content
Sign in

/changelog

What shipped, when, why.

Dated entries for everything that lands. Paired with the public roadmap: this page is the past, that one is the plan.

Feature Improvement Fix Content Platform
33 entries
  1. Feature v0.19.0

    Three new profiles on analyze/profile: room (reverberation from a clap), chain (lost packets) and pitch (where a voice sits and how clean it is)

    analyze/profile has three new profiles, all paid presets and all additive: nothing that exists changes. room reads the reverberation time per octave band from one clap, a balloon pop, an impulse response or the sweep of the RoomLab app (the new roomSource option, roomSource="impulse" and so on as a keyword in the Python client, room_source), with the flutter echo and the noise of the room; it is the method of the RoomLab app, taken over exactly, and tested against 385 real impulse responses (a median 3.9 percent from the same method on the bare response, 1.5 percent where the decay had at least 35 dB). A recording without a clap is a 422 with the new code room_not_measurable. chain counts the gaps of digital silence in the middle of sound, the mark of a lost packet: 99.8 percent of 8,411 made gaps found, 99.9 percent of the 8,406 reported gaps real, no false alarm in 1,615 recordings without gaps, and it says what it cannot see (a loss the player concealed, a loss in a pause). pitch gives the pitch of a voice (the median, the span, the variation), how voiced the recording is and the harmonics-to-noise ratio: no gross pitch errors on clean constructed voices where the trackers we already had made 2.9 to 3.8 percent, and 98.0 percent agreement with an independent tracker on 40 readings of real speech. Three measures are in the registry and are NOT offered: the echo and slapback measure (it found every constructed copy but reported a copy in 27 percent of the recordings without one, almost all synthetic voices), and jitter and shimmer (they missed the criteria we set in advance by small margins). They are Beta, the answer leaves them out, and nothing was adjusted after the test. Nothing here says anything about stuttering. The guides: measure-a-room-with-a-clap, pitch-and-voice-quality and find-lost-packets in VoiceLab, with the numbers and the limits.

    api lenses voicelab validation
  2. Improvement v0.18.1

    Signal-to-noise: with the new speech detector the reading is corrected below 16 dB, much closer to the true ratio in noise

    The signal-to-noise ratio (signalToNoiseDb) reads too high when the background is loud: 3 to 7 dB at 10 dB and 6 to 9 dB at 5 dB, as the status of the measure has said since 12 October. With the speech detector K2 (0.18.0) it is now corrected below 16 dB: the first reading is combined with a second one, taken from the quietest stretches of the smoothed power (the minimum statistic), with three coefficients that were fitted on the two earlier tests with cross-validation. It was tested once on 13 October 2026, with the criteria fixed in advance, on 520 mixtures of 40 new speakers in three environments that were in no earlier test (a town square, street traffic, a metro). It met all four criteria. At 5 dB the average error went from +5.95 to +1.87 dB (90th percentile 7.44 to 2.98 dB, a paired difference of 4.08 dB, interval 3.93 to 4.21), at 10 dB from +3.52 to -0.18 dB (90th percentile 5.28 to 2.01 dB), and at 20 dB and on clean audio nothing changed. A first attempt (a switch to the minimum statistic) had over-corrected at 10 dB and was not adopted; this one does not. It works the same way as the other options: in the API it applies with "speechDetector": "k2" (opt-in, the default on 15 January 2027), and the website has it today. With K2, signalToNoiseDb reads 0.5 dB lower on clean audio and at 20 dB, and about 4 to 5 dB lower at 10, 5 and 0 dB noise, because the old reading was too high there. What it does not solve: below 5 dB it still reads too high (+5.6 dB at 0 dB), a clean recording reads 0.7 dB worse at the 90th percentile than with the first detector (that comes from K2, not from the correction), and the metro is the hardest environment (90th percentile 7.3 dB at 10 dB). It was tested on read speech with recorded background noise, not on real conversations, telephone speech, music or television. The margin of the measure now holds from 5 dB for a town square, street traffic and for the known noises pooled; the status on /lenses has the numbers. No field, type or default of the API changed.

    api lenses voicelab validation
  3. Feature v0.18.0

    Speech detector: a second detector on the website today, an opt-in in the API, the API default on 15 January 2027

    The speech in a recording is found by a detector. The website now uses a second one, K2, when you measure a file in VoiceLab, the workbench, your account or HearLab. In the API it is an opt-in first, as the change policy says: add "speechDetector": "k2" to a request to voicelab/qa, voicelab/segments or analyze/profile (speechDetector="k2" as a keyword in the Python client). The answer has the same keys and types; only the values differ. The default stays the first detector until 15 January 2027, when K2 becomes the default; the first detector stays selectable with "speechDetector": "v1" until at least 15 April 2027. K2 lets a phrase run on while the envelope stays above 0.3 of the threshold, by at most 100 ms on each side, so that soft word starts and endings count as speech. It was tested once on 13 October 2026, with the criteria fixed in advance, on LibriSpeech test-clean (40 speakers it had never seen, 17 noise conditions, 680 mixtures; the noise recordings were the same as in development) and on the 1,344 files of the scene test. On clean audio and noise at 20 and 10 dB the frame F1 went from 0.878 to 0.941, the purity of the frames called pause from 0.608 to 0.756 and the mean error of the speech ratio from 0.170 to 0.082; at 5 dB the F1 went from 0.637 to 0.773. K2 met all five criteria but not the original bar (purity 0.95, error 0.04), so none of the measures changes status. What moves in the numbers: the speech ratio reads about 5 to 14 points higher, the speech seconds 2.6 to 6.9 seconds on recordings of about 50 seconds, there are 0.15 to 0.73 fewer long silences and the segments are fewer and longer. Everything that reads the speech frames or the pauses moves with them, by less: the speech level reads 0.5 dB lower on clean audio and up to 1.4 dB lower in noise (the signal-to-noise ratio moves more, see 0.18.1), the pause level 0.4 to 2.6 dB lower, the per-phrase values about 1 dB either way, and the scene label changes for about 8 percent of the test mixtures. Recordings with digital silence between the phrases, such as synthetic voices, move much more (on the 12 sample recordings of the site the pause level reads 1 to 15 dB lower and the worst phrase up to 31 dB higher), and a measure that needs a pause is empty when no pause frame is left. Brightness, sibilance risk, the noise floor and the peak do not move. The two scene measures that passed the earlier test also improved with K2 (gapSpeechBandShare AUC 0.88 at 20 dB and 0.94 at 10 dB, gapLowBandShare 0.90 and 0.97). A proposed correction of the signal-to-noise reading below 16 dB was tested on the same 1,344 files and not adopted: it cut the error at 5 dB (90th percentile from 7.1 to 2.5 dB) but over-corrected at 10 dB (6.2 dB against the bar of 6.0 dB). The existing margin was confirmed on other speech and mostly new environments: the engine reads 3.2 dB too high at 10 dB and 5.6 dB at 5 dB. No field, type or default of the API changed.

    api lenses voicelab validation
  4. Feature v0.17.0

    Content type: a new model on the website today, an opt-in in the API, the API default on 15 January 2027

    The content type of a file (voice, music, mixed, noise or unknown) comes from a new model on the website from today: SignalLab, the workbench and the quick analysis in your account. In the API it is an opt-in first, as the change policy says: add "contentModel": "v2" to a request to signallab or analyze/profile (contentModel="v2" as a keyword in the Python client). The answer has the same keys and types; only the values of the content type, its confidence and its evidence differ, and the evidence list contains model:v2. The default stays the first model until 15 January 2027, when v2 becomes the default; the first model stays selectable with "contentModel": "v1" until at least 15 April 2027. v2 was tested once on 12 October 2026 on the 600 real excerpts of the first test plus 90 excerpts of three environments it had never seen: speech 197 of 200 (precision 0.95), music 190 of 200 (0.86), steady noise 40 of 90 (precision 1.00; street traffic and the metro mostly read unknown); the first model reached speech 0.82 and 0.56, music 0.46 and 0.50, and noise 0 of 90. Mixed now means that part of the file reads as speech and part as music, not speech over music. Also from today: the lens scene.stationaryScore is called "Constant background noise" instead of "Machine in the background", because a test on real environments (1,344 files) showed that it measures whether the level and the spectrum stand still and does not find machines (a washing machine scores 0.14, a restaurant crowd 0.57); and the status texts of the two scene measures that passed that test (gapSpeechBandShare and gapLowBandShare) and of the mixed label (tested on 500 constructed mixtures) now carry their numbers. No field, type or default of the API changed.

    api lenses signallab validation
  5. Content v0.16.3

    A second content-type model was tested: much better on speech and music, still missing steady noise, and not in use yet

    The engine now holds a second model for the content type (voice, music, noise or unknown), v2, behind an option; the one in use is still the first. v2 was tested once, with the bar fixed in advance, on the same 600 real excerpts as the first test plus 90 excerpts of three environments it had never seen (a square, street traffic, the metro): speech recall 0.99 and precision 0.95, music 0.95 and 0.86, steady noise recall 0.44 (40 of 90) and precision 1.00. It met the bar for speech and music and missed it for noise, because street traffic and the metro mostly read unknown, so it stays Proxy. On the same excerpts the model in use reached speech 0.82 and 0.56, music 0.46 and 0.50, and noise 0 of 90. The lens page now says all this, and the description of the decay slope adds that single phrases scatter widely (in the driest of the 24 test rooms from about -146 to -30 dB/s) and that you should read the median over many phrases. No field, value or default of the API changed.

    lenses validation signallab
  6. Content v0.16.2

    The decay slope and the energy after a phrase were tested on 24 real rooms: a rough order, not a room measure

    segment.tailDecay (the decay slope behind a phrase) and segment.decayScore (the energy after a phrase) were tested for the first time against real rooms with measured reverberation times: 24 rooms from 0.18 to 1.71 s, 120 clean sentences (synthetic voices played through the measured room impulse responses, no noise), one run, the bar fixed in advance and nothing tuned afterwards. The decay slope ranks the rooms roughly by reverberation (rank correlation 0.56, 95% interval 0.12 to 0.81) and gives a value for 119 of the 120 files, but it fell short of the bar (0.70 with a lower bound of 0.50) and is not calibrated to RT60: dry rooms read far too shallow, and rooms between 0.5 and 1.0 s overlap. The energy after a phrase reached a rank correlation of 0.30 (interval -0.20 to 0.71), so a link with the reverberation time is not shown; read it as the energy after the phrase, not as reverb. Both stay Proxy. The status texts on /lenses carry these numbers, and the description of the decay slope no longer calls it a physical measure of the room. No field, value or default of the API changed.

    lenses validation voicelab
  7. Content v0.16.1

    The content-type guess was tested on 600 real recordings, and it fell short

    signal.contentType, signal.contentConfidence and voice.activeKind were tested for the first time against real, labelled recordings: 600 excerpts of 20 seconds from the MUSAN corpus (200 speech, 200 music, 200 noise), one run, the bar fixed in advance and nothing tuned afterwards. The bar was recall and precision of 0.80 or more for all three classes. Neither measure reached it for any class, so both stay Proxy. signal.contentType found 164 of the 200 speech excerpts (precision 0.56), 91 of the 200 music excerpts (precision 0.65) and 3 of the 200 noise excerpts; voice.activeKind found 181, 118 and 3. Music and noise are often taken for speech (130 of 400 for contentType, 161 of 400 for activeKind), and the confidence hardly drops when the guess is wrong (mean 0.76 when right, 0.62 when wrong or abstaining). The strong case is audiobook speech, called voice in 98 of 100 cases (US government recordings: 66 of 100). The status texts on /lenses, the SignalLab pages and the methodology page now say all this, in place of 'not yet measured'. No field, value or default of the API changed: the 'noise' label is still returned, and on this data it cannot be relied on.

    lenses validation signallab
  8. Feature v0.16.0

    API: GET /v1/usage, a Python client, ready calls in the spec, a reference you can try, and two new guides

    All of it is additive: nothing in /v1 was removed, renamed or retyped, and the default answer of every route is byte-for-byte what it was. New: (1) GET /v1/usage returns the plan, the calls and the data used this month against the limits, and the requests per minute: the same numbers as /account. It needs a key, reading it is free and does not count as a call. (2) The OpenAPI spec carries a ready call in curl, Python and TypeScript for every operation (x-codeSamples), an Error schema with the stable codes as an enum, and every error response names its codes; the batch route lists signallab, the name the documentation uses, next to signallab/index. (3) A small typed Python client, audiolabtools, with the ten numbers as one call, each with its status and margin, and one exception per error code with its docs_url. It uses only the standard library and needs a key for batches and for files over 4 MB. (4) On /api the response schema block is now a reference per endpoint: what you send, an example in three languages, the answer field by field with the status and the margin of every number, the errors with their codes, and a box to try it with your own key. That box sends your URL or file to the EU-hosted API and says so; the key stays in the memory of the page. (5) Two guides in the form of the first one: check audio quality in CI, with a script and a workflow, and audit a dataset of conversations for upsampling, a lossy source, splices, channels and clipping. Also changed: the plan label in /account and in the plug-in follows the same rule as the API, the ten numbers in the comparison guide start with a table, code blocks in the guides have a copy button and use the whole column, and a dark box behind every word of every code block in the guides is gone.

    api python docs
  9. Platform v0.15.0

    API: every error has a code and a link, two opt-in options, and the Dutch field names stay until 31 January 2027

    Nothing in /v1 was removed, renamed or retyped, and the default answer of every route is byte-for-byte what it was (a contract test in the build keeps it that way). New: (1) every error carries a stable code and a docs_url next to type and message, a Link header with rel=help, and on a 429 or a limit the usage; each code is explained at /docs/errors, and the MCP servers add a Docs line to their error text. (2) Two opt-in request options: "round": true gives fewer decimals (same keys, same types) and "measureStatus": true adds one key with the status and margin of every measure in the answer. (3) Every response carries Link headers to the documentation and an X-AudioLab-Changelog header. The deadline for the Dutch field names (bron, meetVerschil, naadVerhouding, randStilte and the others that still sit next to the English ones) moves from 31 October 2026 to 31 January 2027, so nobody is caught out. A response that still carries them has a Deprecation and a Sunset header. Also corrected: the privacy page said nothing is written to disk when audio is analysed, which was not true for compressed files (a temporary file in the function's scratch space, deleted right after decoding), and it said uploads are gone within the hour while the sweep could leave one for almost two hours. Both are fixed, in the text and in the code: the sweep now runs every 15 minutes on files older than 45 minutes. The usage count on the admin page was reading the wrong counter; the counting itself, and the limits, were never affected.

    api mcp docs privacy
  10. Fix v0.14.0

    We withdrew our reverb score, and corrected what the site said around it

    On 27 September we tested VoiceLab's room echo score against 24 rooms with measured reverberation times, from 0.18 to 1.71 seconds. The rank correlation was 0.06: the score rises with background noise, not with reverb, and a room of 1.71 s scored below a booth of 0.18 s. The label (Dry, Tight, Live, Reverberant) is gone from the engine, the apps, the API and the MCP server. The number stays under the name of what it measures, energy in the pauses after speech, and it no longer lowers the intelligibility proxy. Today the last copies of the old claim left the site, in four languages. We also corrected the sound-level article (EU directive 2003/10/EC has three thresholds: 80 and 85 dB(A) as action values and 87 dB(A) as the limit, with a 3 dB exchange rate), and the statement that your audio stays on your device now says where it holds: in the browser labs. The API and the MCP server receive the audio you send them. A check in the build now fails if a withdrawn claim comes back. The write-up with the numbers is in the docs, under VoiceLab: what envelope decay after speech actually measures.

    voicelab truth
  11. Improvement v0.13.0

    The API answers in a kilobyte: curves are opt-in from today

    Three routes always sent their curves along, whether you wanted them or not. /v1/mixlab/analyze, /v1/voicelab/qa and /v1/signallab now leave them out unless you ask, with series: true in the JSON body or ?series=true on a raw or multipart call. Measured on a two-minute file: voicelab/qa drops from 79 KB to 1.4 KB, mixlab/analyze from 38 KB to 2.8 KB, signallab from 38 KB to 1.8 KB, and a batch of twenty from 1.6 MB to 27 KB. The arrays were ~98% of the payload and not one of them is an answer; there are dedicated routes for the series (/v1/mixlab/timeseries, /v1/mixlab/spectrum, /v1/voicelab/segments). BREAKING if you read shortTermLufs, waveform, spectrum, rmsEnvelope, voicedMask, segments, segmentalSnrPerSegmentDb, regions, energyEnvelope or centroidEnvelope from those three routes: add series: true and you get exactly what you got yesterday. Not a single measurement changed, only what is sent. /v1/analyze/profile already worked this way; this makes it the rule instead of the exception. What does still come back on every call is what a curve grows into: whatever series you do ask for is now capped (2000 points, 500 events) with the peak per bucket kept, so a hot moment survives and a thirty-minute recording no longer answers in megabytes.

    api breaking
  12. Feature v0.12.0

    HearLab Log: a hard hearing moment, measured, and seen by the practice as it comes in

    HearLab now links patient and practice. In HearLab Log (/hearlab) the patient taps New moment where hearing is hard, picks the situation, rates it and saves; the phone keeps the last 15 seconds in memory, measures them with the tools of four labs and then throws the sound away. MixLab: level, loudness and the loudest moment. VoiceLab: whether and when someone was speaking, how loud and how high the voices were, speech against noise per phrase, what kind of background it was, how much of it falls in the speech band and how far speech sits above it, and the room. SignalLab: third-octave bands, a prominent tone, and per half second how far the sound stands out above the noise and how bright it is. NoiseLab: A-weighted Leq, max, min, L10, L50, L90 and C minus A. Combined: per third-octave band, how far the phrases rise above the pauses, and a coarse spectrogram per half second. The practice dashboard shows it visually (the moment curve with its phrases, speech against background per band, the spectrogram, the NoiseLab scale, voice pitch) and per patient: rating trend, when and where it gets hard, rating against speech-over-background, a band heatmap across all moments, with an extensive filter, CSV and JSON export, a data dictionary at /hearlab/data and a printable report. On /labs/hearlab the same dashboard runs in example mode on measurements of real recordings. Linked with a code from the practice and after explicit consent, each moment goes to the practice dashboard (/hearlab/praktijk), where patients are pseudonyms and moments appear as they arrive, with export and deletion per patient. Stored in the EU (Frankfurt) under a data processing agreement, deleted after the retention period the practice picks, and withdrawing consent in the app deletes the shared moments. No audio, no location, no analytics on these pages. Dutch and English. Non-medical: HearLab shows, the professional interprets.

    hearlab engine privacy
  13. Fix v0.11.1

    Labs play on an iPhone with the ring switch on silent, and measure a file at its own sample rate

    On iOS, Safari put audio played through Web Audio in the ambient category, which stays silent while the ring switch is on silent. The labs that only play back (MixLab, stem compare, SignalLab, the workbench, the API playground and both Psi labs) now ask Safari for playback audio. The labs that record from the microphone keep the automatic setting, because a playback session would end the microphone track. MixLab and the workbench also stopped resampling before measuring: WAV, FLAC and MP3 are now decoded at the sample rate in their own header, so a 44.1 or 96 kHz file is measured at 44.1 or 96 kHz, not at the rate of your sound card. Other formats still decode at the device rate.

    mixlab signallab psilab safari fix
  14. Feature v0.11.0

    The engine says what is behind a voice, and whether the voice in front can still be followed

    Thirteen scene lenses from the voice pass, in the voice, environment and dataset profiles. The background is read in the speech pauses and named: quiet, stationary (a fan, a fridge, air handling, with a steady tone reported in Hz when there is one), program (a second voice or music, found by a moving pitch or a speech cadence) or unsteady. Behind the label sit the numbers: level stability of the pause floor, how much its spectral shape moves, its share below 500 Hz and in the speech band, and how far the speech sits above it. Intelligibility comes as a proxy and is called one: the weaker of the worst-tenth per-phrase SNR and speech over background, reduced for reverberation and clipping. Calibrated on a lecture with a second speaker, a club track and air handling mixed underneath at known levels, and on a room recording; what it cannot do yet (dense music reads unsteady rather than program) is written into the lenses. Engine 0.4.0, 129 lenses.

    engine voicelab environment api mcp
  15. Improvement v0.10.0

    API and MCP responses are now fully English

    The last Dutch field names in API and MCP responses are English now. On the check-target target: source, sourceUrl, verifiedOn and measurementCaveat (were bron, bewijs, gecontroleerd and meetVerschil); on platformNormalisation: source and measurementCaveat. The caveat itself now reads in English. On signallab/sample: seamRatio, edgeSilence with startMs and endMs, bars, tempoStrength, candidateMargin, bpmRaw, octaveCandidates and attackStrength, and its reasons and evidence read in English too. The old Dutch names stay in every response as deprecated aliases, in their old shape, through 31 October 2026, so code that reads those field names keeps working; move to the English names before then. The reason and evidence texts on signallab/sample changed language outright: they are explanations, not values to match on. The OpenAPI spec is now 0.2.0-preview and marks the old names deprecated. Separately: the remote MCP server at /mcp crashed on load from 11 August to 14 September and works again; the npm package was not affected.

    api mcp
  16. Feature v0.9.0

    The engine learns to hear a heat pump, a padded WAV and a lopsided export

    Twenty-three new lenses land in the engine behind the labs, the API and the MCP server, and every one of them ships with the test that proves it. Master check: momentary max, peak-to-loudness and peak-to-short-term ratios, left/right balance, a channel-layout label that names a dual-mono or one-sided export, bass mono compatibility measured under 120 Hz (the broad correlation misses an out-of-phase sub entirely), and per platform what normalisation does to your true peak, which is the number that actually clips. Loop QC: seam ratio, edge silence and an input hash, in a new loop profile for anyone shipping a pack. Provenance: bandwidth, the wall a lossy encoder leaves with its bitrate, effective bit depth (16 bits in a 24-bit file reads 16), the sample rate a file was upsampled from, and bandwidth splices between sources. Where two explanations collide, such as a 64 kbps MP3 and a sharply resampled 22.05 kHz file, the engine says unknown rather than guessing. Environment and voice: tone prominence per ISO 1996-2 with the words of the standard, third-octave bands per IEC 61260, and mains hum measured only in the pauses of a voice, in dB above the floor. Share links from the mix lab now carry the new master numbers too; older links keep working.

    engine mixlab signallab voicelab api mcp
  17. Feature v0.8.0

    VoiceLab goes deep, and a whole folder at once

    The voice tab now shows what it was already measuring but never displayed: peak and speech level with the crest between them, speech and silence in seconds, brightness, sibilance risk, room label, and whether the take starts or ends mid-sound, which is how you spot a recording that was cut short. Pause rhythm sits underneath: how many, how long, and how they cluster. Drop a folder in and every take lands in one table, worst signal-to-noise first, one click to open any of them in the bench. Export is measurements only: no file name, no audio, takes numbered rather than named.

    voicelab workspace batch export
  18. Improvement v0.8.0

    You decide whether we keep your file names

    The workspace asks once, before your first save. Choose to anonymise and a name becomes a stable code like “take-4f2a91c8.wav”. The same code every time for the same file, so your history still groups, but meaningless to anyone else and not comparable between accounts. With the setting on the name is never sent to us at all, and the server enforces the same rule as a backstop. The choice lives on your account, so it holds on every device. It also stops analytics from picking a name up off the screen.

    privacy accounts workspace
  19. Platform v0.8.0

    Analysis now runs in Frankfurt, not Washington

    Storage was already in the EU; the functions that decode and measure your audio were not. They are now. You can check it yourself on any request: read the X-Vercel-Id response header, the middle field says fra1 where it used to say iad1. This only ever affected API and MCP customers. The seven in-browser labs measure in your browser and send no audio to us (HearLab’s live captions go through the browser’s own speech recognition, see /privacy).

    platform privacy api
  20. Fix v0.8.0

    Clipping detection, corrected in both directions

    A file normalised to full scale was reported as clipped even when nothing had ever clipped, and a recording that did clip and was then turned down was reported as clean. That is the common case, because material usually arrives already levelled. Clipping is now measured as a flat top: consecutive samples pinned at the file’s own peak, which survives any later gain change. It also carries a stated limit: at high frequencies too few samples fit in a cycle to form a flat top, and there peak level remains the number that counts.

    engine signallab voicelab
  21. Improvement v0.8.0

    Every lens now has a check behind it

    All 93 measurements the labs can show are held against a known answer: a sine has a crest factor of 3.01 dB, two identical channels correlate at 1.000, adding 0.15 of DC reads back as 0.150. Where an exact answer is not available, the check is directional on a calibrated disturbance. Two names were fixed that said the opposite of their number, and two measurements now return “not measured” instead of a zero that read as an answer. A wall of reverb no longer reports itself as a dry room.

    engine quality
  22. Feature v0.7.0

    Measurement certificate and register

    Any analysis in the workspace can now be downloaded as a certificate: the measured values, the references they were held against, where in the track something happens, and a SHA-256 of the audio that was actually measured. A bulk run produces a register instead of one sheet per file. Both print to PDF straight from the browser. There is deliberately no overall verdict on the sheet.

    signallab export certificate
  23. Feature v0.6.0

    Ψ Spectral VST3: the free flagship, in your DAW

    The Ψ EQ, live BS.1770 loudness metering and the branded visualizer now run as a VST3 next to your session. Free, Windows first. Click Connect in the plugin to link it to your AudioLab account; the key survives updates, so a new build never re-links. Same instrument as the Ψ Lab in the workspace.

    vst psi download
  24. Platform v0.5.0

    New home: audiolab.dev → audiolab.tools

    The brand moved to audiolab.tools. The TLD now does the work the suffix was doing on the old domain: "audiolab dot tools" matches what every cluster ships. All URLs, structured data, brand wordmark, OG images, RSS, manifest, sitemap, and 200+ internal links migrated. Same content, sharper lockup.

    rebrand platform
  25. Feature v0.4.5

    Four pillar pieces, glossary tripled, audiologist dashboard, stem compare

    Three new cornerstone pieces joined "What is Audio AI?" as our pillar set: AI voice infrastructure 2026, Android audio development guide, and Hearing accessibility on Android. Glossary expanded from 12 to 41 terms covering all six clusters. HearLab gained a concept audiologist dashboard (B2B2C mirror of the companion app). MixLab gained Stem Compare, an instant-A/B-switch playback tool. All five MixLab Analyzer live upgrades are now in (playback transport, realtime FFT, phase scope, live band meters, shareable URLs).

    mixlab hearlab pillars glossary
  26. Feature v0.4.0

    Hero motion loop, pre-loaded sample audio, public roadmap

    Homepage hero now plays a subtle 5-second motion loop of the AudioLab brand mark (with image fallback and reduced-motion respect). Every analyser now ships with a small library of procedurally-synthesised sample tracks so you can run a demo without uploading anything. /roadmap is live with platform-level and per-lab Now/Next/Later.

    hero samples roadmap
  27. Content v0.3.0

    Build log: Building MixLab Analyzer (BS.1770-4 in the browser)

    New 18-minute deep dive on how the analyser actually works: K-weighting biquads, gating, true-peak via 4× cubic upsampling, Mid/Side, FFT, with the code. The kind of writeup we wanted to read when we were building it.

    mixlab engineering
  28. Platform v0.2.5

    Pricing page

    Four-tier pricing (Free / Pro / Studio / Enterprise) with an honest feature comparison and FAQ. The free tier really is the entire demo surface. Paid tiers are the workflow layer.

    pricing
  29. Feature v0.2.0

    Six cluster demos, all live and interactive

    MixLab Analyzer (BS.1770-4 LUFS, true peak, stereo correlation), VoiceLab QA (mic recording, pacing, room echo), HearLab Companion (Web Speech captions, environment meter, check-in log), SignalLab Indexer (content classifier, timeline regions, JSON export), CueLab Monitor (routing graph, pre-show checklist, health checks), SkillLab Challenge (6 tiered exercises with WebAudio-synthesised targets).

    mixlab voicelab hearlab signallab cuelab skilllab
  30. Feature v0.1.7

    Command palette (⌘K)

    Fuzzy search across all pages, labs, docs, insights, and demos. Keyboard navigation, scoring by title + subtitle + keywords match. Indexed at build time so it stays in sync with content.

    nav a11y
  31. Improvement v0.1.5

    Premium brand identity: cinematic imagery across the site

    Seven Higgsfield-generated brand images (hero + six clusters) auto-converted to WebP via Astro's image pipeline. Atmospheric section on homepage, full-bleed image on cluster heroes, brand strip on every cluster card.

    design brand
  32. Platform v0.1.2

    SEO infrastructure: dynamic OG, RSS, JSON-LD

    Open Graph image endpoint generates per-page social cards via satori + resvg-js. RSS feed at /rss.xml for insights. JSON-LD schema (Organization, WebSite, Article, TechArticle, BreadcrumbList) on every relevant page.

    seo infrastructure
  33. Platform v0.1.0

    v0.1: initial public build

    Astro 6 + React 19 + Tailwind v4 + TypeScript. Forty pages, dark + light themes with no-flash hydration, mobile drawer nav, view transitions, OKLCH-calibrated color tokens, Geist + JetBrains Mono variable fonts.

    platform foundation

Want updates without checking back?

Subscribe via RSS, follow the roadmap, or become a design partner for early access and direct line.