7 Commits

Author SHA1 Message Date
Conal Mullan fd24349fe1 REMOVE: EchoMimicV3 — drift made it unusable, SoulX is the default (#81)
EchoMimicV3 was added earlier in this same unreleased cycle and never reached a
tagged release, so this removes it rather than deprecating it — no public API
changes.

Identity drift is why. On a controlled A/B (same photo, same 80s audio, same
544x736) it fell to 50% of frame-zero sharpness by 70s, glasses dissolving
around 55s and no recognisable face by 67s, where SoulX-FlashHead held 97%. The
failure is absorbing rather than gradual — each segment re-anchors on the
previous segment's output, so one bad segment poisons everything after it — and
colour correction recovers none of it because the damage is structural. That
implied a ~30s render ceiling which shaped the surrounding design.

The one capability SoulX lacks is text-prompt and CFG steering, and our own
docs already recorded from testing that the prompt is close to inert. Everything
else EchoMimicV3 offered, SoulX matches or beats: aspect preservation, motion
quality, ~3.7x cheaper, ~3-6x faster. The genuine loss is gesture and
upper-body motion, which nothing in the toolkit currently uses.

Also in this commit:
- Talking head docs, registry entries (tools and modal endpoints), cloud_gpu
  dispatch, modal-setup, NarratorPiP's comment and both env files repointed to
  soulx. cloud_gpu also gains a GPU tier for it, which echomimic3 never had --
  its jobs silently reported no cost estimate.
- The Unreleased Kiro changelog entry is dropped; it shipped in v0.19.0 and was
  flagged in-file for removal when this section was cut.

Findings worth keeping outlived the tool and moved into docs/soulx.md: the
warning against scoring talking heads with similarity metrics (two have now
misled — one ranked highest a variant with a visible eye defect, the other
plateaued straight through a total collapse), the volume-weights rationale, and
the image guidelines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 11:41:35 +01:00
Conal Mullan bfadee6518 CHANGE: echomimic3 — store weights in a Modal Volume, pin every ref by SHA (#76)
Closes #76. Every other docker/modal-* app bakes its weights into the image, a
habit inherited from RunPod where serverless genuinely pulls the image. Modal
recommends the opposite, and the benchmark backs it:

  rebuild after a dependency change   79-385s baked   1.8-8.2s volume
  cold start                          57-94s          60-67s
  generation speed                    identical       identical

Cold start and generation are a wash; the rebuild gap is 20-100x. Getting this
model working took four dependency changes, each of which re-downloaded 26GB
under the baked scheme, so that is the cost that actually bites. Storage is free
at this scale — Modal includes 1 TiB/month and this app stores 26.6GB — which is
what makes the choice an engineering one rather than a cost trade-off.

The settled apps (upscale, image-edit) change rarely and gain nothing by moving,
so they stay baked. Baking remains fully supported here too, as a separate app:

  ECHOMIMIC_WEIGHTS=image uv run modal deploy docker/modal-echomimic3/app.py

The real cost of a volume is reproducibility: weights are no longer tied to the
image, so nothing else stops the two drifting apart. Hence REPO_REF moves off
`main` to a commit SHA (an unpinned ref silently re-resolving on rebuild is how
#71/#74 happened to flux2) and all four model revisions are pinned too. Fetching
by SHA needs git init + fetch --depth 1; clone --branch only takes a ref name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 19:22:11 +01:00
Conal Mullan 290d7d345b Adopt uv for Python dependency management (#33 rebased, thanks @AsharibAli) (#59)
* Adopt uv for Python dependency management

Replace manual pip/venv setup with `uv sync` (pyproject.toml + uv.lock),
and switch all tool invocations across docs, skills, commands, and
examples to `uv run`. Optional extras: --extra whisper, --extra modal.
tools/requirements.txt is kept as a pip fallback.

* FIX: bring uv migration current with main — post-June deps and docs

Adds websocket-client (60db websocket transport) to core deps and a
'youtube' extra for the google-* packages (tools/youtube_upload.py),
regenerates uv.lock, bumps pyproject version to 0.18.0, and converts the
51 'python3 tools/…' invocations added since the PR was opened (60db,
YouTube, Kiro docs, publish command) to 'uv run'. Verified with
uv sync --frozen --extra youtube; voiceover, sixtydb_tts, youtube_upload
and migrate_to_kiro all run through the project environment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Asharib Ali <asharibarain4@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 22:55:43 +01:00
Edgar 7cca516f96 FIX: wire up LTX-2 Modal config, repair verify_setup app detection, document Windows gotchas (#51)
Three unrelated gaps found while running /setup end to end on Windows.

1. MODAL_LTX2_ENDPOINT_URL was read by tools/cloud_gpu.py but appeared in
   neither .env.example nor verify_setup.py, so LTX-2 could only be configured
   by someone who had read the source. Added to both, plus the deploy command
   and env var in docs/modal-setup.md.

2. verify_setup.py always reported "no toolkit apps deployed". `modal app list
   --json` emits lowercase keys ("description", "state") while the check read
   the capitalised column headers of the human-readable table, so the filter
   never matched. Verified against a workspace with 6 deployed apps: now
   correctly reports "6 deployed". Also made the "N/7 tools" header derive its
   total from the tool list instead of hardcoding it, since adding LTX-2 would
   otherwise have desynced the count.

3. Documented three Windows blockers that each present as a toolkit bug:
   - modal deploy aborts mid-build with a cp1252 'charmap' encode error unless
     PYTHONIOENCODING=utf-8 is set
   - python3 resolves to the zero-byte WindowsApps App Execution Alias, which
     fails with "Permission denied" — this breaks every documented
     `python3 tools/...` invocation
   - FFmpeg needs a manual install, with a fallback for when winget's source
     index is corrupted

   Also documented two Modal behaviours that cost real debugging time: AppCreate
   is rate-limited so deploys must be serial, and A100-class apps (image-edit,
   ltx2) fail at deploy time until a payment method is added. Noted that ltx2
   separately needs a `huggingface-token` secret, and that Modal truncates long
   endpoint labels with a hash so URLs must be copied rather than reconstructed.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-13 22:05:14 +01:00
Conal Mullan b9f39563a2 Add acemusic cloud API as default music generation provider
Switch music_gen.py from self-hosted Modal/RunPod to the official ACE-Step
cloud API (acemusic.ai) as the default provider. This gives access to the
XL Turbo 4B model with 5Hz LM thinking mode — significantly better quality
and variety than the self-hosted 2B model, with free API keys and no GPU costs.

New features: --thinking/--no-thinking, --variations, --repaint,
--continuation, --guidance-scale, --infer-method. Modal/RunPod remain as
--cloud modal/runpod fallbacks.

Skill doc updated with vocal gender control and duet patterns discovered
through testing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 22:11:05 +01:00
Conal Mullan 11f98442d6 Rewrite modal-setup.md: Modal as recommended provider, add R2 and /setup refs
- Frame Modal as recommended (not "alternative"), explain $30/mo free tier
- Add account creation steps with signup link
- Add Cloudflare R2 section (was completely missing)
- Reference /setup as the automated path throughout
- Add verify_setup.py to monitoring section
- Update cold start times from actual testing (dewatermark was missing)
- Move RunPod to "Alternative" section at bottom
- Add tool usage examples with --cloud modal

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:50:13 +00:00
Conal Mullan 2eec07af24 Add Modal docs, propainter app, and cloud GPU quick start
- Create docs/modal-setup.md with motivation, quick start, cold start
  times, monitoring, and architecture overview
- Add propainter (dewatermark) Modal app for video inpainting
- Update CLAUDE.md with cloud GPU providers quick start section
- Update registry with dewatermark Modal endpoint
- Update ROADMAP with docs tracking

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 17:25:46 +00:00