---
title: 'Nitter in 2024'
date: 2024-09-05T10:34:46+03:00
draft: false
---
Earlier this year, [Nitter has ceased development](https://github.com/zedeus/nitter/issues/1155#issuecomment-1913361757), due to the removal of guest accounts, but, you can still self host an alternative Twitter frontend, and we'll do it with something some love and some hate, Docker!

We will be using [Privacydevel's Nitter fork](https://github.com/PrivacyDevel/nitter) for this.

### Prerequisites:
* A Linux server with Docker and Docker-compose installed
* A few twitter accounts
* A machine with a residential IP (for logging into your twitter alts, nothing else. You can use a smartphone for this)

### Step 1. Getting accounts
For this you will need a residential IP, as the login script won't work otherwise.  You can simply run it on your computer or on your phone using something like Termux. 

After you get a bunch of alts, it is time to get their oauth tokens.
```bash
curl https://raw.githubusercontent.com/PrivacyDevel/nitter/master/twitter_oauth.sh -o twitter_oauth.sh
vim twitter_oauth.sh
```
**twitter_oauth.sh**
```sh
...
5 | username="yourUsernameHere"
6 | password="yourPasswordHere"
...
```
```sh
bash twitter_oauth.sh
```
You'll end up with something similar in your terminal:
```json
{"oauth_token":"SECRET", "oauth_token_secret":"SECRET"}
```
Save it for later.

### Setting up Nitter
```bash
# Clone the instance. We will be using /srv/nitter
$ git clone https://github.com/PrivacyDevel/nitter.git /srv/nitter
# Now we have to edit the guest_accounts.json file
$ vim guest_accounts.json
```
**guest_accounts.json**
```json
[{"oauth_token":"SECRET", "oauth_token_secret":"SECRET"}]
```
```bash
# We'll also have to edit the docker-compose.yml file to pass the guest_accounts.json to the container.
$ vim docker-compose.yml
```
```yaml
version: "3"

services:

  nitter:
    image: ghcr.io/privacydevel/nitter:master
    container_name: nitter
    ports:
      - "8080:8080" # Replace with "8080:8080" if you don't use a reverse proxy. 
    volumes:
      - ./nitter.conf:/src/nitter.conf:Z,ro
      - ./guest_accounts.json:/src/guest_accounts.json:Z,ro
    depends_on:
      - nitter-redis
    restart: unless-stopped
    healthcheck:
      test: wget -nv --tries=1 --spider http://127.0.0.1:8080/Jack/status/20 ||                                                                                                  exit 1
      interval: 30s
      timeout: 5s
      retries: 2
    user: "998:998"
    read_only: true
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL

  nitter-redis:
    image: redis:6-alpine
    container_name: nitter-redis
    command: redis-server --save 60 1 --loglevel warning
    volumes:
      - nitter-redis:/data
    restart: unless-stopped
    healthcheck:
      test: redis-cli ping
      interval: 30s
      timeout: 5s
      retries: 2
    user: "999:1000"
    read_only: true
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL

volumes:
  nitter-redis:

```
```bash
$ vim nitter.conf # Now you can edit the nitter.conf file. I won't be going into it as it is fairly straightforward.
$ docker-compose up -d
```

And voila! Now if you go to your server's IP on port 8080, you will be greeted by Nitter. Isn't that awesome?

Thanks to [Phin](https://filehaus.su) for helping me set it up.
