テクノロジー / オープンソース
ありふれた部品。一度だけ組み立てる。
どのベンチャーにもバックエンドが必要ですが、それを一から作るべきではありません。会社が成り立つために必要な部品は、Rust製のオープンソースのハーネスとして一度だけ書かれています。ベンチャーは必要なモジュールを選び、1つのファイルで結び付け、独自のデータベースを持つ1つのステートレスなワーカーとして出荷します。
数字で見るファクトリー
- ベンチャー
- 23検証17 · プロトタイプ1 · ローンチ5
- スタック上
- 1723のベンチャーのうち、共有部分
- オープンソース
- 11MIT 8 · Apache-2.0 3
- ハーネス上で稼働
- 18現在18件が稼働中 · 1件が計画中
- 決定記録
- 30ハーネスのリポジトリ内
ベンチャーの作り方
ひとつのファイルが会社を定義します。
ベンチャーのバックエンドは小さなRustプロジェクトです。使うモジュール、それらを外部につなぐアダプター、そしてベンチャー固有の名前とドメインを列挙します。それ以外はすべてハーネスです。ビルドすると、そのモジュールだけを含む1つのWorkerができあがります。
モジュールがランタイムの提供できないものを必要としたり、2つのモジュールが同じテーブルを要求したりすると、何かがデプロイされる前にビルドが失敗します。設定を誤ったベンチャーが本番に届くことはありません。
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
名前を付ける
ベンチャー、そのドメイン、モジュール、それに応えるアダプター。1つのファイルにまとまっています。
- ステップ2
組み立てる
ランタイムが提供しないポートを求めるモジュールや、同じテーブルまたはルートを主張する2つのモジュールは、ビルドが拒否します。
- ステップ3
出荷する
列挙したモジュールだけを含むステートレスなWorkerが1つ。独自のデータベース、シークレット、ドメインを持ちます。
レイヤー
ランタイムからプロダクトまでの6つのレイヤー。
下から上へお読みください。コードが動く場所、すべてのバックエンドのコンパイル元となるハーネス、バックエンド、共有プロダクト、会社を動かすエージェント、そして独立したベンチャーの順です。塗りつぶしのチップは現在稼働中、枠線のチップはハーネス内、破線のチップは計画中です。
Cloudflare Workers、WebAssemblyにコンパイル
すべてのベンチャーWorkerが動く場所。データとメールはその隣にあり、同じコードをサーバー上でも動かせます。
Cratefield:オープンソースのRustコア
ポート、ルーター、モジュール。モジュールがポートを求め、アダプターが応えます。
ポート
モジュール
ベンチャーごとに1つのWorkerと1つのデータベース
各ベンチャーはハーネスから組み立てられ、単独でデプロイされます。現在ハーネスで稼働中のもの:
スタック:すべてのベンチャーが接続するプロダクト
共有プロダクトを役割別に棚に分けたもの。それぞれが独自の顧客を持つ会社です。
出荷と運用
VibeCaddie
Keep Shipping
release.show
Shoal
コミュニケーション
Owlpost
Squeezin
セキュリティ
promptdecode
Sealbin
顧客
SupportGenius
PosPlugin
Ledgers
コンテンツとAI
Kontinuum
Living Brain
Tokker
Ghostwritin'
5つのレイヤー、機能ごとに1つのエージェント
各レイヤーの各機能がエージェントです。ビルドレイヤーのコーディングエージェントはColonizerが動かしています。
- DISCOVERエージェント3件
- BUILDエージェント4件
- OPERATEエージェント4件
- DISTRIBUTEエージェント3件
- LEARNエージェント3件
Colonizer:GitHubのissueをプルリクエストに変えるコーディングエージェント
独立したベンチャー
スタック外のベンチャー。基盤を引き継ぎますが、基盤には何も加えません。
6つのレイヤー(下から上へ)
- ランタイム:Cloudflare Workers、WebAssemblyにコンパイル。すべてのベンチャーWorkerが動く場所。データとメールはその隣にあり、同じコードをサーバー上でも動かせます。
- ハーネス:Cratefield:オープンソースのRustコア。ポート、ルーター、モジュール。モジュールがポートを求め、アダプターが応えます。
- バックエンド:ベンチャーごとに1つのWorkerと1つのデータベース。各ベンチャーはハーネスから組み立てられ、単独でデプロイされます。現在ハーネスで稼働中のもの:
- 棚:スタック:すべてのベンチャーが接続するプロダクト。共有プロダクトを役割別に棚に分けたもの。それぞれが独自の顧客を持つ会社です。
- エージェント:5つのレイヤー、機能ごとに1つのエージェント。各レイヤーの各機能がエージェントです。ビルドレイヤーのコーディングエージェントはColonizerが動かしています。
- プロダクト:独立したベンチャー。スタック外のベンチャー。基盤を引き継ぎますが、基盤には何も加えません。
リクエストの流れ(端から端まで)
訪問者が登録したとき、誰が何をするか。
レジストリ内のリンクのみから描いています。実線は現在稼働中でトラフィックが流れており、破線は計画中でまだ流れていません。
訪問者
ベンチャーサイトを訪れた人
ベンチャーWorker
ベンチャーごとに1つのWorker、Cratefieldハーネス上
稼働中Owlpost
ベンチャー向けのメール
稼働中SupportGenius
バグ報告とサポート
計画中Colonizer
ハーネス上のコーディングエージェント
稼働中Living Brain
うまくいったことを残すナレッジ
計画中
このフローのつながり: 訪問者からベンチャーのワーカーへのHTTPSリクエスト: 稼働中。ベンチャーのワーカーからOwlpostへの確認メール: 稼働中。ベンチャーのワーカーからSupportGeniusへのエラーの課題化: 計画中。SupportGeniusからLiving Brainへのサポート情報のナレッジ化: 計画中。ColonizerからLiving Brainへのエージェントによるナレッジ化: 稼働中。
モジュールが見るのはポートだけ
一方にポート、もう一方にアダプター。
モジュールが求めるのはポートであり、ベンダーではありません。ランタイムはアダプター経由で応えます。アダプターはハーネス自身のもので、ステータスは稼働中のベンチャーが現在使っているかどうかを示します。
-
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 (ハーネス内)
ポートとそのアダプター:Database(テーブル、クエリ、マイグレーション):D1(稼働中)、Postgres(ハーネス内)、SQLite(ハーネス内)。Mailer(トランザクションメール):Resend(稼働中)、Owlpost(計画中)。Captcha(失敗時は拒否するボット判定):Turnstile(ハーネス内)。KeyValue(小規模なキーバリュー状態):Cloudflare KV(ハーネス内)。RateLimiter(キーごとのリクエスト上限):Cloudflare Rate Limiting(ハーネス内)、Redis(ハーネス内)。Payments(チェックアウトと課金):Polar(計画中)、Stripe(ハーネス内)。TextModel(モデルによる補完):Anthropic(ハーネス内)、OpenAI互換(ハーネス内)。Push(デバイスへの通知):APNs(ハーネス内)、FCM(ハーネス内)、Web Push(ハーネス内)。Signer(鍵参照による署名):Turnkey(ハーネス内)。
デザインルール
設計が守る4つのルール。
01
モジュールが見るのはポートだけです。
モジュールはデータベース、メーラー、captchaを要求します。Cloudflareのバインディングやベンダーのクライアントには一切触れません。応えるのはアダプターです。このルールひとつで、のちにCloudflareから移行する際の変更は1つのcrateで済みます。
モジュールMailerアダプター02
構成はコンパイル時に行われます。
プラグインの読み込みも、レジストリサービスも、ランタイムでの予期せぬ動作もありません。Workerにはベンチャーが列挙したものが含まれ、最初のレビュアーはコンパイラです。ソースを共有ビルドに入れるべきでないモジュールは、独自のWorkerとして動かし、サービスバインディング経由で同じパスにマウントできます。この場合も組み立てられてはいますが、同じバイナリには入りません。
コンパイル拒否デプロイ03
ベンチャーごとに1つのデータベース。
実行時に会社間で共有されるものはありません。それぞれが独自のワーカー、データ、シークレットを持ちます。ひとつのベンチャーを、他に影響を与えずにバックアップ、移動、停止できます。
WorkerデータベースシークレットWorkerデータベースシークレットWorkerデータベースシークレットランタイム共有なし
04
構造的にステートレス。
リクエストをまたいで残るのは、データベースに書き込まれたものだけです。確認リンクと配信停止リンクは署名付きトークンなので、運用、スケール、漏えいの対象となるセッションストアはありません。
リクエストWorkerデータベースセッションストアなし
ステータス
ハーネスの現在地。
進捗はissueとマイルストーンとして公開の場で管理しています。
- M0完了
基盤
ワークスペースツール、コア、Cloudflareランタイム、ResendおよびTurnstileアダプター、SQLiteアダプター、fz CLI、テストキット。
- M1完了
最初のモジュール
メール登録、ウェイトリスト、テンプレート、セキュリティのベースライン、オブザーバビリティ。
- M2進行中
最初のベンチャーが稼働
crates.ioへの公開、ドキュメント、コントラクトのバージョニング、そして独自のAPIドメイン上での最初のベンチャー。
- M3完了
セルフホストへの移植性
Postgresアダプター、ネイティブランタイム、SQLiteとPostgresでのパリティスイート、データのエクスポートとインポート。
- デザイン
- 決定記録30件、すべてリポジトリ内
- アーキテクチャ
- アーキテクチャ文書は12セクション
- 最初のモジュール
- メール登録とウェイトリスト、構築済み
- 公開済み
- ほとんどのクレートはcrates.ioにあります。リリースの一巡は保留中です。
- マネージドサービス
- まだ構築していません。コントロールプレーンは設計済みで、実装はされていません。
ハーネスの数値:2026-10-21にCratefield/harnessから取得。
セキュリティとプライバシー
リクエストとデータの間にある6つのレイヤー。
各レイヤーは、ハーネスが文書化している対策です。全一覧はセキュリティおよびプライバシー文書にあります。
- 01 · エッジ
ベンチャー自身のオリジンのみ
ベンチャーのWorkerは独自のドメインで応答します。CORSはベンチャーが列挙したオリジンのみを許可し、すべてのレスポンスはリクエストIDを返します。
- 02 · 不正対策
ボットと大量アクセス
Turnstileは失敗時に拒否します。公開される書き込みにはすべて、RateLimiterポート経由でレート制限をかけます。
- 03 · リクエスト
アドレスを含まないエラーとログ
エラーはproblem+jsonで、ケースごとに固定のスラッグを持ちます。ログはリクエストごとに構造化された1行で、メールアドレスは含みません。
- 04 · トークン
セッションではなくリンク
確認リンクと配信停止リンクはHMACで署名され、鍵のローテーションに対応しています。運用もスケールも漏えいも考える必要があるセッションストアはありません。
- 05 · シークレット
エンベロープ暗号化
シークレットはエンベロープ暗号化され、各行に紐づけられます。KMSポートのローカルファイルプロバイダーは本番環境では動作を拒否します。
- 06 · 分離
1ベンチャーに1データベース
会社間でランタイムを共有することはありません。それぞれが独自のWorker、データ、シークレットを持ち、単独で移設も停止もできます。
公開されているもの
工場の現場は公開しています。レシピは公開していません。
ハーネス、そのランタイム、アダプター、最初の2つのモジュールは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: 非オープンソース。