PRACTICE
Pocket is gone and you have the CSV: what survives an import, field by field
Migration guides say the export is straightforward. The question that actually costs people their library is narrower: which fields the export contains at all, and which of those any given importer reads.
Published 2026-08-06 · Updated — · 2770 words · 20 sources · Status of facts checked 2026-08-06
Pocket Gone stopped working on 2025-07-08. Mozilla announced the closure on 2025-05-22.1 Mozilla’s own support article, in the Internet Archive capture of 2025-10-07, states that a user’s “data will remain available for export until 10/08/2025; after which all Pocket user data, including all saved articles, highlights, notes and personal profile information will be deleted automatically.”2 The same article as captured on 2026-04-20 still carries that sentence in its body while the note at its head reads that saves could be exported until November 12, 2025; which of the two dates was operative could not be verified.19 Either way the window is shut: as of 2026-08-06 getpocket.com/export answers with an HTTP 302 to /home, which serves Mozilla’s closure notice and no export control.20 A file downloaded before that is not a backup of a service that still exists. It is the only copy.
Guides written during the migration treat the move as one step: export to CSV, import somewhere else. It is two separate questions, and the second one is where collections quietly lose their shape. The first is what the export file contains. The second is which of those fields a given importer reads — which is a property of that importer’s source code, not of the file.
What the export file is
Per Mozilla’s support article, an export is requested at getpocket.com/export, generated asynchronously, and mailed as a download link the article states is active for 48 hours.2 The download is a zip. Reporting the change to Karakeep’s tracker on 2024-10-19, the issue’s author described the revamped tool as mailing “a zip file which contains csv files, each containing 10.000 pocket saves + the first row containing the column’s titles.”3 A large library therefore arrives as several numbered files, not one; the file named in the Shiori report below is part_000000.csv.7
Inside each file the record is five named fields: title, url, time_added, tags, status. time_added is read as a Unix timestamp in seconds by every importer examined below. Multiple tags are joined with a pipe character, which the Karakeep report states in as many words. status carries the string unread or archive. Those names and conventions are attested by the two dated header reports below, by the sample rows in that report, and by the test fixture committed to Readeck’s repository; four of the five importers examined resolve their columns by those same five names.38
That is a thinner record than it looks, and it is worth measuring against the interchange format everything else in this space uses. Microsoft’s archived definition of the Netscape Bookmark File Format, dated 2017-08-15, specifies a shortcut as <DT><A HREF="{url}" ADD_DATE="{date}" LAST_VISIT="{date}" LAST_MODIFIED="{date}">{title}</A>, nested inside <DL> lists that carry the folder tree.4 There is no tag attribute, no read-state attribute and no note in that definition. TAGS, TOREAD and PRIVATE are later private conventions bolted onto the same element: linkding’s parser reads all three, and its exporter writes them.56 A Pocket CSV and a browser bookmark file are not the same shape of thing, and the conversion between them is the point at which fields go missing.
Two headers, both still in circulation
The header line is not constant. The Karakeep issue of 2024-10-19 records it with six names, giving the example row header as title,url,time_added,cursor,tags,status.3 On 2025-05-30 a Shiori user filed a report whose entire content is that the shape had changed: Shiori v1.7.4 rejected a current export with the message Invalid CSV format. Header must be: title,url,time_added,cursor,tags,status, and the reporter observed that the file now read title,url,time_added,tags,status.7 The cursor column had been removed. Readeck’s repository still carries a Pocket test fixture with the six-column header, retrieved 2026-08-06.8
Both shapes therefore exist as files people are still holding. Which one is in a given zip depends on when the export was generated, and the exact date of the change could not be verified; the two dated reports bound it to between 2024-10-19 and 2025-05-30. Nothing about a file’s name says which shape it is. The header line does, and it is the first line.
Read by name, or read by position
This is the split that decides whether an import is faithful, and it is visible in five repositories.
Four importers resolve columns by name. Readeck’s Pocket adapter declares its struct fields with CSV tags — csv:"title", csv:"url", csv:"time_added", csv:"tags", csv:"status", each marked case:"ignore".9 Karakeep parses with columns: true and destructures the same five names.10 Linkwarden parses with header: true.11 Shiori, after the report above was closed on 2025-06-27, looks each column up in the header row with slices.Index at tag v1.8.0 and errors only if title, url, time_added or tags is absent.12 None of the four requires a cursor column, and each takes its column order from the header line rather than from a fixed order; Readeck’s committed fixture is itself the six-column shape.8
Wallabag reads by position. In PocketCsvImport.php at tag 2.6.14, released 2025-10-07, the loop skips a row whose first cell is title and then assigns 'url' => $data[1], 'title' => $data[0], 'created_at' => $data[2], 'tags' => $data[3] and 'is_archived' => 'archive' === $data[4].13 Those indices match the five-column header exactly. Read against a row in the six-column shape, index 3 is the cursor and index 4 is the tag list — so the cursor value lands in the tag field, and the archived test is applied to a string that will only equal archive if a tag happens to be spelled that way. This is arithmetic over the published header and the published source, not a trial: no importer was run by this publication.a
The asymmetry matters more than the individual bug. Shiori’s mismatch was loud: the import stopped and printed the header it wanted. A positional read of the wrong shape is silent. It completes, reports success, and produces a library in which every row is unread and every row carries one meaningless tag. An importer that names its columns can survive a format change; an importer that counts them fails without saying so.
Field fidelity, per importer
Every cell below is read from the named source file or documentation page, at the version stated in the row, on 2026-08-06.b Nothing in this table is a result of using any of these products, and one frequently named destination is absent for want of a first-party document.c
| Destination | Header read by | url | title | time_added | tags | status | highlights |
|---|---|---|---|---|---|---|---|
| wallabag 2.6.14 | position | preserved | preserved | preserved | preserved, pipes rewritten to commas | preserved from index 4, so from the five-column shape only | no such column |
| Karakeep, branch main | name | preserved | preserved | preserved | preserved, split on pipe | preserved | no such column |
| Readeck, branch main | name | preserved, fragment stripped | preserved unless equal to the url | preserved | preserved, split on pipe | preserved | no such column |
| Linkwarden, branch main | name | preserved, truncated at 2047 | preserved, truncated at 254 | preserved | preserved, split on pipe | dropped | no such column |
| Shiori v1.8.0 | name | preserved, UTM parameters removed | preserved | preserved | preserved, split on comma or pipe | dropped | no such column |
| linkding v1.45.0 | no CSV importer | requires a transform to Netscape bookmark HTML | no field in that format; linkding’s own export encodes it as a private tag | no such column | |||
| Raindrop.io, documented CSV | documented column names | preserved, required | preserved | column named created | requires a transform, commas not pipes | no such column in the documented format | no such column |
Scroll →
Read state is the field with nowhere to go
Of the five fields, status is the one that most often has no destination. Linkwarden’s importer declares status: string in its TypeScript type for a Pocket row and then never references it in the record it writes; the created link carries url, name, import date, tags and collection, and no archived flag.11 Shiori’s rewritten reader looks up four column indices and does not look up status at all.12 Karakeep is the case where documentation and code disagree in the reader’s favour: its import page states that titles, tags and addition date are preserved and says nothing about read state, while the parser and the import worker read on the same date do carry the archived flag through.1810 Raindrop.io’s own import documentation lists the CSV fields it accepts as “url (required), folder, title, note, tags, created (optional)” — a set with no read-state member.14
linkding shows what the absence costs on the other side. Because the Netscape format has no read-state attribute, linkding’s exporter appends the literal string linkding:bookmarks.archived to the TAGS attribute of archived bookmarks and writes unread as TOREAD="1"; its parser strips that magic tag back out on the way in.65 The round trip works between two linkding instances and carries nothing to anyone else. Read state, in this whole ecosystem, is either a column or a convention, and conventions do not cross tools.
The workaround the format forces is to move the field out of the column and into the file boundary. In the Ask HN thread on Pocket alternatives, commenter floundy wrote on 2025-07-17 that they filtered the CSV into two files, one for unread articles and one for archived ones, and imported each into wallabag separately, because its import feature offered a mark-as-read setting per import rather than per row.15 That per-import switch is visible in wallabag’s source: when the option is set, the abstract importer passes every row of the run through setEntryAsRead, which sets is_archived to archive.13 Stated as a rule: a collection whose read state carries meaning requires either a destination that reads status per row or a split of the export on that column before import; there is no third option, and no later repair.
Highlights had no column to be dropped from
Mozilla’s support article answers the question “What is contained in the export file?” twice, differently. In the Internet Archive capture of 2025-05-15, describing an HTML export, it reads: “Your export file will include links (URLs) of your saved items. The export does not extract the text of saved links. Additionally, the export does not contain tags or highlights.”16 In the capture of 2025-10-07, describing a CSV export, the same passage reads: “Additionally, the export does contain tags or highlights.”2
What is observable is that the CSV carries a tags column, which five separate importers read. No importer examined reads a highlights column, and neither of the two attested header shapes names one. Whether any file inside a Pocket export zip carried highlights in some other form could not be verified by this publication. What is certain is what the deadline covered: Mozilla’s note states that highlights and notes were among the data deleted automatically after the export window closed.2
This is the general shape of the loss and it is not specific to Pocket. The URL survives because every system has a field for it. The annotation — the highlight, the note, the reason the page was saved — is the part with no interchange representation, so it is the part that does not travel.
Why the row counts will not match, and which mismatches are fine
Verification after an import means counting. Exact equality is the wrong test, because several importers legitimately discard rows. Readeck rejects any URL whose scheme is not in its allowed list — its own test fixture includes an ftp:// row for that case — and it clears the fragment from every URL it accepts, so two saves differing only after the # collapse into one.98 Linkwarden constructs a URL from each row and skips the row if that throws.11 Shiori strips UTM parameters from each URL, skips a row whose time_added will not parse as an integer, and skips a URL already present in the file or in the database.12 Wallabag looks up each URL against the existing entries for that user and increments a skipped counter instead of writing a duplicate.13 And the header row itself is one line.
So the useful check is per file rather than per library: rows in the file, minus one for the header, compared against the count that importer reports, with the difference explained by scheme, fragment and duplicate rules that are written down in its source. A single grand total across a multi-file export explains nothing.
An import is also a crawl
Two numbers get conflated after a migration: how many rows were written, and how many pages the destination could fetch. Only the first is a property of the file. Wallabag’s Pocket importer calls fetchContent for every entry as it is created, so an import of a large library is an outbound request per row.13 Wallabag issue #8268, opened 2025-06-05 against 2.6.13, reports about 1,300 articles importing a different, random number each attempt, with the import timing out.17 Linkwarden wraps its whole Pocket import in a database transaction with an explicit timeout: 30000.11
Fetching also fails for reasons that have nothing to do with the importer. In the same 2025-07-17 thread, floundy reported that about ten per cent of their articles did not download, on CAPTCHA requirements or paywalls added since the article was saved.15 That figure is one person’s account of one library on one date and is not a general rate; the mechanism behind it, however, is structural. A URL saved in 2013 points at a 2026 page, and the destination is fetching the 2026 one.
What follows, stated as rules
These operate on a reader’s own file, as of 2026-08-06.
- Read the first line of the CSV before choosing a destination. If it names six fields, an importer that reads columns by position will misfile them without reporting an error; if it names five, an older positional importer may refuse it outright.
- Keep the original export unmodified and import a copy. As of 2026-08-06
getpocket.com/exportredirects to Pocket’s closure notice, so no second export can be requested. - If read state carries meaning, check whether the destination reads
status. If it does not, split the file on that column before importing, because after the import the distinction no longer exists anywhere. - Count per file, not per library, and account for the difference from documented rules rather than assuming loss.
- A collection that must answer “what did that page say” after the source goes offline requires a destination that stores retrieved text or a snapshot; one that only needs to be re-findable does not. That is a property of the destination, not of the export.
- No importer restores a field the export never contained.
Where to find it now
- Pocket, the service
- Gone Announced 2025-05-22, stopped serving 2025-07-08. Mozilla states that remaining data — including highlights and notes — was deleted automatically once the export window closed; the closing date is given as 10/08/2025 in the body of Mozilla’s export article and as November 12, 2025 in the note at its head, and which was operative could not be verified. No read-only remnant. Checked 2026-08-06.
- The export endpoint,
getpocket.com/export - Returns HTTP 302 to
/home, which serves Pocket’s closure notice and no export control (checked 2026-08-06). An export taken while the window was open is the only surviving copy of an individual library; nothing in this article recovers one that was not taken. - The export format itself
- Survives as documentation and as test fixtures rather than as a specification. The six-column header is recorded verbatim in Karakeep issue #570 (2024-10-19) and in Readeck’s committed fixture
internal/bookmarks/importer/fixtures/pocket_part.csv; the five-column header is recorded in Shiori issue #1110 (2025-05-30). Both retrieved 2026-08-06. - Mozilla’s export documentation
- Still served at support.mozilla.org and captured by the Internet Archive across the transition: 2025-05-15 describes an HTML export, 2025-10-07 and 2026-04-20 describe a CSV export, the sentence about tags and highlights differs between them, and the 2026-04-20 capture carries the line that the article is no longer maintained. Captures retrieved 2026-08-06.
- Pocket highlights
- No export representation was located in any importer source or header shape examined. Whether the export carried them in another form could not be verified. Deleted with the accounts after the export window closed.
- The importers
- All live and independently checkable at the versions cited: wallabag 2.6.14 (2025-10-07), Karakeep v0.33.1 (2026-08-01), Readeck 0.22.3 (2026-04-16), Linkwarden v2.16.0 (2026-07-28), Shiori v1.8.0 (2025-09-26), linkding v1.45.0 (2026-01-06). Release tags read 2026-08-06.
References
- Mendes, Marcus. “Mozilla announces shutdown of Pocket as it refocuses on Firefox.” 9to5Mac, 2025-05-22. https://9to5mac.com/2025/05/22/mozilla-announces-shutdown-of-pocket/ — retrieved 2026-08-06. ↩
- Mozilla Support contributors. “How to export your Pocket saves.” support.mozilla.org, last updated 2025-06-13 per the page. Internet Archive capture 2025-10-07. https://web.archive.org/web/20251007081536/https://support.mozilla.org/en-US/kb/exporting-your-pocket-list — retrieved 2026-08-06. ↩
- daniel-l. “Import from Pocket: Pocket now mails you zipped CSV files.” karakeep-app/karakeep issue #570, 2024-10-19. https://github.com/karakeep-app/karakeep/issues/570 — retrieved 2026-08-06. ↩
- Microsoft. “Netscape Bookmark File Format (Internet Explorer).” Microsoft Learn, archived Internet Explorer documentation, 2017-08-15. https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa753582(v=vs.85) — retrieved 2026-08-06. ↩
- Ißbrücker, Sascha, and contributors. “bookmarks/services/parser.py.” sissbruecker/linkding, branch master, n.d. https://github.com/sissbruecker/linkding/blob/master/bookmarks/services/parser.py — retrieved 2026-08-06. ↩
- Ißbrücker, Sascha, and contributors. “bookmarks/services/exporter.py.” sissbruecker/linkding, branch master, n.d. https://github.com/sissbruecker/linkding/blob/master/bookmarks/services/exporter.py — retrieved 2026-08-06. ↩
- LordEidi. “Pocket import fails with CSV parsing error.” go-shiori/shiori issue #1110, 2025-05-30. https://github.com/go-shiori/shiori/issues/1110 — retrieved 2026-08-06. ↩
- Readeck contributors. “internal/bookmarks/importer/fixtures/pocket_part.csv.” readeck/readeck, branch main, n.d. https://codeberg.org/readeck/readeck/src/branch/main/internal/bookmarks/importer/fixtures/pocket_part.csv — retrieved 2026-08-06. ↩
- Meunier, Olivier, and contributors. “internal/bookmarks/importer/pocket_file.go.” readeck/readeck, branch main, n.d. https://codeberg.org/readeck/readeck/src/branch/main/internal/bookmarks/importer/pocket_file.go — retrieved 2026-08-06. ↩
- Karakeep contributors. “packages/shared/import-export/parsers.ts and packages/shared/import-export/importer.ts.” karakeep-app/karakeep, branch main, n.d. https://github.com/karakeep-app/karakeep/blob/main/packages/shared/import-export/parsers.ts — retrieved 2026-08-06. ↩
- Linkwarden contributors. “apps/web/lib/api/controllers/migration/importFromPocket.ts.” linkwarden/linkwarden, branch main, n.d. https://github.com/linkwarden/linkwarden/blob/main/apps/web/lib/api/controllers/migration/importFromPocket.ts — retrieved 2026-08-06. ↩
- Shiori contributors. “internal/cmd/pocket.go.” go-shiori/shiori, tag v1.8.0, 2025-09-26. https://github.com/go-shiori/shiori/blob/v1.8.0/internal/cmd/pocket.go — retrieved 2026-08-06. ↩
- wallabag contributors. “src/Wallabag/ImportBundle/Import/PocketCsvImport.php and AbstractImport.php.” wallabag/wallabag, tag 2.6.14, 2025-10-07. https://github.com/wallabag/wallabag/blob/2.6.14/src/Wallabag/ImportBundle/Import/PocketCsvImport.php — retrieved 2026-08-06. ↩
- Raindrop.io. “Import.” help.raindrop.io, n.d. https://help.raindrop.io/import — retrieved 2026-08-06. ↩
- floundy. Comment 44597956 in ahmedfromtunis, “Ask HN: What Pocket alternatives did you move to?” Hacker News item 44597668, 2025-07-17. https://news.ycombinator.com/item?id=44597956 — retrieved 2026-08-06. ↩
- Mozilla Support contributors. “How to export your Pocket saves.” support.mozilla.org, n.d. Internet Archive capture 2025-05-15. https://web.archive.org/web/20250515164422/https://support.mozilla.org/en-US/kb/exporting-your-pocket-list — retrieved 2026-08-06. ↩
- sunilnc. “Issues when importing Pocket CSV feed.” wallabag/wallabag issue #8268, 2025-06-05. https://github.com/wallabag/wallabag/issues/8268 — retrieved 2026-08-06. ↩
- Karakeep contributors. “Import your library.” Karakeep documentation, n.d. https://github.com/karakeep-app/karakeep/blob/main/docs/docs/04-using-karakeep/import.md — retrieved 2026-08-06. ↩
- Mozilla Support contributors. “How to export your Pocket saves.” support.mozilla.org, n.d. Internet Archive capture 2026-04-20. https://web.archive.org/web/20260420164430/https://support.mozilla.org/en-US/kb/exporting-your-pocket-list — retrieved 2026-08-06. ↩
- Pocket. “So long, farewell, Auf Wiedersehen…” getpocket.com, n.d. https://getpocket.com/export — retrieved 2026-08-06. ↩
Notes
- No product named in this article was installed, run or otherwise used by this publication. Every statement about importer behaviour is read from the source file or documentation page cited, and every consequence drawn from it — including the effect of a positional read on a six-column row — follows from the published code and the published header rather than from an observed import. ↩
- Where a row in the matrix names a branch rather than a tag, the file was read from that branch on 2026-08-06 and may differ from the most recent tagged release, whose number is given in Where to find it now. Where a row names a tag, the file was read at that tag. ↩
- Instapaper is absent from the matrix. It is frequently named as a Pocket destination, but no first-party document stating its field-level import behaviour could be retrieved on 2026-08-06, and this publication does not fill a cell from a secondary account. ↩