---
title: Public ids and urls
description: How p., f., and sl. addresses are built, and why they never change.
---

# Public ids and urls

Every published page and every uploaded file gets a direct, permanent
URL built from a random **public id** — 12 characters from a 32-symbol
alphabet, matching `^[a-z2-7]{12}$`:

- A page: `p.shebang.pro/<id>`
- An uploaded file: `f.shebang.pro/<id>`

The id is assigned once, at creation, and never changes — renaming the
page's title or its dashboard label doesn't touch the URL. Older
accounts may still see a `@handle/slug` shape in the dashboard; those
URLs now answer a `301` redirect (preserving any sub-path and query
string) to the id-based one, for one release, rather than serving
directly.

## Short links are different

`sl.shebang.pro/<code>` (or a custom alias set via `link_set_alias`) is a
separate, optional wrapper created automatically alongside every
publish/upload. It already resolves by the underlying resource's id, not
by handle or slug, so it's unaffected by the change above — a short link
never needed a 301.

`link_delete` deletes both the short link **and** the page or file it
wraps, permanently. There's no "unwrap but keep the file" operation.

## Slugs are labels now, not addresses

A page or object's `slug` is still there — it's what shows up in the
dashboard and in a short link's preview card — but it plays no part in
the public URL anymore. Renaming it is purely cosmetic.

## Next

[Access modes](/concepts/access-modes) — who's allowed to actually load
one of these urls.
