Reka already reads video. Why peepshow?
Reka accepts video natively. peepshow is not a competing video understanding stack — it's a control plane that sits in front of native video to handle the cases native upload doesn't.
- Cost ceiling on long clips. Reka's native video bills per-second. peepshow extracts N scene-change frames so a 1-hour CCTV reel costs predictably instead of scaling linearly with seconds.
- Animated GIF / APNG / WebP. Reka's video path expects container formats. peepshow flattens animated images into a clean frame sequence.
- Audit trail. Reka's native sampling is opaque. peepshow gives you the exact frames the model saw — replayable, diffable, cacheable.
- Audio transcript stays cheap. whisper.cpp on PATH → plain text transcript. Cheaper than feeding the raw audio for dialogue-heavy content.
- Cross-model portability. Same peepshow bundle feeds Reka + Gemini + Claude + GPT. Extract once, run anywhere.
- Sinks. Reka won't push frames to Notion / Slack / S3 / SQL. peepshow does — same run, 95 destinations.
Token-cost math (worked examples)
| Clip | Native upload | peepshow + Reka |
|---|---|---|
| 30s product demo | ~6K tokens | ~5K (6 frames + 200-word transcript) |
| 10-minute lecture | ~120K tokens | ~12K (20 scene frames + transcript) |
| 1-hour CCTV reel | ~720K tokens | ~22K (30 motion frames + sparse transcript) |
| 3-hour conference recording | ~2.2M tokens (over context limit on Flash / Edge) | ~45K (60 scene frames + transcript chapters) |
Reka publishes per-second video pricing across Core / Flash / Edge. Numbers above are approximate against the current Core tier — Flash and Edge are cheaper but with smaller context.
Install (CLI)
npm install -g peepshow
# Set Reka credentials:
export REKA_API_KEY=...
# Extract — peepshow's manifest still works alongside Reka's native video:
peepshow ./demo.mp4 --emit json > run.jsonInstall (Reka API directly, no CLI)
Calling the Reka API from your own code? Run peepshow first, then feed the JSON manifest in as multimodal parts:
# Hand frames + transcript to Reka (OpenAI-compatible chat endpoint)
node -e '
import OpenAI from "openai";
import { readFileSync } from "node:fs";
const run = JSON.parse(readFileSync("run.json", "utf8"));
const content = [
{ type: "text", text: "Summarise this clip." },
...run.frames.map(f => ({
type: "image_url",
image_url: { url: "data:image/jpeg;base64," + readFileSync(f.path).toString("base64") }
})),
{ type: "text", text: "Transcript:\n" + (run.transcript?.text ?? "") }
];
const client = new OpenAI({
apiKey: process.env.REKA_API_KEY,
baseURL: "https://api.reka.ai/v1",
});
const r = await client.chat.completions.create({
model: "reka-core",
messages: [{ role: "user", content }]
});
console.log(r.choices[0].message.content);
'Animated GIF / APNG / WebP — peepshow's killer move on Reka
Reka's native video path expects video containers. Animated PNG, animated WebP, and most GIFs come back as still images — motion lost. peepshow probes the source, treats it as a frame sequence, and emits ordinary JPEGs Reka will gladly read alongside its native modalities.
peepshow ./meme.gif # animated GIF → frame timeline
peepshow ./tutorial.apng # animated PNG → frames
peepshow ./loop.webp # animated WebP → framesFrame strategy presets
peepshow picks scene-change frames by default. For Reka specifically, these presets are worth knowing:
--strategy scene --max 20Default — good balance for narrative clips that exceed Reka's native short-clip sweet spot.--strategy fps --fps 1 --max 60Match Reka's internal video sampler cadence for comparison runs.--strategy scene --max 12 --dedup perceptualLong static footage (CCTV / timelapse). Drops near-duplicates before Reka pays for them.
All 95 sinks still fire
Same CLI = same sinks. Push frames to SQLite, embed captions into Chroma, mirror to S3, drop a thumbnail in Slack, file a GitHub issue with the offending frame attached — all from one Reka run. Browse the full sink catalogue →.
Report + LLM analysis loop
Every run also writes a self-contained report.html + manifest.json next to the frames (see the Report page). When Reka consumes the frames, the analysis flows back into the report — whoever opens it next sees the model's understanding without re-running the prompt.
echo '{"summary":"<Reka's summary>","provider":"reka-core"}' \
| peepshow report annotate "<outputDir>"When to skip peepshow + use Reka direct
- Clip is under 60s and you want full native motion + audio fidelity (lip-sync, sport, music).
- One-shot prototype — token cost doesn't matter, and you don't need the audit trail.
- No need to fan out to other models or sinks — Reka's native path is fine on its own.
Native video is excellent for those cases. peepshow earns its place when any of: long, animated format, cost-bounded, auditable, multi-model, local-first, fan out to other systems.