links-free.openapps.xyz

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.
Owned app · rev 9e2af813edac
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.
← All files
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<script>
// Short links: /<code> opens its destination right away, before anything else on the page loads.
(function () {
  var m = location.pathname.match(/^\/([A-Za-z0-9_-]{3,32})\/?$/);
  if (!m || /^(api|e|new|admin|about|help|assets|art|fonts|__bounded)$/i.test(m[1])) return;
  document.documentElement.className = "go";
  function stop(text) {
    function show() {
      document.getElementById("go-text").textContent = text;
      document.getElementById("go").className = "go-stopped";
    }
    if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", show); else show();
  }
  fetch("https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/go/" + m[1]).then(function (r) {
    return r.json().then(function (b) {
      if (r.ok && /^https?:\/\//i.test(b.url)) location.replace(b.url);
      else stop(b.error || "This link does not exist.");
    });
  }).catch(function () { stop("This link could not be opened. Check your connection and try again."); });
})();
</script>
<style>
#go { display: none; }
html.go body > :not(#go) { display: none !important; }
html.go #go { display: grid; place-content: center; justify-items: center; gap: 14px; min-height: 100vh; min-height: 100dvh; padding: 24px; text-align: center; }
#go-text { font: 400 20px/1.4 var(--serif, Georgia, serif); color: #5d6169; }
#go .go-more { display: none; }
#go.go-stopped #go-text { max-width: 18ch; font-size: 30px; line-height: 1.2; letter-spacing: -.02em; color: #15171b; }
#go.go-stopped .go-more { display: block; }
#go.go-stopped a.go-more { display: inline-flex; margin-top: 8px; }
#go .go-art { width: 140px; height: auto; }
#go p.go-more { max-width: 34ch; color: #5d6169; }
</style>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Links: free Bitly alternative with unlimited short links and QR codes | OpenApps</title>
<meta name="description" content="Links is a free Bitly alternative: unlimited short links and QR codes, custom endings, clicks per day, and destinations you can change after printing. No ads, no sign-up, no expiry.">
<link rel="canonical" href="https://links-free.openapps.xyz/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="OpenApps">
<meta property="og:title" content="Links: free Bitly alternative with unlimited short links and QR codes">
<meta property="og:description" content="Shorten a link, pick its ending, get its QR code. Change where it goes any time, even after printing, and see clicks per day. No ads, no monthly cap, no expiry.">
<meta property="og:url" content="https://links-free.openapps.xyz/">
<meta property="og:image" content="https://free-apps.openapps.xyz/og/links.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="theme-color" content="#fdfdfc">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="alternate" type="text/plain" title="llms.txt" href="/llms.txt">
<link rel="alternate" type="text/markdown" title="Links as plain markdown" href="/index.md">
<link rel="service-desc" type="application/vnd.oai.openapi+json" title="Links API" href="/openapi.json">
<link rel="preload" href="/fonts/NewsreaderVariable-var.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/ArchivoVariable-var.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/kit.css">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"Links by OpenApps","applicationCategory":"BusinessApplication","operatingSystem":"Web","url":"https://links-free.openapps.xyz/","description":"Free short links and QR codes that never expire, a free alternative to Bitly. Custom endings, destinations you can change after printing, clicks per day and CSV export, with no ads, no monthly cap and no sign-up.","featureList":["Unlimited short links and QR codes","Custom endings","Change where a link goes after printing","Clicks per day for the last 30 days","QR codes as PNG or SVG in your color","CSV export","Public API with no key"],"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"isAccessibleForFree":true,"dateModified":"2026-10-19","publisher":{"@type":"Organization","name":"OpenApps","url":"https://openapps.xyz"}}
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Is there a free alternative to Bitly?","acceptedAnswer":{"@type":"Answer","text":"Yes. Links makes unlimited short links and QR codes for free, with custom endings, clicks per day and destinations you can change after printing. There is no ad page before your link opens, no sign-up and no expiry. It does not do custom domains."}},{"@type":"Question","name":"Is Links really free?","acceptedAnswer":{"@type":"Answer","text":"Yes. There is no paid plan, no ads and no limit on links, QR codes or clicks. Each click is one small read and write, and OpenApps pays for it."}},{"@type":"Question","name":"Do the links or QR codes expire?","acceptedAnswer":{"@type":"Answer","text":"No. Links never turns a link off. Only you can, from its edit page. Some QR code generators switch off dynamic codes when a free trial ends; Links has no trial."}},{"@type":"Question","name":"Is there an ad page before the link opens?","acceptedAnswer":{"@type":"Answer","text":"No. Opening a short link goes straight to its page, with no ad and no countdown."}},{"@type":"Question","name":"Can I change where a link goes after printing its QR code?","acceptedAnswer":{"@type":"Answer","text":"Yes. Open the link's private edit link and paste the new address. The short link and the QR code stay the same, so printed codes open the new page."}},{"@type":"Question","name":"Can I see how many people clicked my link?","acceptedAnswer":{"@type":"Answer","text":"Yes. The edit page shows the total since you made the link and a bar for each of the last 30 days. Links counts opens only: it does not record who opened a link, where they were or what device they used."}},{"@type":"Question","name":"What is the edit link?","acceptedAnswer":{"@type":"Answer","text":"When you make a short link, Links gives you a private edit link. It lets you change the link, turn it off and see its clicks, on any device and without an account. Anyone with it can edit the link, so keep it to yourself. This browser also keeps your links under \"Your links\"."}},{"@type":"Question","name":"How do I get my links on another device?","acceptedAnswer":{"@type":"Answer","text":"Under \"Your links\", press \"Copy link for another device\" and open that link on your phone or other computer. It adds all your links there. Anyone with that link can edit your links, so send it only to yourself. You can also download every link, with its edit link, as a CSV file."}},{"@type":"Question","name":"Can other people see my links?","acceptedAnswer":{"@type":"Answer","text":"Nobody can browse or list the links on Links. A short link opens for anyone who has it. Random endings cannot be guessed; a custom ending is as easy to guess as the word you pick."}},{"@type":"Question","name":"Can I use my own domain?","acceptedAnswer":{"@type":"Answer","text":"No. Every short link lives at links-free.openapps.xyz. If your links must carry your own domain, a paid shortener is the better fit for now."}},{"@type":"Question","name":"Can my AI assistant make short links?","acceptedAnswer":{"@type":"Answer","text":"Yes. Links has a public HTTP API with no key. An assistant can shorten a link, get its QR code, read clicks per day and change the link later with the owner key it gets back."}}]}
</script>
</head>
<body>
<div id="go" role="status">
  <img class="art go-art go-more" src="/art/card-links.webp" alt="" width="200" height="184" loading="lazy">
  <p id="go-text">Opening...</p>
  <p class="go-more">Ask the person who sent it for a new link, or make your own.</p>
  <a class="btn go-more" href="/">Make a short link</a>
</div>
<header class="site-head">
  <div class="wrap">
    <a class="brand" href="https://free-apps.openapps.xyz/" aria-label="OpenApps free apps">
      <img src="/logo.svg" alt="" width="26" height="26">
      <span>OpenApps</span>
    </a>
    <span class="brand-sep" aria-hidden="true">/</span>
    <a class="brand brand-app" href="/">Links</a>
    <nav class="site-nav" aria-label="Main">
      <a class="nav-optional landing-link" href="/#how">How it works</a>
      <a class="landing-link" href="/#api">API</a>
      <a href="https://free-apps.openapps.xyz/apps">Free apps</a>
    </nav>
  </div>
</header>

<main>
  <div id="app"></div>

  <section class="app-hero landing-only">
    <div class="wrap app-hero-grid">
      <div class="hero-copy">
        <img class="art hero-art" src="/art/card-links.webp" alt="" width="200" height="184">
        <p class="eyebrow">Free alternative to Bitly</p>
        <h1 class="display">Short links and QR codes that never expire.</h1>
        <p class="lede">Links is a free Bitly alternative. Paste a long link and get a short one with its QR code. Change where it goes any time, even after printing. No ads, no monthly cap, no sign-up.</p>
        <ul class="hero-points">
          <li>Unlimited links, QR codes and custom endings</li>
          <li>Clicks per day for every link</li>
          <li>No ad page before your link opens</li>
        </ul>
      </div>
      <div id="create"><noscript><p class="notice">Links needs JavaScript to make a short link.</p></noscript></div>
    </div>
  </section>

  <section id="mine" class="landing-only"></section>

  <section class="section landing-only" id="how">
    <div class="wrap">
      <h2 class="h2">How it works</h2>
      <ol class="steps">
        <li><h3>Paste a link</h3><p>Paste the long address. Pick an ending like /spring-menu, or let Links choose a short random one.</p></li>
        <li><h3>Share it or print it</h3><p>Copy the short link, or download its QR code as a PNG or SVG in your color, ready for menus, flyers and packaging.</p></li>
        <li><h3>Change it any time</h3><p>Your private edit link lets you point the link somewhere new and see its clicks for each day. The QR code keeps working.</p></li>
      </ol>
    </div>
  </section>

  <section class="section-tight landing-only">
    <div class="wrap">
      <h2 class="h2">Free, with no catch</h2>
      <p class="lede" style="margin-top:14px">A short link should not need a subscription, and a printed QR code should not stop working when a trial ends. Links is free because it costs almost nothing to run: each click is one tiny read and write, and OpenApps pays for it.</p>
      <div class="table-wrap" style="margin-top:24px">
        <table class="table compare">
          <thead><tr><th scope="col"></th><th scope="col">Links</th><th scope="col">Bitly free</th></tr></thead>
          <tbody>
            <tr><td>Short links</td><td class="yes">Unlimited</td><td class="no">5 a month</td></tr>
            <tr><td>QR codes</td><td class="yes">Unlimited</td><td class="no">2 a month</td></tr>
            <tr><td>Custom endings</td><td class="yes">Unlimited</td><td class="no">3 a month</td></tr>
            <tr><td>Change where a link goes</td><td class="yes">Any time, free</td><td class="no">Not on free</td></tr>
            <tr><td>Clicks per day</td><td class="yes">Yes, 30 days on the page, 90 in the API</td><td class="no">Not on free</td></tr>
            <tr><td>Export your links</td><td class="yes">CSV, free</td><td class="no">Not on free</td></tr>
            <tr><td>Page before the link opens</td><td class="yes">Never</td><td class="no">An ad page</td></tr>
            <tr><td>Your own domain</td><td class="no">No</td><td class="no">Not on free</td></tr>
            <tr><td>Account needed</td><td class="yes">No</td><td class="no">Yes</td></tr>
            <tr><td>API for AI assistants</td><td class="yes">Yes, no key</td><td>Account and token needed</td></tr>
            <tr><td>Price</td><td class="yes">Free</td><td class="no">Paid plans from $10 a month, billed yearly</td></tr>
          </tbody>
        </table>
      </div>
      <p class="hint" style="margin-top:12px">From Bitly's <a href="https://bitly.com/pages/pricing">pricing page</a> and its <a href="https://support.bitly.com/hc/en-us/articles/32874287800333-Why-are-there-ads-on-my-links">help article on ads</a>. QR Code Generator switches off dynamic codes made in its 14-day trial when the trial ends (<a href="https://support.qr-code-generator.com/hc/en-us/articles/7665013224205">its help center</a>). Checked October 2026. Already printed Bitly codes? Keep them running and use Links for everything new.</p>
      <p class="not-yet">What Links does not do: custom domains, reports by country, device or referrer, a campaign tag builder, or bulk upload in the page (the API makes one link per call). For a link-in-bio page, use <a href="https://bio-free.openapps.xyz/">Bio</a>.</p>
    </div>
  </section>

  <section class="section landing-only" id="api">
    <div class="wrap api-grid">
      <div>
        <p class="eyebrow">For AI assistants</p>
        <h2 class="h2">Your assistant can shorten links too.</h2>
        <p class="lede" style="margin-top:14px">Links has a public API with no key and no account. One call returns the short link, its QR code and an owner key. With the owner key, an assistant can read clicks per day and change the link later.</p>
        <p style="margin-top:14px">Full reference: <a href="/llms.txt">llms.txt</a> and <a href="/openapi.json">openapi.json</a>. The owner key lets anyone edit the link, so treat it like a password.</p>
        <p style="margin-top:14px">An assistant that can only send links can send <code class="inline">links-free.openapps.xyz/?url=</code> followed by the address: the shortener opens filled in.</p>
      </div>
      <pre class="code"><span class="c"># Shorten a link ("code" is an optional custom ending)</span>
curl -X POST https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/links \
  -H 'content-type: application/json' \
  -d '{"url": "https://example.com/menus/autumn-2026",
       "code": "autumn-menu"}'

<span class="c"># Point it somewhere new, with the ownerKey from above</span>
curl -X PATCH https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/links/autumn-menu \
  -H 'x-owner-key: OWNER_KEY' \
  -H 'content-type: application/json' \
  -d '{"url": "https://example.com/menus/winter-2026"}'

<span class="c"># Clicks: the total and each of the last 90 days</span>
curl https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/links/autumn-menu \
  -H 'x-owner-key: OWNER_KEY'</pre>
    </div>
  </section>

  <section class="section-tight landing-only">
    <div class="wrap">
      <h2 class="h2">Questions</h2>
      <div class="faq" style="margin-top:22px">
        <details><summary>Is there a free alternative to Bitly?</summary><div>Yes. Links makes unlimited short links and QR codes for free, with custom endings, clicks per day and destinations you can change after printing. There is no ad page before your link opens, no sign-up and no expiry. It does not do custom domains.</div></details>
        <details><summary>Is Links really free?</summary><div>Yes. There is no paid plan, no ads and no limit on links, QR codes or clicks. Each click is one small read and write, and OpenApps pays for it.</div></details>
        <details><summary>Do the links or QR codes expire?</summary><div>No. Links never turns a link off. Only you can, from its edit page. Some QR code generators switch off dynamic codes when a free trial ends; Links has no trial.</div></details>
        <details><summary>Is there an ad page before the link opens?</summary><div>No. Opening a short link goes straight to its page, with no ad and no countdown.</div></details>
        <details><summary>Can I change where a link goes after printing its QR code?</summary><div>Yes. Open the link's private edit link and paste the new address. The short link and the QR code stay the same, so printed codes open the new page.</div></details>
        <details><summary>Can I see how many people clicked my link?</summary><div>Yes. The edit page shows the total since you made the link and a bar for each of the last 30 days. Links counts opens only: it does not record who opened a link, where they were or what device they used.</div></details>
        <details><summary>What is the edit link?</summary><div>When you make a short link, Links gives you a private edit link. It lets you change the link, turn it off and see its clicks, on any device and without an account. Anyone with it can edit the link, so keep it to yourself. This browser also keeps your links under "Your links".</div></details>
        <details><summary>How do I get my links on another device?</summary><div>Under "Your links", press "Copy link for another device" and open that link on your phone or other computer. It adds all your links there. Anyone with that link can edit your links, so send it only to yourself. You can also download every link, with its edit link, as a CSV file.</div></details>
        <details><summary>Can other people see my links?</summary><div>Nobody can browse or list the links on Links. A short link opens for anyone who has it. Random endings cannot be guessed; a custom ending is as easy to guess as the word you pick.</div></details>
        <details><summary>Can I use my own domain?</summary><div>No. Every short link lives at links-free.openapps.xyz. If your links must carry your own domain, a paid shortener is the better fit for now.</div></details>
        <details><summary>Can my AI assistant make short links?</summary><div>Yes. Links has a public HTTP API with no key. An assistant can shorten a link, get its QR code, read clicks per day and change the link later with the owner key it gets back. See <a href="/llms.txt">llms.txt</a> or the <a href="/openapi.json">OpenAPI file</a>.</div></details>
      </div>
    </div>
  </section>

  <section class="section-tight landing-only">
    <div class="wrap">
      <h2 class="h2">More free apps</h2>
      <ul class="more-apps">
        <li><a href="https://split-free.openapps.xyz/"><strong>Split</strong><span>Shared expenses, instead of Splitwise</span></a></li>
        <li><a href="https://forms-free.openapps.xyz/"><strong>Forms</strong><span>Unlimited responses, instead of Typeform</span></a></li>
        <li><a href="https://bio-free.openapps.xyz/"><strong>Bio</strong><span>Link-in-bio pages, instead of Linktree</span></a></li>
        <li><a href="https://free-apps.openapps.xyz/apps"><strong>All apps</strong><span>The app store of free alternatives</span></a></li>
      </ul>
    </div>
  </section>
</main>

<footer class="site-foot">
  <div class="wrap">
    <!-- network:start -->
    <nav class="oa-network" aria-label="Free apps from OpenApps">
      <p class="oa-network-title"><a href="https://free-apps.openapps.xyz/">Free apps from OpenApps</a><span>Free alternatives to the apps you pay for, built for people and their AI assistants.</span></p>
      <ul>
      <li><a href="https://sign-free.openapps.xyz/">Sign</a><span>instead of DocuSign</span></li>
      <li><a href="https://forms-free.openapps.xyz/">Forms</a><span>instead of Typeform</span></li>
      <li><a href="https://split-free.openapps.xyz/">Split</a><span>instead of Splitwise</span></li>
      <li><a href="https://links-free.openapps.xyz/" aria-current="page">Links</a><span>instead of Bitly</span></li>
      <li><a href="https://when-free.openapps.xyz/">When</a><span>instead of Doodle</span></li>
      <li><a href="https://pdf-free.openapps.xyz/">PDF</a><span>instead of Smallpdf</span></li>
      <li><a href="https://invoice-free.openapps.xyz/">Invoice</a><span>instead of FreshBooks</span></li>
      <li><a href="https://bio-free.openapps.xyz/">Bio</a><span>instead of Linktree</span></li>
      <li><a href="https://book-free.openapps.xyz/">Book</a><span>instead of Calendly</span></li>
      <li><a href="https://dictate-free.openapps.xyz/">Dictate</a><span>instead of Wispr Flow</span></li>
      <li><a href="https://images-free.openapps.xyz/">Images</a><span>instead of TinyPNG</span></li>
      </ul>
      <p class="oa-network-more"><a href="https://free-apps.openapps.xyz/apps">All free apps</a> · <a href="https://free-apps.openapps.xyz/alternatives">Free alternatives A to Z</a> · <a href="https://free-apps.openapps.xyz/for-ai">Add every app to your AI assistant</a></p>
    </nav>
    <!-- network:end -->
    <div class="foot-note" style="margin-top:0;border-top:0;padding-top:0">
      <span>Links is an <a href="https://openapps.xyz">OpenApp</a>: free, with public <a href="/__bounded/source">source</a> and its own agent.</span>
      <span><a href="https://free-apps.openapps.xyz/">OpenApps free apps</a> · <a href="/llms.txt">llms.txt</a></span>
    </div>
  </div>
</footer>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

Change history

Quality pass: clicks per day, CSV export, links on other devices
9e2af813ed · 4 hours ago
Bounded source sync
29eee7dafa · 1 day ago
Bounded source sync
c5e634046a · 1 day ago
Bounded source sync
12abf93e7e · 1 day ago
Bounded source sync
d0d6a654b1 · 1 day ago
Bounded source sync
e03049f905 · 1 day ago
Bounded source sync
eb5c793bfa · 1 day ago
Bounded source sync
5dd8ec26e1 · 1 day ago