惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
N
Netflix TechBlog - Medium
P
Privacy International News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
G
Google Developers Blog
Recorded Future
Recorded Future
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
G
GRAHAM CLULEY
A
Arctic Wolf
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Register - Security
The Register - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V
Visual Studio Blog
Webroot Blog
Webroot Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
H
Heimdal Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
M
MIT News - Artificial intelligence
V2EX - 技术
V2EX - 技术
Jina AI
Jina AI
TaoSecurity Blog
TaoSecurity Blog
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
WordPress大学
WordPress大学
V
V2EX
Cyberwarzone
Cyberwarzone
Stack Overflow Blog
Stack Overflow Blog
Cloudbric
Cloudbric
H
Hackread – Cybersecurity News, Data Breaches, AI and More

BlogFinder

日常漫步 Vol.24 之漫步前山河 - 雅余 周报 #1-聊聊本周的收获 - Edwin's Blog 我的OpenCode必装插件与Skill Write Something 掌中之物未必在掌握之中 · CRIVU PiliNara,一个更顺手的 PiliPlus 分支 「NekoEcho」:做一个必有回响的猫娘主题博客 2026-05 书影音总结 简化博客主题 - 安迪 你要加油呐 我第一次发布 npm 包 拾花小记#45:中考前的二三事 – 小改学习志 黛西花园5月游 #18 枇杷又熟了的五月月报 一些奇奇怪怪的需求?word仿方正书版的几个小操作 - Xiobb's Blog 0419 御温泉之旅 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 又回到四十年前 如何定义成功 迷鹿屋2026已重新上线 科技冰火两重天+一周回顾 ${title} 热度退了,我反而用得更深了-咕咚同学 我到底该不该换个域名? 随身WIFI折腾记 - 安迪 博客撰写体验提升——hexo pro插件 为什么不用相机把屏幕上的接关密码拍下来? 国清寺与天台山 – Ouroboros ★★★★☆《挽救计划》——久违的经济上行感 - Davidの3号基地 删除右键“打开方式”里多余选项 第三周刊_No.53|一切都会被支付两次 安卓APP通话记录与录音上传踩坑记录 - 子舒的博客 天量下跌 inBox 笔记 2.3.8,把工具栏交给了你-咕咚同学 我把小龙虾搬到了微信-咕咚同学 安好 - 响石潭 Compound Engineering Plugin:让每个工程单元都比上一个更容易 MOSS-TTS Family:开源高质量语音与声音生成模型家族深度解析 Crawl4AI:专为 LLM 设计的开源 Web 爬虫与数据抓取工具 Build Your Own X:从零实现你最喜欢的技术——程序员进阶的终极资源清单 Anthropic Skills:用文件夹教 Claude 专业技能的开源框架 1年的去月球(下) - 梅之夏 欢迎回来。 简单讲讲 ASN.1 与 OID DTV - 直播聚合客户端 5.22-5.27 – 不兴江 还没去过鸭川 – 不兴江 张晶晶同学三刷林志颖 关于我 – 不兴江 爱与嫉妒 – 不兴江 港股被持续做空 备案码花了四百块-咕咚同学 一句话生成封面:我给公众号做了4种风格的AI封面生成技能 「官」方認證 再谈费曼学习法 2026-05-28T00:34:11+08:00 2026-05-28T00:28:45+08:00 离谱的英语学习指南:基于AI的英语进阶系统方法论 iii:零集成架构的后端统一运行时 Claude Code Harness:让 Claude Code 工作有迹可循的工程化框架 Heretic:全自动移除大语言模型审查机制的开源工具 MarkItDown:微软开源的万能文档转 Markdown 利器 Harness:让 Claude Code 秒变多智能体协作工厂 这段时间尽折腾AI Agent了,确实极大地提高了效率 近期动态:两个新站点正式上线啦 误判解除!zhouayuan.com 腾讯安全申诉成功 - 周阿源|玩具设计・插画日常・生活随笔 Ralph:让 AI 编码工具自主循环跑完所有 PRD 任务的量产神器 全都违法 – 个人工作记录 关于zhouayuan.com被误判 “含违规信息” 的说明与申诉记录 - 周阿源|玩具设计・插画日常・生活随笔 小米 MiMo v2.5 Pro 白嫖 最大的人间清醒,兜里有钱,但是不花。 夜晚靓歌(12):于文文现场solo - 王志勇的Blog 今日插画:风扬起的倔强 - 周阿源|玩具设计・插画日常・生活随笔 回门习俗 独立网卡 - 忘记了回忆 500亿入股人工智能企业 从命令行到桌面智能体-咕咚同学 第一性原理读书笔记 行者微评论223-加班の守株待兔-博客|政治与时事-风雨行者 ZOZO开源物理接触求解器:GPU加速的可扩展仿真引擎 OpenStock:开源股票市场交易平台技术深度解析 MoneyPrinterTurbo:基于AI的全自动短视频生成工具深度解析 Claude-Mem:为 Claude Code 构建的持久化记忆压缩系统 2026-05-26T22:59:17+08:00 企业级开源大模型部署平台 GPUStack 实战教程 1年的去月球(上) - 梅之夏 Sevalla - 静态网站托管服务 不用翻墙、不用注册、不用月费,普通人也能用上 Claude Code 装修灯具要注意⚠️ 黄梅天先锋 - 游子微博 公安备案顺利办结,站点备案全部完成 - 周阿源|玩具设计・插画日常・生活随笔 第三次兑换天猫超市卡了宗宗酱-三维狐少儿编程 Don't think, feel. - Rolen's Blog 人这一辈子,到底图个什么 博客迁移 - Edwin's Blog 情感赛道写作模板 再现本轮行情的典型特征 裁员与平常心-咕咚同学 别让“偷懒”,成为隐私泄露的破绽 片刻 - Jdeal | Life is like a Design.
Twenty:可代码化定制的企业级开源 CRM 平台技术深度解析
Cheman · 2026-05-27 · via BlogFinder

一、项目概述

Twenty 是一个开源的现代化 CRM(客户关系管理)平台,定位为"技术团队构建、发布和版本控制 CRM 的首选方案"。与传统 CRM 不同,Twenty 允许开发者将 CRM 配置作为代码来管理,实现与现有技术栈的无缝集成。

核心特性:

  • 应用化扩展:通过 Twenty CLI 脚手架创建自定义应用,支持对象定义、字段配置、视图定制等
  • 版本控制:支持将 CRM 配置作为代码进行版本管理,实现 DevOps 流程集成
  • 现代技术栈:基于 TypeScript 全栈开发,前端 React + 后端 NestJS 的经典组合
  • AI 集成:内置 AI Agent 和聊天功能,支持智能化客户关系管理
  • 灵活部署:支持 Cloud 托管、自托管(Docker Compose)和本地开发

解决的核心问题: 传统 CRM 系统通常存在定制困难、扩展性差、与现有技术栈集成复杂等问题。Twenty 通过将 CRM 配置代码化,让开发团队可以使用熟悉的工具链(Git、CI/CD、代码审查等)来管理 CRM 定制,大幅降低了定制成本和维护难度。

二、技术原理

2.1 架构设计

Twenty 采用 Monorepo 架构管理多个子项目,使用 Nx 作为构建系统,核心包包括:

  • twenty-server:后端服务,基于 NestJS 框架
  • twenty-front:前端应用,基于 React 构建
  • twenty-ui:共享 UI 组件库
  • twenty-shared:前后端共享类型和工具
  • twenty-sdk:客户端 SDK
  • twenty-cli:命令行工具,用于应用脚手架和发布

2.2 核心技术栈与选型理由

后端技术栈:

  • NestJS:提供模块化、依赖注入等企业级特性,便于构建可维护的大型应用
  • PostgreSQL:关系型数据库,适合 CRM 的复杂数据关系管理
  • Redis:用于缓存和 BullMQ 消息队列,支持异步任务处理
  • BullMQ:基于 Redis 的任务队列,处理后台任务(如邮件发送、数据同步等)

前端技术栈:

  • React 18:主流前端框架,生态丰富
  • Jotai:轻量级状态管理库,API 简洁,适合中型应用
  • Linaria:零运行时 CSS-in-JS 方案,编译时提取样式,性能优秀
  • Lingui:国际化库,支持编译时优化

构建与工具链:

  • Nx:Monorepo 管理工具,提供增量构建、任务编排等能力
  • TypeScript 5.9.2:类型安全,提升代码可维护性
  • Yarn 4.13.0:支持 Plug’n’Play 和 Patches,依赖管理更可靠

2.3 关键设计模式

1. 应用化扩展机制

Twenty 的核心设计理念是"App as Code"。开发者可以通过 create-twenty-app 脚手架创建应用,定义自定义对象、字段和视图:

import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  nameSingular: 'deal',
  namePlural: 'deals',
  labelSingular: 'Deal',
  labelPlural: 'Deals',
  fields: [
    { name: 'name', label: 'Name', type: FieldType.TEXT },
    { name: 'amount', label: 'Amount', type: FieldType.CURRENCY },
    { name: 'closeDate', label: 'Close Date', type: FieldType.DATE_TIME },
  ],
});

这种设计模式借鉴了 Infrastructure as Code (IaC) 的思想,将 CRM 配置代码化,实现版本控制和自动化部署。

2. 模块化 Monorepo 设计

package.jsonworkspaces 配置可以看出,Twenty 将功能划分为 20+ 个独立包:

"workspaces": {
  "packages": [
    "packages/twenty-front",
    "packages/twenty-server",
    "packages/twenty-emails",
    "packages/twenty-ui",
    // ... 更多包
  ]
}

这种设计的优势:

  • 职责分离:每个包职责单一,便于独立开发和测试
  • 依赖共享:通过 twenty-shared 共享类型定义和工具函数
  • 增量构建:Nx 可以智能识别受影响的包,只重新构建必要的部分

3. 测试策略

jest.preset.js 可以看到,Twenty 使用 Jest 作为测试框架,并针对 Lingui 的模块解析问题进行了特殊处理:

const nxPreset = require('@nx/jest/preset').default;

module.exports = {
  ...nxPreset,
  // Override the new testEnvironmentOptions added in @nx/jest 22.3.3
  // which breaks Lingui's module resolution
  testEnvironmentOptions: {},
};

2.4 数据流分析

典型的 Twenty 应用数据流:

  1. 客户端请求 → React 前端通过 twenty-sdk 发送 GraphQL 请求
  2. API Gateway → NestJS 后端接收请求,进行认证和授权
  3. 业务逻辑层 → 调用相应的 Service 处理业务逻辑
  4. 数据访问层 → TypeORM 与 PostgreSQL 交互
  5. 异步任务 → 通过 BullMQ 将耗时任务(如发送邮件)推入 Redis 队列
  6. 响应返回 → 数据经过 DTO 转换后返回给客户端

三、安装与快速开始

3.1 环境要求

  • Node.js:^24.5.0(从 engines 字段可知)
  • Yarn:>=4.0.2(必须使用 Yarn,禁止使用 npm)
  • PostgreSQL:关系型数据库
  • Redis:缓存和消息队列

3.2 安装步骤

方式一:Cloud 托管(推荐)

访问 twenty.com 注册账号,一键创建 Workspace,无需任何基础设施配置。

方式二:本地开发环境

# 1. 克隆仓库
git clone https://github.com/twentyhq/twenty.git
cd twenty

# 2. 安装依赖(必须使用 Yarn)
yarn install

# 3. 启动开发服务器
yarn start

yarn start 会并发启动前端和后端服务,并通过 wait-on 等待后端就绪后启动 Worker。

方式三:Docker Compose 自托管

参考官方文档使用 Docker Compose 部署完整环境。

3.3 最简运行示例

创建并发布一个简单的 Twenty 应用:

# 1. 脚手架创建应用
npx create-twenty-app my-app

# 2. 定义对象(编辑 src/main.ts)
import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  nameSingular: 'contact',
  namePlural: 'contacts',
  labelSingular: 'Contact',
  labelPlural: 'Contacts',
  fields: [
    { name: 'firstName', label: 'First Name', type: FieldType.TEXT },
    { name: 'email', label: 'Email', type: FieldType.TEXT },
  ],
});

# 3. 发布到 Workspace
npx twenty app:publish --private

四、使用方法与实战

4.1 基础用法

1. 管理客户数据

Twenty 提供标准化的 CRM 功能:

  • Companies(公司管理):记录客户公司信息
  • People(联系人管理):管理客户联系人
  • Deals(商机管理):跟踪销售机会
  • Tasks(任务管理):安排跟进任务

2. 自定义视图

用户可以通过拖拽方式自定义列表视图、看板视图、日历视图等,满足不同业务场景需求。

3. AI 辅助

Twenty 内置 AI Agent,可以:

  • 自动提取邮件中的联系人信息
  • 智能推荐下一步行动
  • 生成邮件回复草稿

4.2 进阶用法

1. 应用开发

通过 Twenty CLI 开发自定义应用,扩展 CRM 功能:

// 定义自定义对象
export default defineObject({
  nameSingular: 'project',
  namePlural: 'projects',
  fields: [
    { name: 'name', label: 'Project Name', type: FieldType.TEXT },
    { name: 'status', label: 'Status', type: FieldType.SELECT, options: ['active', 'completed'] },
  ],
});

// 自定义视图
import { defineView } from 'twenty-sdk/define';

export default defineView({
  objectName: 'project',
  type: 'table',
  columns: ['name', 'status', 'createdAt'],
});

2. 版本控制集成

将 CRM 配置纳入 Git 管理:

# 导出当前配置
npx twenty config:export > config.json

# 提交到 Git
git add config.json
git commit -m "Update CRM configuration"
git push

# 在其他环境导入配置
npx twenty config:import < config.json

3. Webhook 集成

Twenty 支持 Webhook,可以与其他系统(如 ERP、邮件营销工具)实时同步数据。

4.3 实际项目示例

场景:销售团队 CRM 定制

某 B2B 销售团队需要定制 CRM 来跟踪复杂的销售流程:

  1. 定义自定义对象Deal(商机)、Contact(联系人)、Activity(活动记录)
  2. 添加自定义字段Deal 对象添加 Contract Value(合同金额)、Expected Close Date(预计成交日期)
  3. 创建自定义视图:看板视图按销售阶段分组,表格视图显示关键指标
  4. 集成邮件系统:通过 Webhook 将邮件往来记录自动同步到 Activity
  5. AI 辅助:AI Agent 自动分析邮件内容,推荐下一步行动(如"发送报价单")

五、常见问题与解决方案

5.1 安装失败

问题yarn install 失败,提示 Node.js 版本不匹配

原因:Twenty 要求 Node.js ^24.5.0,当前版本不符合要求

解决方案

# 使用 nvm 安装正确版本
nvm install 24.5.0
nvm use 24.5.0

yarn.config.cjs 可以看到,Twenty 在 constraints 中强制检查 Node.js 版本:

const requiredNodeVersion = rootWorkspace.manifest.engines?.node;
const currentNodeVersion = process.version;
if (!semver.satisfies(currentNodeVersion, requiredNodeVersion)) {
  throw new Error(
    `Node version ${currentNodeVersion} doesn't match the required version, please use ${requiredNodeVersion}`,
  );
}

5.2 运行时错误

问题:Jest 测试失败,提示 Lingui 模块解析错误

原因:@nx/jest 22.3.3+ 添加了 testEnvironmentOptions,破坏了 Lingui 的模块解析

解决方案: 在 jest.preset.js 中覆盖配置(已完成):

module.exports = {
  ...nxPreset,
  testEnvironmentOptions: {},
};

5.3 性能问题

问题:Monorepo 构建缓慢

原因:Nx 默认全量构建,未利用增量构建能力

解决方案

# 只构建受影响的包
npx nx run-many -t build --base=main

# 使用 Nx Cloud 分布式构建
npx nx run-many -t build --distribute-on=5

5.4 兼容性问题

问题:Yarn 版本不兼容

原因:Twenty 使用 Yarn 4.13.0(Berry),与 Yarn 1.x 不兼容

解决方案

# 启用 Corepack(Node.js 自带的包管理器管理器)
corepack enable
corepack prepare [email protected] --activate

六、总结

Twenty 是一个极具创新性的开源 CRM 项目,其核心价值在于:

  1. 代码化配置:将 CRM 定制从"点击配置"升级为"代码配置",实现版本控制、代码审查、CI/CD 等现代化开发流程

  2. 现代技术栈:TypeScript 全栈 + React/NestJS + Nx Monorepo,保证了代码的可维护性和扩展性

  3. 应用化扩展:通过 Twenty CLI 和 SDK,开发者可以快速构建和发布自定义应用,满足个性化需求

  4. 活跃社区:项目在 GitHub 上获得大量 Star,Discord 社区活跃,文档完善

适用场景:

  • 技术团队希望将 CRM 纳入现有技术栈和 DevOps 流程
  • 需要高度定制化的 CRM 解决方案
  • 希望避免传统 CRM 的供应商锁定和高昂定制成本

未来展望: 随着低代码/无代码平台的兴起,Twenty 的"App as Code"理念具有前瞻性。未来可能会看到更多企业采用类似的代码化配置方案,实现业务系统的灵活定制和高效管理。

项目链接:

  • GitHub:https://github.com/twentyhq/twenty
  • 官网:https://twenty.com
  • 文档:https://docs.twenty.com
  • Discord:https://discord.gg/cx5n4Jzs57