Skip to main content
opini

Canonical URLs

Every org and project has a short, stable public_id that backs its public-facing URLs. Rename the org or the project — the existing links keep working.

Why not the slug

Slugs are nice until someone renames. A form URL on Twitter, a QR code on a flyer, a link in an onboarding email — all dead the moment acme becomes acme-labs.

Opini resolves public-facing URLs against a 10-character public_id (Crockford base32, so no ambiguous characters like I/l/O/U). The id doesn't change when a rename happens.

What they look like

Both org and project get their own id. The canonical URL for the hosted form looks like:

url
https://opini.dev/f/<org-public-id>/<project-public-id>

Release posts and public API endpoints follow the same pattern —/r/..., /api/v1/public/projects/....

Copy a project's public_id from Settings → General — the chip is right under the name, with a one-click copy button. The same chip exists on the org settings page.

Slug URLs redirect

Old slug-based URLs (/f/acme/main) don't break — they 301-redirect to the canonicalpublic_id URL. Browsers cache the redirect; crawlers update their index. You can keep sharing slug URLs and they'll settle on the canonical form over time.

Renaming an org or project keeps both the old slug and the new slug working — the public_id is the ground truth, and the slug is just a human-readable shortcut.

Rotating a public_id

You don't. public_id is intentionally stable — rotation would break every link that uses it, which defeats the point.