FastSM is a fast, accessible Mastodon/Bluesky client, built with blind users in mind. It descends from the code for the Quinter Twitter app written alongside Quin in 2021, but is heavily modified and modernized — the goal is a Mastodon/Bluesky app with the same keyboard-first, earcon-driven feel as Quinter.
- Multi-account support for both Mastodon and Bluesky
- Timeline caching for faster startup
- Gap detection for missed posts
- Position restore across restarts
- Audio player with YouTube/Twitter support via yt-dlp
- AI-powered image descriptions (GPT/Gemini)
- Customizable soundpacks
- Invisible interface mode (Windows)
- Explore/Discover dialog for finding users and content
- Poll support (viewing and voting)
- Content warning handling
- Server-side filters (Mastodon)
- Timeline filtering by user or text
Prebuilt binaries for every commit to master are published at the latest release:
- Windows Installer:
FastSMInstaller.exe(recommended) - Windows Portable:
FastSM-Windows-Portable.zip - macOS:
FastSM-<version>.dmg - Linux Portable:
FastSM-Linux-Portable.tar.gz
Python 3.10+ is required. Clone the repo, install dependencies, and run:
pip install -r requirements.txt
python FastSM.pywOn Debian/Ubuntu, install these before pip install:
sudo apt install libgtk-3-0 libnotify4 libsdl2-2.0-0 libasound2 libpulse0 \
libgstreamer1.0-0 libgstreamer-plugins-base1.0-0wxPython on Linux does not have a universal pip wheel — pull it from the wxPython extras index matching your distro:
pip install -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-22.04 wxpython(Swap the Ubuntu codename for your release.)
Speech uses AV Speech (via prism) and must run on the main thread; speak.py handles that automatically with wx.CallAfter when called off-thread.
Dropping a userdata/ folder next to the executable (or at the repo root when running from source) switches FastSM to portable mode — config and accounts live there instead of in the OS config directory.
build.py is the single entry point for all platforms. It detects the host OS and runs the matching PyInstaller flow:
python build.pyOutput lands in ~/app_dist/FastSM/.
Produces both a portable zip and an Inno Setup installer (requires Inno Setup 6 on PATH). The CI workflow does this automatically.
Produces a signed .app inside a DMG. Uses ad-hoc signing (-) if no Developer ID is on the keychain; pass a real identity via security find-identity ahead of time for distribution builds.
Produces a .tar.gz of a PyInstaller onedir bundle. The build script post-processes the bundle to remove libraries that must come from the user's system (GLib family, libasound, libpulse, util-linux, etc.) — bundling these causes ABI mismatches on distros newer than the build runner.
.github/workflows/build.yml runs the Windows, macOS, and Linux jobs on every push to master and republishes the latest release with fresh artifacts.
The options dialog (Application menu → Global Options) is organized into:
- General: Basic application settings
- Timelines: Dismiss confirmations, timeline reversal, home-timeline position sync, cache settings
- Audio: Media/navigation/error sounds and output device selection
- YouTube: yt-dlp path, cookies, Deno path for YouTube/Twitter audio extraction
- Templates: Post display templates, demojify, 24-hour time
- Invisible Interface (Windows only): Invisible interface settings and keymap selection
- Advanced: API and general settings
- Confirmation: Per-action confirm toggles (follow, boost, favorite, block, etc.)
- AI: GPT/Gemini API keys and prompts for AI image descriptions