- async zip() instead of zipSync (non-blocking for large files)
- null check for track in DELETE endpoint (was non-null assertion)
- formatFileSize extracted to format.ts, imported in StemList
- Stem type exported from StemList, removed duplicate in +page.svelte
- files[idx].progress = p direct Svelte 5 mutation (no spread)
- remove narrative comments from stems.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ContentLength in PutObjectCommand causes XHR upload failures (browser
does not send matching Content-Length header in presigned PUT requests)
- Change accept to audio/* so macOS Finder allows multi-file selection
- Add step prefix to errors ([URL]/[S3]/[DB]) for easier debugging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>