Introduction to Fortransky
Fortransky is a unique terminal-only Bluesky client written in Fortran. It features a Rust native firehose decoder for the relay-raw stream path, making it a standout in the world of Bluesky clients.
Additionally, Fortransky has a simple and intuitive interface, with a text-based user interface (TUI) that makes it easy to navigate and use.
Architecture of Fortransky
The architecture of Fortransky is divided into several components, including the Fortran TUI, C libcurl bridge, and Rust staticlib. The Fortran TUI is the main interface of the application, while the C libcurl bridge handles the communication with the Bluesky server.
The Rust staticlib is used for the firehose decoder, which is responsible for decoding the binary CBOR data from the relay-raw stream path.
Build Dependencies
To build Fortransky, you will need to install several dependencies, including gfortran, cmake, and libcurl4-openssl-dev. You will also need to install the Rust toolchain, which can be done using rustup.
In addition, you will need to install the Python dependencies, including cbor2 and websockets. You can do this using pip, either system-wide or in a virtual environment.
Building and Running Fortransky
To build Fortransky, you can use the build script provided in the repository. This script will build the Rust bridge first, and then run CMake to build the Fortran application.
Once the build is complete, you can run Fortransky using the ./build/fortransky command. You will need to log in using an app password, which can be created in the Bluesky settings.
Login and Session Management
When you log in to Fortransky, your session is saved to a file in the ~/.fortransky directory. This file contains your app password and other session information, and is used to restore your session when you run Fortransky again.
To log out, you can use the x command, which will clear the saved session and log you out of the application.
TUI Commands
Fortransky has a simple and intuitive command system, with several commands available for navigating and using the application. These commands include:
- l: login and fetch timeline
- x: logout and clear saved session
- a : author feed
- s : search posts
- p : profile view
- n: notifications
- c: compose post
- t : open thread
- j: stream tail
- m: toggle stream mode (jetstream / relay-raw)
- q: quit
Post List View
In the post list view, you can use the following commands:
- j / k: move selection
- n / p: next / previous page
- o: open selected thread
- r: reply to selected post
- l: like selected post
- R: repost selected post
- q: quote-post
- P: open author profile
- /query: search
- b: back to home
Notifications View
In the notifications view, you can use the following commands:
- j / k: move selection
- n / p: next / previous page
- o: open thread
- r: reply
- b: back
Stream View
In the stream view, you can use the following commands:
- j: refresh
- b: back
Stream Modes
Fortransky has two stream modes: jetstream and relay-raw. The jetstream mode connects to the Bluesky Jetstream WebSocket service, while the relay-raw mode connects to the raw AT Protocol relay.
The relay-raw mode uses a native Rust decoder to decode the binary CBOR data from the relay-raw stream path. This decoder is more efficient and reliable than the Python fallback decoder.
Relay Fixture
Fortransky includes a relay fixture that can be used for offline testing. This fixture is a synthetic dataset that simulates the relay-raw stream path.
To use the live relay, you can set the FORTRANSKY_RELAY_FIXTURE environment variable to 0. You can also use the –relay-fixture option when running Fortransky.
Known Issues and Notes
Fortransky is still a relatively new application, and there are some known issues and notes that you should be aware of. These include:
- The JSON parser is hand-rolled and lightweight, but not a full schema-driven parser.
- The relay-raw mode only surfaces app.bsky.feed.post create ops, and other collections are filtered out at the normalize stage.
- The stream view shows raw DIDs, but handle resolution (DID → handle lookup) is not yet implemented.
- The TUI is line-based (type command + Enter), not raw keypress.
Changelog
Fortransky has a changelog that lists the changes and updates made to the application. Some of the notable changes include:
- v1.1: Native Rust firehose decoder integrated, relay_raw_tail.py prefers firehose_bridge_cli when found, CMakeLists wires Rust staticlib into the Fortran link, JWT field lengths bumped to 1024 to fit full AT Protocol tokens.
- v1.0: Like, repost, quote-post actions, URL facet emission.
- v0.9: Typed decode layer (decode.f90), richer post semantics in TUI.
- v0.7: C libcurl bridge replacing shell curl, saved session support, stream mode toggle (jetstream / relay-raw).








