[![docker-pulls-badge](https://img.shields.io/docker/pulls/sintan1729/chhoto-url)](https://hub.docker.com/r/sintan1729/chhoto-url) [![maintainer-badge](https://img.shields.io/badge/maintainer-SinTan1729-blue)](https://github.com/SinTan1729) [![latest-release-badge](https://img.shields.io/github/v/release/SinTan1729/chhoto-url?label=latest%20release)](https://github.com/SinTan1729/chhoto-url/releases/latest) ![docker-image-size-badge](https://img.shields.io/docker/image-size/sintan1729/chhoto-url) ![commit-since-latest-release-badge](https://img.shields.io/github/commits-since/SinTan1729/chhoto-url/latest?sort=semver&label=commits%20since%20latest%20release) [![license-badge](https://img.shields.io/github/license/SinTan1729/chhoto-url)](https://spdx.org/licenses/MIT.html) # ![Logo](resources/assets/favicon-32.png) Chhoto URL # What is it? A simple selfhosted URL shortener with no unnecessary features. Simplicity and speed are the main foci of this project. The docker image is ~6 MB (compressed), and it uses <5 MB of RAM under regular use. Don't worry if you see no activity for a long time. I consider this project to be complete, not dead. I'm unlikely to add any new features, but I will try and fix every bug you report. I will also try to keep it updated in terms of security vulnerabilities. If you feel like a feature is missing, please let me know by creating an issue using the "feature request" template. ## But why another URL shortener? Most URL shorteners are either bloated with unnecessary features, or are a pain to set up. Even fewer are written with simplicity and lightness in mind. When I saw the `simply-shorten` project (linked below), I really liked the idea but thought that it missed some features. Also, I didn't like the fact that a simple app like this had a ~200 MB docker image (mostly due to the included java runtime). So, I decided to rewrite it in Rust and add some features to it that I thought were essential (e.g. hit counting). ## What does the name mean? Chhoto (ছোট, [IPA](https://en.wikipedia.org/wiki/Help:IPA/Bengali): /tʃʰoʈo/) is the Bangla word for small. URL means, well... URL. So the name simply means Small URL. # Features - Shortens URLs of any length to a randomly generated link. - (Optional) Allows you to specify the shortened URL instead of the generated one. (It's surprisingly missing in a surprising number of alternatives.) - Opening the shortened URL in your browser will instantly redirect you to the correct long URL. (So no stupid redirecting pages.) - Super lightweight and snappy. (The docker image is only ~6MB and RAM uasge stays under 5MB under normal use.) - Counts number of hits for each short link in a privacy respecting way i.e. only the hit is recorded, and nothing else. - Has a mobile friendly UI. - Has a public mode, where anyone can add links without authentication. Deleting or listing available links will need admin access using the password. - Allows setting the URL of your website, in case you want to conveniently generate short links locally. - Links are stored in an SQLite database. - Available as a Docker container. - Backend written in Rust using [Actix](https://actix.rs/), frontend written in plain HTML and vanilla JS, using [Pure CSS](https://purecss.io/) for styling. - Uses very basic authentication using a provided password. It's not encrypted in transport. I recommend using something like [caddy](https://caddyserver.com/) to encrypt the connection by SSL. # Bloat that will not be implemented - Tracking or spying of any kind. The only logs that still exist are errors printed to stderr and the basic logging (only warnings) provided by the [`env_logger`](https://crates.io/crates/env_logger) crate. - User management. If you need a shortener for your whole organization, either run separate containers for everyone or use something else. - Cookies, newsletters, "we value your privacy" popups or any of the multiple other ways modern web shows how anti-user it is. We all hate those, and they're not needed here. - Paywalls or messages begging for donations. If you want to support me (for whatever reason), you can message me through GitHub issues. # Screenshots
# Usage ## Using `docker compose` (Recommended method) There is a sample `compose.yaml` file in this repository. It contains everything needed for a basic install. You can use it as a base, modifying it as needed. Run it with ``` docker compose up -d ``` If you're using a custom location for the `db_url`, make sure to make that file before running the docker image, as otherwise a directory will be created in its place, resulting in possibly unwanted behavior. ## Building and running with docker ### `docker run` method 0. (Only if you really want to) Build the image for the default `x86_64-unknown-linux-musl` target: ``` docker build . -t chhoto-url ``` For building on `arm64` or `arm/v7`, use the following: ``` docker build . -t chhoto-url --build-arg target=