ANTIGRAVITY LABJP
Articles/App Development
App Development/2026-07-01Intermediate

Systematize Pre-Release Checks for Sound-Playing Apps with Waveform Rendering and Agents

The 6/26 update let Antigravity render audio files. Drawing on years of shipping sound in healing apps, here is a design that folds loudness, clipping, length, and silence checks into an agent verification loop, with the actual scripts.

Antigravity301audio assetspre-release checksindie development14quality gate

Premium Article

Run a healing app long enough and "sound" climbs into the surprising top ranks of reasons a star gets docked. "I used it before bed and it was suddenly loud," "I thought it was silent, then it played a few seconds in" — these quietly erode ratings more than functional bugs do.

Audio assets don't announce themselves with a compile error the way code does. Verifying every one by ear becomes unrealistic as the track count grows. With the 6/26 update, Antigravity can render audio files as waveforms inside the IDE, opening a path to offload part of this "ear work" to eyes and scripts. As someone who has shipped sound in indie apps, here is a design that systematizes pre-release audio checks as a verification loop.

Where audio assets actually cause accidents

First, let's make concrete which defects break the reader's experience. A vague "quality check" hands an agent a vague result.

Across my operations, the ones most likely to draw complaints and low ratings were four: loudness varying between tracks, peaks clipping into distortion, unnatural silence or an abrupt onset at the start, and loop material whose tail and head don't join smoothly.

Most of these are visible in the waveform. Put differently, if you reduce them to things a waveform can show, you can give the agent a footing for judgment.

Kill the machine-decidable parts first

Before sending anything to ears or an agent, automate what a number can decide. Skip this and reviews drown in subjective back-and-forth. I always run a light gate built on ffprobe and ffmpeg's loudnorm analysis before publishing.

#!/usr/bin/env bash
# audio-gate.sh — machine-judge audio assets before release
# usage: ./audio-gate.sh assets/sounds/*.wav
set -euo pipefail
 
# distribution targets (tune to your app)
TARGET_LUFS=-16      # a mobile playback ballpark
MAX_TP=-1.0          # true-peak ceiling dBTP
MIN_SEC=1.0          # reject material that's too short
MAX_HEAD_SILENCE=0.3 # allowed head-silence seconds
 
for f in "$@"; do
  dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f")
  stats=$(ffmpeg -i "$f" -af loudnorm=I=$TARGET_LUFS:TP=$MAX_TP:print_format=json -f null - 2>&1 \
          | sed -n '/{/,/}/p')
  lufs=$(echo "$stats" | python3 -c "import sys,json;print(json.load(sys.stdin)['input_i'])")
  tp=$(echo "$stats" | python3 -c "import sys,json;print(json.load(sys.stdin)['input_tp'])")
  head_sil=$(ffmpeg -i "$f" -af silencedetect=noise=-50dB:d=0.1 -f null - 2>&1 \
             | grep -m1 "silence_end" | grep -oE "[0-9.]+" | head -1 || echo 0)
 
  status="OK"
  awk "BEGIN{exit !($dur < $MIN_SEC)}" && status="TOO_SHORT"
  awk "BEGIN{exit !($tp > $MAX_TP)}" && status="CLIPPING"
  awk "BEGIN{exit !($head_sil > $MAX_HEAD_SILENCE)}" && status="HEAD_SILENCE"
  printf "%-28s dur=%.1fs LUFS=%s TP=%s headSil=%ss -> %s\n" \
    "$(basename "$f")" "$dur" "$lufs" "$tp" "$head_sil" "$status"
done

Just running this surfaces, in one list, problems that are hard to catch without A/B listening: "one track is 6 dB louder," "the tail is clipping." When I swapped an AdMob reward sound, this stage caught a true-peak overage and I fixed it before release.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A verification script that machine-judges loudness, clipping, and head silence with ffprobe and loudnorm
A procedure for having an agent review with 'eyes instead of ears' using waveform rendering
How to place a pre-release gate so you don't lose stars to volume complaints after launch
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

App Dev2026-06-21
A Few Low-Density Phones Lost Their Bundled Wallpaper — The drawable vs nodpi Boundary in Play's Density Splits
App Bundle density splits will happily split images that should never be split, dropping a static resource on one density bucket only. Here is how I reproduced it with bundletool and fixed it by moving to drawable-nodpi or disabling density split — with the decision criteria.
App Dev2026-06-01
Migrating Wallpaper Apps to Mandatory Edge-to-Edge on targetSdk 36 with Antigravity
The moment I bumped targetSdk to 36 (Android 16), the toolbar in my wallpaper preview screen slid under the status bar clock. Here is a working memo on handling the now-unavoidable edge-to-edge enforcement across several apps with Antigravity's agent.
App Dev2026-05-16
Surviving New iPhone Resolution Support with Antigravity — 29 Changes in DefineManager.h, One Honest Recap
A real-world account of updating Beautiful HD Wallpapers and three other iOS apps for iPhone Air (420×912) and iPhone 17 Pro (402×874). What Antigravity caught, what it missed, and the two-step prompt pattern that made the 29-edit process manageable.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →