決定論的なToolsを組み合わせてFlowsを作る。コードまたはYAMLで一度作成すれば、実行時にAIを介さず、同じFlowをどこでも起動できます。
Browserflow は、ゼロから作られたポータブルなオープンソースのワークフローエンジン兼サービスです。プロセスを一度だけ、fluentなTypeScriptチェーンまたはYAMLファイルとして記述すれば、ラップトップ、CI、RESTエンドポイントの背後、MCPサーバー、cron、あるいは完全にネットワークから切り離されたオンプレミス環境で、同じように実行できます。すべてのRunはcontent-addressedでリプレイ可能です。同じ入力と同じ記録済みエフェクトがあれば、バイト単位で再現されます。
エンジンではなくホスト型プロダクトを作っていますか? Jinba Trail を参照してください。Browserflowの上に構築されたWebサービスで、AIによるオーサリングスタジオ、Playground、オートメーションごとの1つのHTTPSエンドポイントを提供します。
import { flow, http, browser, transform } from "@browserflow/sdk";
import { z } from "zod";

export default flow("daily-price-watch")
  .input("query", z.string())
  .input("threshold", z.number())
  .input("webhook", z.string().url(), { secret: true })

  // 再利用可能で決定論的なbrowser tool。1回記録し、何度でもリプレイする。
  .step("lookup", browser.tool("search-price@1.2.0").with((c) => ({ query: c.input.query })))
  .step("shape", transform((c) => ({ price: c.steps.lookup.output, at: c.now })))

  .branch("dropped?", (c) => c.steps.shape.output.price < c.input.threshold, {
    yes: (f) => f.step("notify", http.post((c) => c.secret.webhook, (c) => c.steps.shape.output)),
    no:  (f) => f.noop("unchanged"),
  })
  .output((c) => ({ price: c.steps.shape.output.price }));
flow: daily-price-watch
inputs:
  - { name: query,     type: string }
  - { name: threshold, type: number }
  - { name: webhook,   type: string, secret: true }
steps:
  - id: lookup
    use: browser:search-price@1.2.0
    with: { query: ${{ input.query }} }
  - id: shape
    use: transform
    with: { expr: { price: ${{ steps.lookup.output }}, at: ${{ now }} } }
  - id: notify
    use: http.post
    when: ${{ steps.shape.output.price < input.threshold }}
    with: { url: ${{ secret.webhook }}, json: ${{ steps.shape.output }} }
output: { price: ${{ steps.shape.output.price }} }
どちらの作成面も、1つの正規化されたcontent-addressedなFlowSpec digest(sha256)へコンパイルされます。このdigestこそがバージョンです。

ここから始める

はじめに

エンジンの背後にあるビジョン、非目標、設計原則。

クイックスタート

5分で最初のFlowを作成、コンパイル、実行します。

最初のFlow

空のファイルから、digestで固定されたリプレイ可能なRunまでのガイド付きウォークスルー。

提供するもの

3つのサービスと、それらを支えるエンジンがあります。これはプロジェクトの目標にそのまま対応しています。

SDKをデプロイする

Packs、つまりToolsとFlowsをまとめたversionedでcontent-addressedなバンドルをRegistryに公開します。

それらを複製する

Registry replication。push、pull、またはスケジュールされたミラーリングを行い、すべてのartifactをdigestで検証します。

どこでも起動する

Launchers。1つのエンジンを、CLI、REST、MCP、cron、CI、container、edgeなど多くのホストで動かします。

ワークフローシステム

Flow engine。決定論的で、再開でき、リプレイできるDAG schedulerです。

コードまたはYAMLで作成する

fluentなSDKと読みやすいYAML。どちらも1つのFlowSpec IRへloweringされます。

なぜ存在するのか

多くのワークフローツールは、強力だが持ち出せないホスト型プラットフォームか、ネットワークに触れた瞬間に再現性からずれていく接着剤のようなスクリプト群か、どちらかを選ばせます。Browserflowはそのトレードオフを拒みます。

ポータブル

1つのエンジン、多くのLaunchers。browserflow run、長時間稼働するサーバー、container、GitHub Action、MCPサーバー、edge function。ロックインはありません。

AIなしで再現可能

Runは構造上、決定論的です。外部エフェクトはJournalに記録され、オフラインでバイト単位にリプレイできます。

2つの顔、1つの真実

エンジニア向けの型安全なfluent SDKと、それ以外の人にも読みやすいYAML。どちらも同じFlowSpec IRへloweringされ、相互にround-tripできます。

魔法ではなく実用品

browser(Playwright)、HTTP、shell、transformのためのfirst-classなTool種別。小さなTool contractを書けば独自Toolも追加できます。

サービス対応、サービス縛りではない

オープンソースのcoreは単独で動作します。必要なときだけ、optionalなコントロールプレーンでdeployment、replication、scheduling、secrets、RBAC、run inspectorを追加できます。

本番運用のために

アーキテクチャ

エンジン、Registry、コントロールプレーンがどう組み合わさるか、境界がどこにあるか。

シークレット

境界で扱うSecret。値はedgeで解決され、Journalには入りません。

アクセス制御

システムをサービスとして運用するときの、Packs、Registries、RunsにまたがるRBAC。

スキーマ

すべてのコンパイル対象になる正規のFlowSpec、Pack、Tool-contract schemas。
早期リリースです。 エンジン、CLI、standard packs、browser record/replay、control-plane APIは実装済みです。今後の予定はロードマップを参照してください。