{"id":16726783,"url":"https://github.com/taitems/sniper-link","last_synced_at":"2026-01-28T17:02:30.718Z","repository":{"id":63387600,"uuid":"566738902","full_name":"taitems/sniper-link","owner":"taitems","description":"Create sniper links programmatically ","archived":false,"fork":false,"pushed_at":"2022-11-28T10:08:13.000Z","size":341,"stargazers_count":10,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-24T11:32:52.956Z","etag":null,"topics":["conversion-rate-optimization","email","signup","ux"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/sniper-link","language":"JavaScript","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/taitems.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["taitems"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2022-11-16T10:12:14.000Z","updated_at":"2025-06-09T11:08:48.000Z","dependencies_parsed_at":"2023-01-23T18:46:09.616Z","dependency_job_id":null,"html_url":"https://github.com/taitems/sniper-link","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/taitems/sniper-link","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taitems%2Fsniper-link","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taitems%2Fsniper-link/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taitems%2Fsniper-link/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taitems%2Fsniper-link/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taitems","download_url":"https://codeload.github.com/taitems/sniper-link/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taitems%2Fsniper-link/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28847054,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["conversion-rate-optimization","email","signup","ux"],"created_at":"2024-10-12T22:54:22.756Z","updated_at":"2026-01-28T17:02:30.698Z","avatar_url":"https://github.com/taitems.png","language":"JavaScript","funding_links":["https://github.com/sponsors/taitems"],"categories":[],"sub_categories":[],"readme":"![npm](https://img.shields.io/npm/v/sniper-link) ![npm](https://img.shields.io/npm/dm/sniper-link) ![GitHub Sponsors](https://img.shields.io/github/sponsors/taitems)\n\n# sniper-link (under development)\n\nWhat is a [sniper link](https://growth.design/sniper-link)? Let **growth.design** explain:\n\n\u003e A Sniper Link is a special link that makes it easier for new users to confirm their email after a signup. It typically simulates an inbox search, which minimizes distractions while leading users to the inbox of their email service provider detected on signup.\n\n\u003e With Sniper Links, your new users will only see YOUR confirmation email in their inbox, nothing else. It works even if you landed in their spam.\n\n\u003e This onboarding technique was coined by Dan Benoni in 2019.\n\n### Feature Support Table\n\n|                    | Gmail | Outlook | Yahoo | Proton | iCloud |\n| ------------------ | ----- | ------- | ----- | ------ | ------ |\n| Account scope      | ✅    | ✅      |       |        |        |\n| From filter        | ✅    |         | ✅    | ✅     |        |\n| Spam piercer       | ✅    |         | ✅    | ✅     |        |\n| Time frame (days)  | ✅    |         | ✅    | ✅     |        |\n| Time frame (hours) | ✅    |         |       | ✅     |        |\n\nLegend:\n\n- ✅ = Supported by this provider and the script\n- \\*️⃣ = Supported by the provider, but not by the script as yet\n\n## Installation\n\nUsing the node package manager of your choice, either\n\n`yarn add sniper-link` or `npm install sniper-link`\n\n## Usage\n\nSubject to change while this script is in an alpha version. Currently it builds three versions:\n\n- A node version in `dist/node/index.js`\n- Web esm for React/Svelte etc `dist/web/esm.js`\n- Web IIFE for native and legacy js `dist/web/iife.js`\n\n### Feature Support Table\n\n|                    | Expects         | Required? | Notes |\n| ------------------ | --------------- | --------- | ----- |\n| `email`            | String (email)  | ✅ Yes    | User's email inbox to search. |\n| `from`             | String          |           | Sender's email address. Can be an email, or partial match.      |\n| `forceProvider`    | String ('google', 'yahoo', 'microsoft', 'proton', 'icloud') |           | Optional override to skip email provider being detected from the provided string. Useful for when you already know `jessie@company.com` is using G-Suite under the hood, possibly via a MX lookup. |\n| `daysAgo`          | Number          |           | Sent within the last 'x' days      |\n| `hoursAgo`         | Number          |           | Sent within the last 'y' hours. See note below.       |\n\n- You cannot use a combination of `daysAgo` and `hoursAgo`. If `hoursAgo` are specified, they will be used in preference.\n- Yes, you could use `forceProvider` to make `lee@yahoo.com` to open `mail.google.com` -- that's on you.\n\n#### Example\n\nA node.js example\n\n```js\nconst buildUrl = require('sniper-link/dist/node');\n\nconsole.log(\n  buildUrl({\n    email: 'username@gmail.com',\n    from: '@userfront.com',\n    daysAgo: 1,\n  }),\n);\n\n// Logs the following\n// {\n//   provider: 'google',\n//   link: 'https://mail.google.com/mail/u/username@gmail.com/#search/from%3A(@userfront.com)+in%3Aanywhere'\n// }\n```\n\n## Roadmap\n\n- Return Android and iOS links with app protocols?\n- Add a subject/keyword filter (very low priority)?\n- Consider more popular [non-western email providers](https://www.quora.com/Who-are-the-top-5-email-providers-in-China-Are-there-any-stats-around-their-marketshare)\n\n## Development\n\nRun either `npm run build` or `yarn build` to output to the `dist` folder\n\n## Testing\n\nRun `npm run test` or `yarn test` to run tests via Jest. `--watch` flag supported.\n\n---\n\n## Disclaimer\n\nI am in no way affiliated with the team at [growth.design](https://growth.design), I am merely a fan. All credit goes to Dan Benoni for the idea.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaitems%2Fsniper-link","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaitems%2Fsniper-link","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaitems%2Fsniper-link/lists"}