TailTalk: A modern async user space AppleTalk stack with Rust and Tokio
TailTalk is a "toolkit" for building fully userspace AppleTalk implementations on Linux, macOS and Windows over EtherTalk or LocalTalk networks. It is written from scratch with zero dependencies on Netatalk or any kernel drivers — all it needs is a raw socket and/or a TashTalk-compatible device for LocalTalk, plus "patience for grumpy old computers." It provides a complete AppleTalk stack, and multiple copies of that stack can run on the same machine simultaneously.
The author's motivation was to copy files to and from old Macs, print to LaserWriters, ImageWriters and networked StyleWriters, and write modern async software that communicates with them. Currently TailTalk only works in a routerless setup; work is in progress to make it gracefully join networks where a router is present, but that is not yet in the mainline code. Each part of the stack aims to be as "zero config" as possible, so it behaves like a Mac of the era — plug it in, launch, and it should just work.
The current user-facing program is the TailTalk GUI for use with TashTalk USB. It includes an AFP server intended to work with just about every Mac that shipped with a LocalTalk port, and can import Stuff-It archives and floppy disk images into the share path while preserving resource forks. It also shares LocalTalk-capable LaserWriters, ImageWriters and StyleWriters to modern networks as AirPrint/IPP printers, and shares modern printers back to classic Macs. The project is explicitly a work-in-progress prototype, so bugs and missing features are expected; the latest release is on GitHub.
Feature-wise it offers packet parsers and fully async APIs for almost all major AppleTalk protocols: AARP, DDP, NBP, ATP, PAP, ASP, AFP and the AppleTalk Data Stream Protocol, plus support for running with TashTalk for LocalTalk Macs. The AARP/DDP underlay can run either in-process (the default) or in a shared daemon, tailtalkd, which owns the interfaces and serves DDP sockets, addressing and routing rules to multiple clients over a protobuf protocol on a Unix or UDP socket — usable from TailTalk via TalkStack::builder().daemon_unix(..) or from plain C clients, as documented in docs/daemon-protocol.md.
Building requires Rust 1.90 or above, installable from rustup.rs, which should supply a matching compiler for the host OS and CPU architecture. Packaging uses cargo-packager to build Linux AppImages, macOS app bundles and Windows installers; Windows users must also have the MSVC prerequisites specified in the rustup book.