Twenty는 Salesforce의 오픈소스 대안 — 커뮤니티가 만드는 현대적 CRM 플랫폼입니다. TypeScript + React + NestJS + PostgreSQL 기반의 풀스택 오픈소스 CRM으로, "비싸고 폐쇄적인 Salesforce를 대체하겠다"는 명확한 목표 아래, 커스텀 데이터 모델, 워크플로우 자동화, 이메일/캘린더 통합, AI 기능까지 갖춘 엔터프라이즈급 CRM을 커뮤니티 주도로 개발하고 있습니다.
Salesforce는 임대 아파트입니다. 들어가려면 매달 돈을 내야 하고, 내 맘대로 인테리어를 바꿀 수 없고, 이사 가면 내 데이터는 집주인 것이 됩니다. Twenty는 내 서버라는 토지를 사서 집을 짓는 것입니다.
특히 주목할 점은 메타데이터 기반 엔진 — "고객", "거래" 같은 CRM 객체를 하드코딩하지 않고, 런타임에 사용자가 직접 만들 수 있습니다. Salesforce의 "Custom Object" 기능을 표준 웹 기술로 구현한 셈입니다.
사용자당 월 $25~300, 데이터는 Salesforce 클라우드에 고정, 커스터마이징은 Apex/LWC 독자 생태계 필수. 기존 오픈소스 CRM(SugarCRM, SuiteCRM)은 UX가 2010년대 수준이라 쓰기 불편합니다.
무료로 내 서버에서 돌리고, 데이터 주권 100%, 커스터마이징은 TypeScript/React 표준 웹 기술로 가능합니다. ⭐49k+ 스타로 오픈소스 CRM 중 단연 1위.
| 항목 | Salesforce | Twenty |
|---|---|---|
| 가격 | 사용자당 월 $25~300 | 무료 (셀프호스팅) |
| 데이터 소유권 | Salesforce 클라우드 | 내 서버에 100% |
| 커스터마이징 | Apex/LWC (독자 생태계) | TypeScript/React |
| 확장성 | AppExchange (유료) | 오픈소스 + API |
| AI | Einstein (추가 비용) | 내장 (Claude, GPT, Mistral 등) |
| 학습 곡선 | Salesforce 전용 지식 필요 | 웹 개발자라면 바로 기여 가능 |
| 기술 | 버전 | 역할 |
|---|---|---|
| React | 19 | UI 프레임워크 |
| Vite + SWC | @vitejs/plugin-react-swc 4.3 | 번들러 (Babel 대비 20x+ 빠름) |
| Apollo Client | 4.0 | GraphQL 클라이언트 + 캐시 |
| Jotai | — | 원자적 상태관리 |
| BlockNote + TipTap | 0.51 / 3.4 | Notion 스타일 리치텍스트 에디터 |
| Monaco Editor | 0.52 | 코드 에디터 (VS Code 엔진) |
| Vercel AI SDK | 6.0 | 다중 LLM 프로바이더 통합 |
| Playwright | 1.56 | E2E 테스트 |
| Oxlint | 1.51 | Rust 기반 린터 (ESLint 대비 50~100배 빠름) |
| 기술 | 버전 | 역할 |
|---|---|---|
| NestJS | 11 | 모듈식 Node.js 서버 프레임워크 |
| GraphQL Yoga | 4.0.5 | GraphQL API 레이어 |
| TypeORM | 0.3.20 | PostgreSQL ORM |
| PostgreSQL | 16 | 메인 DB (멀티 테넌트 스키마 격리) |
| ClickHouse | — | 분석 DB (집계 쿼리 특화) |
| Redis + BullMQ | 5.40 | 캐시 + 이메일/캘린더 동기화 큐 |
| Anthropic + OpenAI + Mistral | — | 다중 AI 프로바이더 |
| Passport | — | JWT, Google, MS, SAML 인증 |
| Stripe | 20.4 | 결제 |
| 기술 | 역할 |
|---|---|
| Nx 22.7 + Yarn 4.0 Workspaces | 모노레포 빌드 시스템 (22개 패키지) |
| Docker + Docker Compose | 컨테이너화 + 셀프호스팅 |
| GitHub Actions | CI/CD |
| Sentry + OpenTelemetry | 에러 추적 + 분산 추적 |
Twenty에서 가장 주목할 만한 설계입니다. CRM의 객체(Contact, Company, Deal 등)를 하드코딩하지 않고, Engine 모듈이 메타데이터를 기반으로 동적으로 객체를 생성합니다.
각 워크스페이스(=회사)의 데이터가 PostgreSQL 스키마 분리를 활용하여 완전히 격리됩니다. 같은 DB 인스턴스에서도 워크스페이스 간 데이터 접근이 불가능합니다.
// 추상화된 AI 호출 — 프로바이더를 설정에서 교체 가능
const result = await aiService.generate({
provider: workspace.aiProvider, // 'anthropic' | 'openai' | 'mistral'
model: workspace.aiModel,
prompt: "이 연락처를 분석해줘..."
});
19개 도메인 모듈이 독립적으로 동작하면서도 app.module.ts에서 통합되는 모듈식 설계를 배웁니다. GraphQL 스키마 자동 생성(코드 퍼스트 방식), 커스텀 데코레이터와 가드를 활용한 인증/인가, BullMQ 작업 큐 패턴도 익힐 수 있습니다.
Jotai의 원자적(Atomic) 상태관리 — Redux보다 단순하면서 강력합니다. Apollo Client와 Jotai를 조합한 서버/클라이언트 상태 분리, 56개 모듈을 가진 대규모 React 앱의 구조 설계를 배울 수 있습니다.
하드코딩 없이 데이터 모델을 런타임에 정의하는 패턴입니다. PostgreSQL 동적 테이블/스키마 생성, GraphQL 스키마 동적 생성, Salesforce 같은 플랫폼의 내부 동작 원리를 이해하게 됩니다.
PostgreSQL 스키마 기반 테넌트 격리, 테넌트별 마이그레이션 관리, 멀티 테넌트 환경에서의 인증 플로우를 배웁니다.
22개 패키지를 하나의 레포에서 관리하는 방법, Nx의 빌드 캐싱과 의존성 그래프, 패키지 간 공유 코드 관리(twenty-shared, twenty-utils)를 배웁니다.
| 항목 | 최소 | 권장 |
|---|---|---|
| Node.js | v24.5.0+ | v24.x LTS |
| 패키지매니저 | Yarn 4.0.2+ | Yarn 4.x |
| RAM | 8GB | 16GB (모노레포 빌드 시) |
| 디스크 | 10GB | 20GB |
| OS | Linux/macOS/WSL2 | Linux/macOS |
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 2코어 | 4코어+ |
| RAM | 4GB | 8GB+ |
| 디스크 | 20GB | 50GB+ (첨부파일 포함) |
| Docker | 20.10+ | 최신 |
Docker Compose 멀티 서비스 오케스트레이션을 체험합니다.
curl -o docker-compose.yml \
https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml
cat > .env << 'EOF'
TAG=latest
PG_DATABASE_PASSWORD=my-secret-password
APP_SECRET=my-app-secret-change-me
SERVER_URL=http://localhost:3000
EOF
docker compose up -d
# http://localhost:3000 접속
메타데이터 기반 동적 시스템이 실제로 어떻게 동작하는지 체감합니다. 설정 → 데이터 모델 → "새 객체 만들기"에서 "프로젝트" 객체를 생성하고, GraphQL Playground에서 해당 객체의 CRUD API가 자동 생성되었는지 확인합니다.
Nx 모노레포 구조 이해 + NestJS/React 동시 개발 환경을 체험합니다.
git clone https://github.com/twentyhq/twenty.git
cd twenty
yarn install
docker run -d --name twenty-postgres -p 5432:5432 \
-e POSTGRES_PASSWORD=postgres postgres:16
docker run -d --name twenty-redis -p 6379:6379 redis
# 환경변수 설정 후
yarn start
이벤트 기반 아키텍처 + BullMQ 작업 큐를 이해합니다. Twenty UI에서 워크플로우 빌더를 열고, 트리거 "연락처 생성 시" → 액션 "이메일 발송"을 연결합니다. 서버 코드에서 modules/workflow/ 디렉토리를 분석합니다.
NestJS 모듈 아키텍처 + GraphQL 코드 퍼스트 방식 실전 적용. packages/twenty-server/src/modules/에 새 모듈을 생성하고, GraphQL resolver + TypeORM entity를 정의한 후 app.module.ts에 등록합니다.
| 주차 | 주제 | 학습 내용 |
|---|---|---|
| 1주차 | TypeScript + NestJS 기초 | 제네릭/데코레이터, 모듈/컨트롤러/서비스, GraphQL 코드 퍼스트, TypeORM + PostgreSQL |
| 2주차 | 프론트엔드 심화 | Apollo Client 캐시 전략, Jotai 원자/파생 원자, React Hook Form + Zod, Vite + SWC 빌드 최적화 |
| 3주차 | 인프라 + 모노레포 | Docker Compose 멀티 서비스, Nx 워크스페이스 설정, BullMQ 작업 큐, OpenTelemetry + Sentry |
| 4주차 | 고급 주제 | 메타데이터 기반 설계, 멀티 테넌트 아키텍처, Vercel AI SDK 다중 LLM 연동, engine/ 소스코드 분석 |
| 키워드 | 설명 |
|---|---|
| CRM | Customer Relationship Management. 연락처, 거래, 활동 등 고객 관계를 체계적으로 관리하는 시스템 |
| NestJS | Angular에서 영감받은 모듈식 Node.js 프레임워크. 데코레이터 기반 DI(의존성 주입) 지원 |
| GraphQL | REST 대안 API 쿼리 언어. 클라이언트가 필요한 데이터만 정확히 요청 가능. Over-fetching 해결 |
| Jotai | 원자(atom) 단위로 상태를 관리하는 React 상태관리 라이브러리. Redux보다 보일러플레이트 90% 감소 |
| Apollo Client | GraphQL 클라이언트. 캐싱, 상태 관리, 실시간 구독 지원 |
| BullMQ | Redis 기반 Node.js 작업 큐. 이메일 동기화 등 무거운 작업을 백그라운드에서 처리 |
| Nx | 모노레포 빌드 시스템. 빌드 캐싱과 의존성 그래프로 대규모 패키지를 효율적으로 관리 |
| 멀티 테넌트 | 하나의 인프라에서 여러 고객(테넌트)이 독립적으로 사용하는 아키텍처. 데이터 격리가 핵심 |
| ClickHouse | 열 지향 분석 DB. 대량 데이터 집계 쿼리에서 PostgreSQL보다 수십 배 빠름 |
| Vercel AI SDK | OpenAI, Anthropic, Mistral 등 다중 AI 프로바이더를 동일한 인터페이스로 호출하는 라이브러리 |
| Oxlint | Rust로 작성된 초고속 JavaScript 린터. ESLint보다 50~100배 빠름 |
| SWC | Rust로 작성된 TypeScript/JavaScript 컴파일러. Babel보다 20배+ 빠른 변환 속도 |
| AGPL-3.0 | 소스코드 공개 의무가 있으며, 네트워크 서비스도 해당되는 오픈소스 라이선스 (SaaS 루프홀 차단) |
| Code-First GraphQL | GraphQL 스키마를 SDL 파일이 아닌 TypeScript 코드(데코레이터)로 정의하는 방식 |