macOS app
Tessera
A native macOS BitTorrent client where every transfer is drawn as a mosaic of its own pieces, lighting up as they're verified.


- Type
- macOS app
- Platform
- macOS 14+
- Status
- In active development
- Built with
- Swift 6 / SwiftUI / AppKit / Network.framework
- BitTorrent engine written from scratch in Swift
- DHT, PEX, magnets, and v2 / hybrid torrents
- ~92k lines of Swift, ~1,800 tests
The idea
Most torrent clients look like spreadsheets. Tessera is my attempt at one that feels like a Mac app: calm, fast, and informative, aiming for what Transmission can do but with a more thoughtful interface.
The name comes from tesserae, the small tiles that make up a mosaic. Every transfer in the library is a square tile, and its face is a 16 × 16 grid of dots. Each dot stands for one slice of the file and lights up in the state's colour as its pieces are verified. A paused download looks patchy, a seeding one glows solid, and one still verifying shows the warm orange of work in progress. You can read the state of the whole library at a glance.

An engine, written in Swift
The original plan was to wrap libtorrent-rasterbar behind a small C ABI. That's still the long-term option, but I didn't want to wait on a C++ bootstrap before anything could actually download. So the package now includes TorrentTransfer, a BitTorrent engine written in pure Swift, behind the same TorrentSession seam the UI already uses.
It grew one BEP at a time:
- The basics: a bounded bencode decoder, the v1 metainfo reader, the peer wire protocol, piece/block scheduling, and a choker with per-torrent speed limits.
- Finding peers: HTTP/UDP trackers with tier fallback, the mainline DHT over IPv4 and IPv6, Peer Exchange, and Local Peer Discovery.
- Magnets and modern torrents: BEP 9 metadata transfer, web seeds, and BitTorrent v2 / hybrid torrents (BEP 52).
- Durability: versioned, crash-safe resume data, download files that grow as data arrives instead of being preallocated, and hash checking that runs once, not twice.
Everything sits behind Swift actors: one per torrent, one per session, and a FIFO mailbox in front of the engine. High-frequency updates are coalesced before they reach SwiftUI, so a busy swarm doesn't flood the interface with redraws.
Correctness before cleverness
This is a personal project, but I run it like a real one. Decisions that would be expensive to reverse go into Architecture Decision Records (eleven so far). Feature parity with Transmission 4.1 is tracked row by row in a parity contract, and every row needs a test or a documented manual check. Downloads may only land in folders you have explicitly authorized. Remote control was removed entirely rather than left half-secured.
The release pipeline follows the same rule. It builds universal binaries, signs with the hardened runtime, notarizes, and verifies the new bundle before it replaces the old one. If any step fails, the previous build is restored.
What's next
The native libtorrent adapter, µTP and peer encryption, and checking that scrolling stays smooth with very large libraries, since every tile draws 256 dots.