From 0ce4f1398c92f1ce41888ba75330be67ff48695f Mon Sep 17 00:00:00 2001 From: prompt.ac/@jeffrey Date: Tue, 14 Jul 2026 22:55:58 +0000 Subject: [PATCH] slab + marketing tooling: multi-contact iMessage, caption burner, CaPUR logo gen - imsg.mjs: contacts map + `send --to ` recipient selection, backward-compatible with the legacy single-contact config (default contact preserved; status/tail/open unchanged) - dm-mcp.mjs: dm_send now passes `to` through to imsg (--to) for iMessage - marketing/bin/caption-burn.mjs: node-canvas caption burner (this ffmpeg has no libass) — burns styled captions over a raw-frame pump + muxes an audio track; portrait-friendly, CRF arg - marketing/capur/: CaPUR (Calisthenics Puerto Rico) logo material studies via gpt-image-2 (mirrors gen-pals) with wordmark-legibility QC; out/ gitignored --- marketing/.gitignore | 3 +++ marketing/bin/caption-burn.mjs | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ marketing/capur/gen-capur.mjs | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ marketing/capur/ref/CaPUR.png | 0 slab/bin/dm-mcp.mjs | 13 +++++++------ slab/bin/imsg.mjs | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------- 6 file(s) changed, 305 insertion(s)(+), 23 deletion(s)(-) diff --git a/marketing/.gitignore b/marketing/.gitignore --- a/marketing/.gitignore +++ b/marketing/.gitignore @@ -20,3 +20,6 @@ podcast/publish/ # av-reels working outputs (regen-able) av-reels/out/ + +# capur logo studies — regen with capur/gen-capur.mjs +capur/out/ diff --git a/marketing/bin/caption-burn.mjs b/marketing/bin/caption-burn.mjs new file mode 100644 --- /dev/null +++ b/marketing/bin/caption-burn.mjs @@ -0,0 +1,110 @@ +#!/usr/bin/env node +// caption-burn.mjs — burn styled captions onto a video + attach an audio track. +// +// This ffmpeg build has NO libass, so captions are drawn in node-canvas over a +// raw-frame pump (same approach as pop/menuband/bin/finalize-vo.mjs), then the +// audio (VO) is muxed in by the encoder. Portrait-friendly defaults. +// +// Usage: node marketing/bin/caption-burn.mjs [W H FPS] + +import { readFileSync } from "node:fs"; +import { spawn } from "node:child_process"; +import { once } from "node:events"; +import { createCanvas, registerFont } from "canvas"; +import { spawnFFmpegEncode } from "../../pop/lib/preview-shared.mjs"; + +const [VIDEO, AUDIO, SRT, OUT, wArg, hArg, fpsArg, crfArg] = process.argv.slice(2); +if (!VIDEO || !AUDIO || !SRT || !OUT) { + console.error("usage: caption-burn.mjs