기술 / 오픈 소스
평범한 부품. 한 번 조립합니다.
모든 벤처에는 백엔드가 필요하지만 어느 벤처도 직접 만들어서는 안 됩니다. 회사가 존재하는 데 필요한 부품을 오픈 소스 Rust 하니스로 한 번만 작성합니다. 벤처는 원하는 모듈을 고르고, 파일 하나에서 연결하여, 자체 데이터베이스를 가진 상태 비저장 워커 하나로 출시합니다.
숫자로 보는 팩토리
- 벤처
- 23검증 17 · 프로토타입 1 · 출시 5
- 스택 내
- 17벤처 23개 중, 공유 부분
- 오픈소스
- 11MIT 8 · Apache-2.0 3
- 하니스에서 실행
- 18현재 운영 중 18 · 계획됨 1
- 결정 기록
- 30하니스 저장소 내
벤처는 이렇게 만들어집니다
파일 하나가 회사를 정의합니다.
벤처 백엔드는 작은 Rust 프로젝트입니다. 사용하는 모듈, 그 모듈을 외부와 연결하는 Adapter, 벤처 고유의 이름과 도메인을 나열합니다. 나머지는 모두 하니스입니다. 빌드하면 나열한 모듈만 정확히 담은 하나의 Worker가 만들어집니다.
모듈이 런타임이 제공할 수 없는 것을 필요로 하거나 두 모듈이 같은 테이블을 요구하면 배포 전에 빌드가 실패합니다. 잘못 구성된 벤처는 프로덕션에 도달할 수 없습니다.
Harness::builder() .venture(Venture::new("factory0", "factory0.ventures") .cors_origins(["https://factory0.ventures"])) .module(EmailSignup::new().double_opt_in(true)) .module(Waitlist::new() .products(["kontinuum", "undercover-rockstars"])) .runtime(Cloudflare::new() .db("DB") .mailer(Resend::from_env()) .captcha(Turnstile::from_env())) .build()?
- 1단계
이름 짓기
벤처, 도메인, 모듈, 그리고 이를 담당하는 Adapter. 파일 하나로 정리됩니다.
- 2단계
구성하기
빌드는 런타임이 제공하지 않는 Port를 요구하는 모듈, 그리고 같은 테이블이나 라우트를 요구하는 두 모듈을 거부합니다.
- 3단계
배포하기
나열된 모듈만 정확히 담은 하나의 상태 비저장 Worker이며, 자체 데이터베이스, 시크릿, 도메인을 가집니다.
레이어
런타임에서 제품까지 여섯 개 레이어.
아래에서 위로 읽습니다. 코드가 실행되는 곳, 모든 백엔드가 컴파일되는 하니스, 백엔드, 공유 제품, 회사를 운영하는 에이전트, 독립 벤처 순입니다. 채워진 칩은 현재 운영 중, 윤곽선 칩은 하니스 내, 점선 칩은 계획됨입니다.
WebAssembly로 컴파일된 Cloudflare Workers
모든 벤처 Worker가 실행되는 곳. 데이터와 메일은 그 곁에 있으며, 같은 코드를 서버에서도 실행할 수 있습니다.
Cratefield: 오픈소스 Rust 코어
Port, 라우터, 모듈. 모듈이 Port를 요청하면 Adapter가 응답합니다.
Port
모듈
벤처당 Worker 하나와 데이터베이스 하나
각 벤처는 하니스로 구성되어 독립적으로 배포됩니다. 현재 하니스에서 운영 중인 벤처:
스택: 모든 벤처가 연결하는 제품
기능별로 선반에 나눈 공유 제품입니다. 각각 자체 고객을 가진 회사입니다.
배포 및 운영
VibeCaddie
Keep Shipping
release.show
Shoal
커뮤니케이션
Owlpost
Squeezin
보안
promptdecode
Sealbin
고객
SupportGenius
PosPlugin
Ledgers
콘텐츠 및 AI
Kontinuum
Living Brain
Tokker
Ghostwritin'
다섯 개 레이어, 기능마다 에이전트 하나
각 레이어의 모든 기능은 에이전트입니다. Colonizer가 빌드 레이어의 코딩 에이전트를 운영합니다.
- 발굴에이전트 3개
- 빌드에이전트 4개
- 운영에이전트 4개
- 유통에이전트 3개
- 학습에이전트 3개
Colonizer: GitHub 이슈를 풀 리퀘스트로 바꾸는 코딩 에이전트
독립 벤처
스택 밖의 벤처. 기반을 상속하며 기반에 더하는 것은 없습니다.
여섯 개 레이어, 아래에서 위로
- runtime: WebAssembly로 컴파일된 Cloudflare Workers. 모든 벤처 Worker가 실행되는 곳. 데이터와 메일은 그 곁에 있으며, 같은 코드를 서버에서도 실행할 수 있습니다.
- harness: Cratefield: 오픈소스 Rust 코어. Port, 라우터, 모듈. 모듈이 Port를 요청하면 Adapter가 응답합니다.
- backends: 벤처당 Worker 하나와 데이터베이스 하나. 각 벤처는 하니스로 구성되어 독립적으로 배포됩니다. 현재 하니스에서 운영 중인 벤처:
- shelves: 스택: 모든 벤처가 연결하는 제품. 기능별로 선반에 나눈 공유 제품입니다. 각각 자체 고객을 가진 회사입니다.
- agents: 다섯 개 레이어, 기능마다 에이전트 하나. 각 레이어의 모든 기능은 에이전트입니다. Colonizer가 빌드 레이어의 코딩 에이전트를 운영합니다.
- products: 독립 벤처. 스택 밖의 벤처. 기반을 상속하며 기반에 더하는 것은 없습니다.
요청의 처음부터 끝까지
방문자가 가입할 때 누가 무엇을 하는지.
레지스트리의 링크에서만 그렸습니다. 실선은 현재 운영 중이며 트래픽을 전달하고, 점선은 계획됨 상태로 아직 트래픽이 없습니다.
방문자
벤처 사이트의 사용자
Venture worker
벤처당 Worker 하나, Cratefield 하니스 기반
운영 중Owlpost
벤처를 위한 메일
운영 중SupportGenius
버그 리포트 및 지원
계획Colonizer
하니스 위의 코딩 에이전트
운영 중Living Brain
효과가 있었던 것을 보존하는 지식
계획
이 흐름의 연결: 방문자에서 벤처 워커로, HTTPS 요청: 운영 중. 벤처 워커에서 Owlpost로, 확인 메일: 운영 중. 벤처 워커에서 SupportGenius로, 오류가 이슈가 됨: 계획됨. SupportGenius에서 Living Brain으로, 지원 내용이 지식이 됨: 계획됨. Colonizer에서 Living Brain으로, 에이전트가 지식을 공급함: 운영 중.
모듈은 Port만 봅니다
한쪽에는 Port. 다른 쪽에는 Adapter.
모듈은 벤더가 아닌 Port를 요청합니다. 런타임은 Adapter를 통해 응답합니다. Adapter는 하니스 자체의 것이며, 상태는 운영 중인 벤처가 오늘 어디에서 사용하는지를 나타냅니다.
-
Database
테이블, 쿼리, 마이그레이션
- D1 (운영 중)
- Postgres (하니스 내)
- SQLite (하니스 내)
-
Mailer
트랜잭션 메일
- Resend (운영 중)
- Owlpost (계획됨)
-
Captcha
봇 확인, 실패 시 차단
- Turnstile (하니스 내)
-
KeyValue
작은 키-값 상태
- Cloudflare KV (하니스 내)
-
RateLimiter
키별 요청 한도
- Cloudflare Rate Limiting (하니스 내)
- Redis (하니스 내)
-
Payments
결제 및 청구
- Polar (계획됨)
- Stripe (하니스 내)
-
TextModel
모델 완성
- Anthropic (하니스 내)
- OpenAI-compatible (하니스 내)
-
Push
기기 알림
- APNs (하니스 내)
- FCM (하니스 내)
- Web Push (하니스 내)
-
Signer
키 참조 기반 서명
- Turnkey (하니스 내)
Port와 Adapter: Database(테이블, 쿼리, 마이그레이션): D1(운영 중), Postgres(하니스 내), SQLite(하니스 내). Mailer(트랜잭션 메일): Resend(운영 중), Owlpost(계획됨). Captcha(봇 확인, 실패 시 차단): Turnstile(하니스 내). KeyValue(작은 키-값 상태): Cloudflare KV(하니스 내). RateLimiter(키별 요청 한도): Cloudflare Rate Limiting(하니스 내), Redis(하니스 내). Payments(결제 및 청구): Polar(계획됨), Stripe(하니스 내). TextModel(모델 완성): Anthropic(하니스 내), OpenAI-compatible(하니스 내). Push(기기 알림): APNs(하니스 내), FCM(하니스 내), Web Push(하니스 내). Signer(키 참조 기반 서명): Turnkey(하니스 내).
디자인 규칙
설계가 지키는 네 가지 규칙.
01
모듈은 포트만 봅니다.
모듈은 데이터베이스, 메일러, 캡차를 요청할 뿐 Cloudflare 바인딩이나 벤더 클라이언트에는 직접 닿지 않습니다. 응답은 어댑터가 합니다. 이 규칙 하나 덕분에 나중에 Cloudflare에서 옮겨 가는 일이 크레이트 하나를 바꾸는 일로 끝납니다.
모듈MailerAdapter02
조합은 컴파일 시점에 이루어집니다.
플러그인 로딩도, 레지스트리 서비스도, 예기치 않은 런타임 동작도 없습니다. Worker에는 벤처가 나열한 것만 담기며, 컴파일러가 첫 번째 리뷰어입니다. 소스가 공유 빌드에 들어가면 안 되는 모듈은 별도의 Worker로 실행하여 서비스 바인딩을 통해 같은 경로에 마운트할 수 있습니다. 여전히 구성된 것이며, 같은 바이너리에 들어가지 않을 뿐입니다.
컴파일거부배포03
벤처 하나에 데이터베이스 하나.
회사 간에는 런타임에 공유되는 것이 없습니다. 각 회사에는 자체 워커, 자체 데이터, 자체 시크릿이 있습니다. 벤처 하나를 백업하거나, 옮기거나, 종료해도 다른 벤처에 영향이 없습니다.
Worker데이터베이스시크릿Worker데이터베이스시크릿Worker데이터베이스시크릿공유되는 런타임 없음
04
구조상 상태 비저장.
요청이 끝나면 데이터베이스에 기록된 것 외에는 아무것도 남지 않습니다. 확인 링크와 구독 취소 링크는 서명된 토큰이므로 운영하고, 확장하고, 유출될 세션 저장소가 없습니다.
요청Worker데이터베이스세션 저장소 없음
상태
하니스의 위치.
진행 상황은 이슈와 마일스톤으로 공개 추적합니다.
- M0완료
기반
워크스페이스 도구, 코어, Cloudflare 런타임, Resend와 Turnstile Adapter, SQLite Adapter, fz CLI, 테스트 키트.
- M1완료
첫 모듈
이메일 가입, 대기자 명단, 템플릿, 보안 기준선, 관측성.
- M2진행 중
첫 벤처 운영 중
crates.io 게시, 문서, 계약 버전 관리, 그리고 자체 API 도메인을 갖춘 첫 벤처.
- M3완료
자체 호스팅 이식성
Postgres Adapter, 네이티브 런타임, SQLite와 Postgres 대상 패리티 테스트 스위트, 데이터 내보내기와 가져오기.
- 디자인
- 저장소에 모두 수록된 결정 기록 30건
- 아키텍처
- 아키텍처 문서 12개 섹션
- 첫 모듈
- 이메일 가입 및 대기자 명단, 구축 완료
- 게시됨
- 대부분의 크레이트는 crates.io에 있습니다. 릴리스 라운드가 대기 중입니다.
- 관리형 서비스
- 아직 구축되지 않았습니다. 컨트롤 플레인은 설계만 되었고 작성되지 않았습니다.
하니스 수치: 2026-10-21에 Cratefield/harness에서 읽음.
보안 및 개인정보
요청과 데이터 사이의 여섯 개 레이어.
각 레이어는 하니스가 문서화한 통제 장치입니다. 전체 목록은 보안 및 개인정보 문서에 있습니다.
- 01 · EDGE
벤처 자체의 오리진만
벤처의 Worker는 자체 도메인에서 응답합니다. CORS는 벤처가 나열한 오리진만 허용하며, 모든 응답은 요청 ID를 되돌려 줍니다.
- 02 · 악용 방지
봇과 트래픽 폭주
실패 시 차단하는 Turnstile. 모든 공개 쓰기에 RateLimiter Port를 통한 요청 제한.
- 03 · 요청
주소 없는 오류와 로그
오류는 사례별로 고정된 슬러그를 가진 problem+json입니다. 요청당 구조화된 한 줄만 기록하며 이메일 주소는 절대 포함하지 않습니다.
- 04 · 토큰
세션이 아닌 링크
확인 링크와 구독 해지 링크는 HMAC으로 서명되며 키 교체를 지원합니다. 운영하거나 확장하거나 유출될 세션 저장소가 없습니다.
- 05 · 시크릿
봉투 암호화
시크릿은 봉투 암호화되어 해당 행에 묶입니다. KMS Port의 로컬 파일 제공자는 프로덕션을 거부합니다.
- 06 · 격리
벤처 하나, 데이터베이스 하나
회사 간에 공유되는 런타임은 없습니다. 각 회사는 자체 Worker, 데이터, 시크릿을 가지며 단독으로 이전하거나 종료할 수 있습니다.
공개된 항목
팩토리의 작업 현장은 공개되어 있습니다. 레시피는 공개하지 않습니다.
하니스, 런타임, Adapter, 그리고 첫 두 모듈은 MIT 라이선스이며 공개적으로 개발됩니다. 누구나 이를 바탕으로 백엔드를 구축할 수 있고, 우리가 운영하는 모든 벤처도 그렇게 합니다. Factory Zero가 회사를 운영하는 방식을 담은 모듈은 비공개로 유지됩니다. 각 벤처 자체의 백엔드도 비공개입니다.
벤처 하나는 하니스 자체입니다. Cratefield는 오픈 소스 하니스를 가져와 그 주위에 관리형 레이어를 더합니다. 사용자의 Cloudflare 계정 안에 워커, 데이터베이스, 시크릿을 프로비저닝하고 운영하게 됩니다. 하니스는 실제로 동작 중이며, 컨트롤 플레인은 설계만 되었고 아직 작성되지 않았습니다. 모듈 경계가 제 역할을 하는 곳이기도 합니다. 고객이 소스가 저희에게 전달되지 않은 채 자신만의 모듈을 빌드하고 배포할 수 있습니다.
의사 결정은 내려지는 대로 기록됩니다. 아키텍처 문서와 의사 결정 기록은 리포지토리에 있으며, 첫 시도를 폐기한 이유를 기록한 문서도 포함되어 있습니다.
스택 전반의 라이선스
스택에 있는 벤처 17개 중 11개가 오픈소스이며, 각각 OSI 라이선스를 따르는 공개 저장소를 가집니다. 막대와 타일은 레지스트리의 라이선스 필드에서 그려집니다.
KontinuumMIT
CratefieldMIT
ColonizerMIT
SupportGeniusMIT
promptdecodeMIT
Keep ShippingMIT
LedgersMIT
Ghostwritin'MIT
SealbinApache-2.0
Living BrainApache-2.0
TokkerApache-2.0
VibeCaddie오픈소스 아님
PosPlugin오픈소스 아님
Owlpost오픈소스 아님
release.show오픈소스 아님
Shoal오픈소스 아님
Squeezin오픈소스 아님
라이선스별 스택 벤처: Kontinuum: MIT. Cratefield: MIT. VibeCaddie: 오픈소스 아님. Colonizer: MIT. SupportGenius: MIT. promptdecode: MIT. PosPlugin: 오픈소스 아님. Keep Shipping: MIT. Owlpost: 오픈소스 아님. Sealbin: Apache-2.0. release.show: 오픈소스 아님. Living Brain: Apache-2.0. Shoal: 오픈소스 아님. Tokker: Apache-2.0. Ledgers: MIT. Ghostwritin': MIT. Squeezin: 오픈소스 아님.