If you’re a long-time command-line enthusiast, you probably have fond memories of TTYtter, a quirky Perl-based Twitter client that let you tweet, read timelines, and manage your social media life entirely from the terminal. It was fast and perfect for those of us who live in the command line.
But then Twitter happened. You know the story - API changes, restrictions, and eventually the platform became something entirely different from what we fell in love with. TTYtter, like so many other third-party clients, was left behind in the dust of a rapidly changing (and increasingly hostile) platform.
Enter the fediverse, stage left.
The Great Migration Begins
When I first discovered Mastodon and the broader ActivityPub ecosystem, I was excited about the possibilities. Decentralized social media! Open protocols! No single point of failure! But there was one problem: I missed my beloved command-line interface. Web browsers are fine, but there’s something special about managing your social media from the same terminal where you write code and manage servers.
That’s when I had an idea that was either brilliant or completely insane: What if I could take TTYtter and adapt it for the fediverse?
The Easy Wins
Some parts of the migration were surprisingly straightforward. TTYtter was already well-architected with clean separation between the UI layer and the API layer. The core functionality - posting, reading timelines, and managing notifications translated pretty directly to Mastodon’s API.
The OAuth 2.0 implementation was actually easier than Twitter’s old OAuth 1.0a system. Modern fediverse servers have cleaner APIs, and the documentation is generally excellent. Where Twitter’s API felt like it was designed by committee (and frequently changed by whim), Mastodon’s API felt like it was designed by developers who actually wanted people to use it.
Timeline management was another pleasant surprise. The concept of federated timelines maps beautifully to different use cases. Want to see just your friends? Home timeline. Curious about your local instance community? Local timeline. Feeling adventurous and want to see the wider fediverse? Federated timeline. It’s like having multiple Twitter lists, but built into the platform itself.
The Challenging Parts
But let’s be honest - it wasn’t all smooth sailing.
The biggest challenge was rethinking assumptions that were baked into TTYtter’s DNA. Twitter had mentions in a separate timeline; Mastodon integrates them into your home feed and notifications. Twitter had simple retweets; the fediverse has boosts that work differently and carry more context. Twitter had 140 (then 280) character limits; Mastodon instances can have wildly different limits, from 500 to 65,000+ characters.
Then there was the HTML content issue. Twitter gave you plain text with some metadata. Mastodon sends you rich HTML that needs to be converted to readable terminal text while preserving the important bits (like links and mentions). Suddenly I was writing HTML parsers and figuring out how to make emoji work in a text-only environment.
Direct messages were a complete rewrite. Mastodon’s conversation-based DM system is actually superior to Twitter’s old approach, but it meant throwing out years of Twitter-specific code and starting fresh.
And don’t get me started on polls. TTYtter never had to deal with interactive polls, vote tallies, or expiration times. Implementing /poll
, /mpoll
, and /vote
commands meant diving deep into Mastodon’s polling system and figuring out how to make it work intuitively from the command line.
The Breakthrough Moment
The moment I knew this was going to work was the first time I successfully posted to GoToSocial from my terminal. It sounds simple, but seeing that familiar TTYtter interface spring to life, connected to my GoToSocial account, felt like magic. All those years of muscle memory - the commands and keyboard shortcuts - suddenly worked again.
But it was more than nostalgia. The fediverse brought new possibilities that Twitter never offered. I could connect to different instances, follow hashtags across the entire network, vote in polls, and participate in communities that weren’t controlled by a single corporation. The command line interface that I loved was now connected to a social network that actually aligned with my values.
Modern Improvements
TTYverse isn’t just TTYtter with a different API endpoint - it’s a modern reimagining of what a command-line social media client can be. I’ve added features that TTYtter never had:
Sound notifications that actually make sense - different sounds for mentions, boosts, favorites, and follows. No more checking your timeline every few minutes; you’ll hear when something important happens.
Menu codes with superpowers: Want to mute that annoying user? /mute d4
. Want to block someone? /block b7
. The menu codes that made TTYtter efficient now work with user management commands.
Rich media handling with accessibility in mind. Images require alt-text descriptions (because accessibility matters), and the client will refuse to upload images without them.
XDG compliance means your config files, extensions, and data live in the right places according to modern Linux standards.
Profile management with bidirectional sync between your local setup and the server.
The Extension Ecosystem
One of TTYverse’s coolest features is its extension system. Want text-to-speech for your timeline? There’s an extension. Want desktop notifications? Extension. Custom sound packs? Extension. The modular design means you can customize your experience without touching the core code.
The extension system follows XDG standards, so everything lives in ~/.local/share/ttyverse/extensions
where it belongs. No more scattered config files or mysterious directories.
Living in the Terminal
There’s something deeply satisfying about managing your social media from the command line. While others are dealing with algorithmic feeds, infinite scroll, and attention-harvesting dark patterns, I’m reading my timeline with the same tools I use for everything else. I can pipe posts to grep, search my timeline history, and integrate social media into scripts and workflows.
The fediverse’s decentralized nature makes this even more powerful. I can connect to any Mastodon-compatible instance, follow people across the network, and participate in conversations that span dozens of servers. The command line becomes a window into this vast, interconnected social web.
The Technical Bits (For the Curious)
Under the hood, TTYverse is a multi-process Perl application that maintains separate foreground (UI) and background (data fetching) processes. This means the interface stays responsive while the client fetches new posts, processes notifications, and handles real-time updates.
The OAuth 2.0 implementation handles the modern web-based authentication flow, automatically opening your browser when needed and handling the token exchange securely. Configuration follows the XDG Base Directory specification, so everything ends up in the right places.
The HTML-to-text conversion engine handles Mastodon’s rich content while preserving the essential information - links become URLs and mentions stay clickable (well, as clickable as things get in a terminal).
Real-time notifications use Mastodon’s markers API to track what you’ve seen, preventing duplicate notifications and ensuring you don’t miss anything important.
The Future
TTYverse proves that you don’t need to abandon your favorite tools when platforms change. Sometimes the best path forward is adaptation, not replacement. The fediverse’s open nature makes this possible in ways that proprietary platforms never could.
As the fediverse continues to grow and evolve, TTYverse grows with it. New Mastodon features become new TTYverse features. New ActivityPub capabilities become new possibilities for command-line social media.
Why This Matters
In an era of walled gardens and algorithmic manipulation, there’s something revolutionary about a simple command-line client that connects you directly to an open, decentralized social network. TTYverse represents both nostalgia for simpler times and hope for a better future - a future where users control their experience and developers can innovate freely.
If you miss the days when social media was about actual social connection, or if you just think managing your online presence from the command line sounds awesome, give TTYverse a try. It’s social media, but on your terms.
The terminal is waiting. Your timeline is calling. Welcome to the fediverse.
TTYverse is available at https://git.stormux.org/storm/ttyverse and works with any Mastodon-compatible instance. Installation is simple, configuration is straightforward, and the learning curve is gentle. Come for the nostalgia, stay for the superior user experience.
Contributing
I would love to have some help with this project. I’m not a Perl wizard, and a lot of this was very difficult. There’s more than once where I would have been stuck without Claude to bail me out. In short, I’m no Cameron Kaiser. 😀 So I would love to have your help. Pull requests or emailed patches are more than welcome. If you need to contact me, mention @storm@social.wolfe.casa