Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
baeaf68
Make maxConcurrentReqs configurable (#1341)
jackyzy823 Dec 8, 2025
a92e79e
Fix the checkmark position (#1347)
796176 Dec 24, 2025
a45227b
Add user-agent to guest_token request (#1359)
cmj Jan 29, 2026
33dd9b6
Fix /pic/ exploit
zedeus Feb 6, 2026
0a6e79e
Add bulk script create_sessions_browser.py
zedeus Feb 9, 2026
5d28bd1
Add preference for configuring sticky navbar
zedeus Feb 9, 2026
db36f75
Support restoring preferences via new prefs param
zedeus Feb 9, 2026
b85e8c5
Support preference overrides using URL params
zedeus Feb 9, 2026
40b1ba4
Bump css version
zedeus Feb 9, 2026
1c06a67
Support image alt text
zedeus Feb 10, 2026
dcec1eb
Fix invalid search link formatting
zedeus Feb 10, 2026
05b6dd2
Add config options to enable subset of RSS feeds
zedeus Feb 11, 2026
cbce620
Add dynamic-range-limit to prevent HDR jumpscares
zedeus Feb 12, 2026
90b664f
Make "Tweet unavailable" clickable and consistent
zedeus Feb 14, 2026
d45545c
Fix "Replying to" parsing
zedeus Feb 14, 2026
f257ce5
Bump style version
zedeus Feb 14, 2026
a15d1ce
Add full support for tweet edit history
zedeus Feb 15, 2026
2bd664a
Add community notes support
zedeus Feb 19, 2026
61b6748
Add community notes to RSS
zedeus Feb 19, 2026
95a9ee8
Update and speed up GitHub workflows (#1368)
zedeus Feb 19, 2026
d187b1c
Fix video thumbnails not loading
zedeus Feb 22, 2026
b0773dd
Fix incorrect multi-user search query
zedeus Mar 4, 2026
2898efa
Fix search repeating when the end has been reached
zedeus Mar 4, 2026
4bf3df9
Fix segfault
zedeus Mar 4, 2026
35a929c
Implement mixed-media tweet support
zedeus Mar 13, 2026
0fefcf9
Update gif class in tests
zedeus Mar 13, 2026
91ff936
Add workaround for broken "until" search filter
zedeus Mar 14, 2026
7ce29bd
Add new media grid and gallery views
zedeus Mar 15, 2026
33bf2c2
Support tweet content disclosures (AI and ads)
zedeus Mar 21, 2026
b726767
Bump css
zedeus Mar 21, 2026
b6ccea0
Add configurable retry logic
zedeus Mar 21, 2026
fea6f59
Fix mobile gallery and grid, add size preference
zedeus Mar 21, 2026
3429667
Fix null legacy tweet crash
zedeus Mar 21, 2026
741060c
Increase maxRetries in CI conf
zedeus Mar 21, 2026
e7e7050
Add support for viewing account info
zedeus Mar 29, 2026
0c75834
Increase CI test maxRetries
zedeus Mar 29, 2026
7d43178
Increase CI reruns
zedeus Mar 29, 2026
8114eef
Add support for broadcasts
zedeus Mar 30, 2026
4e38317
Fix verified type enum parsing error
zedeus Apr 16, 2026
74f5ff8
Fix thread test
zedeus Apr 16, 2026
1ff123d
chore: merge upstream zedeus/nitter (40 commits)
guanbinrui May 21, 2026
b262938
fix(api): restore CORS, unify media field, add upstream tweet fields …
guanbinrui May 22, 2026
ed1e754
chore(ci): remove test workflows
guanbinrui May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions .github/workflows/build-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ jobs:
build-docker-amd64:
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/checkout@v6
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
with:
version: latest
- name: Login to DockerHub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
Expand Down
108 changes: 0 additions & 108 deletions .github/workflows/run-tests.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ nitter.conf
guest_accounts.json*
sessions.json*
dump.rdb
*.bak
/tools/*.json*

node_modules
debug_responses
Expand Down
36 changes: 22 additions & 14 deletions nitter.example.conf
Original file line number Diff line number Diff line change
@@ -1,34 +1,42 @@
[Server]
hostname = "nitter.net" # for generating links, change this to your own domain/ip
hostname = "nitter.net" # for generating links, change this to your own domain/ip
title = "nitter"
address = "0.0.0.0"
port = 8080
https = false # disable to enable cookies when not using https
https = false # disable to enable cookies when not using https
httpMaxConnections = 100
staticDir = "./public"

[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" # Change to "nitter-redis" if using docker-compose
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" # Change to "nitter-redis" if using docker-compose
redisPort = 6379
redisPassword = ""
redisConnections = 20 # minimum open connections in pool
redisConnections = 20 # minimum open connections in pool
redisMaxConnections = 30
# 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
enableRSS = true # set this to false to disable RSS feeds
enableJsonApi = true # set this to false to disable the JSON API
enableDebug = false # enable request logs and debug endpoints (/.sessions)
proxy = "" # http/https url, SOCKS proxies are not supported
hmacKey = "secretkey" # random key for cryptographic signing of video urls
base64Media = false # use base64 encoding for proxied media urls
enableRSS = true # master switch, set to false to disable all RSS feeds
enableRSSUserTweets = true # /@user/rss
enableRSSUserReplies = true # /@user/with_replies/rss
enableRSSUserMedia = true # /@user/media/rss
enableRSSSearch = true # /search/rss and /@user/search/rss
enableRSSList = true # list RSS feeds
enableJsonApi = true # set this to false to disable the JSON API
enableDebug = false # enable request logs and debug endpoints (/.sessions)
proxy = "" # http/https url, SOCKS proxies are not supported
proxyAuth = ""
apiProxy = "" # nitter-proxy host, e.g. localhost:7000
disableTid = false # enable this if cookie-based auth is failing
apiProxy = "" # nitter-proxy host, e.g. localhost:7000
disableTid = false # enable this if cookie-based auth is failing
maxConcurrentReqs = 2 # max requests at a time per session to avoid race conditions
maxRetries = 1 # max number of retries on rate limit errors
retryDelayMs = 150 # delay in ms between retries

# Change default preferences here, see src/prefs_impl.nim for a complete list
[Preferences]
Expand Down
4 changes: 2 additions & 2 deletions nitter.nimble
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ requires "oauth#b8c163b"
# Tasks

task scss, "Generate css":
exec "nimble c --hint[Processing]:off -d:danger -r tools/gencss"
exec "nim r --hint[Processing]:off tools/gencss"

task md, "Render md":
exec "nimble c --hint[Processing]:off -d:danger -r tools/rendermd"
exec "nim r --hint[Processing]:off tools/rendermd"
22 changes: 16 additions & 6 deletions public/css/fontello.css
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
@font-face {
font-family: "fontello";
src: url("/fonts/fontello.eot?77185648");
src: url("/fonts/fontello.eot?49059696");
src:
url("/fonts/fontello.eot?77185648#iefix") format("embedded-opentype"),
url("/fonts/fontello.woff2?77185648") format("woff2"),
url("/fonts/fontello.woff?77185648") format("woff"),
url("/fonts/fontello.ttf?77185648") format("truetype"),
url("/fonts/fontello.svg?77185648#fontello") format("svg");
url("/fonts/fontello.eot?49059696#iefix") format("embedded-opentype"),
url("/fonts/fontello.woff2?49059696") format("woff2"),
url("/fonts/fontello.woff?49059696") format("woff"),
url("/fonts/fontello.ttf?49059696") format("truetype"),
url("/fonts/fontello.svg?49059696#fontello") format("svg");
font-weight: normal;
font-style: normal;
}
Expand Down Expand Up @@ -56,6 +56,11 @@
}

/* '' */
.icon-group:before {
content: "\e804";
}

/* '' */
.icon-play:before {
content: "\e805";
}
Expand Down Expand Up @@ -121,6 +126,11 @@
}

/* '' */
.icon-attention:before {
content: "\e812";
}

/* '' */
.icon-circle:before {
content: "\f111";
}
Expand Down
Binary file modified public/fonts/fontello.eot
Binary file not shown.
6 changes: 5 additions & 1 deletion public/fonts/fontello.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/fonts/fontello.ttf
Binary file not shown.
Binary file modified public/fonts/fontello.woff
Binary file not shown.
Binary file modified public/fonts/fontello.woff2
Binary file not shown.
4 changes: 3 additions & 1 deletion public/js/hlsPlayback.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
function playVideo(overlay) {
const video = overlay.parentElement.querySelector('video');
const url = video.getAttribute("data-url");
const startTime = parseFloat(video.getAttribute("data-start") || "0");
video.setAttribute("controls", "");
overlay.style.display = "none";

Expand All @@ -12,12 +13,13 @@ function playVideo(overlay) {
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, function () {
hls.loadLevel = hls.levels.length - 1;
hls.startLoad();
hls.startLoad(startTime);
video.play();
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = url;
video.addEventListener('canplay', function() {
if (startTime > 0) video.currentTime = startTime;
video.play();
});
}
Expand Down
Loading