Pinned alpha
Bookmarks, self hosted Open source, AGPL-3.0 One container, one data folder One user, one password

A start page for Photos10.0.0.5:8101 and every link you keep, on every browser and every device.

One place for your links, the same on the Mac, the iPhone, Android and any browser you open. It runs on one machine that only you can log into, at home or rented for a few bucks a month, and every device reaches it there. Save with one tap from wherever you are. Folders instead of tags. Links to the services you run are an address and a port, and Pinned treats them that way. Everything sits in one file on that machine, and every night Pinned also writes it out as bookmarks.html, a file any browser can open.

Today
Exampleexample.com
Inbox
SaveThe bookmarkletMac and iPhone browsers

Save from the phone. The title and the address are already filled in.

The bookmarklet opens a small save page with a folder picker, and the browser extension has the same picker in its popup. Pick a folder, or leave it and the link goes to the Inbox, where you sort it later. The iPhone Shortcut saves to the Inbox first, then shows a list of your folders to move it to, so Cancel still keeps the link.

Folder
SortFolders nestDrag, select, reorder

Links arrive in the Inbox. You sort them into folders.

Drag a card onto a folder. Folders nest, so Home lab can hold Personal, System and Files. On the desktop you select the way you do in Finder: click, Shift, Cmd A or a box drawn around them. On the phone there is a select mode with swipe checks, and a long press reorders.

LockA password per folder10 minutes unlocked

A screen share or a demo never shows client links.

A locked folder has its own password, and its contents drop out of every list and search until you unlock it for 10 minutes. The lock button relocks it at once. Locking a folder removes its share links, and a folder with a lock cannot be shared, even while it is unlocked.

In Work
ShareRead onlyPassword and expiry optional

Share a folder by link. Revoke it any time.

The shared page is read only. Add a password and an expiry if you want them. A folder with a lock cannot be shared, even while it is unlocked, and locking a folder removes the links it had.

bookmarks.htmlA copy of all your bookmarks, written every night at 03:00Hover or tap a card to find its line in the file

This file is written every night. Any browser can open it.

Import and export use the same format, the one every browser exports. The file holds your bookmarks and folders. Trash, shares, locks and pins are not in it.

bookmarks.htmlthe browsers' bookmark formatimport and export
<!DOCTYPE NETSCAPE-Bookmark-file-1><!-- This is an automatically generated file. It will be read and overwritten. --><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1><DL><p>    <DT><A HREF="https://example.com" ADD_DATE="1791882840">Example</A>    <DT><H3>Home lab</H3>    <DL><p>        <DT><H3>System</H3>        <DL><p>            <DT><A HREF="http://10.0.0.5" ADD_DATE="1791882840">Dashboard</A>            <DT><A HREF="http://10.0.0.5:8097" ADD_DATE="1791796440">Containers</A>            <DT><A HREF="http://10.0.0.5:8098" ADD_DATE="1791364440">Status page</A>            <DT><A HREF="http://10.0.0.5:8099" ADD_DATE="1791364440">Sync</A>        </DL><p>        <DT><H3>Personal</H3>        <DL><p>            <DT><A HREF="http://10.0.0.5:8090" ADD_DATE="1791882840">Podcasts</A>            <DT><A HREF="http://10.0.0.5:8091" ADD_DATE="1791796440">Notes</A>            <DT><A HREF="http://10.0.0.5:8092" ADD_DATE="1791796440">Documents</A>            <DT><A HREF="http://10.0.0.5:8093" ADD_DATE="1791364440">Recipes</A>            <DT><A HREF="http://10.0.0.5:8094" ADD_DATE="1791364440">Radio</A>        </DL><p>        <DT><H3>Files</H3>        <DL><p>            <DT><A HREF="http://10.0.0.5:8095" ADD_DATE="1791364440">Calendar</A>            <DT><A HREF="http://10.0.0.5:8100" ADD_DATE="1791364440">Git server</A>            <DT><A HREF="http://10.0.0.5:8101" ADD_DATE="1791796440">Photos</A>            <DT><A HREF="https://files.home.example.net" ADD_DATE="1791882840">Cloud files</A>        </DL><p>    </DL><p>    <DT><H3>Reading</H3>    <DL><p>        <DT><A HREF="https://archive.org" ADD_DATE="1791710040">Internet Archive</A>        <DT><A HREF="https://www.mozilla.org" ADD_DATE="1791623640">Mozilla</A>        <DT><A HREF="https://en.wikipedia.org" ADD_DATE="1791623640">Wikipedia</A>        <DT><A HREF="https://www.w3.org" ADD_DATE="1791364440">W3C</A>    </DL><p>    <DT><H3>Shopping</H3>    <DL><p>        <DT><A HREF="https://store.example.org" ADD_DATE="1791710040">Hardware store</A>    </DL><p>    <DT><H3>Travel</H3>    <DL><p>        <DT><A HREF="https://weather.example.com" ADD_DATE="1791796440">Weather</A>    </DL><p></DL><p>
What is in the fileand what is not

One file on your machine holds all of it. A few things are left out on purpose.

In the file

Folders
They nest. Links arrive in the Inbox and you sort them.
Links
A link is known by its address and port, so two services on one machine stay two links. Pinned fetches each site's icon itself.
Pinned and Dashboard
A pinned row on the start screen, and a Dashboard of the links you opened last, by day.
Trash
Deleted links stay 30 days.
Locks
A folder can have its own password.
Shares
A folder can be shared by link, with an optional password and an expiry.

Not in the file

No accounts
One user, one password. There is nothing to sign up for.
No tags
Folders instead of tags, and they nest.
No cloud
It runs on your own machine, a home server or any computer that stays on, and the file stays there.
No tracking
Nothing is reported back to us. The only sites your server contacts are the ones you save, to fetch their icons.
Nothing from other servers
The fonts come with the app, Geist under an open font licence. Site icons are fetched by your server, not by your browser.
No page archive
It keeps the link, not a copy of the page.
Phone and desktopInstalled from the browserMac, iPhone, Android

On the phone, put the app on the home screen.

You install it from the browser to the home screen. On Android it then shows up in the share sheet. Selecting works the same on the phone and the computer: hold a card and let go. Cmd K opens the search on a computer.

Start screen on the phone
Desktop, 1440 wide
Ways to saveSix today, two coming

Six ways today. Two are drawn.

The dark ones are built. The drawn ones are the plan.

  1. Bookmarklet

    Brave, Chrome and Safari on the Mac, Safari on the iPhone

    today

  2. Home screen app

    Installed from the browser on the phone

    today

  3. Android share target

    The installed app, picked from the share sheet

    today

  4. iOS Shortcut

    The share sheet, added from the app's save button page

    today

  5. Token API

    Scripts, launchers and other apps

    today

  6. Browser extension

    Chrome, Brave, Edge; Firefox 142 or newer as a temporary add-on

    today

  7. Safari extension

    Mac

    coming

  8. iOS app

    With a share extension, once there are users

    coming

With a tokenScripts, launchers, other apps

A token lets other tools save links for you.

Make one in the app, paste it into the tool, revoke it when you are done. Six ready examples, each a file in the project on GitHub with its setup steps, once the project is public.

  1. Terminal

    One line of curl from any shell

    today

  2. Raycast

    A script that sends a pasted or copied link straight to the Inbox

    today

  3. Home Assistant

    A ready made action for your automations

    today

  4. n8n

    A workflow you import that takes in a link and saves it

    today

  5. Feed to folder

    New posts from a feed into a folder, hourly

    today

  6. Shortcuts on the Mac

    The iPhone Shortcut, from the Mac share menu

    today

What it is

Links in folders, on every device you use.

Pinned keeps your links and opens them, from any browser and any phone. You save with one tap, the sheet opens on the folder you used last, and you find anything by typing a few letters. Folders and search are the whole system.

No home lab?Run it anyway

We do not host Pinned. You run it, and that is the point.

It needs one machine that stays on, and there are more of those than you think. A Mac or a PC that sits in a corner. A Raspberry Pi. A NAS. A USB stick on an always-on computer works too, though not one we would trust for years. Or rent the smallest server at Hetzner or any other provider, a few bucks a month, and run Pinned there as your own service. Either way the data is yours, on a machine only you can log into.

We collect nothing. No links, no passwords, no share links, no usage data. That is also why the app never checks with us for updates: new versions are announced on GitHub and on this page.

  1. Pick the machineAnything that stays on and runs Docker. At home, or the cheapest server at a provider.
  2. Run one commandThe setup script in the repo installs Docker, writes the compose file, asks for your password once and starts Pinned. Or paste the compose file under Install by hand.
  3. Open your addressAdd it to the home screen on the phone, put the extension in the browser. From then on every device saves to the same place.
InstallDocker composeOne volume with the data

One container, one folder. Set a password and start it.

services:
  pinned:
    image: ghcr.io/pinned-cc/pinned:latest
    environment:
      APP_PASSWORD: ${APP_PASSWORD:?set APP_PASSWORD}
      TZ: UTC
    volumes:
      - ./data:/data
    ports:
      - "9095:8080"
    restart: unless-stopped

The container runs as user 1000 and refuses a folder it cannot write, so make the data folder first and give it to that user. Then start it with your password.

mkdir data && sudo chown 1000:1000 data
APP_PASSWORD='choose one' docker compose up -d
APP_PASSWORD
The login password. Required, and never logged.
DATA_DIR
The folder with the SQLite file, the icons and the nightly export. Default /data, the one volume.
BASE_URL
The address used in the save button and the browser search entry, for example http://homelab:9095. Taken from the request when unset.
Licence
AGPL-3.0
Image
ghcr.io/pinned-cc/pinned, public once released
Source
github.com/pinned-cc/pinned
Address bar
search your links from the browser, on a computer
Status address
your address plus /health, for uptime monitors
Add Pinned to your browser as a search engine. Then, on a computer, type a few letters in the address bar, choose Pinned, and it opens with those letters already searched.
If you watch your server with an uptime monitor, point it at your address followed by /health. It answers ok while Pinned is running, and someone who is not logged in learns nothing else from it.