← 返回选刊

X · @sardorml / 长帖

CaptureFlow:边录屏边上传,支持 Docker 自托管

Chrome 扩展已上架,macOS 签名版仍待发布;Docker 使用 SQLite 和本地磁盘,也可部署到 Cloudflare Workers、D1、R2。

乔木改写

Sardor 在 11 月 6 日介绍了自己做的开源录屏工具 CaptureFlow:人在 Chrome 里录屏,结束后把链接发给别人;AI Agent 也可以通过 MCP 录制演示。它支持 Docker 自托管。原帖所链接的仓库 README 进一步写明,录制过程中就会上传,停止录制时分享链接已经准备好了。

能录什么,在哪里使用

CaptureFlow 可以录制浏览器标签页、窗口或整个屏幕,并加入摄像头悬浮画面和麦克风声音。观看者可以在视频里发表情、留言,录制者能看到谁看过。截图也可以加箭头、文字和模糊遮挡,再用同样的链接方式分享。

团队使用工作区管理内容,可设为公开、仅工作区成员可见或私密。托管服务按整个团队的存储量收费,不按席位收费;付费方案提供 100 GB、500 GB 或 1 TB 存储空间。作者说明,全部功能都包含在开源构建中,也可以部署到自己的 Cloudflare 账户,并把登录范围限制在公司内。

Chrome 扩展已经在 Chrome Web Store 上架。macOS 应用目前可以从源码构建,签名发行版仍是即将推出的状态;网页管理台和观看页支持现代浏览器。托管版可以先注册免费账户,再安装扩展,具体付费额度见价格页。

在原帖评论里,@progerallworld 提出的用途是让 Agent 重现 Bug、录下步骤,再附上视频。Sardor 回复说,这正是他加入 MCP 时考虑的场景。随后他又补充,也可以让 Agent 为 GitHub Pull Request 录制演示,并附到 PR 描述里;安装扩展后,审阅者可以观看演示来理解改动。这是作者对用途的说明,本轮没有连接 MCP 或试录视频。

用 Docker 部署

README 给出的 Docker 启动方式很短:先执行 cp .env.example .env,设置 APP_URL,再执行 docker compose up -d。

数据都保存在 ./data:SQLite 数据库、磁盘上的录屏文件,以及第一次启动时生成的密钥。这条部署路线不需要 Cloudflare 账户。生成转写可以使用兼容 OpenAI 接口的 Whisper 服务;Compose 也提供 --profile whisper 来运行一个这样的服务。完整说明在 Docker 部署文档。

部署到自己的 Cloudflare 账户

另一条路线使用 Cloudflare Workers、D1 和 R2。仓库提供了一键部署入口,也列出了手动步骤。

先运行 pnpm --filter @captureflow/web exec wrangler d1 create captureflow 创建数据库,再运行 pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings 创建存储桶。把数据库 ID 填入 apps/web/wrangler.jsonc 后,依次执行 pnpm --filter @captureflow/web db:apply:remote 和 pnpm --filter @captureflow/web cf:deploy。

DEPLOY.md 说明了密钥、登录服务、自定义域名,以及如何让扩展和桌面应用连接自己的实例。部署在自己的域名下会作为自托管实例运行;如果要做成公司内部工具,还需要按照配置文档设置 ALLOWED_EMAIL_DOMAINS。仓库也链接了逐步自托管教程和代配置服务。

本地开发和检查

开发环境需要 Node.js 24.13 或更新版本,以及 pnpm 10;README 提示用 corepack enable 启用。取得仓库并进入目录后,先执行 pnpm install。

完整的取代码命令是 git clone git@github.com:sardorml/captureflow.git,接着执行 cd captureflow。pnpm web 启动网页管理台和官网,地址为 http://localhost:3032;pnpm admin 启动实例管理后台,地址为 http://localhost:3034。pnpm extension 会在一个新的 Chrome 配置环境中启动浏览器扩展;macOS 录屏应用的开发命令是 pnpm --filter @captureflow/desktop dev。

仓库列出的检查命令分别是 pnpm typecheck、pnpm --filter @captureflow/web test、pnpm --filter @captureflow/extension test 和 pnpm format。这里保留的是作者提供的命令,没有把文档中的检查项写成本站已经跑过的结果。

仓库如何拆分

应用放在 apps/,共享包放在 packages/。依赖方向有明确约束:应用可以依赖共享包,共享包不能反向依赖应用,应用之间也不能互相依赖。

  • apps/web 使用 Next.js 16,包含官网、博客、管理台、观看页和 API,通过 OpenNext 部署到 Cloudflare Workers。
  • apps/admin 是运行在独立主机名下的实例管理 Worker,与主应用绑定同一组 D1 和 R2。
  • apps/mailer 是产品邮件 Worker,通过 Resend 发送管理员编写的邮件活动,并处理退订。
  • apps/extension 是基于 WXT、MV3 的浏览器录屏扩展,包含面板、离屏采集和页面内控制。
  • apps/desktop 是基于 Electron 的 macOS 录屏应用;apps/docs 是 VitePress 文档站。
  • packages/engine 是桌面端与扩展共用的采集引擎,包含 macOS 辅助程序、录制协议和封装处理,采用 MIT 许可。
  • packages/admin 为管理后台提供认证与数据逻辑;packages/mail 负责邮件活动、渲染、退订令牌、Resend 投递和事务邮件。
  • packages/quota 管理存储额度、限制与工作区;packages/shared 放各应用共享的类型和常量;packages/ui 放主题令牌,以及没有对应 HeroUI 组件的 React 组件。

macOS 采集辅助程序以编译后的二进制文件形式存入仓库。修改 Swift 源码后,需要运行 packages/engine/scripts/build-native.sh 重新构建;加上 --universal 可以同时支持 arm64 和 x86_64。

文档、贡献和许可

项目的官网、文档、自托管总览、博客、FAQ、安全说明、发行记录和 Discord 均由 README 提供入口。

作者欢迎 Bug 报告、想法和 Pull Request,可以到仓库 Issues或功能建议页提交。贡献前需要阅读 CONVENTIONS.md。发现安全问题应按照安全页说明私下报告,不要发到公开 Issue。

项目采用 AGPL-3.0-only,例外是可复用的采集引擎 packages/engine,它采用 MIT 许可。桌面应用与浏览器扩展的组合构建,整体仍适用 AGPL-3.0-only。

本文完整改写上述作者帖文、已取得的作者回复及固定版本 README;README 最近修改于 11 月 4 日,不能把 11 月 6 日的介绍帖当成当天发布新版本。文档文字按上游 AGPL-3.0-only 许可使用,许可全文随站点提供;本站中文不是官方文档。

原文附带媒体

来源附带的产品概览配图;未核验与中文具体段落的一一对应关系,集中保留于文末。

CaptureFlow 作者原帖配图
原帖图片无法显示?去原文查看 ↗
CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard
原帖图片无法显示?去原文查看 ↗

原文

CaptureFlow — author announcement, replies and complete README

CaptureFlow 作者原帖配图
原帖图片无法显示?去原文查看 ↗
CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard
原帖图片无法显示?去原文查看 ↗

Author announcement — Sardor (@sardorml)

Source: https://x.com/sardorml/status/2118616954085024133

I built CaptureFlow, an open-source screen recorder for you and your AI agents.

Record your screen in Chrome and get a link you can share with anyone. Or let your agent record the demo over #MCP.

Self-host it with Docker.

https://t.co/GwIkaJEH9C

#opensource #buildinpublic https://t.co/dlOESaA0wJ

Public reply context — @progerallworld (not the author)

Source: https://x.com/progerallworld/status/2118618493977313326

@sardorml This could be useful for bug reports too: agent reproduces the issue, records the steps, attaches the clip. Much easier to review than “I clicked around and it broke” 😅

Author reply — Sardor (@sardorml)

Source: https://x.com/sardorml/status/2118619339041755560

@progerallworld Yes, definitely. That's the use case i had in mind when i added the MCP.

Author reply — Sardor (@sardorml)

Source: https://x.com/sardorml/status/2118621775856865775

@progerallworld You can also ask it record a demo for your github pull request and it will attach it to the pr description. With extension installed reviewers can watch the demo to get a better idea of the changes.

Linked README — complete text, fixed source snapshot

Source: https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md

<div align="center"><a name="readme-top"></a>

<picture> <source media="(prefers-color-scheme: dark)" srcset="apps/web/public/brand-mark-light.svg" /> <img src="apps/web/public/brand-mark-dark.svg" height="112" alt="CaptureFlow" /> </picture>

<h1>CaptureFlow</h1>

Open-source screen recorder with instant share links, self-hostable on your own Cloudflare account.

[![CI status][ci-image]][ci-url] [![License: AGPL-3.0][license-image]][license-url] [![Chrome Web Store][chrome-image]][chrome-url] [![Stars][stars-image]][stars-url] [![Discord][discord-image]][discord-url]

[Website][website-url] · [Docs][docs-url] · [Blog][blog-url] · [Report Bug][issues-url] · [Request Feature][feature-url]

[ci-image]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml [license-image]: https://img.shields.io/badge/license-AGPL--3.0-2563EB.svg?style=flat-square [license-url]: ./LICENSE [chrome-image]: https://img.shields.io/chrome-web-store/v/lgpgeoelaokbigdljofhkgbfnfcnmcol?label=chrome%20web%20store&color=2563EB&style=flat-square [chrome-url]: https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol [stars-image]: https://img.shields.io/github/stars/sardorml/captureflow?color=2563EB&style=flat-square [stars-url]: https://github.com/sardorml/captureflow/stargazers [discord-image]: https://img.shields.io/badge/chat-discord-5865F2.svg?style=flat-square [discord-url]: https://discord.gg/qzeBCaEeNq [website-url]: https://captureflow.dev [docs-url]: https://docs.captureflow.dev [blog-url]: https://captureflow.dev/blog [issues-url]: https://github.com/sardorml/captureflow/issues/new [feature-url]: https://captureflow.dev/suggest-feature

</div>

[![CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard](.github/assets/readme-hero.png)](https://captureflow.dev)

✨ Features

  • 🔗 The share link is ready the moment you stop: the upload runs while you record.
  • 🎥 Record a tab, a window or your whole screen, with camera bubble and mic.
  • 💬 Viewers react with emoji and comment right on the video, and you see who watched.
  • 🖼 Annotated screenshots with arrows, text and blur, shared by the same kind of link.
  • 👥 Workspaces for your team, with public, workspace-only or private visibility.
  • 💸 Priced by storage for the whole team, never per seat.
  • ☁️ Self-host on your own Cloudflare account, with sign-in limited to your company.
  • 🔓 Every feature ships in the open-source build.

🖥 Where it runs

| Surface | Status | | ------------------------- | ----------------------------------------------- | | Chrome extension | Available on the [Chrome Web Store][chrome-url] | | macOS app | Build from source; signed release coming soon | | Web dashboard and viewers | Any modern browser |

📦 Get started

☁️ Self-hosting

Docker

``bash cp .env.example .env # set APP_URL docker compose up -d ``

Everything lives in ./data: a SQLite database, the recordings on disk, and secrets generated on first start. You don't need a Cloudflare account. Transcripts can use any OpenAI-compatible Whisper server, including one compose runs for you with --profile whisper. See the Docker guide.

Cloudflare

![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow)

Or manually:

```bash pnpm --filter @captureflow/web exec wrangler d1 create captureflow pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings

paste the database id into apps/web/wrangler.jsonc, then:

pnpm --filter @captureflow/web db:apply:remote pnpm --filter @captureflow/web cf:deploy ```

[DEPLOY.md](./DEPLOY.md) is the full runbook: secrets, sign-in providers, custom domains, and pointing the extension and desktop app at your own instance. A deployment on your own domain runs as a self-hosted instance; to make it a private company tool, set ALLOWED_EMAIL_DOMAINS as described in the configuration docs.

⌨️ Development

Requires Node.js 24.13 or newer and pnpm 10 (corepack enable).

``bash git clone git@github.com:sardorml/captureflow.git cd captureflow pnpm install pnpm web # dashboard and landing on http://localhost:3032 pnpm admin # instance admin on http://localhost:3034 pnpm extension # browser extension, in a fresh Chrome profile pnpm --filter @captureflow/desktop dev # macOS recorder ``

Checks:

``bash pnpm typecheck pnpm --filter @captureflow/web test pnpm --filter @captureflow/extension test pnpm format ``

<details> <summary>Monorepo layout</summary>

`` apps/ web/ Next.js 16 landing, blog, dashboard, viewers and API → Cloudflare Workers (OpenNext) admin/ Instance-admin Worker on its own host, bound to the same D1 and R2 mailer/ Product-email Worker: sends admin-written campaigns via Resend, handles unsubscribe extension/ Browser recorder (WXT, MV3): panel, offscreen capture, in-page controls desktop/ Electron screen recorder (macOS) docs/ VitePress documentation site packages/ engine/ Capture engine shared by desktop and extension: macOS sidecars, record protocol, mux (MIT) admin/ Admin auth and data logic behind apps/admin mail/ Campaigns, email rendering, unsubscribe tokens, Resend delivery, transactional sends quota/ Storage quota, limits and workspace logic shared/ Types and constants shared across the apps ui/ Theme tokens and the React components with no HeroUI equivalent ``

Apps depend on packages, never the reverse, and never on each other.

The macOS capture sidecars are committed as built binaries. After editing the Swift sources, rebuild them with packages/engine/scripts/build-native.sh (add --universal for arm64 + x86_64).

</details>

🔗 Links

🤝 Contributing ![PRs Welcome](https://github.com/sardorml/captureflow/pulls)

Bug reports, ideas and pull requests are all welcome. Open an [issue][issues-url], [suggest a feature][feature-url], or send a pull request. Read [CONVENTIONS.md](./CONVENTIONS.md) first: it's the standard every change follows.

Found a security issue? Please report it privately as described on the security page, not in a public issue.

📄 License

[AGPL-3.0-only](./LICENSE), with one exception: the reusable capture engine in [packages/engine](./packages/engine) is [MIT-licensed](./packages/engine/LICENSE). Combined builds (the desktop app and the browser extension) are AGPL-3.0-only as a whole.

<div align="right"><a href="#readme-top">Back to top ↑</a></div>