OldTwitter: a browser extension that replaces the Twitter client instead of restyling it
Extension to return old Twitter layout from 2015 / 2018.
At a glance
- What is it?
- A 2,700-star Chrome and Firefox extension that rebuilds the 2015 and 2018 Twitter layouts from scratch, and what its repository structure says about how it stays alive.
- Who is it for?
- OldTwitter is a good fit if you want the old layout on a browser you control and accept that the extension has to track Twitter's private endpoints itself, which is exactly what the release notes show happening several times a month. The repository is not archived and the last push was on 2026-09-14, with 1.9.8.1 published on 2026-08-11.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 22 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Installing from the web store, or unpacking a zip when the store is gone
The install story is uneven across browsers, which is worth knowing before you plan around this extension. Chrome, Edge, Opera, Brave and any other Chromium build install from the Chrome Web Store listing. Firefox is the awkward one: the Add-ons for Firefox entry is struck through in the README with the note that it was removed, so the documented path is manual installation from GitHub releases instead.
The manual route has two variants. For a stable build you download `OldTwitterChrome.zip` or `OldTwitterFirefox.zip` from the Releases page. For a beta you need a GitHub account, go to the Actions page for the `pack.yml` workflow, pick the newest "Pack Extension" run, and take `OldTwitterChrome` or `OldTwitterFirefox` from it. The Chromium instructions are then the familiar ones: unpack somewhere, open `chrome://extensions`, turn on Developer mode, and use Load unpacked. Firefox uses `about:debugging#/runtime/this-firefox` and Load Temporary Add-on.
The temporary add-on route has a real cost. A temporary install disappears when you close the browser, so the README points at Firefox Developer Edition and tells you to set `xpinstall.signatures.required` to false in `about:config`, then install from `about:addons`. The README says this reportedly also works on Extended Support Release and Nightly, which is the kind of phrasing that tells you nobody has verified it across the board.
A replacement client rather than a stylesheet on top of one
The README makes an unusual claim for a browser extension, and it is the claim most worth taking seriously: this extension doesn't add any CSS on top of original Twitter, it is a fully original client that replaces it. That is a much bigger maintenance commitment than a theme plugin, because a theme only has to keep up with class names while a replacement client has to reproduce the endpoints, the routing and the data handling that the real client relies on.
The payoff is stated just as plainly: it is faster than the alternatives. When your own code is building the timeline rather than restyling someone else's, you control the render path entirely, which is also why the feature list can include things the official client has no room for. The list covers removal of analytics and tracking, removal of ads, a free unfollower tracker, search and filtering over your own follower list, inline tweet translation with per-user and per-language auto-translate rules, and a button that explains why a given tweet appeared in the algorithmic timeline.
A few entries are pure taste and worth naming as such. You can disable Twemoji, turn stars back into heart likes, change the font and every colour in the interface, and pick the 2018 design instead of 2015. There is a priority order for profile link colours, oldtwitter colour database first, then the Twitter colour database, then the default, which is a small example of the extension running its own shared state alongside the platform's.
By its own FAQ the result is not a pixel-perfect copy. The author says plainly that the extension takes the general look and feel rather than reproducing the old interface exactly, so anyone expecting a museum-grade recreation should know that before installing.
What the file tree says about how the thing is built
The tree is small and legible for a project with this many users: `manifest.json`, `ruleset.json`, `pack.js`, `test.js`, `sandbox.html`, `LIBRARIES.md`, plus `layouts/`, `libraries/`, `fonts/`, `images/`, `scripts/` and `_locales/`. Nothing is minified into a bundle, which is unusual for a shipped extension and consistent with the claim that you can read everything yourself.
`layouts/` and `libraries/` hold the UI and the code it uses, and the presence of vendored libraries in a checked-in directory is what makes the claim about removing Twitter's analytics plausible, since the extension never loads the remote scripts in the first place. `LIBRARIES.md` is the inventory of those, and `_locales/` is where the translations live, with the README crediting contributors per language rather than shipping English only. `fonts/` and `images/` are self-hosted for the same reason: a client that claims speed and privacy should not be fetching a webfont from a CDN.
The two files a reader should look at first are `ruleset.json`, which almost certainly encodes the request and response rewriting that makes interception work, and `sandbox.html`, which is the isolated page used for the parts of the client that need a clean environment. Neither is explained in the README, so the honest statement is that the interception mechanism is discoverable from the tree rather than described in prose.
The build and test entry points are visible in `package.json`, and both are one-liners run through plain Node with no framework:
node pack.js
node test.jsThe third script, `build-action`, passes `-a` to the same packer and is the one the GitHub Actions workflow runs, which explains how the beta artifacts in the Actions page are produced. The only runtime dependencies are `adm-zip` and `node-fetch`, so the packaging step itself is not where the complexity lives.
A keyboard layer built for people who live in the timeline
The hotkey list is the most detailed part of the README and it is where the project's real personality shows. General keys follow a familiar scheme: `F` focuses the search bar, `N` opens the new tweet modal, `ESC` closes any modal, `M` toggles the user menu, and `CTRL+ENTER` sends a tweet from a reply, quote or new tweet box.
Navigation uses a chord prefix, which is a small design decision worth crediting. `G+H` goes home, `G+N` to notifications, `G+M` to mentions, `G+P` to profile, `G+L` to likes, `G+I` to lists, `G+M` to messages, `G+S` to settings, `G+B` to bookmarks. Pressing `CTRL+ALT+O` switches between the old and the new Twitter entirely, and adding `?newtwitter=true` to the end of any URL reaches the original client on demand.
The active-tweet keys are the reason some people keep this installed at all. `S` and `W` move to the next and previous tweet, `L` likes, `B` bookmarks, `T` retweets, `K` blocks the author, `R` and `Q` open the reply and quote boxes, `C` copies the tweet image, `D` downloads the first piece of media, `SPACE` opens a full image or pauses video, and `ENTER` opens the tweet in a new tab. The blue dot on the bottom-right of a tweet element is how the extension tells you which tweet those keys will act on, which is the kind of small piece of state a native client never has to explain.
All hotkeys can be turned off in settings. That matters more than it sounds, because an extension that hijacks `N`, `S` and `W` on every page you visit is unusable alongside anything else that wants those keys, and turning them off is the only escape the README offers.
Release notes as a maintenance forecast
The three most recent releases are a better description of the project's real cost than any feature list. Version 1.9.7, published on 2026-07-16, added a GIF picker and then fixed DMs not loading again, users missing from search results, a recurring "Solver timed out" error on tweet pages, quote navigation sending you to the quote instead of the quoted tweet, list membership changes, and a gallery that only showed the first media item.
Read that list as a pattern rather than a changelog. Three of those fixes are data-fetching failures, one is an anti-bot challenge, and one is navigation state. This is what owning a client means in practice: Twitter changes something on its side, the extension breaks, and the author ships a patch. Version 1.9.6.7 from 2026-05-22 summarises the same idea in four words, "Fixed solver again le sigh", which is an honest signal about how often the anti-bot solver breaks.
Version 1.9.8.1 on 2026-08-11 is where the project stops chasing the old interface and starts reacting to new platform features. It added a setting to block Grok from editing your images, enabled by default, plus settings for showing the download button on tweets with media and pinning the Likes link on the navbar, and fixed the quotes page on mobile. A feature named after a competitor's product, with a switch to disable it, tells you the extension tracks the platform closely rather than freezing in 2015.
The repository is not archived and the last push was on 2026-09-14. With three releases across May, July and August 2026, the cadence is roughly monthly, which for a single-maintainer extension against a moving target is a reasonable pace. The licence field in `package.json` reads UNLICENSED, and there is a LICENSE file in the tree, so read that file before assuming what you can do with the code.
Mobile support, and the honest comparison with the official client
The Android answer in the README is Kiwi Browser or Firefox Beta and Nightly, and with Kiwi you can then use Add to Home screen to get it running as a standalone app. That is a workable answer and it is not a native one: there is no iOS path, because iOS does not allow the extension model Kiwi Browser relies on.
The comparison to draw is not with other extensions. OldTwitter's competitors, if any, are the official client and the several third-party front ends that also replace rather than restyle. Against the official client the trade is straightforward. You gain the 2015 layout, hotkeys, no ads, no analytics, easy media download, inline translation and the reason-a-tweet-was-shown panel. You give up whatever Twitter adds next unless the author ships it, and you accept that when Twitter changes its endpoints the extension is broken until it is patched.
The failure mode that is hardest to avoid is the gap between an extension release and a platform change. An account action or a layout shift can produce something that looks like an extension bug and is not, and the only diagnostic available to a user is the issue tracker. With 253 open issues on the repository, that queue is the honest measure of how much is outstanding.
Two limits are worth stating without hedging. The interface is not a pixel-perfect copy of 2015, by the author's own admission, so nostalgia has a floor. And because everything runs as an extension, anything Twitter requires to be server-side, including anything that needs a trusted client identity, is out of reach. For reading, browsing and composing, that is not a limitation anyone will hit. For anything resembling the official mobile app's account controls, it is.
Editorial conclusion
OldTwitter is a good fit if you want the old layout on a browser you control and accept that the extension has to track Twitter's private endpoints itself, which is exactly what the release notes show happening several times a month. The repository is not archived and the last push was on 2026-09-14, with 1.9.8.1 published on 2026-08-11. Start by installing the Chrome Web Store build, and read `sandbox.html`, `ruleset.json` and `LIBRARIES.md` before you decide anything else, because those three files are where the project's real limits are written down.
Frequently asked questions
How do I get the old Twitter layout back?
Install OldTwitter from the Chrome Web Store for Chromium browsers, or unpack `OldTwitterFirefox.zip` from the Releases page on Firefox since the Add-ons listing was removed. Once installed, add `?newtwitter=true` to any Twitter URL to jump back to the official client, or press `CTRL+ALT+O`.
Does OldTwitter still work on Firefox?
Yes, but not through the add-ons store. The README marks the Firefox add-on listing as removed and gives manual instructions instead: download the zip from Releases and load it at `about:debugging#/runtime/this-firefox`. A temporary load is cleared when the browser closes, so permanent installation needs Firefox Developer Edition with `xpinstall.signatures.required` set to false.
Can I use OldTwitter on an Android phone?
Yes, through Kiwi Browser, which can install Chrome extensions from the web store. Once it is installed you can add it to the home screen and run it as a standalone app. There is no iOS route, because that browser does not support Chrome extensions.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/dimdengd-oldtwitter)