Read one X post and leave.
A Chrome and Firefox (Manifest V3) extension that opens x.com and twitter.com post links
in a popup instead of sending you to the full site.
![]() | ![]() |
| A blue dot marks a link Post Peek can open. | Click it and the post opens in place. Esc closes it. |
Post Peek is an independent, open-source project inspired by Litterbox, the Safari extension by Zhenyi Tan (And a Dinosaur). If you use Safari, use Litterbox itself - it came first, it is free, and it is the better fit there. See Credit.
Add to Chrome from the Chrome Web Store - the reviewed build, kept up to date by Chrome.
Add to Firefox from addons.mozilla.org -
Firefox 140 or newer. The listing goes public once Mozilla's first review is done; until
then, download post-peek-<version>-firefox.zip from the
latest release or build it from source as below.
Chrome: open chrome://extensions, enable Developer mode, click Load unpacked,
and pick this folder.
Firefox: run npm run build, open about:debugging#/runtime/this-firefox, click
Load Temporary Add-on, and pick dist/post-peek-<version>-firefox.zip. (Picking
manifest.json in this folder does not work: that file is the Chrome manifest, and
Firefox needs the rewritten one inside the zip.)
Serve this folder over HTTP and open the test page, for example:
python -m http.server 8000
then visit http://localhost:8000/test.html. The extension deliberately does not run on file:// pages.
npm run build
This writes two zips containing only the runtime files (manifest.json, src/,
options/, icons/) - the banner and store art are not packaged:
dist/post-peek-<version>.zip for the Chrome Web Store, with manifest.json as checked in.dist/post-peek-<version>-firefox.zip for addons.mozilla.org. Same files, but the manifest
is rewritten by scripts/firefox-manifest.js: Firefox runs src/background.js as an
event page rather than a service worker, and the manifest carries the add-on ID, the
minimum Firefox version, and the data-collection declaration AMO requires.To check the Firefox zip the way AMO will, unzip it and run npx web-ext lint on the
folder; the release workflow does this on every tag.
To regenerate artwork: npm run icons for the extension icons, npm run media for the
banner and screenshots above. Both need Chrome; set CHROME if it is not on the default
Windows path.
Unreleased notes in CHANGELOG.md under the new version.version in manifest.json and package.json, then commit.git tag v1.2.3 && git push origin v1.2.3.The release workflow checks that the tag matches the
manifest version, builds both zips, lints the Firefox one, and attaches both to a GitHub
release. Upload the plain zip to the Chrome Web Store and the -firefox zip to
addons.mozilla.org.
manifest.json - MV3 manifest for Chrome. The Firefox manifest is derived from it at build time.src/background.js - service worker (event page on Firefox); fetches posts from cdn.syndication.twimg.com and proxies images when a page's CSP blocks twimg.com.src/content.js - intercepts clicks on post links and renders the popup inside a closed Shadow DOM.src/content.css - dot marker, matched purely on the link's href.src/popup-css.js - popup stylesheet embedded as a string (so nothing is web-accessible).options/ - settings page (also the toolbar popup).scripts/ - icon generator, README artwork renderer, zip builder, and the Chrome-to-Firefox manifest rewrite.test/ - dependency-free tests for the packaging and privacy invariants (npm test).test.html - page of links for checking dots and peeking by hand in the browser.media/ - banner and the cropped screenshots used above; regenerate with npm run media.store/ - Chrome Web Store and addons.mozilla.org listing copy, screenshots, and promo tiles.Post Peek exists because of Litterbox, a Safari extension for iPhone, iPad, and Mac by Zhenyi Tan, who publishes as And a Dinosaur:
Litterbox got there first with essentially every idea this extension is built on: open a linked x.com post in a popup instead of going to the site; mark the links it can handle so you know before you click; fetch the post through the same API X uses for its own website embeds, so no cookies are sent; and leave a link out to X for when you do want the full thread. Post Peek's blue dot is Litterbox's marker in another shape, and the name "Post Peek" is a clip of Litterbox's own listing name, "Litterbox - Post Peeker".
Some of the words are theirs as well. "Read one X post and leave" is a compression of how Litterbox describes itself on the App Store - "opens x.com links in a popup so you can read the one post and leave."
Post Peek is a separate Chrome and Firefox implementation of that idea, written from scratch. Litterbox is closed source, so no Litterbox code or artwork is used here. Post Peek is not affiliated with, endorsed by, or supported by Zhenyi Tan, And a Dinosaur, or X Corp, so anything wrong with this extension is not theirs to answer for - report it on this repository's issues.
JavaScript
85.7%
HTML
11.7%
CSS
2.7%
Read one X post and leave.
A Chrome and Firefox (Manifest V3) extension that opens x.com and twitter.com post links
in a popup instead of sending you to the full site.
![]() | ![]() |
| A blue dot marks a link Post Peek can open. | Click it and the post opens in place. Esc closes it. |
Post Peek is an independent, open-source project inspired by Litterbox, the Safari extension by Zhenyi Tan (And a Dinosaur). If you use Safari, use Litterbox itself - it came first, it is free, and it is the better fit there. See Credit.
Add to Chrome from the Chrome Web Store - the reviewed build, kept up to date by Chrome.
Add to Firefox from addons.mozilla.org -
Firefox 140 or newer. The listing goes public once Mozilla's first review is done; until
then, download post-peek-<version>-firefox.zip from the
latest release or build it from source as below.
Chrome: open chrome://extensions, enable Developer mode, click Load unpacked,
and pick this folder.
Firefox: run npm run build, open about:debugging#/runtime/this-firefox, click
Load Temporary Add-on, and pick dist/post-peek-<version>-firefox.zip. (Picking
manifest.json in this folder does not work: that file is the Chrome manifest, and
Firefox needs the rewritten one inside the zip.)
Serve this folder over HTTP and open the test page, for example:
python -m http.server 8000
then visit http://localhost:8000/test.html. The extension deliberately does not run on file:// pages.
npm run build
This writes two zips containing only the runtime files (manifest.json, src/,
options/, icons/) - the banner and store art are not packaged:
dist/post-peek-<version>.zip for the Chrome Web Store, with manifest.json as checked in.dist/post-peek-<version>-firefox.zip for addons.mozilla.org. Same files, but the manifest
is rewritten by scripts/firefox-manifest.js: Firefox runs src/background.js as an
event page rather than a service worker, and the manifest carries the add-on ID, the
minimum Firefox version, and the data-collection declaration AMO requires.To check the Firefox zip the way AMO will, unzip it and run npx web-ext lint on the
folder; the release workflow does this on every tag.
To regenerate artwork: npm run icons for the extension icons, npm run media for the
banner and screenshots above. Both need Chrome; set CHROME if it is not on the default
Windows path.
Unreleased notes in CHANGELOG.md under the new version.version in manifest.json and package.json, then commit.git tag v1.2.3 && git push origin v1.2.3.The release workflow checks that the tag matches the
manifest version, builds both zips, lints the Firefox one, and attaches both to a GitHub
release. Upload the plain zip to the Chrome Web Store and the -firefox zip to
addons.mozilla.org.
manifest.json - MV3 manifest for Chrome. The Firefox manifest is derived from it at build time.src/background.js - service worker (event page on Firefox); fetches posts from cdn.syndication.twimg.com and proxies images when a page's CSP blocks twimg.com.src/content.js - intercepts clicks on post links and renders the popup inside a closed Shadow DOM.src/content.css - dot marker, matched purely on the link's href.src/popup-css.js - popup stylesheet embedded as a string (so nothing is web-accessible).options/ - settings page (also the toolbar popup).scripts/ - icon generator, README artwork renderer, zip builder, and the Chrome-to-Firefox manifest rewrite.test/ - dependency-free tests for the packaging and privacy invariants (npm test).test.html - page of links for checking dots and peeking by hand in the browser.media/ - banner and the cropped screenshots used above; regenerate with npm run media.store/ - Chrome Web Store and addons.mozilla.org listing copy, screenshots, and promo tiles.Post Peek exists because of Litterbox, a Safari extension for iPhone, iPad, and Mac by Zhenyi Tan, who publishes as And a Dinosaur:
Litterbox got there first with essentially every idea this extension is built on: open a linked x.com post in a popup instead of going to the site; mark the links it can handle so you know before you click; fetch the post through the same API X uses for its own website embeds, so no cookies are sent; and leave a link out to X for when you do want the full thread. Post Peek's blue dot is Litterbox's marker in another shape, and the name "Post Peek" is a clip of Litterbox's own listing name, "Litterbox - Post Peeker".
Some of the words are theirs as well. "Read one X post and leave" is a compression of how Litterbox describes itself on the App Store - "opens x.com links in a popup so you can read the one post and leave."
Post Peek is a separate Chrome and Firefox implementation of that idea, written from scratch. Litterbox is closed source, so no Litterbox code or artwork is used here. Post Peek is not affiliated with, endorsed by, or supported by Zhenyi Tan, And a Dinosaur, or X Corp, so anything wrong with this extension is not theirs to answer for - report it on this repository's issues.
JavaScript
85.7%
HTML
11.7%
CSS
2.7%