
AppFlowy 开源协作工作区解析Flutter Rust 双层架构下的 Notion 替代方案【免费下载链接】AppFlowyBring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowyAppFlowy 是一个以 Flutter 构建前端、以 Rust 构建核心引擎的开源 AI 协作工作区AI Workspace定位为 Notion 的开源替代品。本文基于仓库根目录 README.md 的主体内容展开结合仓库中的构建脚本、Rust workspace 配置与 FFI 源码讲解它的技术定位、安装使用渠道、从源码构建的关键步骤以及 Flutter 与 Rust 之间通过 FFI 协作的底层机制帮助读者在直接使用和二次开发两种场景下快速上手这个代码库。一、项目定位为什么做开源的 Notion 替代README.md 用一句话概括了产品定位AppFlowy is the AI workspace where you achieve more without losing control of your data——一个让你在不完全交出数据控制权的前提下借助 AI 完成更多工作的协作空间。README 的 Why Are We Building This? 章节阐述了核心动机Notion 在美观和功能上很优秀但存在数据安全性偏弱、移动端兼容性不佳等限制作者团队判断封闭的协作工具在横向扩展上存在玻璃天花板当客户需求持续演进时用户要么被迫迁移到另一家厂商要么自建工具并承担高昂成本。基于此AppFlowy 确立了三个基本价值观Data privacy first数据隐私优先用户可以完全控制自己的数据支持自托管Self-hostingReliable native experience可靠的本地化体验单代码库Flutter Rust支撑多平台追求原生的速度与体验Community-driven extensibility社区驱动的扩展性为个人用户与企业/黑客提供 building blocks 和协作基础设施允许按自己方式修改 AppFlowy。从 README 的功能截图描述Kanban 看板、数据库表格、文档站点、AI、模板可以推断AppFlowy 覆盖的核心场景包括看板Board、数据库Grid/Database、文档Document、AI 助手、模板与多端同步。这一能力划分在仓库源码中也能对应到具体模块详见下文。二、技术栈总览Flutter 前端 Rust 后端README 的 Built With 章节明确声明技术栈为Flutter与Rust两者。仓库的实际组织印证了这一点整个代码库分为两大块2.1 Flutter 前端frontend/appflowy_flutterFlutter 应用位于 frontend/appflowy_flutter/其 pubspec.yaml 声明了关键版本约束应用版本version: 0.11.4与 frontend/Makefile.toml 中的APPFLOWY_VERSION 0.11.4保持一致环境要求flutter: 3.27.4、Dartsdk: 3.3.0 4.0.0。依赖中体现了清晰的本地包结构# frontend/appflowy_flutter/pubspec.yaml节选 dependencies: appflowy_backend: path: packages/appflowy_backend # 承载 Rust 引擎的 Flutter 插件包 appflowy_ui: path: packages/appflowy_ui # 通用 UI 组件库 appflowy_popover: path: packages/appflowy_popover flowy_infra: path: packages/flowy_infra # 基础服务事件、日志等 flowy_infra_ui: path: packages/flowy_infra_ui bloc: ^9.0.0 # 状态管理 easy_localization: ^3.0.2 # 国际化其中appflowy_backend位于 frontend/appflowy_flutter/packages/appflowy_backend/是 Flutter 与 Rust 世界之间的桥梁插件负责加载各平台编译出的libdart_ffi动态库并通过 FFI 调用 Rust 侧函数。2.2 Rust 后端frontend/rust-libRust 侧是一个由 frontend/rust-lib/Cargo.toml 定义的 Cargo workspace包含 25 个以上 crate可按职责归纳为几类类别代表性 crate职责FFI 边界dart-ffi暴露给 Flutter/Dart 的 C 函数入口核心调度flowy-core、lib-dispatch应用生命周期、插件运行时与事件分发业务模块flowy-user、flowy-folder、flowy-document、flowy-database2、flowy-search、flowy-ai、flowy-date用户/工作区、目录结构、文档、数据库、搜索、AI、日期提醒云同步flowy-server、flowy-server-pub、collab-integrate对接 AppFlowy-Cloud基于 collab 的 CRDT 协作存储flowy-sqlite、flowy-storage、flowy-sqlite-vecSQLitediesel、文件存储、向量存储测试event-integration-test事件级集成测试从 workspace 依赖声明可以看出底层选型均为 frontend/rust-lib/Cargo.toml 中可验证的事实diesel 2.1.0sqlite 特性关系型数据访问collab 0.2与yrs 0.21.0基于 Yrs 的 CRDT 协作同步引擎collab-integratecrate 将其接入各业务插件tantivy 0.24.1本地全文搜索引擎tokio 1.38.0异步运行时client-api/workspace-template从 AppFlowy-Cloud 仓库按固定 rev592f644引入注释中给出了更新脚本 frontend/scripts/tool/update_client_api_rev.sh。此外 frontend/rust-toolchain.toml 固定了 Rust 工具链版本[toolchain] channel 1.85 components [clippy, rustfmt]即构建该仓库需要 Rust 1.85含 clippy、rustfmt 组件这是从源码开发时的适用前提。三、安装与使用渠道README 的 User Installation 章节列出了完整的使用渠道整理如下平台渠道说明macOS / Windows / Linux 桌面GitHub ReleasesREADME 指向 AppFlowy Releases 页面下载LinuxFlatHub、Snapcraft、Sourceforge替代包管理渠道iPhoneApp Store官方 App Store 应用AndroidPlay Store要求 Android 10 及以上不支持 ARMv7服务端Self-hostingREADME 提供了分步自托管指南从零基础到生产环境源码From Source指向官方文档的源码构建说明仓库根目录的 install.sh 是一个基于 POSIX shellshlib 风格的一键安装脚本可用于在 Linux/macOS 上直接下载安装最新 release 包。脚本的关键参数来自 install.sh 的usage()函数Usage: install.sh [-b] bindir [-d] [tag] -b sets bindir or installation directory, Defaults to /opt -d turns on debug logging [tag] is a tag from the releases; if tag is missing, the latest will be used脚本内部逻辑is_supported_platform校验平台组合windows/amd64、darwin/amd64、darwin/arm64、linux/amd64、linux/arm64、linux/armv6/armv7tag_to_version通过 GitHub releases 接口解析 tag 到具体版本号execute下载对应 tar.gzLinux 下按AppFlowy_x86_64-unknown-linux-gnu_ubuntu-20.04.tar.gz命名、解包并安装到$BINDIR默认/opt然后直接启动./AppFlowy。移动端与桌面端的实际安装请以各商店/Releases 页面为准install.sh 仅覆盖命令行安装路径。四、从源码构建cargo-make 构建体系README 的 Getting Started with development 指向官方文档获取各 OS 的开发步骤仓库内可验证的核心构建事实如下。4.1 构建任务总入口构建系统基于cargo-makeREADME 的 Acknowledgments 中亦致谢了该项目总入口为 frontend/Makefile.toml它extend了 frontend/scripts/makefile/ 下的 10 个任务文件desktop、mobile、protobuf、tests、docker、env、flutter、tool、tauri、web因此所有任务都在frontend目录下以cargo make调用。全局环境变量frontend/Makefile.toml 的[env]段决定了默认构建形态RUST_LOG info CARGO_PROFILE dev CARGO_MAKE_CRATE_NAME dart-ffi # 构建目标 crate LIB_NAME dart_ffi APPFLOWY_VERSION 0.11.4 PRODUCT_NAME AppFlowy CRATE_TYPE staticlib # macOS 静态库Linux/Windows 会切换为 cdylib LIB_EXT a APP_ENVIRONMENT local4.2 桌面端核心构建任务桌面构建任务定义在 frontend/scripts/makefile/desktop.toml以 macOS 为例appflowy-core-dev-macos跨平台别名为appflowy-core-dev的执行链是env_check → setup-crate-type → sdk-dev-build → post-desktop → restore-crate-type其中sdk-dev-build实际执行的核心命令为cd rust-lib/ RUSTFLAGS--cfg tokio_unstable cargo build --packagedart-ffi \ --target ${RUST_COMPILE_TARGET} --features ${FLUTTER_DESKTOP_FEATURES}各平台的目标三元组与环境frontend/Makefile.toml 中各[env.*]段环境段目标CRATE_TYPEdevelopment-mac-arm64aarch64-apple-darwinstaticlibdevelopment-mac-x86_64x86_64-apple-darwinstaticlibdevelopment-windows-x86x86_64-pc-windows-msvccdylibdlldevelopment-linux-x86_64x86_64-unknown-linux-gnucdylibsodevelopment-linux-aarch64aarch64-unknown-linux-gnucdylibso且 flutter 特性追加openssl_vendoreddevelopment-ios-arm64/development-android对应移动目标staticlib / cdylib构建完成后post-desktop任务会把rust-lib/target/${RUST_COMPILE_TARGET}/${BUILD_FLAG}/libdart_ffi.${LIB_EXT}复制到 Flutter 插件目录macOS 为appflowy_flutter/packages/appflowy_backend/macos同时拷贝 frontend/rust-lib/dart-ffi/binding.hWindows 为appflowy_flutter/windows/flutter/dart_ffiLinux 为对应 linux 目录随后restore-crate-type会把dart-ffi/Cargo.toml中的 crate-type 改回仓库默认的staticlib——setup-crate-type/restore-crate-type这对任务通过读写替换rust-lib/dart-ffi/Cargo.toml实现因此开发机在任务中断时可能出现 crate-type 残留重跑任务即可恢复。release 构建任务appflowy-core-release走同样的链路只是CARGO_PROFILE release。4.3 云配置与环境变量Flutter 侧通过 frontend/appflowy_flutter/dev.env 提供本地开发环境变量当前仓库中的内容为APPFLOWY_CLOUD_URL即默认不指定远端 AppFlowy-Cloud 地址走本地模式自托管或对接私有云时可在此填入服务端地址。Rust 侧的dart-ffi有对应的配置保存逻辑frontend/rust-lib/dart-ffi/src/appflowy_yaml.rs 中的save_appflowy_cloud_config说明云配置在启动时会被持久化为本地 AppFlowy 配置文件。五、Flutter 与 Rust 如何通信dart-ffi 入口源码解读dart-ffi是整个 Rust 引擎暴露给 Dart 的边界 crate入口文件为 frontend/rust-lib/dart-ffi/src/lib.rs。从源码结构看其协作机制可以概括为// Dart 侧appflowy_backend 插件 ffiCall(requestBytes, port) // 通过 DynamicLibrary 调用 Rust C 函数 │ ▼ Rust: FFIRequest → AFPluginRequest → 各业务 crateflowy_user / flowy_document / ... │ ▼ Rust: AFPluginEvent → 通过 Dart port 回调 → Dart 侧监听器分发bloc/事件总线frontend/rust-lib/dart-ffi/src/lib.rs 的关键结构印证了这一点全局单例DART_APPFLOWY_CORE: DartAppFlowyCorelazy_static!声明内部持有AppFlowyCore来自flowy-core负责应用生命周期与插件运行时的AFPluginRuntimeTask { dispatcher, request, port, ret }结构承载单次调用请求经AFPluginDispatcher分发port是回传给 Dart Isolate 的 FFI 端口号响应通过tokio::sync::mpsc发送DartNotificationSender负责将 Rust 侧事件如文档变更、登录状态变化推送到 DartLOG_STREAM_ISOLATE用于把 Rust 的tracing日志流转到独立的 Dart Isolate 输出。数据模型定义在同目录的model/子模块FFIRequest/FFIResponse底层字节操作与内存释放forget_rust、extend_front_four_bytes_into_bytes封装在 frontend/rust-lib/dart-ffi/src/c.rs 中。这种请求-端口-事件回传的模式使得 Rust 侧的异步 tokio 任务可以安全地把结果投回 Dart 事件循环是理解 AppFlowy 跨语言调用链的起点。业务模块的组织方式也遵循统一范式每个flowy-*crate 内部有event_handler.rsevent_map.rs如 frontend/rust-lib/flowy-user/、frontend/rust-lib/flowy-document/将 Dart 侧请求事件映射到具体业务处理函数——因此阅读任何业务功能的 Rust 实现从对应 crate 的event_map.rs入手即可定位入口。5.1 测试体系Rust 侧的集成测试集中在 frontend/rust-lib/event-integration-test/按业务域划分document/、database/、chat/、folder/、search/、user/等并通过event_builder.rs模拟事件流验证各模块的行为Flutter 侧则对应frontend/appflowy_flutter/test/bloc/单元/widget 测试与integration_test/desktop/mobile 端到端测试两套体系。构建测试二进制时[env.test-*]段会将 crate-type 切换为cdylib见 frontend/Makefile.toml 的setup-test-crate-type任务说明动态库形态是 FFI 测试所必需的。六、多语言i18n与社区协作README 的 Translations 章节给出了三条添加/维护翻译的途径手动编辑 JSON 翻译文件——仓库中实际位于 frontend/appflowy_flutter/assets/translations/README 中写的/frontend/resources/translations路径在当前仓库结构下已迁移到assets/translations以仓库实际路径为准使用 inlang 在线编辑器仓库带有 project.inlang/settings.json 等 inlang 配置运行npx inlang machine translate自动补全缺失翻译。社区协作方面README 明确提供了 Feature Request 与 Bug Report 的提交入口发布说明changelog与公开 Roadmap 有独立页面仓库内的 doc/roadmap.md、ROADMAP.md 与 doc/CONTRIBUTING.md 可作为进一步阅读入口。七、许可与致谢AppFlowy 以AGPLv3协议分发见根目录 LICENSE。AGPL 的强 copyleft 条款意味着如果你基于 AppFlowy 做修改并向他人提供服务含网络服务需要开源你的修改——商业二次开发时建议先评估协议约束。README 末尾致谢了三个直接支撑项目的开源组件cargo-make即上文构建体系所依赖的任务运行器contrib.rocksREADME 中渲染贡献者头像墙的服务flutter_chat_uiAI Chat 界面的 UI 组件基础pubspec.yaml中可见flutter_chat_ui: ^2.0.0-dev.1依赖。小结从阅读视角理解这个仓库你想了解什么从哪里入手项目定位与功能渠道README.mdRust 引擎的全部模块划分frontend/rust-lib/Cargo.toml构建任务与平台环境矩阵frontend/Makefile.toml、frontend/scripts/makefile/desktop.tomlFlutter ↔ Rust FFI 入口frontend/rust-lib/dart-ffi/src/lib.rs本地安装脚本install.sh云地址等本地环境变量frontend/appflowy_flutter/dev.env事件级集成测试frontend/rust-lib/event-integration-test/AppFlowy 的价值主张数据隐私优先、原生体验、可扩展的协作基础设施与其代码组织高度一致前端用 Flutter 保证多端一致的 UI 体验后端用 Rust 保证数据层、协作同步层与本地搜索/AI 能力的可靠性两者之间以dart-ffi这一薄边界衔接。对使用者Releases 与商店渠道覆盖桌面和移动全平台对开发者Rust 1.85 Flutter 3.27.4 环境下cargo make任务链即可完成核心引擎的编译与产物分发。【免费下载链接】AppFlowyBring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考