はじめに
お久しぶりです、みなぎしです!
前回 Twilic についての記事 を公開したのが 2026 年 5 月 24 日なので、気づけば約 3 ヶ月半が経ちました
前回の記事では、Twilic というバイナリフォーマットを作ったことや、MessagePack と比較して同じ形のデータを大量に送る場合にかなり小さくできることなどを紹介しました
特に、同じ shape のレコードを 256 件まとめたベンチマークでは
- Twilic: 5,316 B
- MessagePack: 19,505 B
- 約 72.75% 削減
という結果になっていて、当時はこの部分を中心に紹介していました
ただ、あれから開発を続けていく中で Twilic 自体もかなり変わりました!
言語実装が増えたり、Playground が強化されたり、Web フレームワーク向けのライブラリが増えたり、エンコードの仕組みを視覚的に確認できる Explorer を作ったり、最近では AI のストリームや Agent の実行記録を扱う Twilic AI まで作っています
今回は、前回の記事から現在までに Twilic がどう変わったのかをまとめていきます!
Twilic は1つのライブラリからプロジェクト群になった
まず、一番大きく変わった部分です
前回の記事を書いた頃は、Twilic の仕様があって、Rust の実装があって、JavaScript や Go や Zig の実装がある、という比較的シンプルな構成でした
現在はそこからかなり広がっていて
- Twilic の仕様
- 多言語 Runtime
- Conformance Test
- Benchmark
- Playground
- Explorer
- CLI
- 公式 Website
- Hono
- Express
- Fastify
- Fetch
- Axios
- Examples
- Twilic AI
などが Twilic Organization の中で開発されています
最初はバイナリフォーマットそのものを作ることが中心でしたが、現在は Twilic を実際のアプリケーションで使うための周辺環境もかなり増えてきました
言語ごとのリポジトリを monorepo に統合しました
そして、かなり最近の変更なのですが、Twilic の各言語実装を twilic/twilic にまとめました!
以前は
twilic-rusttwilic-jstwilic-gotwilic-zig
のように、言語ごとにリポジトリを分けていました
ただ、Twilic のような同じ wire format を複数言語で実装するプロジェクトの場合、仕様変更を行ったときに全 Runtime が同じ挙動をしていることを確認する必要があります
そこで現在は
twilic/
├ SPEC.md
├ docs/
├ versions/
├ conformance/
├ testdata/
├ runtimes/
│ ├ rust/
│ ├ javascript/
│ ├ go/
│ ├ python/
│ └ ...
└ tools/
という構成に変更しています
仕様、テストデータ、Conformance Test、各言語実装を同じリポジトリで管理できるようになりました
これによって、仕様を変更したときに複数の Runtime をまとめて確認しやすくなっています
CI についても、変更された Runtime を判定して必要なテストを実行できる構成にしています
なお、package のバージョンまで全言語で統一したわけではありません
Twilic の仕様とソースツリーは共通で管理しつつ、各 Runtime の package version はそれぞれ独立しています
新しい cross-runtime の変更については、monorepo 側を中心に進めていく予定です
Runtime もかなり増えました
前回紹介した時点では、Rust や JavaScript や Go や Zig が中心でした
現在の runtimes/ には
- C
- C++
- C#
- Dart
- Elixir
- Go
- Java
- JavaScript
- Kotlin
- Lua
- PHP
- Python
- R
- Ruby
- Rust
- Scala
- Swift
- Zig
などの実装があります
もちろん、全ての Runtime が完全に同じ成熟度というわけではありません
そのため実際に利用する場合は、各 Runtime の README や対応 profile を確認してもらう必要があります
ただ、最初は数言語から始めたものがここまで増えたのは、自分でもかなり大きな変化だと思っています!
Schema-first の仕組みも増えました
Twilic はもともと、スキーマなしで JSON のようにそのまま encode できる、という部分をかなり大事にしています
これは現在も変わっていません
一方で、スキーマを事前に共有できる環境ではさらに小さくできるように、v3 profile では schema-aware な仕組みも増えています
代表的なのが BOUND_STREAM と SCHEMA_BATCH です
BOUND_STREAM は、事前に共有している schema を利用して、フィールド名などを毎回送らないための仕組みです
SCHEMA_BATCH は、同じ schema のレコードをまとめて送る場合に利用できます
つまり現在の Twilic は
Schema-less
↓
繰り返し構造を自動的に利用
Schema-aware
↓
事前に分かっている構造まで利用
という 2 つの方向から使えるようになっています
Protobuf のように最初から schema を用意する構成でも、MessagePack のように schema を用意しない構成でも、同じ Twilic の中で選択できるようにすることを目指しています
Playground もかなり変わりました
前回の記事でも Playground を少し紹介しましたが、現在は比較できる内容が増えています
大きく分けると 2 つあります
Encoded sizes
こちらでは
- Twilic
- MessagePack
- CBOR
- BSON
- JSON
を比較できます
Benchmark リポジトリと同じ fixture を利用していて、single-small、batch-homogeneous-256、batch-mixed-256、patch-session などをブラウザから確認できます
さらに、Custom JSON に自分の JSON を貼り付けて比較することもできます
Twilic に都合の良い fixture だけを見るのではなく、実際に自分が利用しているデータを入れて確認できるようにしています
Schema-first
こちらは、schema が存在するフォーマットも含めた比較です
- Twilic
BOUND_STREAM - Twilic
SCHEMA_BATCH - Twilic Dynamic
- Protobuf
- Avro
- FlatBuffers
- Apache Arrow IPC
などを同じデータで比較できます
前回よりも「MessagePack より小さいか」だけではなく、「Schema を利用した場合に他のフォーマットとどう変わるか」まで確認できる Playground になりました
ちなみに Twilic の encode は、ブラウザ上で WASM を使って実行しています
そのため、JSON を外部のサーバーに送って計測しているわけではなく、ブラウザ上でそのまま試すことができます
Twilic Explorer も作りました
Playground を作っていて思ったのですが、「何 byte になったか」だけでは、Twilic が内部で何をしているのか少し分かりづらいです
そこで作ったのが Twilic Explorer です!
Explorer では JSON を入力すると
Input JSON
↓
Profile
↓
Shape detection
↓
Shape tree
↓
String interning
↓
Batch / Typed vector
↓
Binary
という Twilic の encode pipeline を確認できます
Dynamic、Batch、SCHEMA_BATCH、BOUND_STREAM も切り替えられます
さらに、最終的な binary を hex で確認したり、どの部分がどの処理によって生成された byte なのかを確認したりできます
3D の byte 表示も入れているので、単純なテーブルだけではなく視覚的に Twilic の変換を追えるようになっています
Playground は「どれくらい小さくなるのかを見るもの」、Explorer は「どのように binary が作られているのかを見るもの」という感じで役割を分けています
Web Framework 周りも増えました
前回の記事では、Hono 向けの @twilic/hono を紹介していました
現在はそこから増えて
向けの integration があります
例えば、API の request body と response body を Twilic にしたい場合に、毎回 Content-Type の判定や encode / decode を全部自分で書かなくても使えるようにするためのものです
Examples リポジトリにも、HTTP の round-trip を確認できる example を追加しています
Twilic 本体だけを作って終わるのではなく、実際の Web API でどうやって使うのか、という部分も整備しています
そして Twilic AI も作りました
これは、前回の記事を書いた時には存在していなかったものです
最近 AI API や Agent を触っていると
- text delta
- tool call
- reasoning
- trace
- metadata
など、同じような構造のイベントが大量にストリームされます
ここは Twilic とかなり相性が良いのではと思い作ったのが Twilic AI です
Twilic AI では、AI の stream や Agent の実行を記録して、あとから replay や inspect ができるようにしています
現在は @twilic/ai を中心に、@twilic/ai-openai、@twilic/ai-sdk、@twilic/ai-agents などがあります
OpenAI Responses API のイベントを正規化したり、Vercel AI SDK と連携したり、Agents SDK の trace を記録したりできます
記録した session は .twai という形式で保存できます
CLI からも
twilic ai inspect session.twai
twilic ai replay session.twai --speed 10
twilic ai record --input events.jsonl -o session.twai
のように扱えます
他にも、diff や convert や benchmark などの subcommand を用意しています
Twilic はもともと汎用的な構造化データ向けフォーマットとして作っていますが、こういった特定用途でどのように使えるのかも今後試していきたいと思っています
公式サイトもできました
Twilic の公式サイトとして twilic.dev も作りました!
仕様だけでなく
- Getting Started
- Why Twilic
- 各 Runtime
- Integration
- AI
などのドキュメントをまとめています
ブランド周りについても少しずつ変更していて、現在はオレンジを使った新しい mark に変更しています
このあたりはコードそのものではありませんが、OSS として利用する人が迷わず情報にたどり着けるように整備している部分です
前回から一番変わったと思うところ
前回の記事を書いた頃は、「MessagePack より繰り返しデータを小さくできるフォーマットを作った」という状態でした
今はそこから
Protocol
↓
Multi-language Runtime
↓
Conformance
↓
Benchmark
↓
Playground
↓
Explorer
↓
Web Integration
↓
AI tooling
という形まで広がってきました
個人的には、単純に対応言語を増やすことより
- 仕様を確認できる
- 他言語との互換性をテストできる
- 数字を再現できる
- ブラウザですぐ試せる
- 実際のアプリケーションに組み込める
というところまで含めて、1 つのプロジェクトにしていきたいと思っています
まだまだ開発途中です
ここまで色々紹介しましたが、Twilic はまだ開発途中です
特に Runtime が増えた分
- Conformance Test
- API の安定化
- 各 package の release
- ドキュメント
なども今まで以上に重要になっています
フォーマットを作ること自体より、複数の言語で同じ binary を読み書きできる状態を維持することの方が大変なのではと思うことも増えてきました
ただ、ここはマルチ言語の binary format を作る上で避けて通れない部分なので、引き続き整備していきます!
まとめ
前回の記事から約 3 ヶ月半で、Twilic はかなり変わりました
最初は Rust を中心としたバイナリフォーマットとして始まりましたが、現在は仕様と Runtime をまとめた monorepo、多数の言語実装、Benchmark、Playground、Explorer、Web Framework Integration、CLI、Twilic AI、公式 Website などまで広がっています
まだ完成したプロジェクトではありませんが、少なくとも前回の記事を書いた頃より、「実際に触って試せるもの」にはかなり近づいてきたと思っています!
もし Twilic に興味を持ってもらえたら、Playground で普段使っている JSON を入れて比較してみてもらえると嬉しいです!
Explorer で binary がどのように作られているのかを見るのも結構面白いと思います
- Organization: https://github.com/twilic
- 仕様・ランタイム: https://github.com/twilic/twilic
- Playground: https://twilic.github.io/playground /(GitHub)
- Explorer: https://twilic.github.io/explorer /(GitHub)
- Twilic AI: https://github.com/twilic/ai
- Website: https://twilic.dev
GitHub の Star や Issue、PR も歓迎しています!
これからも開発を続けていくので、また大きく変わった頃に続きを書こうと思います!