https://github.com/thejustinwalsh/catchy-links
A catchy link shortener for more memorable urls
https://github.com/thejustinwalsh/catchy-links
nextjs redis upstash url-shortener vercel
Last synced: 4 months ago
JSON representation
A catchy link shortener for more memorable urls
- Host: GitHub
- URL: https://github.com/thejustinwalsh/catchy-links
- Owner: thejustinwalsh
- License: mit
- Created: 2021-09-06T17:14:31.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2021-09-07T22:12:41.000Z (about 4 years ago)
- Last Synced: 2025-03-16T08:11:33.509Z (7 months ago)
- Topics: nextjs, redis, upstash, url-shortener, vercel
- Language: TypeScript
- Homepage: https://catchy-links.vercel.app
- Size: 273 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Catchy Links 🔗
> A catchy link shortener for more memorable urls## Features 🚀
- Generate urls using [friendly words](https://github.com/glitchdotcom/friendly-words)
- Each url maps to a determinstic shuffled range and is reversable to and from an 32bit int
- No collisions until > 4,294,967,296 (2^32) links have been geneerated
- Urls are locked to your own domain by default
- Rate limiting## Why 🤷
Sharing long urls sucks. Depending on a third party service hungry for your data does too.I wanted to solve the problem of sharing incredibly long urls containing lz-string url encoded source code for the [ts-defold playground](https://ts-defold.dev/playground) site I am hacking on. Once you have crafted a masterpiece in the code playgroud dropping in a full screen URL into discord seems like bad taste. So, this idea was born.
## Setup, Config & Deploy 👷
1. `npm install`
2. Edit `env.local` with *ENV Variables*
3. `npm run boostrap`
4. `npx vercel`
5. Configure *ENV variables* on [Vercel](https://vercel.com/docs/environment-variables)### ENV Variables ✍️
`FALLBACK_URL` - This url serves two purposes
1. Locks the url generation to the domain provided
2. Is used when the slug is not found to redirect the user to something more useful than a 404`REDIS_URL` - The connection info for the backing redis server
`SENTRY_DNS` - Sentry DNS connection info for error montioring
`RATE_LIMIT_WINDOW` - Time in milliseconds before the rate limit is reset (globally)
`RATE_LIMIT_MAX` - Number of hits within `RATE_LIMIT_WINDOW` before rate limit kicks in
`RANDOM_SEED` - Used in the bootstrap script so we all aren't generating the same url sequences
## API
`GET` `/[slug]` - Redirect to the url held by the slug`POST` `/api/links` - Create a new link `slug` by passing the `url` into the post `body`: `{ url: "https://epiclylong..." }`
## Specifics 🕴️
Built with ❤️ for 🧑🤝🧑 on [Next.js](https://nextjs.org), [Upstash](https://upstash.com), and [Sentry](https://sentry.io).It is recomended to use Vercel integrations for Upsatash and Sentry, or do what you want, I am not your mother.
Rate limiting is using [express-rate-limit](https://www.npmjs.com/package/express-rate-limit) and is not backed by a store.
It is being used as failsafe to protect costs of running the service from someone spaming the URL, and is not strict due to the in memory ip lists running serverless.Fork if you need a feature, PRs always welcome. 🍻