Screenshot of Pass It by Ranjith Kumar Kakkarayil

Pass It

PassIt is AirDrop for reading position: press one key on your laptop, scan the QR with your phone, and the same page opens at the same paragraph with the same highlight—scan again on another computer and pick up there. The handoff lives entirely in the link fragment, so there is no server, no account, and no sync; a bookmark saves an address, PassIt moves where you left off.

PassIt: AirDrop for Where You Are on a Page

You're halfway through a long article on your laptop and it's time to leave. You want to keep reading on your phone.

So you share the link, open it on your phone, and land at the top of the page. Then you scroll and scroll, trying to find the paragraph you were on.

A link saves an address. What you actually wanted to move was your place on the page.

PassIt does that. Press one key, scan the QR code with your phone, and your phone opens the same page at the same paragraph, with the same text highlighted. Show that code to another computer's webcam and carry on there.

Try it: passit.ranjithkumarkakkarayil.com · Code: GitHub

How it works

The whole handoff is inside the link. There's no server, no account and no sync.

When you press the shortcut, PassIt captures:

  • the page address and title,
  • any text you've selected,
  • a distinctive snippet of the text that was on your screen,
  • how far down the page you were,
  • and, for videos, the current timestamp.

That bundle is compressed and packed into the fragment of a link, the part after the #. Browsers never send the fragment over the network. The PassIt page that opens on your phone is just a decoder; it never receives your data.

So a handoff is only as visible as the two screens involved, and it works with the Wi-Fi off.

The hard part: landing on the right paragraph

You can't inject a scroll script into someone else's website from a phone. So PassIt uses a built-in browser feature called text fragments. A link like this:

https://example.com/article#:~:text=The%20surface%20code%20needs

tells the browser to scroll to that exact text and highlight it. Chrome, Edge, Safari 16.1+ and Firefox 131+ all support it.

Getting it to work reliably came down to three details:

  1. Anchor on what you were reading, not on page clutter. PassIt looks at what's in the middle of your screen and skips anything pinned in place, like cookie banners and sticky navigation bars. Otherwise "where you were" would be the cookie banner.
  2. Make the snippet unique. The browser jumps to the first match on the page. If your snippet also appears earlier, you'd be sent backwards. PassIt lengthens the snippet until it's unique, and if that's not enough, adds the text just before it to pin down the right spot.
  3. Fall back gracefully. PassIt also includes the nearest section ID, so a browser that ignores text fragments still lands close by.

If you selected some text, that wins, because it's the clearest signal of what you meant. If the page has no usable text, the phone tells you "you were 63% down" instead of guessing.

Why the QR code is smaller than you'd expect

QR codes have a special compact mode for uppercase letters and digits. PassIt encodes its data in base32, which only uses characters from that compact set, so each character costs about 5.5 bits instead of 8. Combined with a custom QR encoder that mixes modes, that fits about 18% more data into the same code. It's the difference between a code you can scan from across a desk and one you can't.

Sending from your computer

There are two ways to send:

Browser extension (Chrome, Edge, Arc, Brave):

  1. Download the extension zip from the PassIt page and unzip it.
  2. Open chrome://extensions, turn on Developer mode, click Load unpacked, and choose the unzipped folder.
  3. Press ⌥⇧P (Option+Shift+P) on any tab.

The extension asks for minimal permissions. It can't read any page until you press the button.

Bookmarklet (Safari, or a computer where you can't install extensions): open the PassIt page, expand Set up the sending side, and drag the button to your bookmarks bar. Clicking it shows the QR code on top of whatever page you're on.

Safety choices

A QR code can contain anything, so PassIt is careful on the receiving end:

  • It never opens the page automatically. The phone always shows the destination website first and waits for you to tap.
  • Only normal web links are allowed. Anything that isn't http or https is refused outright, so a malicious code can't run scripts.
  • No history and no tracking. There's nothing to track; nothing is stored anywhere.

Under the hood

  • Zero dependencies. The QR encoder (all 40 QR versions), compression and capture logic are all written from scratch.
  • 61 automated tests, two of which I'm especially proud of:
    • Every generated QR code is decoded by Apple's Vision framework, the same kind of scanner a real phone uses. A subtle bug in a QR encoder can produce a code that your own decoder reads perfectly and no real phone can scan. All 40 versions were checked this way.
    • Capture and restore run in a real WebKit browser engine. The tests scroll a sample article, capture the position, load the generated link, and check that the same paragraph is back on screen, including when that paragraph appears twice in the document.
  • The receiver page is four static files, hosted on Netlify. You could host it anywhere.

Known limits

  • Pages that build their content after loading, like single-page apps or infinite scroll, can miss the text match, though the section-ID fallback usually still helps.
  • Video timestamps are only applied for YouTube. Elsewhere, the time is shown but not jumped to.
  • Extensions can't read browser-internal pages, the Web Store or the built-in PDF viewer. There, PassIt sends just the address and tells you so.

What I learned

The most satisfying part was saying no to a server. Every sync product reaches for one, and the moment you add it, a URL and a reading position start leaving the room. Fitting everything into a QR code was a tighter constraint, but it made PassIt private by design, not by policy.

Next time you have to leave mid-article, press ⌥⇧P.

More projects .

Screenshot of Deskling, mac app, productivity & wellbeing by Ranjith Kumar Kakkarayil

Deskling

Deskling is a free macOS app that puts a small animated companion on your desktop. It wanders, naps and waves, and walks over to gently remind you to drink water, stretch and take breaks.

Screenshot of Tap Trail by Ranjith Kumar Kakkarayil

Tap Trail

TapTrail — You click through a site once while recording. Someone else opens the link and replays the path step by step: scroll, numbered marker, tooltip. It is a few kilobytes of steps, not a screen recording.

Screenshot of What Made You Smile Today by Ranjith Kumar Kakkarayil

What Made You Smile Today

What Made You Smile Today? began with one simple thought: good things deserve a place to be shared too. After reading an inspiring article by a close friend, I wanted to share it more widely—but couldn’t find a space focused only on positive moments. So I built one.

Screenshot of OneScreen by Ranjith Kumar Kakkarayil

OneScreen

OneScreen turns a laptop or projector into a shared wall: open a room, scan the QR, and photos, links, scribbles, and short messages appear on the big screen the moment someone sends them—no accounts, installs, or history.