Steps
- Ask the client (or teammate) to drop media into their existing client Slack channel. No new tools.
- Wait for the watcher cron (every 15 minutes) to pick it up; it uploads to Dropbox under /Client Assets/
/ / and appends a manifest entry. - 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.
- For a NEW client: run the kickoff camera-roll dump (20 minutes, we drive, they share into the channel), then verify the manifest filled.
- 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.