# shlink — the map, read from its code

A frozen map of shlink: 20 features across
7 modules, each anchored to the line of source it was read from, at
commit 4a8fee47d48b. Nobody wrote the list: it was read out of the product's own
source and named in 1 model call.

- Human view: https://featkpr.com/map/shlink
- Every feature below has its own page and its own twin at `<slug>.md`.

## What the map holds

- Features named: 20
- Modules they fall into: 7
- Citations: 28
- Anchors: 28
- Source files read: 25

## What the map does not hold

Printed with their values, not omitted:

- Scenarios: 0
- Tests: 0
- Screens: 0
- Flows: 0
- Merge requests: 0
- Open questions: 0

Every feature reads `code-only, awaiting a source`. This product has been read, not crawled and not run, so the sheet carries no status colour: there is no status to report yet.

## The features

### Visit — 6 features

- [Orphan visits](https://featkpr.com/map/shlink/orphan-visits) ([.md](https://featkpr.com/map/shlink/orphan-visits.md)) — View and manage orphan visits. DELETE /rest/v{version:1|2|3}/visits/orphan, GET /rest/v{version:1|2|3}/visits/orphan
- [Non-orphan visits](https://featkpr.com/map/shlink/non-orphan-visits) ([.md](https://featkpr.com/map/shlink/non-orphan-visits.md)) — View non-orphan visits. GET /rest/v{version:1|2|3}/visits/non-orphan
- [Overall visit stats](https://featkpr.com/map/shlink/overall-visit-stats) ([.md](https://featkpr.com/map/shlink/overall-visit-stats.md)) — View overall visit statistics. GET /rest/v{version:1|2|3}/visits
- [Domain visit stats](https://featkpr.com/map/shlink/domain-visit-stats) ([.md](https://featkpr.com/map/shlink/domain-visit-stats.md)) — View visit statistics for domains. GET /rest/v{version:1|2|3}/domains/{domain}/visits
- [Short URL visit stats](https://featkpr.com/map/shlink/short-url-visit-stats) ([.md](https://featkpr.com/map/shlink/short-url-visit-stats.md)) — View visit statistics for short URLs. GET /rest/v{version:1|2|3}/short-urls/{shortCode}/visits
- [Tag visit stats](https://featkpr.com/map/shlink/tag-visit-stats) ([.md](https://featkpr.com/map/shlink/tag-visit-stats.md)) — View visit statistics for tags. GET /rest/v{version:1|2|3}/tags/{tag}/visits

### ShortUrl — 5 features

- [Delete short URL](https://featkpr.com/map/shlink/delete-short-url) ([.md](https://featkpr.com/map/shlink/delete-short-url.md)) — Delete a short URL. DELETE /rest/v{version:1|2|3}/short-urls/{shortCode}
- [Delete short URL visits](https://featkpr.com/map/shlink/delete-short-url-visits) ([.md](https://featkpr.com/map/shlink/delete-short-url-visits.md)) — Delete visits for a short URL. DELETE /rest/v{version:1|2|3}/short-urls/{shortCode}/visits
- [Edit short URL](https://featkpr.com/map/shlink/edit-short-url) ([.md](https://featkpr.com/map/shlink/edit-short-url.md)) — Edit a short URL. PATCH /rest/v{version:1|2|3}/short-urls/{shortCode}
- [List short URLs](https://featkpr.com/map/shlink/list-short-urls) ([.md](https://featkpr.com/map/shlink/list-short-urls.md)) — List short URLs. GET /rest/v{version:1|2|3}/short-urls, GET /rest/v{version:1|2|3}/short-urls/{shortCode}
- [Shorten URL](https://featkpr.com/map/shlink/shorten-url) ([.md](https://featkpr.com/map/shlink/shorten-url.md)) — Shorten a URL. POST /rest/v{version:1|2|3}/short-urls, GET /rest/v{version:1|2|3}/short-urls/shorten

### Core — 2 features

- [Redirect short URL](https://featkpr.com/map/shlink/redirect-short-url) ([.md](https://featkpr.com/map/shlink/redirect-short-url.md)) — Redirect visitors via short URL. GET /{shortCode}/track, GET /{shortCode}
- [Robots.txt](https://featkpr.com/map/shlink/robots-txt) ([.md](https://featkpr.com/map/shlink/robots-txt.md)) — Serve robots.txt for crawlers. GET /robots.txt

### Domain — 2 features

- [Domain redirects](https://featkpr.com/map/shlink/domain-redirects) ([.md](https://featkpr.com/map/shlink/domain-redirects.md)) — Configure domain-level redirects. PATCH /rest/v{version:1|2|3}/domains/redirects
- [List domains](https://featkpr.com/map/shlink/list-domains) ([.md](https://featkpr.com/map/shlink/list-domains.md)) — List domains. GET /rest/v{version:1|2|3}/domains

### Rest — 2 features

- [Health check](https://featkpr.com/map/shlink/health-check) ([.md](https://featkpr.com/map/shlink/health-check.md)) — Check service health status. GET /rest/v{version:1|2|3}/health
- [Real-time updates info](https://featkpr.com/map/shlink/real-time-updates-info) ([.md](https://featkpr.com/map/shlink/real-time-updates-info.md)) — Enable real-time update notifications. GET /rest/v{version:1|2|3}/mercure-info

### Tag — 2 features

- [Manage tags](https://featkpr.com/map/shlink/manage-tags) ([.md](https://featkpr.com/map/shlink/manage-tags.md)) — Manage tags. DELETE /rest/v{version:1|2|3}/tags, GET /rest/v{version:1|2|3}/tags, PUT /rest/v{version:1|2|3}/tags
- [Tag stats](https://featkpr.com/map/shlink/tag-stats) ([.md](https://featkpr.com/map/shlink/tag-stats.md)) — View tag usage statistics. GET /rest/v{version:1|2|3}/tags/stats

### RedirectRule — 1 feature

- [Short URL redirect rules](https://featkpr.com/map/shlink/short-url-redirect-rules) ([.md](https://featkpr.com/map/shlink/short-url-redirect-rules.md)) — Configure redirect rules for a short URL. GET /rest/v{version:1|2|3}/short-urls/{shortCode}/redirect-rules, PATCH /rest/v{version:1|2|3}/short-urls/{shortCode}/redirect-rules, POST /rest/v{version:1|2|3}/short-urls/{shortCode}/redirect-rules

## How the modules were decided

the founding candidate's component (candidate.extracted.component, invariant 26's module). The judge's module_overlay is 'Settings' for every feature in this store: the naming run was given the BookStack target config (its spend.recorded is titled 'auto-e2e init_naming bookstack'), so it answered in BookStack's module vocabulary. The API's own /spine still returns that one Settings band; this bundle does not.

The judge's own grouping, kept in the bundle: Settings (20).

Band order: feature count, then module name. Every band's weight (reads.band_weight: scenarios + open questions + features a request touched + features in a flow) is 0 here, so the app's order-by-meaning would have nothing to order by.

## Where these numbers came from

- Product: shlink
- Bundle: frozen, as of store sequence 78, 2026-09-24T00:15:47Z
- Commit: 4a8fee47d48bcb949d6a5729ef32994f1f41464e
- Events hash: 94dd0b7f8b14cfcc343621afa488b4c894c89e44920e5cd245e8617c2ea2e1c7
- View hash: 2100871e52c9ef1eb925163f933ccf397c663b2ef7af46b66cdf42579202d6b3
- `events_hash` hashes the event rows this bundle was built from; `view_hash` hashes the rendered view and is what `ae view hash` prints for the same store. Two digests of one store, never equal to each other.
- Events behind it: candidate.extracted 28, blob.seen 25, feature.named 20, admission.rejected 2, spend.recorded 1, judge.recorded 1
- Extractors: mezzio.action_routes 25, mezzio.config_routes 3
- Repository: https://github.com/shlinkio/shlink — the --repo flag, a declared input. The store holds only a commit: no candidate or blob payload carries a repository or a URL. Never present this as a store fact.

### Refused: 2 batches

28 citations is what was admitted, not what was attempted.

- seq 1, endpoint_known: api operation matches no route-list candidate at its commit (53 events, batch 318a28e0cefe6180417fdde782c1bcd8974cc5c5695c4562fdb51b0066390aa5). envelope 25: mezzio.action_routes route|PATCH|Shlinkio\Shlink\Rest\Action\Domain\DomainRedirectsAction|version at 4a8fee47d48bcb949d6a5729ef32994f1f41464e
- seq 3, row_level_security: new row violates row-level security policy for table "events" (53 events, batch 318a28e0cefe6180417fdde782c1bcd8974cc5c5695c4562fdb51b0066390aa5). 42501: new row violates row-level security policy for table "events"

### Naming: 1 model call

The 20 names are a model's, recorded as advice with a confidence on each.

- Models: anthropic/claude-sonnet-5
- Modes: decide
- Tokens: 1508 in, 859 out
- Cost: $0.011606
- Spend line `init_naming` (auto-e2e init_naming bookstack): $0.011606, worst case 63260 usd micros
