{"id":51008386,"url":"https://github.com/voidd0/tabsnap","last_synced_at":"2026-06-20T23:30:59.571Z","repository":{"id":354572119,"uuid":"1223875241","full_name":"voidd0/tabsnap","owner":"voidd0","description":"One-click browser extension that captures every open tab as plain text, markdown, JSON, or a readme file. Free, MIT, zero telemetry.","archived":false,"fork":false,"pushed_at":"2026-05-19T01:31:41.000Z","size":167,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T02:22:49.629Z","etag":null,"topics":["browser-extension","browser-tools","chrome-extension","edge-extension","firefox-addon","free","javascript","lightweight","manifest-v3","markdown","mit-license","open-source","privacy-focused","productivity","session-restore","tab-management","tab-saver","tabs","voiddo","zero-telemetry"],"latest_commit_sha":null,"homepage":"https://extensions.voiddo.com/tabsnap/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voidd0.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"custom":["https://voiddo.com/contact/","https://scrb.voiddo.com/"]}},"created_at":"2026-04-28T18:34:12.000Z","updated_at":"2026-05-19T01:31:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/voidd0/tabsnap","commit_stats":null,"previous_names":["voidd0/tabsnap"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/voidd0/tabsnap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voidd0%2Ftabsnap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voidd0%2Ftabsnap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voidd0%2Ftabsnap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voidd0%2Ftabsnap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voidd0","download_url":"https://codeload.github.com/voidd0/tabsnap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voidd0%2Ftabsnap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34589204,"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-20T02:00:06.407Z","response_time":98,"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":["browser-extension","browser-tools","chrome-extension","edge-extension","firefox-addon","free","javascript","lightweight","manifest-v3","markdown","mit-license","open-source","privacy-focused","productivity","session-restore","tab-management","tab-saver","tabs","voiddo","zero-telemetry"],"created_at":"2026-06-20T23:30:58.756Z","updated_at":"2026-06-20T23:30:59.565Z","avatar_url":"https://github.com/voidd0.png","language":"JavaScript","funding_links":["https://voiddo.com/contact/","https://scrb.voiddo.com/"],"categories":[],"sub_categories":[],"readme":"# tabsnap\n\n[![npm version](https://img.shields.io/npm/v/@v0idd0/tabsnap.svg?color=A0573A)](https://www.npmjs.com/package/@v0idd0/tabsnap)\n[![npm downloads](https://img.shields.io/npm/dw/@v0idd0/tabsnap.svg?color=1F1A14)](https://www.npmjs.com/package/@v0idd0/tabsnap)\n[![License: MIT](https://img.shields.io/badge/license-MIT-A0573A.svg)](LICENSE)\n[![Manifest V3](https://img.shields.io/badge/manifest-v3-1F1A14)](https://developer.chrome.com/docs/extensions/mv3/intro/)\n[![Built by vøiddo](https://img.shields.io/badge/built%20by-v%C3%B8iddo-1F1A14)](https://voiddo.com/)\n\n\u003e Capture every open tab as a browser-session export: plain text, markdown, JSON, or a readme file.\n\u003e One click in the browser. One pipe in the terminal.\n\u003e Free, MIT, zero telemetry. Optional tracking-param stripping for cleaner exports.\n\n[Browser-extension landing](https://extensions.voiddo.com/tabsnap/) ·\n[CLI landing](https://tools.voiddo.com/tabsnap/) ·\n[npm](https://www.npmjs.com/package/@v0idd0/tabsnap) ·\n[Privacy](https://extensions.voiddo.com/tabsnap/privacy/) ·\n[Compare](https://extensions.voiddo.com/compare/tab-saver/)\n\nIf you think in tab backups, session exports, or a OneTab / Session Buddy alternative that still gives you a clean text artifact, tabsnap is the text-first path.\n\n---\n\n## Two faces, one engine\n\nThe same `snapshot.js` formatters drive both the **browser extension** popup\nand the **`@v0idd0/tabsnap` CLI** on npm. Output bytes are identical for the\nsame inputs.\n\n### As a browser extension\n\nClick the toolbar icon → tabsnap reads the title and URL of every tab you have\nopen and renders them in the popup as one of four formats:\n\n- **markdown** — nested list grouped by window, hostnames as section headers\n- **plain** — one tab per line, title + URL\n- **json** — structured array, ready to feed into another tool\n- **readme.md** — full markdown document with a domain-summary table at the top\n\nHit **copy** or **download** and you're done.\n\n### As a CLI\n\n```sh\nnpm i -g @v0idd0/tabsnap\n\n# pipe any tabs-shaped JSON in, get a snapshot out\ncat tabs.json | tabsnap                    # markdown (default)\ncat tabs.json | tabsnap --format=readme    # readme.md\ncat tabs.json | tabsnap -f json --no-group # flat structured array\ncat tabs.json | tabsnap --strip-tracking    # clean tracking params first\n\n# from file\ntabsnap --file=tabs.json -f plain\n\n# include pinned + incognito tabs (skipped by default)\ntabsnap --include-pinned --include-incognito \u003c tabs.json\n\n# strip common marketing params from exported URLs\ntabsnap --strip-tracking -f readme \u003c tabs.json\n\n# pipe to clipboard (macOS) or any tool\ntabsnap --format=readme \u003c tabs.json | pbcopy\n```\n\nAccepted input shapes (the CLI auto-detects):\n\n```jsonc\n// 1) bare array\n[ {\"title\":\"…\",\"url\":\"…\",\"windowId\":1,\"pinned\":false}, … ]\n\n// 2) {tabs:[…]} wrapper\n{ \"tabs\": [ … ] }\n\n// 3) {windows:[{tabs:[…]}]} wrapper — also matches the JSON tabsnap exports\n{ \"windows\": [ {\"window_index\":1, \"tabs\":[…]}, … ] }\n```\n\n### As a library\n\n```js\nconst { formatTabs, filterTabs, groupTabsByWindow, countByDomain } = require('@v0idd0/tabsnap');\n\nconst out = formatTabs(myTabs, 'markdown', {\n  groupByWindow: true,\n  includePinned: false,\n  includeIncognito: false,\n});\n```\n\nPure functions, zero deps, works in any JS runtime that has `URL` + `Date`.\n\n## Privacy\n\ntabsnap reads only `chrome.tabs` metadata (title, URL, windowId, pinned,\nincognito) and only when you click the toolbar icon. **No backend. No\nanalytics. No telemetry.** Your tabs never leave your machine.\n\nPermissions:\n\n- `tabs` — list open tabs\n- `downloads` — save the snapshot to a file (only on user click)\n- `storage` — remember your popup preferences across sessions\n\nNo host permissions. No `activeTab`. No content scripts.\n\nThe CLI is a Node.js process — it cannot reach the browser. It only formats\nJSON you hand it.\n\n## Repo layout\n\n    chrome/      Manifest V3 source for Chrome / Edge / Brave\n    firefox/     Manifest V3 source with browser_specific_settings.gecko\n    edge/        Manifest V3 source (mirrors chrome/)\n    src/         CLI / library source — published to npm as @v0idd0/tabsnap\n    bin/         CLI entry point\n    test.js      40 smoke tests for the lib + CLI\n    dist/        Pre-built ZIPs ready for store submission\n    shared/      Files copied into each platform tree at build time\n\n## Build\n\nThe platform directories are already self-contained — load any of\n`chrome/`, `firefox/`, or `edge/` as an unpacked extension in the matching\nbrowser. The pre-built ZIPs in `dist/` are produced by zipping each platform\ndirectory.\n\nThe npm package ships only `src/`, `bin/`, `README.md`, and `LICENSE` (whitelisted\nvia the `files` field in `package.json`).\n\n```sh\nnode test.js     # run all 40 tests\nnpm publish --access public\n```\n\n## From the same studio\n\n- **[@v0idd0/interviewprep](https://www.npmjs.com/package/@v0idd0/interviewprep)** — turn a job posting into a prep brief, then export it in browser or CLI\n- **[@v0idd0/jsonyo](https://www.npmjs.com/package/@v0idd0/jsonyo)** — JSON swiss army knife, 18 commands, zero limits\n- **[@v0idd0/envguard](https://www.npmjs.com/package/@v0idd0/envguard)** — stop shipping `.env` drift to staging\n- **[@v0idd0/depcheck](https://www.npmjs.com/package/@v0idd0/depcheck)** — find unused dependencies in one command\n- **[@v0idd0/gitstats](https://www.npmjs.com/package/@v0idd0/gitstats)** — git repo analytics, one command\n- **[View all tools →](https://voiddo.com/tools/)**\n\n## License\n\nMIT — see `LICENSE`.\n\n---\n\nBuilt by [vøiddo](https://voiddo.com/) — a small studio shipping AI-flavoured products, free dev tools, Chrome extensions and weird browser games.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoidd0%2Ftabsnap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoidd0%2Ftabsnap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoidd0%2Ftabsnap/lists"}