Dw Marketing Reels

repo: ~/Projects/dw-marketing-reels · 90 commits · 9 in last 24h, 24 in last 7d · ▆▁▄▁▁▁█

Search the build

90 commits indexed

  1. ccd338e 2026-07-28 auto-save: 2026-07-28T07:28:16 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  2. 9829533 2026-07-27 reels: add TIKTOK_DRY_RUN wiring-verify mode for postTikTok (no publish) — TK-00128
  3. e30682f 2026-07-27 tiktok-audit-demo: turnkey capture runbook for the App-Review demo video (TK-00128)
  4. bc02a05 2026-07-27 reels: build TikTok Content-Posting-API uploader (dormant, gated on audit) — TK-00128
  5. eb7ecf5 2026-07-27 auto-save: 2026-07-27T16:52:13 (1 files) — data/reels.json
  6. 8adb693 2026-07-27 reels: fix IG async-publish timeout (first live post landed despite 12s client timeout)
  7. 5121ca1 2026-07-27 reels: honest TikTok status + FTC content-claims hold guard (pre-arm)
  8. 19e8ca4 2026-07-27 reels: consolidate LEAK_DENY to one canonical-synced module + fail-closed leak gate
  9. 4f97f1f 2026-07-27 reels: guard against duplicate social post of an already-'posted' reels[0] on nightly re-run
  10. be479b7 2026-07-27 auto-save: 2026-07-27T07:18:47 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  11. 2cae939 2026-07-26 auto-save: 2026-07-26T07:11:20 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  12. d9aab81 2026-07-25 auto-save: 2026-07-25T07:34:42 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  13. 689fe27 2026-07-24 chore: vN patch (session close — image backfill)
  14. 8d53d7f 2026-07-24 record completed image backfill: upload-imageless-11 (11/11 EUR SKUs imaged, Steve-approved live Shopify write, verified in mirror)
  15. 5ebec05 2026-07-24 auto-save: 2026-07-24T07:26:03 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  16. d86340e 2026-07-23 Pin autonomous Claude CLI invocation to Opus (--model opus)
  17. acc7a77 2026-07-23 auto-save: 2026-07-23T07:19:17 (3 files) — data/new-arrivals.json data/reels.json data/video-suggestions.json
  18. ce006d6 2026-07-22 chore: lint, refactor, v0.8.0 (session close)
  19. d385b43 2026-07-22 Route 9:16 catalog reels through build-reel.mjs ($0, IG-publishable, gallery-visible)
  20. f9fdb8f 2026-07-22 auto-save: 2026-07-22T07:42:20 (3 files) — data/video-jobs.json data/video-suggestions.json output/
  21. 8227e20 2026-07-22 video-runner: give renders narrated audio via auto-resolved HYPERFRAMES_PYTHON
  22. 6eb3061 2026-07-22 Harden video-runner: retry transient API rate-limits before erroring
  23. c0278de 2026-07-22 auto-save: 2026-07-22T07:12:00 (3 files) — data/new-arrivals.json data/reels.json scripts/video-runner.mjs
  24. 96a00f6 2026-07-22 Add hypergen daily video-suggestions tab (4 ideas/day, dated + used-stamp)
  25. aea6ea1 2026-07-21 auto-save: 2026-07-21T07:36:20 (2 files) — data/new-arrivals.json data/reels.json
  26. f9ce647 2026-07-20 chore: colorwheel-reel builder cleanup + dl warn (session close)
  27. c1c43c6 2026-07-20 Fix Threads post: reposted shop-by-color with correct caption (old mismatched post pending manual delete)
  28. 59fcd75 2026-07-20 Shop-by-color reel also posted to Threads (video)
  29. 4d8994e 2026-07-20 chore: v0.6.0 — /showcase brand-films gallery (session close)
  30. af86e6b 2026-07-20 auto-save: 2026-07-20T07:30:40 (2 files) — data/new-arrivals.json data/reels.json
  31. d028c21 2026-07-19 auto-save: 2026-07-19T07:25:16 (2 files) — data/new-arrivals.json data/reels.json
  32. e5e041b 2026-07-18 auto-save: 2026-07-18T07:20:11 (2 files) — data/new-arrivals.json data/reels.json
  33. f3f78cd 2026-07-17 auto-save: 2026-07-17T19:47:29 (1 files) — package-lock.json
  34. e86b958 2026-07-17 Shop-by-color reel posted: Instagram + Bluesky live; Facebook blocked on token scope
  35. 42687b8 2026-07-17 add public /showcase brand-films gallery page (all 6 promo cuts)
  36. 8c77003 2026-07-17 Add shop-by-color reel builder — opens on the color wheel (frame-0 thumbnail fix)
  37. 579b3f6 2026-07-17 chore: v0.5.0 (session close) — Video Studio + color-index hardening
  38. f801707 2026-07-17 reels.json: record IG publish (new-arrivals-audio reel → posted, instagram.com/reel/Da5sp25DyRu)
  39. 5408290 2026-07-17 add platform-tailored IG + TikTok captions to brand-promo reels
  40. 9651df2 2026-07-17 point deploy health-check at public /privacy (true 200, not auth 401)
  41. dcec44c 2026-07-17 stage DW brand promo 15s short cut (3 aspects) into marketing reels panel
  42. 5f5394e 2026-07-17 5x: report — 4 sweeps; fixed preload storm + console persistence (pm2); M3 'JS error' verified benign (video-preload ERR_ABORTED, no real error)
  43. eba4f19 2026-07-17 5x sweep 2: gallery videos preload=none — kills the 21-video simultaneous metadata-preload storm (ERR_ABORTED noise); videos still play on click
  44. 55e44f8 2026-07-17 deploy: cert-safe nginx script to add public /reels/*.mp4 passthrough to the live marketing.dw vhost (enables Meta media-fetch for IG publishing)
  45. 878597b 2026-07-17 fix .deploy.conf health-check port 9848→9600 (reels app real port; 9848 is corkwallcovering)
  46. 463adc4 2026-07-17 console: relative studio-media URL so the video gallery works inside the MCC iframe proxy (/api/reels/ui)
  47. 8ed53f5 2026-07-17 stage DW brand promo (3 aspects) into marketing reels panel
  48. f0a2257 2026-07-17 DW New Arrivals collection-reveal reel (9:16, product-launch-video/HyperFrames): 8-frame cartesian storyboard + frames, Kokoro VO + MusicGen BGM, captions, transitions
  49. d648cd2 2026-07-17 video-studio hardening (contrarian FIX-FIRST): realpathSync kills symlink escape on /studio-media + public /reels/; https-URL/.eml validation + 20-job cap on queue; runner requires CLAUDE_BIN & fails loud (no silent ENOENT); job chips show created-time + host-not-armed warning
  50. f2f4363 2026-07-17 New Arrivals reel: 7 curated heroes + local Kokoro VO + MusicGen BGM (/bin/zsh)
  51. 1d2a1cb 2026-07-17 console: Video Studio — buttons to queue IG reel / URL→reel / newsletter→video + rendered-video gallery (/api/videos) + gated runner (VIDEO_AUTORUN off = waits for studio session; never auto-posts)
  52. f7b3987 2026-07-16 shop-by-color wheel: -50% wheel+dots, mobile+touch, >=80 SKUs (min:80), add-sample-to-cart per card
  53. 907a60d 2026-07-16 colorwheel: canonical /pages/shop-by-color body (new wheel, replaces static swatch page); /pages/colors 301→shop-by-color
  54. 1dfe5d5 2026-07-16 colorwheel: Shopify /pages/colors widget (scoped inline build, hits public color-widen API)
  55. 5f28b85 2026-07-16 colorwheel: add 6-dot palette below wheel, paginated left/right through 24 curated colors
  56. 8098337 2026-07-16 colorwheel: widen to 15% ΔE band (big data set), fix spin/click color mismatch, drop hex+count, center dot = picked color
  57. 5ca3fe3 2026-07-16 shop-by-color motion wheel (local preview :9851, proxies live color-index endpoint) + drafted 12-image Shopify upload script (Steve-run/gated)
  58. 51d3d22 2026-07-16 Source real product images for 12/14 imageless DW products via Browserbase (O&L family blocked host bypass)
  59. 979735d 2026-07-16 auto-save: 2026-07-16T08:12:03 (9 files) — fetch-ol-images.cjs fetch-ol-manifest.json fetch-remaining.cjs fetch-remaining.json harvest-colorways-results.json
  60. cc29f33 2026-07-16 auto-save: 2026-07-16T07:11:48 (2 files) — data/new-arrivals.json data/reels.json
  61. 55f1b05 2026-07-15 chore: v0.4.1
  62. eae2436 2026-07-15 auto-save: 2026-07-15T14:07:06 (2 files) — public/index.html server.js
  63. 2cd59c0 2026-07-15 chore: v0.4.0 (session close) — FB-graph IG publish + publish-ig.mjs + privacy/terms + audio-mux fix
  64. 15079e2 2026-07-15 Add self-contained scripts/publish-ig.mjs — post a reel to IG from the marketing project via the FB-graph flow (durable page token), no Norma dependency; SOCIAL_LIVE_ARMED-gated with a public-media reachability guard
  65. c5afbac 2026-07-15 auto-save: 2026-07-15T07:35:12 (2 files) — data/new-arrivals.json data/reels.json
  66. 390b976 2026-07-14 Add public /privacy + /terms pages (no-auth) for Meta app publish requirement
  67. 59b2d6b 2026-07-14 build-reel: mux silent AAC track into every reel — IG Reels require audio (no-audio MP4 fails Meta processing w/ error 2207082)
  68. 7d816dd 2026-07-14 auto-save: 2026-07-14T07:29:44 (2 files) — data/new-arrivals.json data/reels.json
  69. ac1da40 2026-07-13 Add package-lock.json — unblocks deploy (npm ci requires a lockfile; project is zero-dep)
  70. 9ed9b0f 2026-07-13 New Arrivals reel (2026-07-13-21-49) + refreshed feed (24 arrivals)
  71. 66cb716 2026-07-13 Fix console port default 9846->9848 (matches .deploy.conf + README) — 9846 silently collided with live dw-staged-active-viewer
  72. d02c9bb 2026-07-13 Fix publish-status unwrap: read Norma's .result envelope + explicit r.simulated (kills false 'posted' on no-creds + false 'simulated' on live post) + no-creds badge — contrarian gate
  73. fea25bd 2026-07-13 chore: v0.3.0 — multi-account IG picker + meta-token canary + live-post payload fix (session close)
  74. d9ccbc0 2026-07-13 auto-save: 2026-07-13T08:23:39 (1 files) — data/reels.json
  75. aa4f29e 2026-07-13 5 themed reels (Thibaut, Grasscloth Edit, Phillip Jeffries, Statement Murals, Schumacher) + fetch upgrades: leak-deny filter at feed level, multi-page collection fetch, spread sampling, Repeat-spec title cleanup
  76. 34da727 2026-07-13 auto-save: 2026-07-13T07:23:25 (2 files) — data/new-arrivals.json data/reels.json
  77. 4321527 2026-07-13 Pin SOCIAL_LIVE_ARMED=0 in nightly plist — schedule can never inherit an armed env (contrarian hardening)
  78. 829f7fe 2026-07-13 Fix live-post payload: send video_url (Norma reel.js contract), not mediaUrl — contrarian-caught silent 500
  79. f6b331e 2026-07-13 auto-save: 2026-07-13T01:21:52 (3 files) — data/new-arrivals.json data/reels.json scripts/fetch-new-arrivals.mjs
  80. 2db6c90 2026-07-13 docs: publish-social — reels now public (media blocker cleared), only SOCIAL_LIVE_ARMED remains
  81. 2c90228 2026-07-13 chore: lint, refactor (hoist SLUG), doc outroBig, v0.2.0 (session close)
  82. 582f1f1 2026-07-13 Multi-account Instagram picker: DW-family account registry + per-reel Post-to selector + account-routed publish
  83. 808fac7 2026-07-13 Dry-run publish status for cork reel: IG ready-pending-arm (media URL public), TikTok pending-reconnect
  84. 78da8fd 2026-07-12 Themeable reels + Phillipe Romano cork reel (env-driven copy/caption/slug + vendor/title/dedupe fetch filters)
  85. 2f74ee0 2026-07-12 Safety-when-on: ARMED gate (no live post until SOCIAL_LIVE_ARMED=1) + private-label leak filter in captions (contrarian fixes)
  86. 1584e5c 2026-07-12 Public media exemption: GET /reels/*.mp4 unauthenticated (console/APIs stay gated) — so Meta/TikTok can fetch reels
  87. 20c8b48 2026-07-12 Auto-post to IG/TikTok (fail-safe pending-creds) + captions + publish-status panel
  88. a1ba7d4 2026-07-12 Build-gate for read-only public deploy + nightly push to Kamatera
  89. 7630cbd 2026-07-12 Add nightly runner (gated plist), README, deploy config
  90. fc8c20e 2026-07-12 DW Marketing new-arrivals reels: HyperFrames reel generator + auth-gated console (:9848)

Authors

Agents used

  • comms-compliance2

Skills used

  • /reels22
  • /new-arrivals16
  • /video-suggestions7
  • /video3
  • /pages3
  • /newsletter2
  • /videos2
  • /day2
  • /suggestions2
  • /index2
  • /showcase2
  • /privacy2
  • /colors2
  • /terms2
  • /init1
  • /upload1
  • /status1
  • /narrate1
  • /record1
  • /trim1
  • /split1
  • /tiktok-post1
  • /fire-test-post1
  • /leak-deny1
  • /conversation1
  • /scan-leaks1
  • /error1
  • /gen1
  • /video-jobs1
  • /tts-venv1

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

9829533 · 2026-07-27 · reels: add TIKTOK_DRY_RUN wiring-verify mode for postTikTok (no publish) — TK-00128
dryRunTikTok() exercises the real pre-publish path: token refresh (auth
plumbing, rotates+persists), creator_info (validates token + reads the
privacy levels the app is actually allowed to use), and init-body assembly
— then STOPS before video/init. Nothing is uploaded, no post is created.

Wired into postTikTok as an un-armed escape hatch (TIKTOK_DRY_RUN=1), so the
wiring can be verified without TIKTOK_LIVE_ARMED and without the pending
TikTok app audit. Live publish path unchanged and still gated.

Offline test (fetch stubbed, throwaway HOME): SELF_ONLY -> wouldPost true;
PUBLIC_TO_EVERYONE on unaudited app -> wouldPost false; only token +
creator_info called, no init/upload/status. $0 (no live API call).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e30682f · 2026-07-27 · tiktok-audit-demo: turnkey capture runbook for the App-Review demo video (TK-00128)
Scene-by-scene shot list with embedded narration + who-does-what roles (Steve: OAuth
consent + account-Private toggle + button clicks; me: cue/narrate/record/trim/split).
Encodes the unaudited-app trap (account must be Private during the post) and the ≤50MB
split. Readiness verified 2026-07-27. Live capture is a ~10-min guided pass.
bc02a05 · 2026-07-27 · reels: build TikTok Content-Posting-API uploader (dormant, gated on audit) — TK-00128
- scripts/tiktok-post.mjs: ports the proven FILE_UPLOAD flow (creator_info → init →
  PUT bytes → poll) from tiktok-oauth-catcher/fire-test-post.sh, plus the token refresh
  the nightly cron needs (TikTok access tokens expire ~24h; refresh tokens rotate and are
  persisted back to the canonical secrets .env). Reads creds from secrets (single source).
- publish-social postTikTok: wired to the uploader behind its OWN gate TIKTOK_LIVE_ARMED,
  decoupled from IG's SOCIAL_LIVE_ARMED. Dormant → 'ready-pending-tiktok-arm'.
- privacy defaults SELF_ONLY; refuses a privacy level the app isn't allowed (→ 'pending-audit').

EXTERNAL BLOCKER: the DW production TikTok app is UNAUDITED, so PUBLIC posting is impossible
until TikTok approves the audit (unaudited apps: SELF_ONLY to a private account only). Code is
ready; the first live run is Steve-gated (posts + rotates the shared refresh token).
Verified: syntax, exports resolve, dry resolution = ready-pending-tiktok-arm, leak gate passes.
8adb693 · 2026-07-27 · reels: fix IG async-publish timeout (first live post landed despite 12s client timeout)
First live DW IG reel posted 2026-07-27 (reel/DbUK59zFdfL) but the client saw a 12s
timeout mid-publish (IG container->poll->publish runs ~30-60s), recording a false error.
- bump IG post timeout 12s->90s so a real post is captured as posted.
- on timeout: return posted-unverified (NOT error) - the request was already sent, so a
  blind retry would DUPLICATE the post; the dup-guard now skips posted-unverified too.
Reconciled reels[0] to posted (permalink) so the nightly cron cannot double-post.

TK-14.
5121ca1 · 2026-07-27 · reels: honest TikTok status + FTC content-claims hold guard (pre-arm)
- postTikTok: when armed+token'd but the Content Posting API uploader isn't built,
  return status 'not-implemented' + console.warn instead of a silent 'pending-reconnect'
  that could read as handled on an armed run (contrarian: silent-success bomb).
- Content-claims gate (comms-compliance Fix 1): HOLD any reel whose caption carries an
  unsubstantiated factual claim ('For 25 years', 'As seen in AD/Elle Decor/WSJ') — status
  'held-claims-review' — until CLAIMS_SUBSTANTIATED=1. Verified: holds exactly the 3
  dw-brand-promo reels (15-17), none of the other 30. Fail-safe default = hold.

TK-14. Lets Steve arm the pipeline WITHOUT the unsubstantiated promo reels posting.
19e8ca4 · 2026-07-27 · reels: consolidate LEAK_DENY to one canonical-synced module + fail-closed leak gate
- scripts/leak-deny.mjs: single source of truth for the private-label denylist,
  synced to canonical dw-leak-scanner. Adds names the 3 hand-copied regexes had
  DRIFTED and were missing: lillian august (leaked 2026-07-06), rigo, rigowall.
  Per-term anchoring: leading-\b on 'versa' (catches standalone + concatenated,
  safe on Adversarial/conversation/Universal), both-\b on 'rigo' (protects Rigoletto).
- build-reel / build-colorwheel-reel / fetch-new-arrivals: import the shared module,
  removing 3 drift-prone copies.
- scripts/scan-leaks.mjs + npm 'scan': fail-closed gate over the staged manifests.
- cron-run.sh: run the gate BEFORE publish+push — a leaked name can no longer reach
  a public post. Turns the old one-shot '0 leaks' assertion into a standing gate.

Verified: 22/22 leak+FP assertions pass; gate PASSES on the 33 staged reels.
TK-14. Contrarian-gated (FIX FIRST verdict applied).
4f97f1f · 2026-07-27 · reels: guard against duplicate social post of an already-'posted' reels[0] on nightly re-run
comms-compliance find (TK-14): main() always takes reels[0]; if a nightly build
fails to prepend a new reel but publish-social still runs, an already-posted reel
would be resubmitted to the Graph API (duplicate public post). Skip only a confirmed
'posted'/'already-posted' state; every non-terminal state (pending-creds/
ready-pending-arm/error) is still (re)attempted. Full idempotency-key dedup for the
error-response-leg edge is a follow-up. Contrarian-gated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
d86340e · 2026-07-23 · Pin autonomous Claude CLI invocation to Opus (--model opus)
Bare 'claude' spawn inherited the CLI's drifting default model; pin to Opus
so this build/gen loop always runs on the intended model.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ce006d6 · 2026-07-22 · chore: lint, refactor, v0.8.0 (session close)
- video-runner: hoist prompt(j) to a single const (drop duplicate call in retry loop)
- lint pass: 0 autofixes needed; flagged pre-existing serveFile Range-header
  null-deref for a future scoped fix (not session code)
d385b43 · 2026-07-22 · Route 9:16 catalog reels through build-reel.mjs ($0, IG-publishable, gallery-visible)
Running a real render exposed that new-arrivals-reel via claude -p was slow
(~8min), cost API, produced a SILENT reel, and orphaned it in output/ (invisible
to the gallery). The repo's own build-reel.mjs renders the same reel in ~20s, $0
(local ffmpeg/Chrome), with an IG-publishable AAC track, straight into reels/.
- video-runner: new-arrivals-reel@9:16 → build-reel.mjs (no arming needed);
  1:1 + url/newsletter keep the gated claude -p skill path; retry wraps both
- server: /api/videos gallery now also scans output/ (+ serve guard) so the
  HyperFrames url/newsletter renders that land there are visible + playable
8227e20 · 2026-07-22 · video-runner: give renders narrated audio via auto-resolved HYPERFRAMES_PYTHON
Auto-resolve the local HyperFrames TTS venv (~/.hyperframes/tts-venv/bin/python)
and inject it only into the render child's env — so auto-rendered reels get
voiceover/BGM without arming or mutating the pm2/server environment. Honours an
explicit HYPERFRAMES_PYTHON if already set.
6eb3061 · 2026-07-22 · Harden video-runner: retry transient API rate-limits before erroring
Root cause of the studio host's 'claude exit 1' renders was a transient Anthropic
throttle ('Server is temporarily limiting requests'), which permanently killed the
job with no retry. Now:
- capture claude stderr, classify transient (rate-limit/overloaded/429/529/reset)
- retry with exponential backoff (VIDEO_MAX_TRIES=3, VIDEO_BACKOFF_MS=20000)
- record attempts + a human-readable reason in job.note (not opaque 'exit 1')
- console surfaces the last few errored renders with their reason so failures
  don't vanish silently
Applies to both the manual studio buttons and the new suggestions 'Use it' flow.
96a00f6 · 2026-07-22 · Add hypergen daily video-suggestions tab (4 ideas/day, dated + used-stamp)
- scripts/suggest-videos.mjs: $0-local daily generator, 4 ideas/day from
  New Arrivals catalog, append-only history, idempotent per PT date
- server.js: GET /api/video/suggestions, POST /api/video/suggest,
  POST /api/video/suggestions/use (queues the render + stamps used_at/used_where);
  shared buildVideoJob/enqueueVideoJob helpers reused by the manual queue door
- public/index.html: Suggested-videos tab — day-grouped cards, created date+time
  chip, Use-it button, and a when/where used-stamp; gated on allowBuild
- com.steve.dw-video-suggest launchd agent: fills today's 4 daily at 7:05 PT (ideas only)
f2f4363 · 2026-07-17 · New Arrivals reel: 7 curated heroes + local Kokoro VO + MusicGen BGM (/bin/zsh)
- Curated 7 hero picks (1-2 colorways/pattern) across Rebel Walls murals + Thibaut
- 1080x1920 9:16, 22.8s, yuv420p 30fps, AAC 44.1kHz
- Real local audio: Kokoro TTS voiceover (bf_isabella) over ducked MusicGen ambient bed
- Fixed banned-word: caption hashtags now #Wallcovering/#Wallcoverings (was #Wallpaper)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

File tree

97 files tracked. Click any to browse the source at HEAD.

Other build journals

← Dw Launches  ·  all 4 projects  ·  Dw Marketing Viewer →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 1ms