Versión en Español (README.md)
I won't sugarcoat it: I'm mostly out of X's orbit. What happened to Twitter is a disaster, and I think most of the free software and cybersecurity community feels the same way. But I'm also a realist. X is still, today, a place where things happen. Where news breaks, where the tech community debates, where many people I care about still post. Sometimes you need to get in, read, join the conversation, and get out.
The problem is how you get in.
X's website is a tracking monster. Every click, every scroll, every second you spend there is being monitored, profiled and sold. And the desktop alternatives available for GNU/Linux are mostly Electron-based wrappers: an entire Chromium packaged per application, eating 300-500MB of RAM to do exactly the same thing a browser does.
I looked for a lightweight, native solution that respected my privacy and didn't treat my machine as if it had infinite resources. I didn't find one. So I built it.
FreeTheBird is a lightweight X (Twitter) client built with PyQt6 + QtWebEngine. A single 50KB Python file that uses the system's Qt libraries. No Electron. No node_modules. No 150MB packaged runtime. No tracking.
The name is an act of protest and a statement of intent: free the bird that was caged.
| FreeTheBird | Electron clients | |
|---|---|---|
| RAM | ~150-200MB | 300-500MB |
| Install size | 50KB (1 .py file) | 80-150MB |
| Tracker blocking | Yes, network-level | No |
| Dependencies | System Qt6 | Bundled Chromium |
| Node.js | Not needed | Required |
| Auditable | 1 file, readable | Thousands of deps |
| Linux integration | Native (Qt) | Variable |
FreeTheBird intercepts every HTTP request before it leaves the application. Over 45 advertising and tracking domains are blocked, including Google Ads, Analytics, Tag Manager, Twitter/X Ads, Facebook tracking, Criteo, Taboola, Outbrain, Hotjar, Mixpanel, FullStory and many more. An indicator in the bottom bar shows the protection status and the number of blocked requests in the session.
Hot-swap language without restarting. The entire interface updates instantly: menus, toolbar, system tray and dialogs.
Switch between dark and light mode with a single click, applied across the entire interface.
Your public IP is shown in the menu bar. Click to see full connection details: ISP, organization, country, region, city, timezone and coordinates. Useful if you work with VPNs or want to verify your exit point.
Select any text on the page and translate it without leaving the app. Uses the Google Translate API and shows the result in a dialog alongside the original text.
Automatic refresh with adjustable interval from 10 to 3600 seconds. Toggle from the toolbar, system tray or with Ctrl+R.
Adjustable zoom with Ctrl++, Ctrl+-, Ctrl+0 and toolbar buttons. The level is saved between sessions.
When closing the window, the app minimizes to the tray instead of quitting. Includes notifications when there are new messages on X.
All links pointing outside X automatically open in the system browser. Nothing loads inside the app that isn't from X or its media CDNs.
F5 Refresh
Ctrl+R Auto-refresh on/off
Ctrl+H Home / Timeline
Ctrl+M Messages
Ctrl+N Notifications
Ctrl+Q Quit
F11 Fullscreen
Ctrl++/- Zoom in / out
Ctrl+0 Zoom 100%
python3 freethebird.py # Default start
python3 freethebird.py --no-refresh # No auto-refresh
python3 freethebird.py --refresh 60 # Refresh every 60s
python3 freethebird.py --purge # Clear cache
python3 freethebird.py --width 1400 --height 900
python3 freethebird.py --version # Show version
Dependencies:
sudo apt install python3-pyqt6 python3-pyqt6.qtwebengine python3-pyqt6.qtsvgDownload and run:
git clone https://github.com/daboblog/FreeTheBird.git
cd FreeTheBird
python3 freethebird.py| Distribution | Python | PyQt6 |
|---|---|---|
| Slimbook OS (Ubuntu 24.04) | 3.12.3 | 6.6.1 |
| Debian 13.3 (Trixie) | 3.13.5 | 6.9.0 |
# Copy icons
sudo cp freethebird_128.png /usr/share/icons/hicolor/128x128/apps/freethebird.png
sudo cp freethebird_256.png /usr/share/icons/hicolor/256x256/apps/freethebird.png
sudo cp freethebird_512.png /usr/share/icons/hicolor/512x512/apps/freethebird.png
sudo gtk-update-icon-cache /usr/share/icons/hicolor/
# Create application menu entry
cat > ~/.local/share/applications/freethebird.desktop << 'EOF'
[Desktop Entry]
Name=FreeTheBird
Comment=Privacy-first X (Twitter) client for GNU/Linux
Exec=python3 /path/to/freethebird.py
Icon=freethebird
Terminal=false
Type=Application
Categories=Network;InstantMessaging;
Keywords=twitter;x;social;freethebird;
StartupWMClass=freethebird
EOF
update-desktop-database ~/.local/share/applications/FreeTheBird blocks third-party trackers and ads at the network level, but cannot block native X ads (promoted tweets), as those are served from X's own domain.
Some optional features use third-party external services: connection info lookup (IP, geolocation) uses ipapi.co over HTTPS, and the built-in translator uses the Google Translate API.
Created by David Hernández (Dabo), cybersecurity professional and GNU/Linux systems administrator.
- oreixa — Security, performance, architecture and UX improvements (PRs #1–#8)
- Claude by Anthropic — Code security review, architecture guidance and documentation
GPL v3 -- Copyleft. This software is free and must remain so. You can use, study, modify and distribute this code, but derivative works must keep the same license. Because software freedom is non-negotiable.
I <3 GNU/Linux

