Codync
免费开源的 1:1 Grok Bot 与 Muse 替代方案。可在 iPhone、Mac 或 Linux 桌面上将 Claude 代码、Codex、Cursor 以及 40 多个编码代理作为持久机器人使用。支持群组聊天、线程、应用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证AgentTake — hand the camera to your AI agent: it drives a browser and directs a narrated product video, over MCP. Part of AgentHotel (as Take); runs anywhere.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Part of AgentHotel — where it is installed as Take — and it runs anywhere on its own. Formerly reel-studio.
🌐 take.agenthotel.org — what it is, in two minutes.
AgentTake turns any AI agent into a video director. Point your agent at a web app and it drives a real browser, decides what to click, narrates what matters, moves the camera, and walks away with a polished, narrated MP4 and a public link — no human in the loop, no editing suite, no screen-recording plugins.
It's not another autopilot. It's a clean MCP surface that hands the camera to your agent. The agent that already knows your product is the best director you'll ever hire — AgentTake just gives it a studio.
▶ Watch what agents have made: take.clawable.org/theater — including Hermes checks in, AgentHotel's launch video — a Hermes agent tells its own story, and directed, filmed and cut it with AgentTake.
Give the camera to the agent:
observe returns a live screenshot plus
structured, clickable elements; act clicks, types, scrolls, hovers and
narrates. The agent sees the screen and directs the shot.wide,
medium, close), ease at the speed the director sets, and follow clicks.
Recorded at a higher pixel density, so a close-up stays sharp.list_voices lets the agent cast its own narrator.preview_shot shows the exact frame before a beat
is recorded; storyboard shows the finished film as a contact sheet, part by
part, and contact_sheet the whole video as one picture, a frame every 2 s.start_session(beats=...); the review flags a beat skipped or recorded
out of order, a page that had not loaded under a line, and a menu left open.source, highlight,
source_card, card, image, page_tour, login, system, live_answer, cta) and
AgentTake shoots each with a tested recipe; plan_storyboard checks sources,
URLs, secrets and length before anything records.rerender: no re-recording the browser.{{secret:NAME}}), so
it never passes through the directing model./theater.MIT-licensed. Bring your own agent, on any model.
AgentTake is one Docker container: Chromium, Xvfb and ffmpeg behind an MCP server on port 8000. It runs anywhere Docker runs. It needs 2 CPU cores and 2 GB of RAM (the encoder keeps a core busy while recording) and a few GB of disk for the image and the videos. For agents elsewhere to reach it, give it a domain with HTTPS.
Any agent with a shell on your server can set it up. Paste this:
Install AgentTake from https://github.com/magnusfroste/agenttake on this server with Docker Compose, following its README. Use the domain
take.example.comwith HTTPS, generate a long randomREEL_API_TOKEN, and then add it to your own MCP servers so you can direct videos with it.
git clone https://github.com/magnusfroste/agenttake.git && cd agenttake
cp .env.example .env # set REEL_API_TOKEN and REEL_PUBLIC_BASE_URL
docker compose up -d --build
The MCP endpoint is then http://<server>:8000/mcp and videos are kept in
./data. Put your usual reverse proxy (Caddy, Traefik, nginx) in front of
port 8000 for HTTPS, at the address in REEL_PUBLIC_BASE_URL.
Create an app from this GitHub repository; it builds from the Dockerfile.
Set REEL_API_TOKEN and REEL_PUBLIC_BASE_URL, mount a volume at /data,
expose port 8000 and give it a domain — the panel handles TLS.
AgentHotel has AgentTake as a ready template: pick it, give it a domain, deploy. The token is generated and shown under Credentials, ready to hand to the hotel's agents.
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/playwright install --with-deps chromium
.venv/bin/python -m reel_studio.server # MCP over stdio
Python 3.10+, with Xvfb and ffmpeg installed. For HTTP instead of stdio,
set REEL_TRANSPORT=http, REEL_API_TOKEN and REEL_PUBLIC_BASE_URL.
The MCP endpoint is https://<your-domain>/mcp (streamable HTTP), with
Authorization: Bearer <REEL_API_TOKEN> on every request. No trailing
slash — /mcp/ answers with a redirect that looks like a hang.
Claude Code:
claude mcp add --transport http agenttake https://take.example.com/mcp --header "Authorization: Bearer <REEL_API_TOKEN>"
Claude Desktop, or any client that takes a command:
{
"mcpServers": {
"agenttake": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://take.example.com/mcp", "--header", "Authorization: Bearer <REEL_API_TOKEN>"]
}
}
}
Hermes Agent (config.yaml):
mcp_servers:
agenttake:
url: "https://take.example.com/mcp"
headers:
Authorization: "Bearer <REEL_API_TOKEN>"
timeout: 300
Then ask your agent to read the director prompt and make a video.
The director MCP prompt walks an agent through the loop: explore the site
first and write the script; start_session once, with the script as
beats=[{"line": ..., "label": ...}]; one act_batch per beat,
with narration on every visible step and a caption on every line; a
begin_shot before each camera move, checked with preview_shot;
review_session; finish once. After that, storyboard shows the film part
by part, contact_sheet the whole of it in one picture, and edit_step plus
rerender fix a beat without recording it again.
For a documentary-style film — a source on screen, a quote marked, text cards,
a product tour, a sign-in, live proof, a call to action — the director writes
the film and AgentTake shoots it. plan_storyboard(beats=[{"shot": ..., "line": ..., "source": ..., ...}]) checks it without recording: a claim with no
source, a URL that does not answer or answers 401/403, a secret AgentTake does
not have, and a plan longer than the film are on its checklist.
shoot_storyboard(session_id, plan_id=...) then records each beat with its
recipe (consent banners closed offscreen, every line waiting for its text,
glides, push-ins, sign-ins offscreen) and reports each beat ok or failed with
the reason; shoot_beat retakes one, and apply_retakes puts it in place
after finish. A shoot runs as a job: a call answers within about three
minutes, and one still running reports the beat it is on, followed with
shoot_status. A live_answer reads the page until the answer stops growing,
so it needs no predicted words, and ends in a verdict either way. After
finish, fresh_take shoots the film again in a new session started like
the first, from AgentTake's own copy of the storyboard. The handbook is docs/storyboard.md, also
served as the director_guide tool and the storyboard prompt.
A Hermes agent learns the whole job, from research to a downloaded MP4, from the film-director skill:
hermes skills install magnusfroste/agenttake/skills/film-director
It researches every claim to a source, scouts offscreen, plans until the checklist is clean, shoots, retakes at most twice per beat, and looks at the contact sheet before it calls a film done.
review_session (and the review finish returns) scores the take and lists
findings. Besides leaked secrets, silent steps and a static camera:
start_session(beats=[{"line": "<exact narration>", "label": "..."}]), every planned line must be recorded, in order. A missing beat
(beat_missing) or one recorded out of order (beat_out_of_order) is
high-severity; a planned line spoken twice is beat_repeated. Lines are
compared ignoring case and punctuation. get_status lists the beats still
to come while recording.finish, the storyboard still of
every narrated step is measured for detail (edges running both ways, cell by
cell, leaving out the bottom fifth where captions and subtitles are drawn).
Under 4% of the picture with any detail is blank_frame: a dashboard that had
not loaded, a page still showing its spinner.[role=menu]),
listboxes ([role=listbox]) and Radix popovers on screen. One that an
earlier step opened and that is still open under a later line is
overlay_left_open; what a page has when it arrives (a nav built as a menu)
is not counted.wait_for_text asks the page, at 15 points across that text, what the
browser would hit there. Half or more under another layer (a consent dialog,
a newsletter box, an ad frame) is focus_covered, naming the layer; in a
storyboard the beat fails with that reason. wait_for_text alone passes on
covered text: Playwright's is_visible does not look at what is on top.None of these can score excellent.
| Session | start_session, get_status, finish, finish_status, list_sessions, get_session, delete_session, prune |
| Directing | observe, act, act_batch, assert_visible, begin_shot, preview_shot, verify_shot, review_session |
| Storyboard | director_guide, plan_storyboard, shoot_storyboard, shoot_beat, shoot_status, apply_retakes, fresh_take |
| After finish | storyboard, contact_sheet, edit_step, update_step_narration, rerender, set_watch_page |
| Voices | list_voices |
| Roadmap | submit_backlog, list_backlog, update_backlog |
act and act_batch publish the full action contract (every verb and its
fields) in their input schema, inline with no $ref. Verbs: goto, click,
click_and_wait, type, select_option, press_key, hover, highlight,
scroll, scroll_to_text, wait, caption, annotate, set_zoom, mask,
unmask and card. Any step can carry narration, narration_timing,
target_text, wait_for_url, wait_for_text, wait_timeout_ms, settle_ms,
and the flags quiet (silent on purpose), offscreen (done but cut from the
video — signing in, a cookie banner) and speed (2–16, a labelled time-lapse).
annotate with target_text and no ref marks those words on the page (a
quote in an article). click with text and no ref clicks the visible element showing that text (a
card with no ref of its own); press_key with no ref sends the key to the page
(Escape closes a menu). A scroll answers with scrolled — the pixels that
actually moved and which element — and a warning when nothing did.
wait_timeout_ms goes up to 60000, or 600000 on an offscreen step (a live
agent's answer that takes minutes).
A card step cuts a full-screen text card into the film where it is recorded —
mid-film, like the title and closing cards — with the step's narration spoken
over it:
{"type": "card", "text": "Shadow AI is a question many CISOs struggle with —\nyou're not alone", "background": "brand"}
background is brand (the session's accent colour, the default), blur (the
last frame before the card, blurred and dimmed) or a hex colour (dark text on a
light one). The card lasts its line plus a short tail, at least 2.5 s, and with
transitions smooth dissolves in and out. It is a step like any other: the
beat list counts its line, edit_step hides it, holds it or moves it with
position, and rerender keeps it (it is stored in cards.json beside the
recording, the way glides are in glides.json).
One flawed beat never costs a whole re-record. Record it again at the end of the
same session, finish, then edit_step(hidden=true) on the flawed step and
edit_step(index=<the new step>, position=<n>) to play the new one where it
belongs, and rerender. A step keeps its own footage, so its camera moves and its
glide go with it; storyboard shows the new order.
finish waits about a minute for the render. A longer one answers with
status: "rendering" and a job_id; finish_status(job_id) reports the stage
and parts rendered, then the video URL and review. Calling finish again joins
the same job rather than starting a second render.
width/height override). The
browser is recorded at a higher pixel density than its layout (2560×1440 for a
1920×1080 page; REEL_CAPTURE_SCALE=1 turns it off), so text stays sharp at
the closest framing. output_size downscales the final MP4; an output_size
larger than the page, at the same aspect and at most 2×, records at that scale
— a 720×900 page with output_size 1080x1350 gives a sharp 4:5 video of a
site's phone layout.start_session(mask=[...]) takes CSS selectors that are blurred
on every page from the first frame; mask / unmask blur one element
mid-recording.type action whose text is {{secret:NAME}} types
AgentTake's own REEL_SECRET_NAME and marks the field secret;
start_session lists the names it has, never the values.REEL_IDLE_TIMEOUT_SECONDS (default 900, 0 disables) stops recording and
is marked as ended; its media stays. observe gives up after
REEL_OBSERVE_TIMEOUT_SECONDS (default 60) with a hint instead of hanging.observe(detail="refs") returns only ref, role and text
per element. When several controls share a name, observe marks them
same_name and flags the one that submits_form. Re-observe after
navigation; same-page re-renders are handled by re-queryable locators.medium pushes in to 1.5× and close to 2× on the shot's focus_ref or
focus_text (an explicit zoom from 1 to 2.5 overrides the framing); wide
pulls back to the full page. focus_text prefers the page's content over its
navigation. The move starts with the shot's first step and eases over
move_seconds (default 1), so the push-in lands while that step's narration
names what it frames. While pushed in, the camera pans to anything a step
clicks or types into outside the frame; quiet and offscreen steps never move
it; a new page cuts back to wide. Moves are rendered in post and kept in
camera.json, so rerender reproduces them. When shots exist, finish
refuses to publish until every shot is verified.
speed keeps all its footage until the
screen goes still, played fast under a badge.smooth (default) dissolves within a page and cuts on a
new one; cuts cuts everywhere.title/subtitle add an intro card, cta_url/cta_text a
closing card with a QR code of the link (closing_qr); title_background
auto builds them on blurred stills from the video. A card step adds one
mid-film. accent sets the
colour; music="subtle" adds a quiet generated bed.update_step_narration edits one line and rerender
rebuilds the film from the original recording; unchanged lines reuse their
audio.subtitles=true on start_session (or rerender) burns the
narration into the picture, timed to each step, so the story reads in feeds
that autoplay muted, like LinkedIn. subtitle_style sets the box behind the
text: soft (the default, about 40% black), box (about 75%) or solid
(opaque) for light, busy pages; rerender(subtitle_style=...) changes it.set_watch_page gives the page
its own title and description and picks the poster's moment.review_session scans for secrets in URLs and metadata, checks
focus-narration alignment and flags a mostly silent take.provider is edge (free, the default) or elevenlabs. Set
ELEVENLABS_API_KEY to use ElevenLabs, where voice is an ElevenLabs voice
id; REEL_TTS_PROVIDER=elevenlabs makes it the default. start_session
speaks one word first and refuses a voice that cannot speak, before anything
is recorded.
/ (landing page), /docs (API docs), /theater and /api/videos,
/watch/{session_id}, /videos/{session_id}/video.mp4, /backlog and
/api/backlog, /bug_report and /api/bug_reports, /health, plus
/favicon.svg, /og.png, /robots.txt, /sitemap.xml and /llms.txt.
Only /mcp needs the token; finished videos are public.
| Variable | |
|---|---|
REEL_API_TOKEN | Required for HTTP. The bearer token MCP clients send. |
REEL_PUBLIC_BASE_URL | Required for HTTP. The public address, e.g. https://take.example.com; its host is allowed automatically. |
REEL_ALLOWED_HOSTS | Extra hostnames, comma-separated. |
REEL_TRANSPORT | stdio (default) or http. |
ELEVENLABS_API_KEY | Enables ElevenLabs voices. |
REEL_TTS_PROVIDER | Default voice provider, edge or elevenlabs. |
REEL_SECRET_<NAME> | A secret the director types as {{secret:NAME}}. |
REEL_OUTPUT_DIR | Where sessions are kept (/data in the container). |
REEL_DB_PATH | SQLite file; defaults to one under REEL_OUTPUT_DIR. |
REEL_OUTPUT_SIZE | Default final video size, e.g. 1280x720. |
REEL_CAPTURE_SCALE | Capture density; 1 turns hi-res capture off. |
REEL_IDLE_TIMEOUT_SECONDS | Stop an abandoned session (default 900). |
REEL_OBSERVE_TIMEOUT_SECONDS | Give up on a slow observe (default 60). |
REEL_MAX_CLIPS | Newest finished sessions to keep (default 50, 0 keeps all). |
REEL_KEEP_RAW_CLIPS | Keep screen.mp4 (needed to rerender) for only the newest N (default 0, all). |
REEL_SEGMENTED | 0 renders the raw recording instead of cut segments. |
examples/demo_client.py runs a complete smoke test against
https://example.com.
Agents file friction and bugs into the public /backlog through MCP. Label a
pull request auto-merge and it is merged once the package import and compile
checks pass.