Description
A simple and fast URL Shortener built with JavaScript that converts long links into short, easy-to-share URLs 🔗. The project features a clean user interface, quick link generation, and responsive design for smooth performance across devices.
Key features
- Created with self-host in mind:
- Zero configuration needed
- Easy setup with no build step
- Supporting various databases (SQLite, Postgres, MySQL)
- Ability to disable registration and anonymous links
- OpenID Connect (OIDC) login
- Custom domain support
- Set custom URLs, password, description, and expiration time for links
- View, edit, delete and manage your links
- Private statistics for shortened URLs
- Admin page to manage users and links
- Customizability and themes
- RESTful API
Configuration
The app is configured via environment variables. You can pass environment variables directly or create a .env file. View .example.env file for the list of configurations.
All variables are optional except JWT_SECRET which is required on production.
You can use files for each of the variables by appending _FILE to the name of the variable. Example: JWT_SECRET_FILE=/path/to/secret_file.
| Variable | Description | Default | Example |
|---|---|---|---|
JWT_SECRET |
This is used to sign authentication tokens. Use a long random string. | – | – |
PORT |
The port to start the app on | 3000 |
8888 |
SITE_NAME |
Name of the website | Kutt |
Your Site |
DEFAULT_DOMAIN |
The domain address that this app runs on | localhost:3000 |
yoursite.com |
LINK_LENGTH |
The length of of shortened address | 6 |
5 |
LINK_CUSTOM_ALPHABET |
Alphabet used to generate custom addresses. Default value omits o, O, 0, i, I, l, 1, and j to avoid confusion when reading the URL. | (abcd..789) | abcABC^&*()@ |
DISALLOW_REGISTRATION |
Disable registration. Note that if MAIL_ENABLED is set to false, then the registration would still be disabled since it relies on emails to sign up users. |
true |
false |
DISALLOW_LOGIN_FORM |
Disable login with email and password. Only makes sense if OIDC is enabled. | false |
true |
DISALLOW_ANONYMOUS_LINKS |
Disable anonymous link creation | true |
false |
TRUST_PROXY |
If the app is running behind a proxy server like NGINX or Cloudflare and that it should get the IP address from that proxy server. If you’re not using a proxy server then set this to false, otherwise users can override their IP address. | true |
false |
DB_CLIENT |
Which database client to use. Supported clients: pg or pg-native for Postgres, mysql2 for MySQL or MariaDB, sqlite3 and better-sqlite3 for SQLite. NOTE: pg-native and sqlite3 are not installed by default, use npm to install them before use. |
better-sqlite3 |
pg |
DB_FILENAME |
File path for the SQLite database. Only if you use SQLite. | db/data |
/var/lib/data |
DB_HOST |
Database connection host. Only if you use Postgres or MySQL. | localhost |
your-db-host.com |
DB_PORT |
Database port. Only if you use Postgres or MySQL. | 5432Â (Postgres) |
3306Â (MySQL) |
DB_NAME |
Database name. Only if you use Postgres or MySQL. | kutt |
mydb |
DB_USER |
Database user. Only if you use Postgres or MySQL. | postgres |
myuser |
DB_PASSWORD |
Database password. Only if you use Postgres or MySQL. | – | mypassword |
DB_SSL |
Whether use SSL for the database connection. Only if you use Postgres or MySQL. | false |
true |
DB_POOL_MIN |
Minimum number of database connection pools. Only if you use Postgres or MySQL. | 0 |
2 |
DB_POOL_MAX |
Maximum number of database connection pools. Only if you use Postgres or MySQL. | 10 |
5 |
REDIS_ENABLED |
Whether to use Redis for cache | false |
true |
REDIS_HOST |
Redis connection host | 127.0.0.1 |
your-redis-host.com |
REDIS_PORT |
Redis port | 6379 |
6379 |
REDIS_PASSWORD |
Redis password | – | mypassword |
REDIS_DB |
Redis database number, between 0 and 15. | 0 |
1 |
SERVER_IP_ADDRESS |
The IP address shown to the user on the setting’s page. It’s only for display purposes and has no other use. | – | 1.2.3.4 |
SERVER_CNAME_ADDRESS |
The subdomain shown to the user on the setting’s page. It’s only for display purposes and has no other use. | – | custom.yoursite.com |
CUSTOM_DOMAIN_USE_HTTPS |
Use https for links with custom domain. It’s on you to generate SSL certificates for those domains manually—at least on this version for now. | false |
true |
ENABLE_RATE_LIMIT |
Enable rate limiting for some API routes. If Redis is enabled uses Redis, otherwise, uses memory. | false |
true |
MAIL_ENABLED |
Enable emails, which are used for signup, verifying or changing email address, resetting password, and sending reports. If is disabled, all these functionalities will be disabled too. | false |
true |
MAIL_HOST |
Email server host | – | your-mail-server.com |
MAIL_PORT |
Email server port | 587 |
465Â (SSL) |
MAIL_USER |
Email server user | – | myuser |
MAIL_PASSWORD |
Email server password for the user | – | mypassword |
MAIL_FROM |
Email address to send the user from | – | example@yoursite.com |
MAIL_SECURE |
Whether use SSL for the email server connection | false |
true |
OIDC_ENABLED |
Enable OpenID Connect | false |
true |
OIDC_ISSUER |
OIDC issuer URL | – | https://example.com/some/path |
OIDC_CLIENT_ID |
OIDC client id | – | example-app |
OIDC_CLIENT_SECRET |
OIDC client secret | – | some-secret |
OIDC_SCOPE |
OIDC Scope | openid profile email |
openid email |
OIDC_EMAIL_CLAIM |
Name of the field to get user’s email from | email |
userEmail |
REPORT_EMAIL |
The email address that will receive submitted reports | – | example@yoursite.com |
CONTACT_EMAIL |
The support email address to show on the app | – | example@yoursite.com |





Reviews
There are no reviews yet.