Short URLs are usually created through third-party services. If you’d rather keep those links under your own control, there are open source projects you can run on a personal server, and Kutt is one of them.
What Is Kutt?
Kutt is a URL shortener maintained by thedevs-network and built with self-hosting in mind. Besides shortening links, it lets you manage URLs, view statistics, set up custom domains, and use an admin page to handle users. The official site is at kutt.to.
Note that the domain kutt.it is no longer owned by Kutt’s developers. It was disabled by the Italian TLD registrar due to incomplete identification documents and is now controlled by someone else. The repository recommends using kutt.to and warns that kutt.it could be used for phishing.
Features
Links can be created and edited with custom URLs, passwords, descriptions, and expiration dates. Each link comes with its own statistics, and users can manage their own URLs. For team use, there is an admin page to manage users and links.
Custom domains are supported, so shortened links can use your own domain. Registration and anonymous link creation can be disabled, and login can be integrated with OpenID Connect (OIDC). On the technical side, Kutt supports SQLite, PostgreSQL, and MySQL/MariaDB, plus Redis for caching. It also provides a RESTful API and theme options for customizing the look.
Running Kutt
The main prerequisite is Node.js 20 or newer. The default database is SQLite, so no separate database setup is needed to try it out. On first start, the app asks you to create an admin account.
The general steps are as follows.
git clone https://github.com/thedevs-network/kutt.git
cd kutt
npm install
npm run migrate
npm run dev
For production, use npm start. To use PostgreSQL, MySQL/MariaDB, or Redis, those services need to be set up separately.
Another option is Docker: from the project root, run docker compose up. The repository includes several Compose configurations for different setups, such as SQLite, SQLite with Redis, PostgreSQL with Redis, and MariaDB with Redis. The official image is available on Docker Hub.
Configuration
Kutt is configured through environment variables, either directly or via an .env file. All variables are optional except JWT_SECRET, which is required in production. This value is used to sign authentication tokens, so it should be a long random string.
Commonly adjusted variables include SITE_NAME, DEFAULT_DOMAIN, PORT, and DB_CLIENT. There are also options to disable registration (DISALLOW_REGISTRATION) or anonymous link creation (DISALLOW_ANONYMOUS_LINKS). For certain setups, values can be read from a file by appending _FILE to the variable name, like JWT_SECRET_FILE.
Customizing the Look
The interface can be customized through the custom folder, which has three parts: css for style files, images for replacing logos and favicons, and views for HTML templates. File naming in images should match the original files in static/images, while views follows the structure and naming in server/views.
The repository also provides a sample theme called Crimson with custom styles, images, and views. More themes and customizations are available in the kutt-customizations repository. When using Docker, custom files can be copied into the container with docker cp, then the container needs to be restarted.
API and Integrations
Kutt provides a RESTful API documented at docs.kutt.to. There are also browser extensions for Chrome and Firefox. Tools that can be integrated include ShareX, an Alfred workflow, and an iOS shortcut.
For developers, third-party libraries are available for C#/.NET, Python, Ruby, Rust, Node.js, Java, and Go.
Who Is It For?
Kutt is a good fit for anyone who wants to run their own URL shortener instead of relying on third-party services. Custom domain support and multiple database options make it usable for personal needs or team link management. The admin page, OIDC support, and API are useful for managing multiple users or connecting other services.
If you need a self-hosted URL shortener, Kutt is worth trying out via Docker or a regular Node.js setup. For detailed features, configuration options, and API documentation, check the official repository.
Repository: https://github.com/thedevs-network/kutt