Drop a video, give it a prompt, and have an LLM analyze it. Results land in your Notion page so Claude Code can pick up where you left off. Uses Apify MCP Connectors to write to Notion on your behalf — no Notion API key required.
Build reproducibility and memory rightsizing. No input/output schema changes.
Reproducible builds (lockfile). Added requirements.lock, a fully pinned,
hash-verified resolution compiled from requirements.txt. The Docker build now
installs from it with pip install --require-hashes -r requirements.lock instead
of from the loose ranges. This pins apify-shared (currently 2.2.0) — the
transitive dependency behind the v2.x crash — so a rebuild can't silently pull a
changed version. requirements.txt keeps the human-readable ranges and is the
source the lock is compiled from. Regenerate the lock after editing
requirements.txt with:
uv pip compile requirements.txt -o requirements.lock --generate-hashes --no-header --python-version 3.14
(--python-version 3.14 matches the apify/actor-python:3.14 base image;
pre-releases are excluded by default). The lock in this commit was generated this
way on a connected machine, not hand-written.
Memory rightsizing. Lowered .actor/actor.json from min 2048 / max 4096 MB to
min 1024 / max 2048 MB. Peak observed Python RSS was ~114 MB; the 2 GB max keeps
headroom for the ffmpeg subprocess (whose RSS is not in that 114 MB number) while
halving the per-GB actor-start charge.
Follow-up (not yet done): run an on-platform headroom test on a long /
high-resolution video to confirm 2 GB is enough for ffmpeg before considering a
further drop to 1024 MB max. Watch the run for OOM kills / ffmpeg exit 137. Do
not lower the max below 2048 MB until that test passes.
v2.8 — 2026-06-12
Error-handling hardening. No input/output schema changes; existing Tasks keep working.
Added a top-level exception net in main(). An unhandled error now fails the
run with a failed_internal dataset row (errorCategory: internal_error,
errorRecoverable: false) and a human status message, instead of exiting with
a bare exit_code 1 and no explanation.
Split the LLM-call handler. Known RuntimeErrors from the LLM paths
(transport, 4xx/5xx, out-of-credit, rate limit) stay user-friendly and
recoverable. Any other exception is treated as an internal error (permanent),
so a bug isn't mislabeled as a retryable LLM condition and looped on by agents.
Both failure messages state "No LLM analysis charge was incurred" where that's
provably true, and keep raw exception types out of the lead of the message.
First release built from the GitHub repo (private) rather than uploaded source files.
Earlier
For 2.7 and earlier, see the Apify Console build history and the project notes.