EXPERIMENT 2026-04-16 · 5 min read

We Built an iOS Shortcut That Saves Any Ad in One Tap

We Built an iOS Shortcut That Saves Any Ad in One Tap

# We Built an iOS Shortcut That Saves Any Ad in One Tap

Here's the problem that was driving me nuts.

I scroll Instagram and TikTok for "research" (read: in the bathroom, in line at coffee, at 11pm). I'd see a great ad — some weirdly-specific hook, some UGC format I hadn't seen before — and I'd think "I need to save that for the swipe file."

And then I wouldn't. Because the workflow was garbage.

Screenshot → open Photos → crop → open SwipeBase → upload → type a note → tag it. By the time I got to step three I'd already forgotten why I cared.

So I told Ari: one tap. That's the bar. One tap, ad saved, with the link, the platform, and enough context that I can find it later. Nothing else is acceptable.

This post is how we got there, what didn't work, and the actual .shortcut file you can install on your phone in about thirty seconds.

The thing I thought would work (and didn't)

First instinct: iOS share sheet. You're in Instagram, you tap the little share arrow, SwipeBase shows up in the list, you tap it, done.

Clean. Obvious. Also completely broken for our use case.

Here's the thing nobody tells you about the share sheet on Meta apps: when you "share" an Instagram reel or a Facebook ad, iOS hands your shortcut a URL like https://www.instagram.com/reel/xyz/ — but ads are not the same as organic posts. Sponsored content often doesn't have a stable shareable URL at all. And when it does, Meta's share sheet frequently hands you a deep link that opens the app instead of a web URL our backend can actually parse.

I had Ari build the share-sheet version first anyway, because I didn't believe this until I saw it. We shipped it. It worked maybe 40% of the time. The other 60% it captured nothing, or captured a useless instagram:// deeplink.

Ari flagged the pattern after about a day of me swearing at my phone. Bad data in, bad swipe file out.

The fix: clipboard, not share sheet

Here's what actually works on Meta apps, every single time:

  1. Tap the three dots on any ad
  2. Tap "Copy Link"
  3. Run the shortcut

The copy-link flow is native, stable, and gives you a clean URL. So we built the shortcut to read from the clipboard instead of receiving input from the share sheet.

The whole thing is five actions:

  1. Get Clipboard — grab whatever was just copied
  2. Get URLs from Input — extract the link (so if you copied extra text it still works)
  3. POST to SwipeBase /api/quick-capture — send the URL with an API key
  4. Show notification — tiny confirmation so you know it worked
  5. Speak (optional) — I turned this off, Ari kept it on the template for accessibility

The endpoint on our side does the real work: fetches the ad, pulls the creative, runs Gemini Flash to auto-tag it, drops it in the swipe file. I wrote about the auto-tagging pipeline in a different post — the point here is the shortcut is dumb on purpose. It sends one URL. The server does the thinking.

Building the .shortcut file programmatically

iOS Shortcuts are plist files. You can technically build them in the Shortcuts app, but exporting them and editing them is a pain, and if you ever want to regenerate one with a different API key (like, say, for every user of your SaaS) you need it scriptable.

I had Ari write a Python script that outputs the plist directly. Roughly:

import plistlib

shortcut = {
"WFWorkflowClientVersion": "2302.0.4",
"WFWorkflowTypes": ["WatchKit"],  # standalone, not share sheet
"WFWorkflowActions": [
{"WFWorkflowActionIdentifier": "is.workflow.actions.getclipboard",
"WFWorkflowActionParameters": {}},
{"WFWorkflowActionIdentifier": "is.workflow.actions.detect.link",
"WFWorkflowActionParameters": {...}},
{"WFWorkflowActionIdentifier": "is.workflow.actions.downloadurl",
"WFWorkflowActionParameters": {
"WFHTTPMethod": "POST",
"WFURL": {"Value": {"string": "https://swipebase.net/api/quick-capture"}, ...},
"WFJSONValues": {"Value": {"WFDictionaryFieldValueItems": [
{"WFKey": "key", "WFValue": API_KEY},
{"WFKey": "url", "WFValue": "<clipboard link>"}
]}}
}}
]
}

with open("SwipeBase-Clipboard.shortcut", "wb") as f:
plistlib.dump(shortcut, f)

(Real version has about 150 lines of plist boilerplate — UUIDs, serialization types, WFTextTokenAttachment wrappers. Apple's schema is verbose. Ari did that part.)

The magic isn't the code, it's the WFWorkflowTypes: ["WatchKit"] flag. That makes it a standalone shortcut — triggered from the home screen, Back Tap, Action Button, or Siri — instead of from the share sheet. Which is what we want.

Installing it (and making it one tap)

Install path is:

  1. AirDrop or tap the .shortcut file on your phone
  2. Tap "Add Shortcut" (iOS will warn you it contains an HTTP action — accept)
  3. Add the shortcut to your home screen, or
  4. Set it as a Back Tap action (Settings → Accessibility → Touch → Back Tap → Double Tap → SwipeBase)

I use Back Tap. Double-tap the back of my phone, done. It is genuinely faster than a screenshot.

iPhone 15 Pro users: assign it to the Action Button and it's a single hardware button press. At that point the friction is basically zero.

The real lesson

The interesting part wasn't the shortcut. It was how badly I over-engineered the first version.

I had Ari build the share sheet extension first because it looked like the "right" solution. More elegant. More integrated. Nerdier. And it shipped broken because I didn't actually check whether Meta would hand us clean URLs through that pipe.

The clipboard version is, objectively, uglier. "Copy link, then run the shortcut" is two steps instead of one. But every step works 100% of the time instead of 40% of the time, and the total wall-clock time from "I see the ad" to "it's in my swipe file" is faster because nothing fails.

This is the lesson I keep re-learning: a two-step flow that works beats a one-step flow that doesn't. The MVP of this feature wasn't the prettiest version. It was the version that actually captured ads I wanted to save, at the moment I wanted to save them, on the device I was using.

Ari pointed this out on the postmortem in slightly more polite language. I updated LEARNINGS.md and moved on.

Try it

The .shortcut file lives in the SwipeBase repo. If you're already on SwipeBase, grab your API key from the dashboard, AirDrop the file to your phone, and you're live in under a minute.

If you're not on SwipeBase yet — you should be. It's the swipe file tool I built because every other one made me want to throw my laptop. Sign up, connect your email for forwarding, install the shortcut, and you've got a persistent, AI-tagged library of every ad that's ever caught your eye.

I still do most of my "research" in the bathroom. The shortcut just means I remember why I cared the next morning.

---

Getting these posts in your inbox instead of hoping the algorithm shows them to you? Subscribe to the Machine Earned newsletter — one email per weekday, same voice, no fluff.

Get the playbook. Every experiment. Every number.

I send one email per week breaking down exactly what my AI co-founder built, what it earned, and what failed spectacularly.

Subscribe Free →