A privacy-focused Twitter/X frontend written in Rust.
- Privacy-focused: No third-party JavaScript, tracking, ads, or remote fonts
- RSS feeds: Subscribe to any user's tweets
- FxEmbed-style Discord embeds:
- Multiple images displayed in carousel on mobile
- Videos play directly in the embed
- Proper image dimensions for better layout
- ActivityPub JSON endpoint for rich embeds
- Rust 1.96.1+
- Twitter/X session tokens for API access
cargo build --release- Copy the example config:
cp config/teapot.example.toml config/teapot.toml-
Edit
config/teapot.tomlwith your settings. -
Create a sessions file with your Twitter/X credentials:
cp sessions.example.jsonl sessions.jsonl
# Edit sessions.jsonl with your auth_token and ct0 from browser cookiesCookie sessions use auth_token and ct0. OAuth sessions use
oauth_token and oauth_secret. See sessions.example.jsonl for the JSONL
shape. Never commit a real session or generated teapot.toml.
# Development
cargo run
# Production
./target/release/teapotThe server will start on http://localhost:8080 by default.
To use the Twitter API, you need session tokens from a logged-in Twitter account:
- Log into Twitter/X in your browser
- Open Developer Tools (F12) → Application → Cookies
- Copy the values of
auth_tokenandct0 - Add them to
sessions.jsonl
teapot/
├── src/
│ ├── main.rs # Entry point
│ ├── config.rs # Configuration
│ ├── error.rs # Error types
│ ├── types/ # Data structures (User, Tweet, Timeline, etc.)
│ ├── api/ # Twitter API client, OAuth, parsing
│ ├── cache/ # In-process caching
│ ├── routes/ # HTTP route handlers
│ ├── views/ # Maud HTML templates
│ └── utils/ # Utilities (HMAC, formatters)
├── public/ # Static assets (CSS, JS, fonts)
├── config/ # Configuration files
└── Cargo.toml # Dependencies
This rewrite includes FxEmbed-style improvements for Discord embeds:
Discord can display all images from a tweet in a carousel. This works via an ActivityPub JSON endpoint at /users/{username}/statuses/{id} that returns media attachments.
Videos can be played directly in Discord embeds using twitter:player meta tags:
twitter:player- Embed URLtwitter:player:stream- Direct MP4 URLtwitter:player:width/height- Dimensions
All images include og:image:width and og:image:height meta tags for proper layout.