Markdown Converter
Agent skill for markdown-converter
Stemset is an AI-powered audio stem separation application with Google OAuth authentication:
Sign in to like and favorite skills
Stemset is an AI-powered audio stem separation application with Google OAuth authentication:
uv run stemset process <profile> (default)media/We do not catch exceptions to provide fallbacks. If something fails, we want to know immediately. No
try/except blocks unless absolutely necessary for resource cleanup.
from __future__ import annotations, type unions with |, no OptionalAny unless interfacing with untyped third-party code. Check with basedpyrightuv for package management, not pipUnidirectional dependencies only. Higher layers can import from lower layers, never the reverse.
Configuration (config.py) ↓ Registry (models/registry.py) ↓ Base Abstractions (models/audio_separator_base.py) ↓ Concrete Models (models/atomic_models.py) ↓ Executors (models/strategy_executor.py) ↓ Public Interface (modern_separator.py) ↓ API (api.py)
All audio separation models inherit from
AudioSeparator ABC which defines:
output_slots: dict[str, str] - What this model produces (e.g., {"vocals": "Vocal track", "not_vocals": "Instrumental"})model_filename: str - Which model file to loadseparate(input_file, output_dir) -> dict[str, Path] - Performs separationWe use
AudioSeparatorLibraryModel as the base for models using the audio-separator library, so concrete models only need to define output_slots and model_filename.
Strategies are defined in
config.yaml as recursive trees:
successive: _: "vocals_mel_band_roformer.ckpt" # Model to use vocals: vocals # Final output not_vocals: # Feed into next model _: "kuielab_b_drums.onnx" drums: drums not_drums: _: "kuielab_a_bass.onnx" bass: bass not_bass: other
The
_ key specifies which model to use. Other keys map that model's output slots to either:
Validation: At execution time, we verify output slots in the config match what the model actually produces. Config errors fail immediately with clear messages.
Intermediate Processing: All intermediate files use lossless WAV format. Only final outputs use the user's configured format (Opus, WAV, etc.).
Processing Workflows:>`
Web Upload Processing (Modal):
Modal Worker Deployment:
modal deploy src/processor/worker.pydocs/modal-deployment.md for full deployment guideThe frontend uses two code generation tools:
OpenAPI Client Generation (API types and hooks)
cd frontend npm run generate # One-time generation npm run generate:watch # Watch mode (auto-regenerates)
http://localhost:8000/schema/openapi.jsonsrc/api/generated/openapi-ts.config.tsTanStack Router Generation (route types)
cd frontend npm run generate:routes # Generate route types
src/routes/ directory for route filessrc/routeTree.gen.tsWhen adding new API endpoints:
src/api/models.pysrc/api/*_routes.pysrc/api/app.pyuv run litestar run --reload (if not running)cd frontend && npm run generateWhen adding new frontend routes:
src/routes/ (e.g., src/routes/p/$profileName/clips/$clipId.tsx)npm run generate:routes