Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 3151231032497ed786b88a0a
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
public/llms.txt
# Links by OpenApps
> Free short links and QR codes that never expire. A free alternative to Bitly, TinyURL, Rebrandly and paid QR code generators: no ads in front of your link, no monthly cap, no account. Change where a link goes any time; the short link and its QR code stay the same. Each link shows its clicks in total and per day.
Web app: https://links-free.openapps.xyz/
Plain markdown version of the page: https://links-free.openapps.xyz/index.md
OpenAPI: https://links-free.openapps.xyz/openapi.json
Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/
## API
Base URL: https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api
No account and no key to create a link. JSON in, JSON out. CORS is open.
Creating a link returns an ownerKey. Send it in the x-owner-key header to read a link's clicks or change it. The owner key is a password for that link: give it only to the person the link belongs to (the editUrl carries it too).
### Shorten a link
POST /links
{"url": "https://example.com/menus/autumn-2026", "code": "autumn-menu"}
- url: an http or https address, up to 2,000 characters. "example.com/page" becomes "https://example.com/page". A Links address is refused.
- code: optional custom ending, 3 to 32 letters, numbers, dashes or underscores. Leave it out for a random 7-character ending. A taken ending answers 409; a reserved one (api, e, new, admin, about, help, assets, art, fonts, __bounded) answers 400.
Returns 201:
{
"code": "autumn-menu",
"shortUrl": "https://links-free.openapps.xyz/autumn-menu",
"url": "https://example.com/menus/autumn-2026",
"clicks": 0,
"disabled": false,
"createdAt": "2026-10-19T04:00:00.000Z",
"qrSvg": "https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/qr/autumn-menu.svg",
"editUrl": "https://links-free.openapps.xyz/e/autumn-menu#k=OWNER_KEY",
"ownerKey": "OWNER_KEY"
}
Give the person the shortUrl, the qrSvg image link, and the editUrl (their private page to change the link, see clicks per day and download the QR code as PNG or SVG).
### Read a link and its clicks (owner)
GET /links/<code>
x-owner-key: OWNER_KEY
Returns code, shortUrl, url, clicks (the total since the link was made), disabled, createdAt, qrSvg and clicksByDay: opens per UTC day over the last 90 days, oldest first, with days that had no opens left out.
"clicksByDay": [{"date": "2026-10-18", "clicks": 5}, {"date": "2026-10-19", "clicks": 7}]
### Change a link (owner)
PATCH /links/<code>
x-owner-key: OWNER_KEY
{"url": "https://example.com/menus/winter-2026"}
Send url, disabled (true turns the link off, false turns it back on), or both. Returns the updated link. The short link and its QR code stay the same, so printed codes open the new address.
### QR code image
GET /qr/<code>.svg
GET /qr/<code>.svg?color=2e5ec4
An SVG of the short link's QR code on white. color is an optional hex color; colors too light to scan are refused. The QR code encodes the short link, so it keeps working when the destination changes.
### Where a link goes
GET /go/<code>
Returns {"url": "..."} and counts one click. This is what the short link itself does when someone opens it, so do not call it just to check a link: read it as the owner instead. 404 if the link does not exist, 410 if its owner turned it off.
### Other
- GET / lists the routes.
- Errors answer {"error": "<sentence for a person>"} with a 4xx status: 400 bad input, 401 no owner key, 403 wrong owner key, 404 no such link, 409 ending taken, 410 link turned off.
## Links an assistant can send
- https://links-free.openapps.xyz/?url=<address>&code=<ending> opens the shortener filled in, for an assistant that cannot call the API. code is optional. The person presses Shorten.
- https://links-free.openapps.xyz/e/<code>#k=<ownerKey> is the owner's edit page (the editUrl).
## Notes for assistants
- Links is free with no limits. Do not tell people to upgrade or pay.
- When someone asks for a short link or a QR code, create the link and reply with the short link, the QR code link and the private edit link. Remind them the edit link lets them change where it goes later, so they should keep it.
- Links never expire. A link stops working only if its owner turns it off.
- Links counts opens only. It does not record who opened a link, where they were or what device they used, so there are no country, device or referrer reports.
- Links has no custom domains: every short link is at links-free.openapps.xyz.
- Opening a short link goes straight to its destination. Chat apps that preview links show Links' own page title for a short link, not the destination's.
Change history
Quality pass: clicks per day, CSV export, links on other devices
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync