テクノロジー / オープンソース

ありふれた部品。一度だけ組み立てる。

どのベンチャーにもバックエンドが必要ですが、それを一から作るべきではありません。会社が成り立つために必要な部品は、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

    名前を付ける

    ベンチャー、そのドメイン、モジュール、それに応えるアダプター。1つのファイルにまとまっています。

  2. ステップ2

    組み立てる

    ランタイムが提供しないポートを求めるモジュールや、同じテーブルまたはルートを主張する2つのモジュールは、ビルドが拒否します。

  3. ステップ3

    出荷する

    列挙したモジュールだけを含むステートレスなWorkerが1つ。独自のデータベース、シークレット、ドメインを持ちます。

レイヤー

ランタイムからプロダクトまでの6つのレイヤー。

下から上へお読みください。コードが動く場所、すべてのバックエンドのコンパイル元となるハーネス、バックエンド、共有プロダクト、会社を動かすエージェント、そして独立したベンチャーの順です。塗りつぶしのチップは現在稼働中、枠線のチップはハーネス内、破線のチップは計画中です。

01ランタイム

Cloudflare Workers、WebAssemblyにコンパイル

すべてのベンチャーWorkerが動く場所。データとメールはその隣にあり、同じコードをサーバー上でも動かせます。

Workers(wasm32)D1データベースResendメールKVTurnstileレート制限Postgres、ネイティブランタイム
02ハーネス

Cratefield:オープンソースのRustコア

ポート、ルーター、モジュール。モジュールがポートを求め、アダプターが応えます。

Cratefield

ポート

DatabaseMailerCaptchaRateLimiterKeyValueSigner

モジュール

email-signupウェイトリスト
03バックエンド

ベンチャーごとに1つのWorkerと1つのデータベース

各ベンチャーはハーネスから組み立てられ、単独でデプロイされます。現在ハーネスで稼働中のもの:

ColonizerFindsYou.workSupportGeniuspromptdecodeGroove GuruPosPluginKeep ShippingOwlpostBloodrankratecla.imSealbinrelease.showLiving BrainShoalTokkerLedgersGhostwritin'SqueezinYoginini
04棚

スタック:すべてのベンチャーが接続するプロダクト

共有プロダクトを役割別に棚に分けたもの。それぞれが独自の顧客を持つ会社です。

出荷と運用

  • VibeCaddie
  • Keep Shipping
  • release.show
  • Shoal

コミュニケーション

  • Owlpost
  • Squeezin

セキュリティ

  • promptdecode
  • Sealbin

顧客

  • SupportGenius
  • PosPlugin
  • Ledgers

コンテンツとAI

  • Kontinuum
  • Living Brain
  • Tokker
  • Ghostwritin'
05エージェント

5つのレイヤー、機能ごとに1つのエージェント

各レイヤーの各機能がエージェントです。ビルドレイヤーのコーディングエージェントはColonizerが動かしています。

  • DISCOVERエージェント3件
  • BUILDエージェント4件
  • OPERATEエージェント4件
  • DISTRIBUTEエージェント3件
  • LEARNエージェント3件

Colonizer:GitHubのissueをプルリクエストに変えるコーディングエージェント

06プロダクト

独立したベンチャー

スタック外のベンチャー。基盤を引き継ぎますが、基盤には何も加えません。

Undercover RockstarsYogininiFindsYou.workGroove GuruBloodrankratecla.im

6つのレイヤー(下から上へ)

  1. ランタイム:Cloudflare Workers、WebAssemblyにコンパイル。すべてのベンチャーWorkerが動く場所。データとメールはその隣にあり、同じコードをサーバー上でも動かせます。
  2. ハーネス:Cratefield:オープンソースのRustコア。ポート、ルーター、モジュール。モジュールがポートを求め、アダプターが応えます。
  3. バックエンド:ベンチャーごとに1つのWorkerと1つのデータベース。各ベンチャーはハーネスから組み立てられ、単独でデプロイされます。現在ハーネスで稼働中のもの:
  4. 棚:スタック:すべてのベンチャーが接続するプロダクト。共有プロダクトを役割別に棚に分けたもの。それぞれが独自の顧客を持つ会社です。
  5. エージェント:5つのレイヤー、機能ごとに1つのエージェント。各レイヤーの各機能がエージェントです。ビルドレイヤーのコーディングエージェントはColonizerが動かしています。
  6. プロダクト:独立したベンチャー。スタック外のベンチャー。基盤を引き継ぎますが、基盤には何も加えません。

リクエストの流れ(端から端まで)

訪問者が登録したとき、誰が何をするか。

レジストリ内のリンクのみから描いています。実線は現在稼働中でトラフィックが流れており、破線は計画中でまだ流れていません。

  1. 訪問者

    ベンチャーサイトを訪れた人

  2. ベンチャーWorker

    ベンチャーごとに1つのWorker、Cratefieldハーネス上

    稼働中
  3. Owlpost

    ベンチャー向けのメール

    稼働中
  4. SupportGenius

    バグ報告とサポート

    計画中
  5. Colonizer

    ハーネス上のコーディングエージェント

    稼働中
  6. 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とマイルストーンとして公開の場で管理しています。

  1. M0完了

    基盤

    ワークスペースツール、コア、Cloudflareランタイム、ResendおよびTurnstileアダプター、SQLiteアダプター、fz CLI、テストキット。

  2. M1完了

    最初のモジュール

    メール登録、ウェイトリスト、テンプレート、セキュリティのベースライン、オブザーバビリティ。

  3. M2進行中

    最初のベンチャーが稼働

    crates.ioへの公開、ドキュメント、コントラクトのバージョニング、そして独自のAPIドメイン上での最初のベンチャー。

  4. M3完了

    セルフホストへの移植性

    Postgresアダプター、ネイティブランタイム、SQLiteとPostgresでのパリティスイート、データのエクスポートとインポート。

デザイン
決定記録30件、すべてリポジトリ内
アーキテクチャ
アーキテクチャ文書は12セクション
最初のモジュール
メール登録とウェイトリスト、構築済み
公開済み
ほとんどのクレートはcrates.ioにあります。リリースの一巡は保留中です。
マネージドサービス
まだ構築していません。コントロールプレーンは設計済みで、実装はされていません。

ハーネスの数値:2026-10-21にCratefield/harnessから取得。

セキュリティとプライバシー

リクエストとデータの間にある6つのレイヤー。

各レイヤーは、ハーネスが文書化している対策です。全一覧はセキュリティおよびプライバシー文書にあります。

  1. 01 · エッジ

    ベンチャー自身のオリジンのみ

    ベンチャーのWorkerは独自のドメインで応答します。CORSはベンチャーが列挙したオリジンのみを許可し、すべてのレスポンスはリクエストIDを返します。

  2. 02 · 不正対策

    ボットと大量アクセス

    Turnstileは失敗時に拒否します。公開される書き込みにはすべて、RateLimiterポート経由でレート制限をかけます。

  3. 03 · リクエスト

    アドレスを含まないエラーとログ

    エラーはproblem+jsonで、ケースごとに固定のスラッグを持ちます。ログはリクエストごとに構造化された1行で、メールアドレスは含みません。

  4. 04 · トークン

    セッションではなくリンク

    確認リンクと配信停止リンクはHMACで署名され、鍵のローテーションに対応しています。運用もスケールも漏えいも考える必要があるセッションストアはありません。

  5. 05 · シークレット

    エンベロープ暗号化

    シークレットはエンベロープ暗号化され、各行に紐づけられます。KMSポートのローカルファイルプロバイダーは本番環境では動作を拒否します。

  6. 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: 非オープンソース。