A fast, no-nonsense URL shortener. No login, no tracking, just get the job done.
Live: satset.io
- Instant - Short links generated locally (zero network wait)
- Offline-First - Works without internet, syncs when back online
- Anonymous - No login, no tracking, no cookies
- Custom Aliases - Make your links readable
- QR Codes - One-click download
- Auto-Expiry - URLs auto-delete after 14 days
| Layer | Technology |
|---|---|
| Runtime | Bun (dev) + Cloudflare Workers (prod) |
| Backend | Elysia |
| Frontend | React 19 |
| Routing | TanStack Router (file-based) |
| Data Fetching | TanStack Query |
| Forms | React Hook Form + Zod |
| Styling | Tailwind CSS v4 |
| Animations | Framer Motion |
| Database | Cloudflare D1 (SQLite) |
| Cache | Cloudflare KV |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β satset.io β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Cloudflare Edge β β
β β β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β β β Workers βββββΊβ D1 β β KV β β β
β β β (Elysia) β β (SQLite) β β (Cache) β β β
β β ββββββββ¬βββββββ βββββββββββββββ ββββββββ¬βββββββ β β
β β β β β β
β β ββββββββββββββββββββ¬βββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β API Layer ββ
β β ββ
β β POST /api/urls Create short URL ββ
β β GET /api/urls/check Check alias availability ββ
β β GET /api/redirect Get redirect data ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β React Frontend ββ
β β ββ
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββ
β β β Router β β Query β β Hook Form β ββ
β β β (TanStack) β β (TanStack) β β + Zod β ββ
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββ
β β ββ
β β routes/ ββ
β β βββ __root.tsx Root layout ββ
β β βββ index.tsx Home page (/) ββ
β β βββ privacy.tsx Privacy page (/privacy) ββ
β β βββ $alias.tsx Redirect page (/:alias) ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The app generates short URLs locally for instant UX, then syncs to the backend when the user commits (copy/QR download).
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Offline-First Architecture β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. USER PASTES URL β
β βββββββββββββββ β
β β Paste URL β β
β ββββββββ¬βββββββ β
β β β
β βΌ β
β 2. LOCAL GENERATION (instant, no network) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Generate random alias locally β β
β β β’ Generate QR code (canvas-based) β β
β β β’ Display short URL immediately β β
β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ β
β β β
β βΌ β
β 3. USER COMMITS (copy link or download QR) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Add to localStorage sync queue β β
β β β’ Trigger background sync β β
β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββ΄βββββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββββββ βββββββββββββββββββ β
β β ONLINE β β OFFLINE β β
β β β β β β
β β POST /api/urls β β Queue in β β
β β Sync to D1 β β localStorage β β
β β Mark as synced β β Show warning β β
β ββββββββββ¬βββββββββ ββββββββββ¬βββββββββ β
β β β β
β β βΌ β
β β βββββββββββββββββββ β
β β β BACK ONLINE β β
β β β β β
β β β Process queue β β
β β β Retry w/ exp. β β
β β β backoff β β
β β ββββββββββ¬βββββββββ β
β β β β
β βββββββββββββ¬ββββββββββββββββ β
β βΌ β
β 4. SYNCED β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ URL stored in Cloudflare D1 β β
β β β’ Cached in Cloudflare KV β β
β β β’ Redirect ready at satset.io/:alias β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key points:
- Alias + QR generated client-side (zero latency)
- Sync only happens when user commits (copies link or downloads QR)
- Failed syncs retry with exponential backoff (up to 5 attempts)
- localStorage persists queue across page reloads
- Online/offline listeners auto-trigger sync when connection restored
satset.io/
βββ public/ # Static assets
β βββ favicon.svg
β βββ index.html
β βββ og-image.png
βββ src/
β βββ api/ # Backend (Cloudflare Worker)
β β βββ worker.ts # Elysia routes
β β βββ schemas.ts # TypeBox validation schemas
β β βββ lib/ # Utilities (rate limit, security, etc.)
β β βββ db/
β β βββ schema.sql
β βββ client/ # Frontend (React)
β β βββ main.tsx # Entry point
β β βββ routes/ # TanStack Router (file-based)
β β βββ components/ # Shared components
β β βββ hooks/ # Custom hooks
β β βββ lib/
β β β βββ sync.ts # Offline sync logic
β β β βββ api.ts # API client
β β β βββ ...
β β βββ global.css # Tailwind
β βββ index.ts # Dev server (Bun)
βββ scripts/
β βββ build.ts # Production build
βββ tsr.config.json # TanStack Router config
βββ wrangler.toml.example # Cloudflare config template
βββ package.json
bun install
cp wrangler.toml.example wrangler.toml
# Edit wrangler.toml with your Cloudflare IDs
bun run db:init
bun dev# Create Cloudflare resources
wrangler d1 create url-shortener-db
wrangler kv namespace create CACHE
# Update wrangler.toml with the IDs from above
# Initialize database
wrangler d1 execute url-shortener-db --remote --file=src/api/db/schema.sql
# Deploy
bun run deploy