nathan perry

Full-time at Tailscale, primarily working on tailscale-rs, a Rust library implementing Tailscale in userspace. It can be used from Rust natively, via a C-compatible FFI layer, with Python bindings, or with Elixir bindings.

{:ok, dev} = Tailscale.connect("keys.json", auth_key: "$AUTH_KEY")
{:ok, sock} = Tailscale.Udp.bind(dev, :ip4, 1234)
:ok = Tailscale.Udp.send(sock, "100.64.0.1", 5678, "hi")

{:ok, node} = Tailscale.peer_by_name(dev, "foo")
:ok = Tailscale.Udp.send(sock, node.tailnet_addresses |> Enum.at(0), 5678, "hi foo")

previous

I completed my Master's degree in May 2025 at the MIT Media Lab with the Responsive Environments group, where I:

I wrote about these projects (and more) in detail at /resenv.

Before the Media Lab, I was a firmware and software consultant in the Boston area: my work included firmware and UI now shipping on Volta Labs' biological sample prep devices. I'm an alum of Tulip Interfaces, where I built their second-generation machine monitoring backend, then helped bring up firmware and embedded Linux on their EdgeMC and EdgeIO industrial IoT gateway devices.

I completed a CS and Philosophy double-major at Williams College in 2018.

content

This blog originally started as a series of assignments for Neil Gershenfeld's how-to-make class series (see /class/{htm,machines}).

Personal projects and reflections: