IMGLAB Image URL Exporter โ€” User Guide
User Guide & Help Center

Collect Every
Photo on X / Twitter

Complete walkthrough โ€” from install to batch download. One extension that collects thousands of original-resolution images while you sleep.

โˆž
IMAGES / SESSION
4K
ORIGINAL RES
2
TABS IN PANEL
0
SIGN-UP NEEDED
1 Getting Started

Install in 2 Minutes

IMGLAB Image URL Exporter is a Chrome extension. Install it once and the panel appears automatically on every x.com and twitter.com page you visit.

01
Add to Chrome from the Web Store

Click Add to Chrome โ€” Free on the product page. Chrome will prompt you to confirm โ€” click Add extension. The IMGLAB icon ๐Ÿงช will appear in your Chrome toolbar. No sign-up, no account, no payment required.

๐Ÿ’ก If the toolbar icon isn’t visible, click the puzzle piece ๐Ÿงฉ in the Chrome toolbar and pin IMGLAB so it’s always accessible.
02
Navigate to x.com

Go to any Twitter profile and open their Media tab (the photo/video grid). Or use the search bar to run a query like:

from:example_user filter:images

The IMGLAB panel will appear automatically in the bottom-right corner of the page. If it doesn’t appear, click the ๐Ÿงช icon in the toolbar and press “Toggle Panel on Page”.

03
Click โ–ถ Start

In the IMGLAB panel, click โ–ถ Start. The extension begins scanning tweets, calling the Twitter API, and collecting image URLs. Auto-scroll loads more content while you watch the stats update in real time.

๐Ÿ’ก You don’t need to do anything while collecting โ€” just leave the tab open. IMGLAB handles scrolling, API calls, rate limits, and retries automatically.
04
Export urls.txt and Download

When collection finishes, urls.txt downloads automatically to your Downloads folder. Load it into the IMGLAB Image Downloader (separate app, beta โ€” donation required) to batch-download every image into organised subfolders. Or use any other batch download tool that accepts a URL list.

โš ๏ธ Do not navigate away from the page before urls.txt has been exported. IMGLAB shows a navigation warning if unsaved data exists, but always export first to be safe.
2 Panel Tour

Panel Walkthrough

The IMGLAB panel is injected into x.com โ€” it’s draggable, minimisable, and non-intrusive. Here’s what every element does.

IMGLAB Image URL Exporter panel
The panel as it appears on x.com
๐Ÿ”
Search / Context Row

Displays the current user or hashtag IMGLAB has detected from the URL. For a profile page it shows ๐Ÿ‘ค @username; for a search it shows ๐Ÿ” Update Search. The โ˜… star button saves the current user or hashtag to Favourites. The Update Search button rebuilds the search URL with your current min-faves filter applied.

๐Ÿ“š
History Badge

If you’ve previously collected from this user or hashtag, a green badge shows your last download date and total image count. This tells you at a glance how up-to-date your local archive is.

The badge only appears when history exists for the current context. It disappears on pages IMGLAB has never collected from before.
๐Ÿ”€
Top Tab Warning (amber)

If you’re on the Top tab of a search (relevance-sorted, not chronological), an amber warning banner appears. In this mode: the history boundary check is skipped, history will not be saved after the session, and the Go Older button is hidden โ€” because relevance sort has no reliable date ordering.

Switch to the Latest tab (f=live) for incremental collection with history tracking.
๐Ÿ“Š
Stats Grid

Four counters update in real time during collection:

๐Ÿ“ฆ Tweets seen โ€” total tweet IDs found in the DOM
โณ Queue remaining โ€” tweets still waiting for API processing
๐Ÿ–ผ Images found โ€” photo URLs successfully extracted (blue)
โŒ Failed tweets โ€” tweets that errored after all retries (red if > 0)

The progress bar below fills as the queue is processed: % = processed / total seen.

๐ŸŽฎ
Control Buttons

โ–ถ Start โ€” begins a new collection session. Disabled after a session completes (navigate to a new page or use Go Older to start again).

โธ Pause / โ–ถ Resume โ€” pauses API processing and auto-scroll. Queue is preserved. Click again to resume exactly where you left off.

โน Stop โ€” stops collection immediately. If not in backfill or Top tab mode, prompts you to save history at the current point.

๐Ÿ’พ
Export Buttons

๐Ÿ’พ Export urls.txt โ€” downloads the collected image list as a tab-separated text file. Also triggers automatically at end of session.

โš  Export โ€” exports a failed.txt of tweet URLs that couldn’t be processed, for manual retry.

๐Ÿ“‚ Retry โ€” loads a previously exported failed.txt back into IMGLAB to retry those specific tweets.

โš™๏ธ
Settings Section

Auto-scroll โ€” automatically scrolls the page during collection to load more tweets. Enabled by default.

Ignore history โ€” forces a full recollect even when history exists. Use this to completely refresh an archive.

API delay โ€” milliseconds between API calls (1000โ€“5000ms). Lower values collect faster but increase rate-limit risk. Default 1500ms is a safe balance.

Min faves โ€” adds min_faves:N to search queries. Filters out low-engagement tweets. Use the Update Search button to apply it to the current URL.

3 Collecting

Collection Modes & Behaviour

IMGLAB automatically detects the context and adjusts its behaviour. Understanding the four collection modes helps you get the most out of every session.

Incremental Mode
Only New Since Last Download
Triggered when: history exists for this user / hashtag and “Ignore history” is unchecked

When IMGLAB finds a stored tweet ID for the current context, it collects normally until it encounters a tweet ID equal to or older than the stored boundary โ€” then auto-scroll stops and the queue finishes processing. Only tweets newer than your last download are collected. Saves huge amounts of time on repeat visits.

Backfill Mode
Digging Back in Time
Triggered when: the search URL contains until:

When you click Go Older at the end of a session, IMGLAB generates a new search URL with an until: date. On this page, IMGLAB detects backfill mode and disables the history boundary check โ€” letting you safely collect older archives without overwriting your newest-ID record. History is not updated at the end of a backfill session.

Top Tab Mode
Relevance-Sorted Results
Triggered when: on /search page with no f param or f=top

Twitter’s “Top” tab sorts by relevance, not date. IMGLAB shows an amber warning, skips the history boundary, hides Go Older, and does not save history after the session โ€” because a newest tweet ID from a relevance-sorted session is meaningless and would corrupt incremental collection. Switch to the Latest tab for proper incremental use.

Retry Mode
Re-process Failed Tweets
Triggered when: a failed.txt file is loaded via the ๐Ÿ“‚ Retry button

Any tweets that failed after 3 API retries are tracked in failedIds[]. Export them with โš  Export, then load the file back with ๐Ÿ“‚ Retry. IMGLAB re-queues only those specific tweet IDs and re-processes them with fresh API calls. Previously collected images are preserved โ€” retry results are added on top.

1
DOM Scan โ€” tweet IDs from the page

On Start, IMGLAB immediately scans all visible <article> elements. It extracts the tweet status ID from each article’s first a[href*="/status/"] link, checks if the article contains media (photo links, data-testid="tweetPhoto", or sensitive content indicators), and adds qualifying IDs to the pending queue. A MutationObserver watches for new articles loaded by scroll.

2
GraphQL API โ€” photo URL extraction

Each tweet ID in the queue is sent to Twitter’s TweetResultByRestId GraphQL endpoint using your own browser session cookies for authentication. The response contains the full tweet object โ€” IMGLAB extracts all type: "photo" media, builds original-resolution URLs with ?format=jpg&name=orig, and generates the structured filename. Retweets and quote tweets are handled separately so photos are attributed to the correct author.

3
Rate limit handling โ€” automatic pause & resume

If the API returns HTTP 429, IMGLAB reads the x-rate-limit-reset header to determine the exact resume time, shows a countdown timer in the panel, and automatically resumes when the window opens. The current tweet is pushed back to the front of the queue and will be retried first. No data is lost during a rate limit pause.

4
Session finish โ€” auto-export & history save

When the queue empties and auto-scroll finds no more new tweets, finishCollection() fires. urls.txt auto-downloads first (before any early returns) to prevent data loss. Then the newest tweet ID is extracted from the collected filenames and saved to chrome.storage.local. If there were any failures, IMGLAB prompts you to confirm history save so a partial session doesn’t corrupt your boundary.

4 History & Favourites

History Tracking

IMGLAB remembers the newest tweet ID per user and hashtag. This enables incremental collection โ€” only grabbing content published since your last session.

Storage KeyWhat It Contains
imglab_history Object keyed by @username or #hashtag. Each entry: newest_tweet_id, last_downloaded (date string), total_images count.
imglab_downloaded Array of tweet IDs downloaded via the per-tweet button. Used to show the blue โœ“ checkmark on already-downloaded tweets.
imglab_favourites Array of { type, name, displayName } objects. type is "user" or "hashtag". name is @username or the full storageKey like #tag-a #tag-b.
imglab_min_faves Number. The last-used minimum favourites filter value. Restored automatically when the panel loads.
๐Ÿ“ก
Downloader history sync: If you run the IMGLAB Image Downloader on port 7861, the extension fetches its history on startup via GET /imglab/history and merges it with local storage โ€” always keeping the highest tweet ID. This means downloader sessions and extension sessions stay in sync automatically.

Multi-Tag Hashtag Searches

Searches combining multiple hashtags are fully supported. Tags are sorted alphabetically so the storage key is always consistent regardless of the order you typed them.

Storage key: #tag-a #tag-b
Space-separated, # on each tag, sorted alphabetically. Used as the imglab_history key and the downloader’s folder name โ€” both match exactly.
Export filename: twitter_urls_hashtag_tag-a_tag-b.txt โ€” underscore-joined, no #. The downloader converts this back to the folder name automatically.

Importing from Tampermonkey

If you were previously using the Tampermonkey version of IMGLAB, you can migrate your history into the Chrome Extension:

1

In the Settings section of the panel, click ๐Ÿ“‚ Import from Tampermonkey (or load history.json).

2

Select your exported JSON file. IMGLAB automatically detects the format: full export (has keys like imglab_history, imglab_favourites) or history-only (top-level keys are @username entries). Both formats are handled correctly.

3

The status bar confirms how many history entries, favourites, and downloaded IDs were imported. Your next collection session will correctly start from the incremental boundary.

5 Export Format

The urls.txt File

Every collection session produces a tab-separated text file. Each line is one image โ€” URL and filename separated by a tab character.

https://pbs.twimg.com/media/ExampleId?format=jpg&name=orig DisplayName(@example_user)_20260101-120000_123456789012345678_photo-1.jpg
URL โ€” direct link to original-resolution JPEG. The ?format=jpg&name=orig suffix forces the highest available quality.
DisplayName โ€” Twitter display name + handle. Used as the subfolder name by the downloader.
YYYYMMDD-hhmmss โ€” tweet timestamp in UTC. Enables sorting images chronologically in your file manager.
Tweet ID โ€” 18-digit snowflake ID. Used for deduplication โ€” the downloader skips any file it already has with this ID.
photo-N โ€” index for tweets with multiple photos (up to 4). Each image in a multi-photo tweet gets its own line.

Export Filename Format

ContextFilename
User profile twitter_urls_username_example_user.txt
Single hashtag twitter_urls_hashtag_tagname.txt
Multi-tag hashtag twitter_urls_hashtag_tag-a_tag-b.txt (alphabetically sorted, underscore-joined)
Unknown context twitter_urls_1735000000000.txt (Unix timestamp fallback)
๐Ÿ’ก
Unicode in display names is fully preserved. Japanese, Chinese, Korean, and emoji characters in Twitter display names are kept as-is in both the filename and the downloader’s subfolder name. Only Windows-invalid characters (\ / | < > : * ? ") are replaced with full-width equivalents.
6 Image Downloader

IMGLAB Image Downloader

๐Ÿ”ฌ BETA
The IMGLAB Image Downloader is a separate app, currently in beta. Access requires a donation to support development. Donors receive the download link directly via Ko-fi or Buy Me a Coffee.
โ˜• Donate for Access

A Python + Gradio GUI app that runs locally on your machine. Drop in your exported urls.txt files and it handles everything โ€” parallel downloads, duplicate skipping, subfolder organisation, and history sync back to the extension.

๐Ÿ“‚
Multi-File Queue

Load multiple urls.txt files at once. Files from the same user are merged into a single batch. Different users queue sequentially. On clean completion the next user starts automatically. Stopping mid-queue clears remaining entries.

โšก
Parallel Downloads

1 to 5 simultaneous downloads, configurable per session. Default is 3 โ€” a safe balance between speed and server stability. Increase to 5 for large batches on a fast connection; decrease to 1 if you see errors.

๐Ÿ“
Smart Subfolder Naming

For user files, the subfolder name is extracted from the first image’s filename โ€” giving you DisplayName(@example_user) as the folder. Hashtag searches use #tag-a #tag-b format, matching the extension’s storage key exactly.

๐Ÿ”
Duplicate Skipping

Before downloading any file, the downloader checks if it already exists at the destination path. Existing files are silently skipped โ€” no re-downloads, no overwriting. This makes it safe to re-load the same urls.txt multiple times.

๐Ÿ“Š
History Sync API

Exposes GET http://127.0.0.1:7861/imglab/history. The Chrome extension’s background.js fetches this on startup and merges it with local history, always keeping the highest tweet ID per user. No manual sync needed.

๐Ÿ”
TMD History Import

Already have thousands of images from Twitter Media Downloader? The Import TMD History tab scans your existing folder structure and bootstraps IMGLAB’s history file โ€” so incremental collection starts from exactly the right point.

โš ๏ธ
Gradio filename sanitisation: Gradio 6.6 strips () from uploaded filenames. If your txt file is named twitter_urls_username_example_user (1).txt after downloading duplicates, Gradio delivers it as twitter_urls_username_example_user 1.txt. The downloader handles this automatically โ€” the trailing number is stripped before extracting the folder name.
7 Limitations

Known Limitations

We believe in being fully transparent. The limitations below are real and acknowledged. Most are caused by Twitter’s infrastructure, API rate limits, or deliberate platform decisions โ€” not by anything we chose or can reasonably fix. We’ve documented each one so you know exactly what to expect.
โธ
Twitter API Rate Limits
Expected behaviour

Twitter’s GraphQL endpoints enforce per-account rate limits. Large collections (1000+ tweets) will typically trigger 1โ€“2 automatic pauses. IMGLAB reads the x-rate-limit-reset header, shows a countdown timer, and resumes automatically โ€” no user action needed. No data is lost during a pause.

Tip: Leave the tab open and let it run. IMGLAB handles everything. Lowering API delay below 1500ms increases rate-limit risk.
๐Ÿ–ผ๏ธ
Photos Only โ€” No Videos or GIFs
By design

IMGLAB extracts only type: "photo" media from tweet objects. Videos, animated GIFs, and other media types are intentionally skipped. The focus is on high-quality original-resolution still images. Video downloading requires a different technical approach and is outside the current scope.

Video support is a potential future Pro feature. Donations fund its development.
๐Ÿ”’
Private Accounts
By design

The extension makes API calls using your own browser session cookies. It can only collect tweets you’re authorised to view while logged in. Private accounts you don’t follow, age-restricted content you haven’t confirmed, and deleted tweets are not accessible โ€” the API simply won’t return them.

This is correct and intentional behaviour. IMGLAB only accesses what you yourself can see.
๐Ÿ”ง
Twitter API Endpoint Changes
Main maintenance risk

Twitter periodically changes its private GraphQL endpoint IDs and required feature flags. When this happens, API calls will fail with empty results or unexpected errors, and collection will stop working. IMGLAB requires an update to fix the endpoint. This is the primary ongoing maintenance burden for any Twitter scraping tool.

If collection suddenly stops working after a Twitter update, check imglab.net for an updated version or contact support.
โญ
Start Button Disabled After Session
By design

After a collection session completes (state === 'done'), the Start button is permanently disabled on that page. This is intentional โ€” re-scanning the same page is unreliable because auto-scroll starts from the current scroll position, not the top.

Navigate to a new search page or use the Go Older button to continue collecting on a fresh page load.
๐Ÿท๏ธ
Hashtags Containing Underscores
Known edge case

The multi-tag filename format uses underscores to separate tag names (e.g. hashtag_tag-a_tag-b.txt). If a hashtag itself contains an underscore, the downloader will incorrectly split it into two tags when converting the filename to a folder name.

Accepted limitation โ€” underscores are rare in Japanese and CJK hashtags which are the primary target audience. No fix is planned.
8 Support

Support & Donations

FREE ยท OPEN ยท COMMUNITY-SUPPORTED

Keep IMGLAB
Alive & Updated

The extension is free. No ads, no data collection, no subscriptions. Every update โ€” fixing broken API endpoints, adding features, testing edge cases โ€” takes real research and time. Your support funds all of it.

๐Ÿ”งKeeping up with Twitter’s frequent GraphQL endpoint changes
โœจPro features: donation key system, advanced filters, video support
๐Ÿ”ฌIMGLAB Image Downloader beta โ†’ stable release for all donors
๐Ÿ”‘Donation Key system โ€” one donation, lifetime offline access, no server dependency

Whether this project continues to grow honestly depends on community support. If you’ve saved images you’re happy with โ€” a one-time coffee is the best way to say “keep going.”

Quick Troubleshooting
Panel doesn’t appear on x.com
Click the ๐Ÿงช toolbar icon and press Toggle Panel on Page. If still missing, go to chrome://extensions/, find IMGLAB, and click the โ†บ refresh icon, then reload x.com.
Collection starts but finds 0 images
The page may have no photo tweets, or you’re on a tab that IMGLAB doesn’t operate on (Media tab, f=user, etc.). Try from:username filter:images in the search bar and switch to the Latest tab.
API calls all fail with errors
Twitter may have changed its GraphQL endpoint. Check imglab.net for an update. Also check that you are logged in to x.com โ€” the extension uses your session cookies.
History badge shows wrong date
Open the panel Settings and use the Import button to load a history.json backup, or clear the entry with the console command in the browser DevTools Service Worker console: chrome.storage.local.get('imglab_history', d => console.log(d))
Go Older button doesn’t appear
Go Older only appears after a completed session on a Latest-tab search where at least one tweet date was recorded. It does not appear in Top tab mode, backfill mode, or if no oldest tweet date was captured.
urls.txt didn’t download automatically
Check that Chrome hasn’t blocked the automatic download (a prompt may appear in the address bar). Click ๐Ÿ’พ Export urls.txt in the panel to trigger it manually. Check your Downloads folder โ€” it may have downloaded without a notification.