A free and open source alternative Twitter front-end focused on privacy.

Why?

This part is copied from: Nitter’s README.md

Screenshot

It’s basically impossible to use Twitter without JavaScript enabled. If you try, you’re redirected to the legacy mobile version which is awful both functionally and aesthetically. For privacy-minded folks, preventing JavaScript analytics and potential IP-based tracking is important, but apart from using the legacy mobile version and a VPN, it’s impossible. This is is especially relevant now that Twitter removed the ability for users to control whether their data gets sent to advertisers.

Using an instance of Nitter (hosted on a VPS for example), you can browse Twitter without JavaScript while retaining your privacy. In addition to respecting your privacy, Nitter is on average around 15 times lighter than Twitter, and in most cases serves pages faster (eg. timelines load 2-4x faster).

In the future a simple account system will be added that lets you follow Twitter users, allowing you to have a clean chronological timeline without needing a Twitter account.

Why own instance?

You can use a public nitter instance from nitter/wiki/Instances, or you can use my nitter instances:

is-nitter.resolv.ee // hosted in 🇮🇸 with Cloudflare CDN enabled
lu-nitter.resolv.ee // hosted in 🇱🇺 with Cloudflare Magic Transit

But if you don’t want to trust other people, you can, and you should set up your own instance.

Installation

Docker

This blog post is based on Debian 11, if you are using other distros, refer to Install Docker Engine from docker docs

  1. To install Docker Engine:
// Remove previously installed, if any, Docker
$ apt -y remove docker docker-engine docker.io containerd runc && apt update
$ apt -y install ca-certificates curl gnupg lsb-release

// Setup repo
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  
// Install Docker
$ apt update
$ apt -y install docker-ce docker-ce-cli containerd.io

// Start Docker
$ systemctl start docker
$ systemctl enable docker
  1. Create a nitter.conf in the current word directory, or you can download it from https://github.com/zedeus/nitter/blob/master/nitter.conf
[Server]
address = "0.0.0.0"
port = 8080
https = false  # disable to enable cookies when not using https
httpMaxConnections = 100
staticDir = "./public"
title = "nitter"
hostname = "nitter.net"

[Cache]
listMinutes = 240  # how long to cache list info (not the tweets, so keep it high)
rssMinutes = 10  # how long to cache rss queries
redisHost = "localhost"
redisPort = 6379
redisConnections = 20 # connection pool size
redisMaxConnections = 30
redisPassword = ""
# max, new connections are opened when none are available, but if the pool size
# goes above this, they're closed when released. don't worry about this unless
# you receive tons of requests per second

[Config]
hmacKey = "secretkey" # random key for cryptographic signing of video urls
base64Media = false # use base64 encoding for proxied media urls
tokenCount = 10
# minimum amount of usable tokens. tokens are used to authorize API requests,
# but they expire after ~1 hour, and have a limit of 187 requests.
# the limit gets reset every 15 minutes, and the pool is filled up so there's
# always at least $tokenCount usable tokens. again, only increase this if
# you receive major bursts all the time

# Change default preferences here, see src/prefs_impl.nim for a complete list
[Preferences]
theme = "Nitter"
replaceTwitter = "nitter.net"
replaceYouTube = "piped.kavin.rocks"
replaceInstagram = ""
proxyVideos = true
hlsPlayback = false
infiniteScroll = false
  1. To run prebuilt Nitter in Docker:
$ docker run -v $(pwd)/nitter.conf:/src/nitter.conf -d -p 8080:8080 zedeus/nitter:latest

// change 8080 to the port you want

Caddy

As recommended by nitter, one should run caddy behind a reverse proxy for security reason; in this case, I’ll use caddy

  1. To install caddy: Download the latest release from here

To install the latest release for Debian:

$ curl -s https://api.github.com/repos/caddyserver/caddy/releases/latest | grep "browser_download_url.*linux_amd64.deb" | cut -d '"' -f 4 | wget -i - | dpkg -i -

Caddyfile sample config:

:443, your-domain.com
tls [email protected]
log {
  level debug
}
route {
  reverse_proxy 127.0.0.1:8080
}

After that start caddy with systemd:

$ systemctl restart caddy
$ systemctl enable caddy

Head over to your-domain.com to enjoy your nitter instance.