Steps

  1. Ask the client (or teammate) to drop media into their existing client Slack channel. No new tools.
  2. Wait for the watcher cron (every 15 minutes) to pick it up; it uploads to Dropbox under /Client Assets/// and appends a manifest entry.
  3. Confirm capture by the black check mark reaction on the message. No reaction after 20 minutes: check the registry entry for that channel in ~/lore-content/asset-intake/registry.json.
  4. For a NEW client: run the kickoff camera-roll dump (20 minutes, we drive, they share into the channel), then verify the manifest filled.
  5. To use assets: search the manifest (asset-intake/manifests/.jsonl) by date, uploader, or caption; pull the Dropbox path from the entry.

Company-wide process, live since 2026-07-30. Design principle (Michael): zero added friction for founders; capture happens in the Slack channels clients already use, agents do the remembering.

How it works

  • Clients (or the team) drop ANY media into their existing client channel (e.g. ryevalley-cape for Cape). No new tools, no portal, no folder to find.
  • A watcher cron on the Mini (“RV: client asset intake”, every 15 min, no-agent script ~/.hermes/scripts/asset_intake_watch.py) picks up new media, uploads to Dropbox under /Client Assets///, appends a searchable manifest entry (date, uploader, caption, mimetype), and reacts with a BLACK check mark (heavy_check_mark, Michael’s chosen marker for this task type) so the human sees it was captured.
  • Non-media messages that sound like events (launch/raise/milestone language) are logged to per-client signals files; the monthly linkable-asset nudge references them to make SPECIFIC asks (“got footage from the launch you mentioned Tuesday?”).
  • Registry: ~/lore-content/asset-intake/registry.json (one entry per client channel). Manifests: asset-intake/manifests/.jsonl and -signals.jsonl.
  • Bot posts are never ingested. Files over 150MB are skipped (chunked upload TODO).

Uses

  • B-roll for the YouTube video pipeline (JOLT channel + Lore client videos).
  • Proof assets for articles and case studies.
  • Signals feed for press-release/linkable-asset nugget identification.

Onboarding step

New client kickoff includes a guided 20-minute camera-roll dump into their channel (we drive, they share). The ongoing trickle then just tops up the library.

Access

Dropbox: RVHermes app (OAuth refresh token at ~/.hermes/dropbox_oauth.json on both machines, scopes files.content./files.metadata., account michael@ryevalley.co).

Registered channels

All ACTIVE clients from the roster (clients/roster.md, source: Michael’s client sheet), 23 channels as of 2026-07-30, including all Draper and Fasset sub-channels, plus jolt (internal). Dropbox folders keyed to Client Company names. Full backfill of channel history completed 2026-07-30 (539+ manifest entries, zero errors). Initial backfills are SILENT (no reactions); the black check mark only marks captures going forward. Channels missing from Slack at go-live: seo-wwr and lore-toptal-arc (private, bot needs invite). Heavenly Health has NO Slack channel (archived; Warren prefers email): email-only clients are exempt from Slack intake; their asset gathering runs through the account owner or the hermes@ryevalley.co mailbox when email flows are enabled.

Update 2026-07-30: agency ownership default

Blake Emal is the DEFAULT content lead for ALL Megaphone clients (not an opt-in list); Tatem is the default for ALL JOLT clients. content_bank_propose.py encodes this as a JOLT_CLIENTS explicit-override set, everything else registered defaults to Megaphone. Michael is providing a full client-channel-to-client mapping; once that lands, replace the default-to-Megaphone fallback with the real per-client agency assignment.