Kutt is a free, open source marketing & customer engagement project written in JavaScript and released under MIT. It has 11,107 GitHub stars, 1,511 forks and 80 open issues, and was last pushed 15 days ago. On this registry it ranks #13 of 50 tracked projects in Marketing & Customer Engagement, with 5 head-to-head comparisons available. It gained 16 stars over the last 6 tracked days.

Kutt — Simplify your links with this free, modern URL shortener

What is Kutt?

Kutt is a free, MIT-licensed, self-hosted URL shortener written in JavaScript for individuals, teams, and organisations that want branded short links on their own infrastructure rather than a rented hosted service.

What it is

Kutt is a modern URL shortener with support for custom domains. It lets an operator create and edit links, view statistics, and manage users, and it is designed from the ground up with self-hosting in mind rather than as a hosted product with an open-source core. It lives in the JavaScript and Node.js ecosystem, is distributed under the MIT licence, and is maintained by thedevs-network with roughly 11,100 stars and 1,500 forks on GitHub.

The concrete problem it solves is replacing a third-party hosted shortener — the kind that owns the short domain, meters your clicks, and can change its pricing or shut down — with an instance you control. Because custom domain support is built in, the short links a team hands out can sit on a domain the organisation already owns, and the click statistics they generate stay in that organisation's own database. The README explicitly presents self-hosting, zero configuration, and no build step as the design goals.

Key capabilities

  • Custom domain support, so shortened links can be served from a domain the operator controls.
  • Per-link options for custom URL slugs, passwords, descriptions, and expiration times.
  • Private statistics for shortened URLs, visible to the operator rather than a third party.
  • Admin page for managing users and links across the instance.
  • OpenID Connect (OIDC) login, alongside the ability to disable registration and anonymous link creation entirely.
  • Choice of database backend: SQLite by default, with Postgres and MySQL/MariaDB supported, plus optional Redis for the cache.
  • RESTful API with documentation at docs.kutt.to, and a themes and customisation layer for the front end.

Who uses it and how

  • Small teams and individuals who want their own short domain without running a full marketing platform, deployed as a single Node.js service.
  • Organisations with authentication requirements that need OIDC login and registration disabled, so only known accounts can create links.
  • Privacy-conscious operators who keep link analytics in their own SQLite, Postgres, or MariaDB instance instead of exporting click data to a vendor.
  • Teams with existing tooling that integrate through the RESTful API rather than the web interface.
  • Operators who prefer containers, using the official kutt/kutt image on Docker Hub or one of the provided compose configurations.

Getting started

The only prerequisite is Node.js version 20 or above: clone the repository, run npm install, then npm run migrate, then npm start for production or npm run dev for development, and create the admin account when first prompted. Alternatively, with Docker installed, run docker compose up from the root directory, or pick one of the supplied compose files such as docker-compose.postgres.yml or docker-compose.mariadb.yml.

How it compares

No list of paid products this project replaces is provided in the facts, and no comparable tools are named, so Kutt stands alone in this registry. It is best understood on its own terms: a permissively licensed, self-hostable shortener rather than a commercial service.

When to use it — and when not to

A self-hoster must operate the Node.js application, a database (SQLite by default, or Postgres/MySQL/MariaDB), optionally Redis, and set JWT_SECRET, which is required in production. Someone who wants zero operational work, or who needs a hosted shortener with a support contract, should not pick it. One real caution from the README: the kutt.it domain is no longer owned by the project and may be a phishing site, so all links and documentation should be reached through kutt.to instead.

project readme (upstream, from github) — read inline

Kutt.to

Kutt.to

Kutt is a modern URL shortener with support for custom domains. Create and edit links, view statistics, manage users, and more.

https://kutt.to

[!WARNING] kutt.it is NOT OWNED BY US. It could be a phishing site. We had the domain but it has been deactivated by the Italian TLD registrar due to the lack of identification documents, and now it's owned by someone else.

Please use kutt.to, all the previous and the future links work with this domain as well.

docker-build-release Uptime Status Contributions GitHub license

Table of contents

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

Donations and sponsors

Support the development of Kutt by making a donation or becoming an sponsor.

Donate or sponsor →

Setup

The only prerequisite is Node.js (version 20 or above). The default database is SQLite. You can optionally install Postgres or MySQL/MariaDB for the database or Redis for the cache.

When you first start the app, you're prompted to create an admin account.

  1. Clone this repository or download the latest zip
  2. Install dependencies: npm install
  3. Initialize database: npm run migrate
  4. Start the app for development npm run dev or production npm start

Docker

Make sure Docker is installed, then you can start the app from the root directory:

docker compose up

Various docker-compose configurations are available. Use docker compose -f up to start the one you want:

Official Kutt Docker image is available on Docker Hub.

API

View API documentation →

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 - [email protected]
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_POMPT OIDC prompt - login
OIDC_CLIENT_ID OIDC client id - example-app
`OIDC_CLIENT_SECR

readme truncated — read the full docs on github

Frequently asked questions

Is Kutt free to use?

Kutt is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Kutt do?

Simplify your links with this free, modern URL shortener

What is Kutt written in?

Kutt is primarily written in JavaScript. Its source is publicly available at https://github.com/thedevs-network/kutt, and it has 11,107 GitHub stars.