Research Summary
Currently project URLs use UUIDs: share.catrob.at/project/3d49a458-4421-42e9-9fdc-804dfb6ad342 (36 chars in the path). This is long and not user-friendly for sharing.
Options Evaluated
| Approach |
Example |
Pros |
Cons |
| Auto-generated Base62 |
/project/A1B2C3D4 |
Short, unique |
Not meaningful, another random string |
| Auto-increment integer |
/project/12345 |
Short, sequential |
Exposes total project count, enumerable |
| User-defined slug |
/project/my-cool-game |
Short AND meaningful |
Requires uniqueness check, optional |
| Separate short domain |
app.catrob.at/A1B2C3 |
Very short |
Needs DNS setup, maintenance |
Recommendation: User-Defined Slugs
Let users optionally claim a custom slug for their projects, like GitHub repo names.
Implementation plan:
- Add optional
slug column (VARCHAR 50, unique, nullable) to Program entity
- Add slug validation: alphanumeric + hyphens, 3-50 chars, unique
- Controller checks if
{id} param is UUID or slug, looks up accordingly
- UI: "Custom URL" field in project settings dialog (same pattern as visibility toggle)
- Old UUID links always work (never break backwards compatibility)
- Default: no slug (URL stays as UUID until user sets one)
Route change:
// Existing route works for both UUID and slug:
#[Route(path: '/project/{id}', name: 'program')]
// Controller:
$project = $this->findByIdOrSlug($id);
Effort: ~1-2 days (entity + migration + settings UI + validation)
Why not auto-generated short IDs?
Auto-generated short IDs (Base62 of UUID) would be A1B2C3D4E5 — shorter but still meaningless. A user-chosen slug like my-cool-game is both short AND tells you what the project is.
Acceptance Criteria
Research Summary
Currently project URLs use UUIDs:
share.catrob.at/project/3d49a458-4421-42e9-9fdc-804dfb6ad342(36 chars in the path). This is long and not user-friendly for sharing.Options Evaluated
/project/A1B2C3D4/project/12345/project/my-cool-gameapp.catrob.at/A1B2C3Recommendation: User-Defined Slugs
Let users optionally claim a custom slug for their projects, like GitHub repo names.
Implementation plan:
slugcolumn (VARCHAR 50, unique, nullable) to Program entity{id}param is UUID or slug, looks up accordinglyRoute change:
Effort: ~1-2 days (entity + migration + settings UI + validation)
Why not auto-generated short IDs?
Auto-generated short IDs (Base62 of UUID) would be
A1B2C3D4E5— shorter but still meaningless. A user-chosen slug likemy-cool-gameis both short AND tells you what the project is.Acceptance Criteria
share.catrob.at/project/my-slugloads the correct projectshare.catrob.at/project/{uuid}still works (backwards compatible)