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.
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).
Chhoto (ছোট, IPA: /tʃʰoʈo/) is the Bangla word for small. URL means, well... URL. So the name simply means Small URL.
env_logger
crate.
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.
docker run
methodx86_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=<desired-target>
Make sure that the desired target is a musl
one, since the docker image is built from scratch
.
For cross-compilation, take a look at the Makefile
. It builds and pushes for linux/amd64
, linux/aarch64
and linux/arm/v7
architectures. For any other architectures, open a discussion, and I'll try to help you out.
docker run -p 4567:4567
-e password="password"
-d chhoto-url:latest
1.a Make the database file available to host (optional)
touch ./urls.sqlite
docker run -p 4567:4567 \
-e password="password" \
-v ./urls.sqlite:/urls.sqlite \
-e db_url=/urls.sqlite \
-d chhoto-url:latest
1.b Further, set the URL of your website (optional)
touch ./urls.sqlite
docker run -p 4567:4567 \
-e password="password" \
-v ./urls.sqlite:/urls.sqlite \
-e db_url=/urls.sqlite \
-e site_url="https://www.example.com" \
-d chhoto-url:latest
You can set the redirect method to Permanent 308 (default) or Temporary 307 by setting
the redirect_method
variable to TEMPORARY
or PERMANENT
(it's matched exactly). By
default, the auto-generated links are adjective-name pairs. You can use UIDs by setting
the slug_style
variable to UID
. You can also set the length of those slug by setting
the slug_length
variable. It defaults to 8, and a minimum of 4 is supported.
To enable public mode, set public_mode
to Enable
. With this, anyone will be able to add
links. Listing existing links or deleting links will need admin access using the password.
By default, the server sends no Cache-Control headers. You can set custom cache_control_header
to send your desired headers. It must be a comma separated list of valid
RFC 7234 §5.2 headers. For example,
you can set it to no-cache, private
to disable caching. It might help during testing if
served through a proxy.
The application can be used from the terminal using something like curl
. In all the examples
below, replace http://localhost:4567
with where your instance of chhoto-url
is accessible.
If you have set up a password, first do the following to get an authentication cookie and store it in a file.
curl -X post -d "<your-password>" -c cookie.txt http://localhost:4567/api/login
You should receive "Correct password!" if the provided password was correct. For any subsequent
request, please add -b cookie.txt
to provide authentication.
To add a link, do
curl -X POST -d '{"shortlink":"<shortlink>", "longlink":"<longlink>"}' http://localhost:4567/api/new
Send an empty <shortlink>
if you want it to be auto-generated. The server will reply with the generated shortlink.
To get a list of all the currently available links as json
, do
curl http://localhost:4567/api/all
To delete a link, do
curl -X DELETE http://localhost:4567/api/del/<shortlink>
The server will send a confirmation.
You can get the version of chhoto-url
the server is running using curl http://localhost:4567/api/version
and
get the siteurl using curl http://localhost:4567/api/siteurl
.
If you do not define a password environment variable when starting the docker image, authentication will be disabled.
This if not recommended in actual use however, as it will allow anyone to create new links and delete old ones. This might not seem like a bad idea, until you have hundreds of links pointing to illegal content. Since there are no logs, it's impossible to prove that those links aren't created by you.
simply-shorten
.