This tutorial builds **Linkly**, a link shortener, one worker at a time. You start with a single function that turns `/s/abc` into a redirect, and finish with a multi-tenant link platform that has durable execution, storage, analytics, a live click stream, bulk imports, and a browser worker on the same bus. Each chapter adds one capability by adding a worker to your existing system. The point is not the link shortener itself, but the pattern: a real system on iii is a set of small workers tha...
Scanned 9/3/2026
Install to Claude Code
npx -y skills add iii-hq/iii --skill linkly --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Linkly?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/iii-hq-linkly-a9d4b3c5)More formats (shields.io, HTML) on the badges page.
<!-- generated by iii-skill-render. DO NOT EDIT (changes here are overwritten on the next render). Edit docs/next/tutorials/linkly/overview.mdx. -->
# Overview
This tutorial builds **Linkly**, a link shortener, one worker at a time. You start with a single
function that turns `/s/abc` into a redirect, and finish with a multi-tenant link platform that has
durable execution, storage, analytics, a live click stream, bulk imports, and a browser worker on
the same bus.
Each chapter adds one capability by adding a worker to your existing system. The point is not the
link shortener itself, but the pattern: a real system on iii is a set of small workers that invoke
each other's functions through the engine. You add capability without rewriting what came before.
<Note>
New to iii? Start with [Getting started](/quickstart) to install the engine and meet functions,
triggers, and workers before you begin.
</Note>
## Ch. 1: Foundations
Build a custom `link` worker with `link::create` and `link::resolve`, store links in memory, then
expose them over HTTP with `http` as `POST /links` and `GET /s/:code`.
## Ch. 2: Observe everything
Add `iii-observability` for logs and traces, and open the `console` to inspect functions, triggers,
and live invocations.
## Ch. 3: Persist everything
Add a `database` worker (SQLite) so links and click events are stored durably and survive restarts,
with `state` kept in front as a fast read cache.
## Ch. 4: Make it durable
Push click events onto `queue` so redirects stay fast, and publish `link.created` events with
`pubsub` that a cache and an analytics function each subscribe to.
## Ch. 5: Stream live clicks
Push every click to subscribers in real time from a dedicated `click-streamer` worker with
`iii-stream`.
## Ch. 6: Move bulk data with channels
Bulk-load links from a CSV in a single streamed upload over a channel.
## Ch. 7: Bring in the browser
Turn a browser tab into a worker with the browser SDK: invoke `link::create` directly, subscribe to
the click stream, and register a browser-side function the server can call.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!