PPurels
Sign in

Apache-2.0 · self-hosted

Shorten links. Keep the data.

Short links, click statistics, divert rules and role-based permissions, running from a single Docker Compose file.

100%self-hosted
10permission scopes
0vendor lock-in

Core features

Link management

Custom aliases or generated codes, with tags, bulk actions and CSV import and export.

Click statistics

Trends, referrers, devices and unique visitors, down to the raw record of every click.

Divert rules

Send one short link to different destinations by device or user agent, matched in order.

devicedestination

Roles and permissions

Ten scopes, editable roles, and an audit trail for every change made in the console.

Confirm before the jump

An optional interstitial shows the destination first, and each link sets how long it holds.

Privacy you control

Three modes for the visitor address, including storing nothing at all.

  • QR codes
  • CSV import and export
  • Scoped API tokens
  • Rate limiting
  • Extra short domains (display only)
  • Manual destination checks

How it works

  1. 01

    Create

    Paste the long link and pick your own alias, or let Purels generate one.

  2. 02

    Share

    The short link, a QR code, or rules that divert by device and user agent.

  3. 03

    Measure

    Trends, referrers, devices and unique visitors, all on one dashboard.

Runs on your own machine

Everything Purels needs fits in one Compose file.

  • One Go codebase (the api and worker processes), a Next.js console, PostgreSQL and Redis
  • One docker compose up -d and it is running
  • Links and click history stay in your own database
  • A configurable link quota per account; administrators are exempt

$ cp .env.example .env

$ docker compose -f deploy/compose.yaml up -d

$ curl localhost/readyz

{"status":"ready"}

Frequently asked questions

Do I need an account to create a short link?

Yes. Every write in the console needs a session, and a link belongs to the account that created it. Administrators can see all of them.

Can I use my own domain?

Yes. The short code itself is global — the domain only decides what the console displays and what the QR code encodes, so each one has to resolve to this deployment on its own.

What happens to existing accounts if registration is closed?

Nothing. Closing registration only stops new accounts being created; every existing account keeps working.

Where is the visitor data stored?

In your own PostgreSQL. A visitor's address can be dropped entirely, kept as a plain hash, or hashed with a key you supply — three modes.

Are two-factor authentication and single sign-on supported?

Both, and both are off until you configure them: TOTP with recovery codes, and OIDC providers. Each needs an encryption key set first.

What licence is it under?

Apache-2.0.

Ready when you are

One command, or go straight to the console and look around.