{"id":50475840,"url":"https://github.com/mattstein/export-reeder-starred","last_synced_at":"2026-06-01T13:02:13.836Z","repository":{"id":354536562,"uuid":"1185481520","full_name":"mattstein/export-reeder-starred","owner":"mattstein","description":"Export Reeder 5 starred posts into JSON or CSV format.","archived":false,"fork":false,"pushed_at":"2026-03-18T16:21:46.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T02:11:36.989Z","etag":null,"topics":["reeder","rss"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattstein.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-18T16:19:24.000Z","updated_at":"2026-03-18T16:22:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mattstein/export-reeder-starred","commit_stats":null,"previous_names":["mattstein/export-reeder-starred"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/mattstein/export-reeder-starred","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattstein%2Fexport-reeder-starred","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattstein%2Fexport-reeder-starred/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattstein%2Fexport-reeder-starred/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattstein%2Fexport-reeder-starred/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattstein","download_url":"https://codeload.github.com/mattstein/export-reeder-starred/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattstein%2Fexport-reeder-starred/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33775864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["reeder","rss"],"created_at":"2026-06-01T13:02:11.807Z","updated_at":"2026-06-01T13:02:13.826Z","avatar_url":"https://github.com/mattstein.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# export-reeder-starred\n\nExports starred items from Reeder 5’s local database to JSON or CSV.\n\n## What it does\n\nReads Reeder 5’s Realm database directly from its sandbox location, extracts all starred items, and writes them to stdout or a file. Each record includes:\n\n| Field | Notes |\n|-------|-------|\n| `title` | Article title |\n| `link` | Article URL |\n| `author` | Author name |\n| `feedUrl` | Feed URL (Reeder doesn’t store a feed title in the DB) |\n| `starredDate` | ISO 8601 timestamp |\n| `summary` | Plain-text excerpt |\n\nResults are sorted newest-starred first.\n\n## Requirements\n\n- **Reeder 5 for Mac** — the database lives at `~/Library/Containers/com.reederapp.5.macOS/Data/Library/Application Support/default.realm`\n- **macOS 13+**\n- **Swift 5.9+** (ships with Xcode 15+; check with `swift --version`)\n\nNo need to close Reeder before running — the tool copies the database to a temp directory before opening it, so the original is never touched.\n\n## Build\n\nFirst build downloads ~300 MB of realm-core and takes several minutes. Subsequent builds are fast.\n\n```sh\ncd /Users/mattstein/Projects/export-reeder-starred\nswift build -c release\n```\n\nThe binary lands at `.build/release/export-reeder-starred`.\n\nOptionally copy it somewhere permanent:\n\n```sh\ncp .build/release/export-reeder-starred /usr/local/bin/\n```\n\n## Usage\n\n```\nexport-reeder-starred [options]\n\nOptions:\n  -f, --format \u003cjson|csv\u003e   Output format (default: json)\n  -o, --output \u003cpath\u003e       Write to file instead of stdout\n  -r, --realm \u003cpath\u003e        Realm file (default: Reeder 5 on current user)\n  -h, --help                Show this help\n```\n\n**JSON to stdout:**\n```sh\n.build/release/export-reeder-starred\n```\n\n**CSV to a file:**\n```sh\n.build/release/export-reeder-starred -f csv -o ~/Desktop/starred.csv\n```\n\n**JSON to a file:**\n```sh\n.build/release/export-reeder-starred -o ~/Desktop/starred.json\n```\n\n## Non-obvious things\n\n### realm-swift is pinned to an exact version — don’t upgrade it carelessly\n\n`Package.swift` uses `exact: \"10.32.0\"` (realm-core 12.9.0). This is not arbitrary:\n\n- **realm-core 13.x deadlocks** when opening Reeder’s format-9 file from a CLI process. The exception handler’s cold path (`Exception::what()`) and the notification listener thread (`kevent`) wait on each other and never resolve.\n- **realm-core 14+** dropped support for file format 9 entirely and returns an immediate error.\n- realm-core **12.9.0** is the sweet spot: it supports format 9 and produces real errors instead of deadlocking.\n\nIf Reeder ever upgrades to a newer Realm (writing format 10+), you’d need to bump the realm-swift dependency accordingly.\n\n### The file must be copied before opening\n\nOpening format 9 in read-only mode is rejected by realm-core 12.x — it needs write access to upgrade the format to its native version (22). The tool copies `default.realm` to a temp directory, upgrades the copy, reads it, and deletes the copy on exit.\n\n### The schema has some surprises\n\n- `Item.starred` is stored as `Int` (0 or 1), not `Bool`\n- `Item.starredDate` is stored as a `Double` (Unix timestamp), not a `Date`\n- `Feed` has **no title field** — the feed URL is the closest identifier available\n- Both `Item` and `Feed` use `String` primary keys\n\n### Migration version must be higher than the file’s\n\nReeder sets the Realm schema version to `1`. The tool sets `schemaVersion: 2` with a no-op migration block. This is what tells realm-core “I know the schema changed, proceed anyway” — without a higher version number, realm-core refuses to open the file when the Swift model definitions don’t exactly match what’s stored.\n\n### Realm work runs on a dedicated thread\n\nIn CLI processes (no AppKit run loop), certain realm-core internal schedulers can stall. All Realm operations run on a background `Thread` while the main thread spins `RunLoop.main` to drain any callbacks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattstein%2Fexport-reeder-starred","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattstein%2Fexport-reeder-starred","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattstein%2Fexport-reeder-starred/lists"}