
2026/03/21 7:06
**Show HN:** Fortranで書かれたターミナル専用のBluesky/AT Protoクライアントを作成しました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Fortransky は、主に Fortran で書かれた Bluesky の AT Protocol 用ターミナル専用クライアントです。Rust がファイアホースストリームのネイティブデコーダーとして機能します。
UI は
src/ にあり、Fortran の iso_c_binding を介して C の libcurl ブリッジ (cshim/) と通信します。このブリッジは HTTP リクエストを静的 Rust ライブラリに転送し、生のエンベロープ(CAR → DAG‑CBOR → NormalizedEvent)を JSON Lines に変換して、Fortran の TUI が描画します。
認証には アプリパスワード を使用し、セッショントークンは
~/.fortransky/session.json に保存されます。プロジェクトは標準の Ubuntu/Debian パッケージ(
gfortran, cmake, pkg-config, libcurl4-openssl-dev)と Rust 1.70+ を利用します。拡張機能が必要な場合は、Python の依存関係(cbor2, websockets)を追加できます。
ビルドは 2 段階で進行します:まず
cargo build --release で Rust ブリッジをコンパイルし、その後 CMake がすべてをリンクします。Rust の変更が無ければ、Rust ステップはスキップされます。
主要な TUI コマンドは次のとおりです:
– ログイン/タイムライン取得l
– 著者フィードa <handle>
– 投稿検索s <query>
– プロフィール表示p <handle>
– 通知n
– 投稿作成c
– スレッド開くt <uri/url>
– ストリームタイル(jetstream)j
– ストリームモード切替 (m
)relay‑raw
– 終了q
ストリーミングには 2 つのモードがあります:jetstream(WebSocket JSON)と relay‑raw(バイナリ CBOR)。Rust デコーダー(
firehose_bridge_cli)が推奨され、利用できない場合は Python の cbor2 フォールバックを使用できます。
デフォルトでは Fortransky はテスト用に組み込まれた合成リレー フィクスチャを使用します。ライブ Bluesky リレーへ接続するには
FORTRANSKY_RELAY_FIXTURE=0 を設定してください。
将来の作業としては、DID からハンドルへの解決、手書き JSON パーサーの改善、および TUI の生キー入力を有効化することが挙げられます。軽量でクロスプラットフォームな設計により、重い GUI スタックや大規模言語ランタイムなしで Bluesky への最小限のエントリポイントを開発者とユーザーに提供します。
Text to translate
(incorporating missing details):**
Fortransky is a terminal‑only client for Bluesky’s AT Protocol written primarily in Fortran, with Rust providing a native decoder for the firehose stream.
The UI lives in
src/ and talks to a C libcurl bridge (cshim/) via Fortran’s iso_c_binding. That bridge forwards HTTP requests to a static Rust library that translates raw envelopes (CAR → DAG‑CBOR → NormalizedEvent) into JSON Lines, which the Fortran TUI renders.
Authentication uses an app password; session tokens are stored in
~/.fortransky/session.json.The project relies on standard Ubuntu/Debian packages (
gfortran, cmake, pkg-config, libcurl4-openssl-dev) and Rust 1.70+. Optional Python dependencies (cbor2, websockets) are available for extended functionality.
Build proceeds in two stages: first compile the Rust bridge with
cargo build --release; thereafter CMake links everything, skipping the Rust step if unchanged.
Key TUI commands are:
– login/fetch timelinel
– author feeda <handle>
– search postss <query>
– profile viewp <handle>
– notificationsn
– compose postc
– open threadt <uri/url>
– stream tail (jetstream)j
– toggle stream mode (m
)relay‑raw
– quitq
For streaming, two modes are available: jetstream (WebSocket JSON) and relay‑raw (binary CBOR). The Rust decoder (
firehose_bridge_cli) is preferred; if unavailable the Python cbor2 fallback can be used.
By default Fortransky uses a bundled synthetic relay fixture for testing; set
FORTRANSKY_RELAY_FIXTURE=0 to connect to the live Bluesky relay.
Future work includes adding DID‑to‑handle resolution, refining the hand‑rolled JSON parser, and enabling raw keypress input in the TUI. The lightweight, cross‑platform design offers developers and users a minimal entry point into Bluesky without heavy GUI stacks or large language runtimes.
本文
Fortran ベースの Bluesky/AT プロトコルクライアント
Fortran で書かれたターミナル専用の Bluesky/AT プロトコルクライアント。リレ―原データストリームパスには Rust 製ネイティブ Firehose デコーダーを使用します。
アーキテクチャ
src/ ← Fortran TUI └─ cshim/ ← C ライブラリ curl ブリッジ └─ src/atproto/firehose_bridge.f90 └─ bridge/firehose-bridge/ ├─ Rust staticlib (bridge/firehose-bridge/) │ envelope → CAR → DAG‑CBOR → NormalizedEvent → JSONL └─ firehose_bridge_cli binary ← relay_raw_tail.py が利用
セッション状態は
~/.fortransky/session.json に保存されます。メインの Bluesky パスワードではなく、アプリパスワードを使用してください。
ビルド依存関係
| カテゴリ | パッケージ / コマンド |
|---|---|
| システム (Ubuntu/Debian) | |
| Rust ツールチェーン | が必要です。未インストールの場合は rustup で導入:`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs |
| Python デペンデンシー (relay‑raw ストリームパスのみ) | ヘルパースクリプト は TUI からサブプロセスとして起動され、 と をインポートします。オプション A – システム全体 (最も簡単): オプション B – venv: Fortransky を venv がアクティブな状態で起動するか、以下を設定してください: (この環境変数のサポートは計画中)。 |
ビルド手順
# まず Rust ブリッジをビルド(cargo build --release)し、その後 CMake を実行。 # Rust ステップは変更が無ければ次回以降スキップされます。
ログイン方法
Fortransky 用に 専用 に作成したアプリパスワードを使用してください。
ホームプロンプトで:
l Identifier: yourhandle.bsky.social Password/app password: <app password>
セッションは
~/.fortransky/session.json に保存され、次回起動時に復元します。ログアウトするには
x を入力してください。
TUI コマンド
ホームビュー
| コマンド | 動作 |
|---|---|
| ログイン + タイムライン取得 |
| ログアウト + 保存セッション消去 |
| 投稿者フィード表示 |
| 投稿検索 |
| プロフィールビュー |
| 通知 |
| 文章作成 |
| スレッドを開く |
| ストリームタイル |
| ストリームモード切替 (jetstream / relay‑raw) |
| 終了 |
投稿一覧ビュー
| コマンド | 動作 |
|---|---|
| 選択を移動 |
| 次/前ページ |
| 選択スレッドを開く |
| 選択投稿に返信 |
| 選択投稿にいいね |
| 選択投稿をリポスト |
| 投稿の引用 |
| 著者プロフィールを開く |
| 検索 |
| ホームへ戻る |
通知ビュー
| コマンド | 動作 |
|---|---|
| 選択を移動 |
| 次/前ページ |
| スレッドを開く |
| 返信 |
| 戻る |
ストリームビュー
| コマンド | 動作 |
|---|---|
| 更新 |
| 戻る |
ストリームモード
- jetstream – Bluesky の Jetstream WebSocket サービスに接続。帯域が低く、JSON がネイティブで扱いやすい。
- relay‑raw – 原生 AT プロトコルリレ― (
) に接続。フレームは WebSocket 上のバイナリ CBOR。Rust 製ネイティブデコーダーcom.atproto.sync.subscribeRepos
が envelope → CAR → DAG‑CBOR → 正規化 JSON を処理します。Python のfirehose_bridge_cli
フォールバックはフェスチャーモード用です。cbor2
ネイティブデコーダ検出順序
- 環境変数
FORTRANSKY_FIREHOSE_DECODER bridge/firehose-bridge/target/release/firehose_bridge_clibridge/firehose-bridge/target/debug/firehose_bridge_cli- PATH 上の
firehose_bridge_cli
リレ―フェスチャー (オフラインテスト)
デフォルトでは relay‑raw はバンドルされた合成フェスチャーを使用します。
ライブリレーを利用するには:
FORTRANSKY_RELAY_FIXTURE=0 ./build/fortransky
簡易オフラインデモ:
printf 'b\nm\nj\nb\nq\n' | ./build/fortransky
既知の問題 / 備考
- JSON パーサは手作りで軽量 – 完全なスキーマ駆動型パーサではありません。
- relay‑raw は
の create 操作のみを公開;他コレクションは正規化段階でフィルタリングされます。app.bsky.feed.post - ストリームビューでは生の DID が表示され、ハンドル解決 (DID → ハンドル) はまだ実装されていません。
- TUI は行ベース(コマンド入力+Enter)であり、ラストキー入力は扱いません。
とm
はホームビューのストリーム制御用 – 投稿一覧にいる場合はまずホームへ戻ってください。j
バージョン履歴
- v1.1 – ネイティブ Rust Firehose デコーダ統合。
が見つかったらrelay_raw_tail.py
を優先使用。CMakeLists で Fortran のリンクに Rust staticlib を組み込み。JWT フィールド長を 1024 に増やし、完全 AT プロトコルトークンに対応。JSON キー スキャナの深度追跡修正(トップレベル feed 配列前にネストされたキーとマッチしていた問題)。firehose_bridge_cli - v1.0 – いいね・リポスト・引用投稿操作。URL ファセットエミッション。
- v0.9 – タイプ付きデコード層 (
)。TUI の投稿意味合いを豊富化。decode.f90 - v0.7 – C libcurl ブリッジでシェル curl を置換。セッション保存サポート。ストリームモード切替 (jetstream / relay‑raw)。