Thanks to visit codestin.com
Credit goes to hub.docker.com

kutt/kutt

By kutt

Updated about 2 months ago

Free Modern URL Shortener.

Image
33

1M+

kutt/kutt repository overview

Kutt.it

Kutt.it

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

https://kutt.it

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 <file_name> 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.

VariableDescriptionDefaultExample
JWT_SECRETThis is used to sign authentication tokens. Use a long random string.--
PORTThe port to start the app on30008888
SITE_NAMEName of the websiteKuttYour Site
DEFAULT_DOMAINThe domain address that this app runs onlocalhost:3000yoursite.com
LINK_LENGTHThe length of of shortened address65
LINK_CUSTOM_ALPHABETAlphabet 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_REGISTRATIONDisable 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.truefalse
DISALLOW_LOGIN_FORMDisable login with email and password. Only makes sense if OIDC is enabled.falsetrue
DISALLOW_ANONYMOUS_LINKSDisable anonymous link creationtruefalse
TRUST_PROXYIf 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.truefalse
DB_CLIENTWhich 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-sqlite3pg
DB_FILENAMEFile path for the SQLite database. Only if you use SQLite.db/data/var/lib/data
DB_HOSTDatabase connection host. Only if you use Postgres or MySQL.localhostyour-db-host.com
DB_PORTDatabase port. Only if you use Postgres or MySQL.5432 (Postgres)3306 (MySQL)
DB_NAMEDatabase name. Only if you use Postgres or MySQL.kuttmydb
DB_USERDatabase user. Only if you use Postgres or MySQL.postgresmyuser
DB_PASSWORDDatabase password. Only if you use Postgres or MySQL.-mypassword
DB_SSLWhether use SSL for the database connection. Only if you use Postgres or MySQL.falsetrue
DB_POOL_MINMinimum number of database connection pools. Only if you use Postgres or MySQL.02
DB_POOL_MAXMaximum number of database connection pools. Only if you use Postgres or MySQL.105
REDIS_ENABLEDWhether to use Redis for cachefalsetrue
REDIS_HOSTRedis connection host127.0.0.1your-redis-host.com
REDIS_PORTRedis port63796379
REDIS_PASSWORDRedis password-mypassword
REDIS_DBRedis database number, between 0 and 15.01
SERVER_IP_ADDRESSThe 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_ADDRESSThe 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_HTTPSUse 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.falsetrue
ENABLE_RATE_LIMITEnable rate limiting for some API routes. If Redis is enabled uses Redis, otherwise, uses memory.falsetrue
MAIL_ENABLEDEnable 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.falsetrue
MAIL_HOSTEmail server host-your-mail-server.com
MAIL_PORTEmail server port587465 (SSL)
MAIL_USEREmail server user-myuser
MAIL_PASSWORDEmail server password for the user-mypassword
MAIL_FROMEmail address to send the user from-[email protected]
MAIL_SECUREWhether use SSL for the email server connectionfalsetrue
OIDC_ENABLEDEnable OpenID Connectfalsetrue
OIDC_ISSUEROIDC issuer URL-https://example.com/some/path
OIDC_CLIENT_IDOIDC client id-example-app
OIDC_CLIENT_SECRETOIDC client secret-some-secret
OIDC_SCOPEOIDC Scopeopenid profile emailopenid email
OIDC_EMAIL_CLAIMName of the field to get user's email fromemailuserEmail
REPORT_EMAILThe email address that will receive submitted reports-[email protected]
CONTACT_EMAILThe support email address to show on the app-[email protected]

Themes and customizations

You can add styles, change images, or render custom HTML. Place your content inside the /custom folder according to below instructions.

How it works:

The structure of the custom folder is like this:

custom/
├─ css/
│  ├─ custom1.css
│  ├─ custom2.css
│  ├─ ...
├─ images/
│  ├─ logo.png
│  ├─ favicon.ico
│  ├─ ...
├─ views/
│  ├─ partials/
│  │  ├─ footer.hbs
│  ├─ 404.hbs
│  ├─ ...
  • css: Put your CSS style files here. (View example →)
    • You can put as many style files as you want: custom1.css, custom2.css, etc.
    • If you name your style file styles.css, it will replace Kutt's original styles.css file.
    • Each file will be accessible by <your-site.com>/css/<file>.css
  • images: Put your images here. (View example →)
    • Name them just like the files inside the /static/images/ folder to replace Kutt's original images.
    • Each image will be accessible by <your-site.com>/images/<image>.<image-format>
  • views: Custom HTML templates to render. (View example →)
    • It should follow the same file naming and folder structure as /server/views
    • Although we try to keep the original file names unchanged, be aware that new changes on Kutt might break your custom views.
Example theme: Crimson

This is an example and official theme. Crimson includes custom styles, images, and views.

Get Crimson theme →

View list of themes and customizations →

HomepageAdmin pageLogin/signup
crimson-homepagecrimson-admincrimson-login-signup
Usage with Docker:

If you're building the image locally, then the /custom folder should already be included in your app.

If you're pulling the official image, make sure /kutt/custom volume is mounted or you have access to it. View Docker compose example →

Then, move your files to that volume. You can do it with this Docker command:

docker cp <path-to-custom-folder> <kutt-container-name>:/kutt

For example:

docker cp custom kutt-server-1:/kutt

Make sure to restart the kutt server container after copying files or making changes.

Browser extensions

Download Kutt's extension for web browsers via below links.

Videos

Official videos

Integrations

  • ShareX – You can use Kutt as your default URL shortener in ShareX. If you host your custom instance of Kutt, refer to ShareX wiki on how to setup.
  • Alfred workflow – Download Kutt's official workflow for Alfred app from alfred-kutt repository.
  • iOS shortcutKutt shortcut for your apple device which works from the iOS sharing context menu or on standalone mode. A courtesy of @caneeeeee.

Third-party packages

LanguageLinkDescription
C# (.NET)KuttSharp.NET package for Kutt.it url shortener
C# (.NET)Kutt.NETC# API Wrapper for Kutt
Pythonkutt-cliCommand-line client for Kutt written in Python
Rubykutt.rbKutt library written in Ruby
RusturlshortenerURL shortener library written in Rust
Rustkutt-rsCommand line tool written in Rust
Node.jsnode-kuttNode.js client for Kutt.it url shortener
JavaScriptkutt-vscodeVisual Studio Code extension for Kutt
Javakutt-desktopA Cross platform Java desktop application for Kutt
Gokutt-goGo client for Kutt.it url shortener
BASHGitHub GistSimple BASH function to access the API
BASHurl-shortenerSimple BASH script with GUI
Kubernetes/HelmArtifactHubA Helm Chart to install Kutt on a Kubernetes cluster

Contributing

Pull requests are welcome. Open a discussion for feedback, requesting features, or discussing ideas.

Special thanks to Thomas and Muthu. Logo design by Muthu.

Tag summary

Content type

Image

Digest

sha256:583885732

Size

110.4 MB

Last updated

about 2 months ago

Requires Docker Desktop 4.37.1 or later.