Wieldy ephemeral links — live at yuio.link.
Every link expires (7 days at most), every link previews before it opens, and
names are short, memorable words like braveOTTER instead of random strings.
No permanent links, no accounts, no tracking.
- Names are words. Drawn from a curated 3,456-word list, shown in
alternating case (
braveOTTER) purely for readability — lookups are case-insensitive. - Three link types.
- Public — the shortest name currently available (1–3 words depending on namespace occupancy and TTL). Guessable by design; guards nothing.
- Secret — a four-word name (~47 bits, ~143 trillion combinations). Not encryption: protection by sheer improbability of guessing within the link's life.
- One-Time — a four-word name that burns on first reveal. If it answers 410 Gone, someone already opened it — tamper evidence built in.
- Always-preview.
GET /:namenever spends a use: you see where a link goes (domain only, for one-time links) before continuing. Consuming is a POST, so unfurl crawlers can never burn a link. - Tombstones. A spent or withdrawn link answers 410 until it expires; only expiry frees a name for reuse. A name can never be silently repurposed within its stated life.
Details: docs/ROUTES.md (endpoints), docs/PREVIEW.md (trust model), docs/NAMESPACES.md (name allocation).
curl -d url=https://example.com https://yuio.link/create
curl -d url=https://example.com -d ttl=1h -d uses=1 https://yuio.link/create
curl --data-binary @notes.txt https://yuio.link/create # becomes a Text linkRust workspace: core (names, validation, detection) and server (axum +
SQLite). HTML is rendered server-side (maud); the pages work without
JavaScript and enhance with a little vanilla JS.
nix develop --command cargo test --workspace # test
nix develop --command cargo run -p yuiolink-server # http://127.0.0.1:8080/Configuration is environment variables (see server/src/config.rs):
YUIOLINK_BIND, YUIOLINK_BASE_URL, YUIOLINK_DB, YUIOLINK_SECRET,
YUIOLINK_MAX_TTL_SECS, YUIOLINK_REAP_INTERVAL_SECS.
CI (.github/workflows/ci.yml) gates every push; pushing a v* tag builds
the linux/amd64 binary and attaches it to a GitHub release
(release.yml). The droplet is provisioned by
deploy/droplet-user-data.bash and updates itself pull-based:
yuiolink-update fetches the latest release, verifies its SHA-256,
snapshots the database, installs, and health-checks /healthz — rolling the
binary back on failure. yuiolink-update.timer runs it every 5 minutes (a
no-op when already current), so tagging a release auto-deploys within 5
minutes with no SSH needed; systemctl start yuiolink-update also runs it
on demand. Nightly database snapshots run via yuiolink-backup.timer.
A Dockerfile builds the same server for container use (/data volume holds
the SQLite database).
SemVer 2.0.0, tags vX.Y.Z. The flake reads the
workspace version from Cargo.toml.
Dual-licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option. Unless you state otherwise, any contribution you submit for inclusion shall be dual-licensed as above, with no additional terms.
Bundled third-party material keeps its own terms — the link-name wordlist derives from the EFF wordlists (CC-BY-3.0-US) and the BIP-0039 English wordlist, and the share-card renderer embeds the DejaVu fonts. See NOTICE, which redistributions must carry.
YuioLink is created by jooize with AI.