---
title: "Deploy Cut | (Just Updated) URL Shortener & Bitly Alternative, Redis Included, Admin Set at Boot"
description: "Cut self-hosted URL shortener with Redis, Bitly alternative, admin API"
category: "Other"
url: https://railway.com/deploy/cut-or-just-updated-url-shortener-and-bi
---

# Deploy Cut | (Just Updated) URL Shortener & Bitly Alternative, Redis Included, Admin Set at Boot

Cut self-hosted URL shortener with Redis, Bitly alternative, admin API

**[Deploy Cut | (Just Updated) URL Shortener & Bitly Alternative, Redis Included, Admin Set at Boot on Railway](https://railway.com/template/cut-or-just-updated-url-shortener-and-bi)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/cut-or-just-updated-url-shortener-and-bi/manifest.json

- **Creator:** SuperSlowSloth
- **Category:** Other

## Template content

### redis

- **Image:** redis:8.2.1
- **Start command:** `/bin/sh -c 'chown -R redis:redis /data && exec docker-entrypoint.sh redis-server --requirepass "$REDIS_PASSWORD" --appendonly yes --dir /data --maxmemory-policy noeviction'`

### cut

- **Image:** ghcr.io/bon5co/cut-railway:0.1.0@sha256:e91ccf28ae59217f574aca29c9642c2f443481a447366cf2421c20e6f3fb0e67
- **Health check:** /
- **Public domain:** Yes

## Documentation

# Deploy and Host Cut on Railway

**Built for an LLM agent to deploy and use.** The deploy form has no fields to fill: the administrator password is generated at deploy time, the Redis that stores the links is included and password-protected, and every write answers `401` until a session cookie from a normal sign-in is sent. Cut is a small open-source self-hosted URL shortener, a Bitly alternative: create short links with custom or random slugs, redirect them, count clicks and manage everything from an admin page.

## About Hosting Cut

This template runs two services: **cut** (the shortener and its admin page behind one public domain) and **redis** (the link store, with a volume mounted at `/data` and append-only persistence on). Links, click counts and login rate-limit counters live in Redis, so they survive redeploys of either service.

**Locked from boot.** Stock Cut redirects an unauthenticated write to the login page with a `302`, which an API client reads as success, and starts with whatever admin password it is given, including none. This template's image answers `401` on `POST /admin/links`, on the edit route and on the delete route when there is no session, refuses to start with an `ADMIN_PASSWORD` shorter than 12 characters, and the generated one is 32 alphanumerics. Sign-in attempts are rate limited per client IP by upstream (2 per minute, 5 per hour, 10 per day), so an agent should sign in once per run.

**Redirects.** A short link is `https://YOUR_DOMAIN/SLUG` and answers `302` to the target. Point a custom domain at the cut service to use your own short domain.

**Using the web interface.** Open `/admin` on the public URL and sign in with the `ADMIN_PASSWORD` value from the cut service variables.

### Agent contract

- Public URL: `https://RAILWAY_PUBLIC_DOMAIN` (the generated domain of the `cut` service)
- Private URL: `http://cut.railway.internal:8080`
- Credentials: the variable `ADMIN_PASSWORD` on the `cut` service (there is no username)
- Auth: sign in with `POST /admin/login` (form field `password`); a correct password answers `302` and sets an `auth` cookie to send on every `/admin/*` write, a wrong one answers `302` with no cookie, and a write without the cookie answers `401`
- Health: `GET /` returns 200 without credentials

```bash
#!/bin/sh
# needs: SITE_URL (public https URL of the cut service) and ADMIN_PASSWORD (its variable); also curl, grep
J=$(mktemp)
curl -s -o /dev/null -w "health: %{http_code}\n" "$SITE_URL/"
curl -s -o /dev/null -w "write without key: %{http_code}\n" -X POST -d "url=https://example.com/x" "$SITE_URL/admin/links"
curl -s -o /dev/null -w "wrong password: %{http_code}\n" -c "$J" -X POST -d "password=not-the-password" "$SITE_URL/admin/login"
echo "wrong password sets cookie: $(grep -c auth "$J")"
curl -s -o /dev/null -w "login: %{http_code}\n" -c "$J" -X POST --data-urlencode "password=$ADMIN_PASSWORD" "$SITE_URL/admin/login"
echo "login sets cookie: $(grep -c auth "$J")"
curl -s -o /dev/null -w "link create: %{http_code}\n" -b "$J" -X POST -d "url=https://example.com/agent-check" -d "slug=agent-check" "$SITE_URL/admin/links"
curl -s -o /dev/null -D- "$SITE_URL/agent-check" | grep -i '^location:' | sed 's/^[Ll]ocation: /redirect: /'
curl -s -o /dev/null -w "link delete: %{http_code}\n" -b "$J" -X POST "$SITE_URL/admin/links/agent-check/delete"
curl -s -o /dev/null -w "after delete: %{http_code}\n" "$SITE_URL/agent-check"
rm -f "$J"
```

A fresh deploy prints `health: 200`, `write without key: 401`, `wrong password: 302`, `wrong password sets cookie: 0`, `login: 302`, `login sets cookie: 1`, `link create: 302`, `redirect: https://example.com/agent-check`, `link delete: 302` and `after delete: 404`.

## Why Deploy Cut on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Cut on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

- **Agent-ready** - no deployer fields, a contract block and one script that proves a sign-in, a create, a redirect, a delete and the refusal without a session.
- **Locked by default** - no empty or weak admin password, and no write that an unauthenticated client can mistake for success.
- **Data survives redeploys** - links and counters sit on a Redis volume with append-only persistence.
- **Pinned** - the upstream image is pinned by digest.
- **No per-link pricing** - unlimited links on your own domain instead of a Bitly plan.

## Common Use Cases

- **Self-hosted URL shortener** - branded short links on your own domain instead of Bitly or Rebrandly.
- **Agent-driven link management** - an agent creates, redirects and deletes short links over plain HTTP with a session cookie.
- **Campaign and QR-code links** - one short URL per campaign, with click counts per link.
- **Internal go-links for a team** - short memorable slugs that redirect to docs, dashboards and tickets.

## Dependencies for Cut Hosting

- The cut service and a Redis service with a volume, both created by the template. A custom domain is optional.

### Deployment Dependencies

- [Cut repository](https://github.com/mendylanda/cut)
- [Official Docker image](https://github.com/mendylanda/cut/pkgs/container/cut)
- [Wrapper image source](https://github.com/bon5co/cut-railway)


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/cut-or-just-updated-url-shortener-and-bi
