A Self-Hostable URL Deeplinker with Analytics!
2
stars
18
commits
JavaScript
primary language
Aug 25, 2026
updated
A self-hosted deep-link generator for your Instagram bio, with a private analytics dashboard.
Instead of placing a raw destination URL in your bio, use a deeplinker URL
such as yourdomain.com/l/some-slug. When someone opens it in an in-app
browser, deeplinker attempts to open the destination in the native app or
the visitor's actual browser. It always shows a visible Continue button
as a fallback.
Each public link open is logged with a timestamp, coarse operating system, browser, device type, and referrer domain. No IP addresses, cookies, or fingerprinting are used for visitor analytics.
Some screenshots of my deployed deeplinker!
| New link | Public redirect page |
![]() | ![]() |
| Dashboard | Link analytics |
![]() | ![]() |
intent:// URL. Android in-app browsers
commonly hand this to Chrome or the matching native app. A browser fallback
URL is included when no matching app is installed.x-safari- escape technique.Automatic iOS escape behavior is not guaranteed. Apple, Meta, and in-app browser vendors can change these behaviors at any time.
Star this repo and then fork it!
Install dependencies:
npm install
Create your local environment file:
Copy-Item .env.example .env.local
Generate a secure session secret:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Open .env.local and set:
UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKENDASHBOARD_PASSWORDSESSION_SECRETNEXT_PUBLIC_SITE_URLFor local development, leave NEXT_PUBLIC_SITE_URL as:
NEXT_PUBLIC_SITE_URL=http://localhost:3000
Start the app:
npm run dev
Then open http://localhost:3000. You will be redirected to /login.
Create an Upstash Redis database, then copy its REST URL and REST token into
.env.local.
The application stores data with these keys:
links:index — set of all slugslink:<slug> — link recordlink:<slug>:count — total openslink:<slug>:stats — OS, browser, device, and referrer countslink:<slug>:daily — daily open countslink:<slug>:events — most recent 200 raw eventsThe dashboard displays the latest 50 events.
Deploy the repository to Vercel or another Next.js-compatible host.
Set the same five environment variables in the deployment environment. Change
NEXT_PUBLIC_SITE_URL to the real production URL, for example:
NEXT_PUBLIC_SITE_URL=https://links.irtaza.xyz
After deployment, add a custom domain if you want a shorter, more trustworthy link for your social-media bio.
https:// or http://./l/<slug> URL in your bio./dashboard to inspect opens, platforms, browsers, referrers, and
recent activity.deeplinker does not store visitor IP addresses, set analytics cookies, or fingerprint users. It records only:
Made with love by Irtaza (me)! Please star the repo!
18 commits
JavaScript
80.3%
CSS
19.7%
A Self-Hostable URL Deeplinker with Analytics!
2
stars
18
commits
JavaScript
primary language
Aug 25, 2026
updated
A self-hosted deep-link generator for your Instagram bio, with a private analytics dashboard.
Instead of placing a raw destination URL in your bio, use a deeplinker URL
such as yourdomain.com/l/some-slug. When someone opens it in an in-app
browser, deeplinker attempts to open the destination in the native app or
the visitor's actual browser. It always shows a visible Continue button
as a fallback.
Each public link open is logged with a timestamp, coarse operating system, browser, device type, and referrer domain. No IP addresses, cookies, or fingerprinting are used for visitor analytics.
Some screenshots of my deployed deeplinker!
| New link | Public redirect page |
![]() | ![]() |
| Dashboard | Link analytics |
![]() | ![]() |
intent:// URL. Android in-app browsers
commonly hand this to Chrome or the matching native app. A browser fallback
URL is included when no matching app is installed.x-safari- escape technique.Automatic iOS escape behavior is not guaranteed. Apple, Meta, and in-app browser vendors can change these behaviors at any time.
Star this repo and then fork it!
Install dependencies:
npm install
Create your local environment file:
Copy-Item .env.example .env.local
Generate a secure session secret:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Open .env.local and set:
UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKENDASHBOARD_PASSWORDSESSION_SECRETNEXT_PUBLIC_SITE_URLFor local development, leave NEXT_PUBLIC_SITE_URL as:
NEXT_PUBLIC_SITE_URL=http://localhost:3000
Start the app:
npm run dev
Then open http://localhost:3000. You will be redirected to /login.
Create an Upstash Redis database, then copy its REST URL and REST token into
.env.local.
The application stores data with these keys:
links:index — set of all slugslink:<slug> — link recordlink:<slug>:count — total openslink:<slug>:stats — OS, browser, device, and referrer countslink:<slug>:daily — daily open countslink:<slug>:events — most recent 200 raw eventsThe dashboard displays the latest 50 events.
Deploy the repository to Vercel or another Next.js-compatible host.
Set the same five environment variables in the deployment environment. Change
NEXT_PUBLIC_SITE_URL to the real production URL, for example:
NEXT_PUBLIC_SITE_URL=https://links.irtaza.xyz
After deployment, add a custom domain if you want a shorter, more trustworthy link for your social-media bio.
https:// or http://./l/<slug> URL in your bio./dashboard to inspect opens, platforms, browsers, referrers, and
recent activity.deeplinker does not store visitor IP addresses, set analytics cookies, or fingerprint users. It records only:
Made with love by Irtaza (me)! Please star the repo!
18 commits
JavaScript
80.3%
CSS
19.7%