I built a Slack client because:wave: was lagging

figmert1 pts0 comments

I built a Slack client because :wave: was lagging | Grant AmmonsI built a Slack client because :wave: was lagging<br>May 15, 2026 · 7 min · Grant Ammons<br>Slack was having a bad day on my machine. Typing :wave: was taking two seconds to autocomplete. Two seconds to autocomplete an emoji! The fan was spinning. The whole app felt sluggish.<br>I have Slack running pretty much nonstop. Most people do. And the whole time I was watching that emoji dropdown crawl I kept thinking.. man, this is just text.<br>Terminals are great at text. The tools I rely on every day - vim, btop, tig, k9s - are a joy to use. They are incredibly fast and responsive. They feel alive. Meanwhile the app that I have to live in all day, where all my conversations happen, is the slowest thing on my machine. It is also freaking enormous, a bundled Electron app that takes up a ton of memory and disk.<br>Slack is just text. Terminals are great at text. So why am I running 1.5GB of Chromium to read it?

Where are all the TUI Slack clients?#<br>I figured someone would have built this already. Slack is twelve years old. The TUI ecosystem has been mature for years. The intersection seemed obvious.<br>But it didn&rsquo;t exist. Not really. There were a few projects, mostly abandoned, mostly bare-bones. Nothing daily-driveable. Nothing that felt like a real Slack client. The gap was weird.<br>The honest answer is that polishing a TUI Slack client probably wasn&rsquo;t worth one person&rsquo;s year. Slack works, more or less, for most people. The desktop app is bloated but functional. The cost of building a real replacement was high and the audience was small. So nobody did it.<br>The unbuilt apps in the world aren&rsquo;t blocked by demand anymore. They&rsquo;re blocked by whether someone cares enough to scratch the itch.

What if I built it?#<br>So I decided to try. Were TUI libraries up to a good Slack experience in 2026? Many unknowns: Real-time messaging. Threads. Multi-workspace. Polish that didn&rsquo;t feel like a 1995 IRC client. Images and avatars, which I knew were possible in terminals but didn&rsquo;t know how they worked, or whether they&rsquo;d hold up in a Slack TUI.<br>The answer, working through them one at a time, seemed to be yes. The TUI ecosystem is in a really good place. Opencode, the AI coding TUI, was already proof. I use it daily. Modals, spinners, motion. Well put together.<br>Early on while I was deciding the stack, I really wanted to land on one single, portable binary. I didn&rsquo;t want to ask users to install Node or Python or Ruby or any runtime. I wanted a single download that just worked. That meant Go.<br>The next question was what TUI libraries are available for Go. I discovered charm.land. What a joy this suite of librares is. Bubbletea handles architecture, lipgloss handles styling. The V2 release also handled layouts, which was the key to making it feel polished without a ton of custom code.<br>Images and avatars are a core part of Slack&rsquo;s UX. So I knew I needed to figure out something there. Kitty&rsquo;s graphics protocol does what it says on the tin, and my tests showed it was viable for my use case.<br>All that being done, I figured I&rsquo;d let agents do most of the typing and see how fast I could go.<br>The build#<br>I started with the part I was most worried about: images.<br>The Kitty graphics protocol gives the terminal a way to render true-pixel images, not just half-blocks or sixel. In a Kitty or Ghostty terminal, slk shows real Slack avatars and images. They look like avatars, not blocky ASCII approximations. This was the moment slk stopped feeling like a half-toy. The screenshots in this post look the way they do because the avatars and images actually render in the terminal. If you try slk in a non-Kitty terminal, you&rsquo;ll get ASCII approximations instead.<br>The main slk view. Avatars are real pixel data rendered via the Kitty graphics protocol, not ASCII approximations.<br>The rest of the work was less surprising and more satisfying. Real-time messages, edits, deletes, reactions, and typing indicators over a WebSocket. Multiple workspaces stay connected in parallel with live unread badges in the left rail. Press 1 through 9 to jump between them. Vim-style modal editing. Fuzzy channel finder. Threads in a side panel, plus a workspace-wide threads view because I always forget which channel a thread came from.<br>The threads side panel. The workspace-wide threads view sits one keypress away.<br>35 themes ship with it (including Hot Dog Stand, haha. I&rsquo;m old.), with a live switcher. Smart paste handles clipboard images and file paths and text in one go, captions included. Slack-native sidebar sections are kept live, or you can configure your own with globs.<br>Mid-switch in the live theme switcher. 35 of these ship with slk.<br>The binary is 24 megabytes. A live multi-workspace session uses a fraction of the RAM. The official Slack app on the same setup uses five hundred megabytes to a gigabyte and a half. Same conversations. Same productivity.<br>This...

slack rsquo images client live real

Related Articles