Automated release: version and notes generated from pull requests merged since 1.13.0.
Added
- One delivery table (
scripts/_platforms.py, internal — the public tool count is unchanged at 42). Every destination is described once: frame, fps, the compliance speccheck.pyreports (duration, aspects, minimum height, fps, codecs, size, LUFS, true peak, SDR-only), the fraction of the frame the app's own UI covers, caption defaults, the export preset and the check platform.check.py'sSPECSandexport.py'sPRESETS/PLATFORM_OFare now built from it — each platform preset's frame and duration cap included — so the loudnessexport.py --normalizehits, the frame it writes, the cap it trims at and the speccheck.pyenforces are the same numbers by construction (two presets deliberately differ and say so in the code:youtube4kis YouTube at 2160p, and noyoutube*preset trims at YouTube's 12-hour limit). The alias map (youtube-shorts/yt-shorts→shorts,yt→youtube,instagram/ig→reels,twitter→x,fb→facebook) is accepted bycheck.py --platform,export.py --preset,caption.py/graphics.py/overlay.py --platform,look.py --safeandrender.py --templatealike, and those tools now offer one platform vocabulary rather than three. Existing platform rows and preset command lines are byte-for-byte what they were. - Delivery templates:
render.py --template tiktok INPUT [--cues cues.txt | --srt subs.srt] [--logo] [--title] [--brand] [--chapters] [--fit crop|pad|blur] [-o OUT]fills a project shipped intemplates/and renders it — frame and fit, captions sized and placed clear of the platform's UI, loudness, the platform export preset and that platform'scheck.pyin one command. Templates ship fortiktok,reels,shorts,youtube-shorts,youtube,x,linkedin,facebookandpodcast(audio: silence trim, −16 LUFS, chapters when given, the podcast check).--list-templatesprints them with their frames, limits and safe zones;--write-project FILEwrites the filled project for editing and renders nothing; an unknown name is refused (kind: input) with the list. - The social pack:
render.py --template all INPUT(or--template tiktok,reels,x) renders every named destination from the same edit into<stem>_<platform>.mp4next to the input (.m4afor an audio-only destination, and--chaptersreaches it), runs each platform's own check, and writes<stem>_pack.mdwith one table row per destination (file, size, duration, check). Under--dry-runthe pack prints every child's planned commands and its table readsplannedwith no size or duration, since nothing was encoded and nothing was verified.report.py --pack <stem>_pack.mdrenders that table as an HTML page. - Real presets per destination:
export.py --preset tiktok|shorts|linkedin|facebookare their own entries rather than aliases ofreels/youtube, each with its platform's frame, duration limit and loudness spec.--preset youtube-hdrwrites HEVC Main10 keeping the source's own HDR10/HLG tags and refuses an SDR source (kind: input, pointing at--preset youtube) instead of labelling SDR as HDR;--preset youtube-av1encodes AV1 with SVT-AV1 (libaom fallback) and refuses withkind: missing_toolon a build that has neither.check.py --platform facebookis new. - Text stays out of the app's UI:
caption.py --platform NAME,graphics.py --platform NAMEandoverlay.py --platform NAME(so a template's--logoclears TikTok's status bar instead of landing 24 px under it) take their margins from that destination's safe zone (TikTok covers the bottom 22 % with its description block and the right 14 % with the like column; Reels 20 %/12 %, Shorts 18 %/12 %; the feed destinations keep a 5 % title-safe border). An explicit--margin(new ongraphics.py) or--positionwins.render.pypasses--platformonly for projects filled from a template, so a hand-written project is unchanged.look.py --safe NAMEshades those zones on the sheet or frame, so "is the caption readable" can be checked against the app and not just the file. fit.py --fit blur: reach an aspect with the whole picture centred on a blurred, darkened (eq brightness=-0.15) copy of itself — nothing cropped, no black bars. The darkening is SDR-only: aneqon PQ/HLG code values is not the same perceptual dim, so an HDR source keeps an undimmed (and un-tone-mapped) blurred background, with oneinfoline saying so. Templates ask for it as"frame": {"aspect": "9:16", "fit": "blur"}, orrender.py --template tiktok clip.mp4 --fit blur.render.pyprojects now accept"frame": {"fit": ...}.graphics.py --template sticker|hook|meme: a filled chip of--textthat pops in at--position(the social sticker), the full-width opening card (--title --duration 3) with a thin progress bar along the top that empties as the card's time runs out, and the classic meme layout (--top/--bottom, upper-case white with a heavy black outline). All three work inside arender.pyproject'sgraphics[]— which now takestext,top,bottom,duration,marginandplatformalongside the older keys — and honour--platform's safe zone.render.pyprojects may carry"template"(the template they were filled from) and audio-only deliveries now carry their intermediates through the audio container instead of.mp4, which is what makes the podcast template render end to end from a.wav.
Docs
- SKILL.md gains the delivery-template rows and the safe-zone gotcha,
references/scripts.mda templates section with the safe-zone table,docs/contract.mdthe delivery-table shape, what is derived from it and the new arguments,references/gotchas.mda "Platform safe zones" section (the target of SKILL.md's safe-zone pointer), and the README a "Deliver to a platform" example.demos/build.pyanddocs/demos.mdgain two demos:fit_blurandtemplate_tiktok.docs/roadmap.mdmarks 1.14.0 done and renumbers the remaining themes. tests/fixtures/mcp_tools.jsonregenerated:rendergainstemplate,list_templates,cues,srt,logo,title,brand,chapters,fit,outputandwrite_project;caption,graphicsandoverlaygainplatform(andgraphicsalsomargin,text,top,bottom,duration);lookgainssafe;reportgainspack. Nothing was removed, renamed or made required.- feat: delivery templates (render.py --template, safe zones, platform presets, blurred fit, social pack, sticker/hook/meme) (#224)
- docs: eval iteration 14 at 1.13.0 (76 prompts, 17 languages, delivery baseline) + roadmap states + external review filed (#223)
- docs: before/after demo gallery (23 demos, demos/build.py, docs/demos.md) (#222)
What's Changed
- docs: before/after demo gallery (23 demos, demos/build.py, docs/demos.md) by @claude[bot] in #222
- docs: eval iteration 14 at 1.13.0 (76 prompts, 17 languages, delivery baseline) + roadmap states + external review filed by @claude[bot] in #223
- feat: delivery templates (render.py --template, safe zones, platform presets, blurred fit, social pack, sticker/hook/meme) by @claude[bot] in #224
Full Changelog: v1.13.0...v1.14.0