Divine Relay Video Requirements
Problem
Publishing Kind 34236 (short-form video) events to divine relays fails with
"blocked: event rejected by relay policy" even though the events comply with
NIP-71 spec.
Context / Trigger Conditions
- Error message:
blocked: event rejected by relay policy
- Kind 0 (profile) events publish successfully to the same relay
- Kind 34236 events fail on divine relays (wss://relay.poc.dvines.org, wss://relay.dvines.org)
- Events that work on other relays fail on divine relays
Root Cause
The divine relay (funnelcake) has additional validation beyond NIP-71:
From divine-funnelcake/crates/relay/src/relay.rs:554-564:
// divine.video requires thumbnail for all videos (stricter than NIP-71)
// Accept: thumb tag, thumbnail tag, image tag, or imeta with image field
let has_thumb = event.get_tag("thumb").is_some()
|| event.get_tag("thumbnail").is_some()
|| event.get_tag("image").is_some()
|| has_imeta_with_image(&event);
if !has_thumb {
// Event rejected
}
Solution
Ensure video events include a thumbnail in one of these formats:
-
Inside imeta tag (preferred - NIP-92 compliant):
["imeta", "url https://...", "m video/mp4", "image https://thumbnail.jpg", ...]
-
Standalone tag:
["thumb", "https://thumbnail.jpg"]
["thumbnail", "https://thumbnail.jpg"]
["image", "https://thumbnail.jpg"]
Getting Thumbnails from Blossom
Blossom (media.divine.video) auto-generates thumbnails for uploaded videos:
- Thumbnail URL:
https://media.divine.video/{video_sha256}.jpg
- Generation is async - may take a few seconds after upload
- Check with HEAD request before assuming availability
Verification
- Ensure imeta tag contains
image https://... field
- Test publication:
nak event -k 34236 ... wss://relay.poc.dvines.org
- Verify with:
nak req -k 34236 -a {pubkey} --limit 1 wss://relay.poc.dvines.org
Example
// Build imeta with thumbnail
const imetaParts = [
`url ${videoUpload.url}`,
"m video/mp4",
`image ${videoUpload.url}.jpg`, // Blossom thumbnail URL
"dim 480x480",
`x ${videoUpload.sha256}`,
"duration 6"
];
tags.push(["imeta", ...imetaParts]);
Notes
- This is divine-specific - other relays may accept videos without thumbnails
- The generic error message doesn't indicate which validation failed
- To debug relay rejections: read the relay source code for policy details
- Other divine relay validations in the same file:
- Required
d tag for addressable events
- Required
title tag
- Required video source (
imeta or url tag)
Debugging Strategy
When getting generic "relay policy" rejections:
- Test different event kinds (Kind 0 vs target kind) to isolate the issue
- Check if the relay codebase is available (divine repos are at ~/code/divine/)
- Search for "reject" or "blocked" in the relay handler code
- Look for validation beyond standard NIP requirements
Related Files
- Relay validation:
divine-funnelcake/crates/relay/src/relay.rs
- Allowed kinds seed:
divine-funnelcake/database/migrations/000015_seed_allowed_kinds.up.sql
- Relay config:
divine-funnelcake/crates/relay/src/config.rs