Zhenyi Tan And a Dinosaur

Launch: Spool

Update: Threads will finally let you set the following feed as your default. What do you call it when you get sherlocked by someone other than Apple?

Spool is a Safari extension that adds a few features to the Threads web app.

With Spool, you can set Following as your default timeline. You can also filter posts from certain users (e.g. engagement farmers) or based on keywords (e.g. engagement bait).

Threads like to show me posts from complete strangers, but I think it’s rude to mute them. So, instead of hiding posts completely, I added a reveal button to show filtered posts. (Filters are saved in iCloud, so sometimes you have to quit and reopen Safari for the new filters to take effect.) Spool also removes the l.threads.net redirect tracking when you click on an external link.

Since Safari extensions don’t work on web apps added to your iPhone or iPad home screen, the mobile version of Spool lets you turn the app into a simple Threads browser, with your settings intact.

If you use Threads but don’t like their approach to maximizing engagement, give Spool a try. I hope you find it useful.

Spool Pricing

Spool is available for $1.99 on the App Store. There are no subscriptions, in-app purchases, ads, or tracking. It’s a universal purchase, so once you buy it, you can use it on all your Apple devices.

Spool Privacy Policy

Spool doesn’t collect, store, or transmit any personal information. But since this is about Threads, you might want to check out their privacy policy.

Spool Support

If you have any questions, feel free to contact me via email, Mastodon, or Threads. I read all my emails and social media mentions, but sometimes I’m too socially awkward to reply. Sorry about that in advance.

Explaining Passkeys with Way Too Many Analogies

If you think about it, using passwords to log in is really weird.

When you sign up, you’re basically shouting a secret word over the ether to the server. The server hears your word, writes it down, and stores it.

Then when you want to log in, you shout your secret word to the server again. The server hears the word, writes it down, and checks it against their note. If it matches, you’re logged in.

At this point, I hope you find it as weird as I do: shouting my word every time I log in? How is that “secret”? What happens if someone else hears it? What happens if someone hacks into the server and steals the notes? What happens if someone tricks you into telling them the word?

We can solve some of these problems by making our secret word complicated and hard to pronounce. To prevent people from overhearing it, we can whisper it over a walkie-talkie. To stop hackers, the server can write their notes with a handwriting so ugly it’s unrecognizable by anyone. But if you get tricked and give your secret word to some baddies… we don’t have a good solution.

I mean sure, let’s be vigilant and always on the lookout for baddies. But what if the baddies are really good at pretending to be trustworthy? Then it’s hard to say. Even security experts come close to falling for that.

Enter Passkeys

Passkeys are designed to solve these problems. With passkeys, the sign-up and login flow differ a bit. When you sign up, you create a key and a lock—digitally, of course—and only pass the lock to the server.

When you log in, the server locks a box with your lock and gives it to you. You unlock the box with your key and send it back. The server then checks if the box’s contents match what it had before. If they do, you’re logged in.

Notice how in both the sign-up and login flows, your key never leaves your house. You’re unlocking the box in the safety of your house, so you never have to worry about baddies. If baddies try to trick you into handing over your keys, well, your key never leaves your house, so you wouldn’t even know how to give it to them.

The makers of passkeys are thinking one step ahead. What if someone breaks into your house? To solve this, they put your keys inside a strongbox in your house, out of reach of everyone—even you. You can use the keys by scanning your face at the strongbox, and the rest is taken care of.

This made some people uneasy. If my keys are out of my reach, are they even mine? What if I own multiple houses, or move house? Don’t worry, the strongbox is magic and will be teleported to your new house. What if I own a different type of house that comes with a different type of strongbox? Don’t worry, you can create separate pairs of keys and locks for each of your houses. And I heard the passkey makers are coming up with a way to move keys between different types of strongboxes, too.

Some people are still unhappy. They don’t want to use the strongboxes that came with their houses. What if I get chased out of my house for some reason? What if I want to live in a cave?

Maybe one day, you’ll be able to hide your keys under your pillow, which you can control, and bring with you wherever you move. Maybe you’ll be able to download blueprints of different strongboxes and build your own.

In the end, it’s about responsibility. Do you want to be responsible if your passwords get stolen? Or do you want to trade some control for convenience? Only you can answer that.

Lucky Now Supports !Bang Syntax

It took some time, but I’ve finally added the 13,000+ bang shortcuts to Lucky. (It was a somewhat labor-intensive process.)

Bangs in Lucky are faster than DuckDuckGo’s because they don’t need to go through a server.

Random things about bangs you probably already know

Bangs are special keywords that allow you to search other websites directly. You’ve probably used the popular ones, like !g for Google, !a for Amazon, !w for Wikipedia, and !yt for YouTube.

But there are some lesser-known and weirder bangs. For example:

Unlike Firefox’s smart keywords, bangs work anywhere in your search query. You don’t have to go back to the start to add your !g, just insert it whenever you want.

Also, bangs are stackable. So if you want to search Google for, say, Daring Fireball, you can do this: !df !g your query. This will first transform into a site search for daringfireball.net, then the site search query will be passed to Google.

So if you’re a DuckDuckGo user and you’ve been holding out on Lucky because of bangs, now is a good time to give it a go. Lucky supports bang syntax starting with version 1.1.0. The update is set to be pushed to you within the next 7 days, but if you can’t wait, here’s a direct link to the update.

Launch: Doomscroll

The story begins with me getting overwhelmed by RSS.

When I first set up my RSS reader, I stupidly subscribed to some “general” news sites. Soon, I was flooded with news from all of them. Then I unsubscribed from them all. I concluded that RSS is good for blogs that update 3 times a year, but not for constant news.

Then I found the Wikipedia news page. But every time I visited that page, I had to figure out what was new and what had been updated. The page sometimes had layout issues that made it difficult to scroll on my phone. So I decided to make an app for that.

I don’t use Facebook, but I was fascinated by the short-lived Facebook Paper app and its MikeMatasMikeMatas design. I wanted to use that design, but with vertical scrolling because no one likes horizontal scrolling.

Then I realized, isn’t this design just like TikTok? So I went with that. I named the app Doomscroll as a joke and made a silly icon for it.

Doomscroll Overview

Doomscroll is a news reader app that helps you stay informed without feeling overwhelmed. It shows you about 10 curated news items each day. You are supposed to open the app, spend a minute browsing through the news, and then get back to your day.

Doomscroll shows you “world news,” which are mostly bad news that are mostly irrelevant to you. This way, you can use your RSS reader for tech news (or finance, or politics lol) and get your general news from Doomscroll.

(Yes, I know this could have been an RSS feed, but most RSS readers don’t pick up updates to entries. Ongoing news items in Doomscroll update themselves.)

If you are a completionist, good news for you because it’s easy to scroll through the whole list. There’s a very obvious indicator at the end of the list.

Doomscroll Pricing

Doomscroll isn’t free, but it’s very affordable at just $0.25 per month or $3 per year. For comparison, Apple News+ is $13 per month, which is 52 times more expensive. I know Apple News+ offers more, but it also offers Taboola chumbox ads...

I’m trying to find a balance here. Subscriptions are expensive and annoying, and one-time fees aren’t sustainable for apps. Although Doomscroll is a subscription, I’m really just selling a $3 app that, if you still use it after a year, consider paying another $3.

If you’re tired of the constant flood of news and want a simpler way to stay informed, Doomscroll is for you. It’s designed to be used for just a few minutes each day, helping you stay updated without getting sucked into the 24-hour news cycle. I hope you find Doomscroll helpful.

Doomscroll Privacy Policy

Doomscroll doesn’t collect, store, or transmit any personal information.

Doomscroll Support

If you have any questions, feel free to contact me via email or Mastodon. I read all my emails and Mastodon mentions, but sometimes I’m too socially awkward to reply. Sorry about that in advance.

Weird Safari Extension Bugs

There are 2 Safari extension bugs that drive me nuts when doing customer support. (Well, more than 2, but these 2 are the most notorious lately.)

1. Extension Activation Issue on iOS

On iOS, after turning on the Safari extension in the settings and granting it permissions to access web pages, the extension may still not be active in Safari.

How to Fix: Open Safari, go to the AA menu in the address bar, select Manage Extensions, and turn on the extension again. On the webpage where the extension is supposed to work (e.g. youtube.com for Vinegar, search.yahoo.com for Lucky), if the extension’s icon is blue, it means the extension is active. Otherwise, it’s not.

If you see a warning sign like this ⚠️ beside the extension’s name, it means it still doesn’t have the necessary permissions. Tap it to grant the permissions.

2. Extension Deactivation After OS Update

When updating the operating system, there’s a chance that your Safari extension will be turned off.

How to Fix: Go through the setup process again.

Launch: Lucky Notes

A little while ago, I launched the Lucky app. It turns the Google search results page into “ten blue links.” It also removes tracking and lets you block spammy domains.

There’s a problem, though. Since the search engine doesn’t know who you are, it can’t personalize the search results for you. This means the results might not be as relevant because they aren’t tailored to your interests and past behavior.

Typically, “personalization” means doing some creepy shit, like sifting through your personal data, building a profile of you, and then using algorithms to figure out what you might want to see.

My solution is very stupid. I made an app that lets you save text snippets. So when you search, Lucky will also search through your saved text and include the relevant results. I call this app Lucky Notes.

Remember when we used to blog about new things we learned, so we could easily find them later by googling? Lucky Notes is kind of like that, but it doesn’t involve blogging.

By the way, if you’re interested in blogging again, I have a service you might like. (See, I know how to cross-promote my stuff, too!)

Since Lucky Notes is a simple app, I decided to add a touch of nostalgia. The app uses an old-school font, has a striped navigation bar, and square-ish navigation buttons. The icon is Lucky the cowdog. A cowdog is not the same as a dogcow. They’re very different. Donsumi.

Lucky Notes Pricing

Lucky Notes is available for $0.99 on the App Store. There are no subscriptions, in-app purchases, ads, or tracking. It’s a universal purchase, so once you buy it, you can use it on all your Apple devices.

Lucky Notes Privacy Policy

Lucky Notes doesn’t collect, store, or transmit any personal information.

Lucky Notes Support

If you have any questions, feel free to contact me via email or Mastodon. I read all my emails and Mastodon mentions, but sometimes I’m too socially awkward to reply. Sorry about that in advance.

Launch: Imgpls

I wrote this app to fix a personal annoyance. You probably don’t need it.

I’m not an Imgur user. But in my day-to-day browsing, I sometimes encounter a wild Imgur link. And when I click that link, it takes me to the Imgur website, and the logo loads. Then the app banner thing on top loads. Then I see the popup that asks me to download the Imgur app. Then I have to dismiss the popup to see the image. Then when I try to zoom in, the website loads another image, for some reason.

With Imgpls, clicking links like i.imgur.com/fxBBsLx.gif loads the image directly.

URL Patterns Supported

Imgpls changes URLs with the following patterns:

Imgpls doesn’t change URLs with the following patterns (mostly because they might contain multiple images):

Imgpls Pricing

Imgpls is available for free on the App Store. There are no subscriptions, in-app purchases, ads, or tracking.

Imgpls Privacy Policy

Imgpls doesn’t collect, store, or transmit any personal information.

Imgpls Support

If you have any questions, feel free to contact me via email or Mastodon. I read all my emails and Mastodon mentions, but sometimes I’m too socially awkward to reply. Sorry about that in advance.

Clarifying the Yahoo and Google Confusion with Lucky

Yesterday, I launched Lucky, a Safari extension that removes the clutter from Google search results. Many people are confused by the setup instructions, so let me explain:

I thought Lucky improves Google search? What does this have to do with Yahoo?
Lucky fetches Google’s results and shows them on Yahoo. The specific webpage doesn’t matter, I could’ve used any site. I could’ve used zombo.com. Yahoo is just a container to display results from Google.

Can’t you just make Lucky work on google.com?
You might still want to access the original google.com for things like searching for flights, hotels, sports scores, or solving math problems. These features aren’t available with “10 blue links.”

Why do I have to set my default search engine to Yahoo?
This allows you to search with Lucky directly from the address bar. It’s similar to how DuckDuckGo used to work before it was an option in Safari.

I’m still confused. So whose results am I seeing? Google or Yahoo?
You’re seeing Google’s results.

Additional Issues

Aside from the Yahoo-related questions, there are a few other issues that users have encountered:

I live in the EU and Lucky seems to be flaky for me.
In the EU, Google sometimes shows a cookie consent page that you have to accept before accessing the search results. This is fixed in Lucky 1.0.3.

My network is being flagged by Google, and I have to solve multiple captchas to access the Google homepage.
Lucky can’t help with that. You should get a refund from Apple.
I tried to solve this by letting you solve captchas in the app and sending those cookies to Google, but it didn’t work well. Sorry I couldn’t come up with a better solution.

Launch: Lucky

Lucky is a Safari extension that removes the clutter from the Google search results page, leaving you with the 10 blue links.

Update: Clarifying the Yahoo and Google confusion with Lucky.
Update: Lucky Now Supports !Bang Syntax.

The classic copywriting formula for selling something tells you to start by talking about the problem, then talking about your solution.

So, the problem. Where do I start with the problems in Google search? I feel like I could write multiple posts on this topic. Should I talk about the declining quality of search results? Their monopoly? Or the AI-generated snippets that tell you to eat rocks and put glue on pizzas?

Anyway, the gist is that Google has added a lot of crappy features, and their search experience sucks now. So much so that people have to add “&udm=14” in the URL to get a cleaner search results page. Lucky takes it a step further.

Lucky not only removes the clutter from the Google search results but also removes tracking, lets you block spammy domains, and fixes some of the annoyances with Google search.

Privacy, Filtering, and Annoyances

Lucky clears the existing HTML and recreates the search results page from scratch. The final page is free of JavaScript. This removes all forms of JavaScript-based tracking and the redirect thing Google does to track you when you click on a search result.

Now, removing the clutter alone won’t improve search result quality. We still need to filter out those SEO spammers.

A few years ago, I made an app to filter search results, but the swipe-to-delete gesture didn’t work well because Google kept changing their HTML. With Lucky, I’m writing the entire HTML from scratch, so it made sense to bring this feature back. The block list is now backed by CloudKit, so it syncs across all your devices.

Lucky uses an old-school pagination footer instead of infinite scrolling. Infinite scrolling made sense when search results were accurate, and you didn’t need to return to the search results page often. But now, I often find myself dissatisfied with the results, go back, and get thrown to the top of page 1.

Google doesn’t use the standard method for switching between light and dark modes, possibly to support older browsers. But their dark mode is so buggy that I often have to refresh the page several times for it to work.

There’s a weird bug (video) with Google where I’d search for something, click on a result, go back, and the search results page would flash for a second before switching back to the destination page. This causes the tab to hang, forcing me to open a new tab to continue my search.

Miscellaneous Features

Even though web extensions are written using JavaScript, I don’t want any JavaScript on Lucky’s results page. There’s no search bar on Lucky’s page because you can search directly from the address bar, which already supports search history and autocomplete.

Lucky fetches Google’s results and shows them on Yahoo. This way, you can fall back to the unmodified Google if needed. It also means Lucky can’t access the content of google.com, which might make some of you feel more comfortable.

Sidenote: I know there are many alternative search engines out there. There’s Kagi, which uses Google’s results but costs $5/month for 300 searches. Then there’s DuckDuckGo, which uses Bing’s results. Sometimes, DuckDuckGo is slow for me, and I have no idea why.

Lucky Pricing

Lucky is available for $2.99 on the App Store. There are no subscriptions, in-app purchases, ads, or tracking. It’s a universal purchase, so once you buy it, you can use it on all your Apple devices.

Lucky isn’t for everyone. If you’re happy with Google or prefer Kagi/DuckDuckGo, you might not need it. But if you’re unhappy with Google and still want an air-gapped way to use it, give Lucky a try.

Lucky Privacy Policy

Lucky syncs your block list through iCloud. When you search, Lucky sends your query to Google. Other than that, Lucky doesn’t collect, store, or transmit any personal information.

Lucky Support

If you have any questions, feel free to contact me via email or Mastodon. I read all my emails and Mastodon mentions, but sometimes I’m too socially awkward to reply. Sorry about that in advance.

Launch: Vinegar 3

Today, I’m launching Vinegar 3, a major small update to Vinegar. This update introduces a new extension, Vinegar Extract.

Vinegar Extract does what the original Vinegar does—it replaces the YouTube video player with a <video> tag. But it doesn’t block ads. So, you’ll need to use it alongside an adblocker or a YouTube Premium subscription.

Why?

I’ve been keeping an eye on the YouTube anti-adblock situation for some time. In fact, to prevent Vinegar from being blocked by YouTube, I’ve already had to rewrite it twice.

I’ve found that when Vinegar is used with other extensions, adblockers, or even VPNs, it can sometimes cause issues. But these issues aren’t caused by Vinegar itself.

Sometimes, YouTube returns 403 errors when you try to load videos using their API. This can make some videos unwatchable. When this happens, I have no choice but to fallback to the ad-laden videos on the YouTube website, which isn’t ideal.

So, thinking about all these problems, I’ve decided to focus on what Vinegar does best—transforming the YouTube video player. As for blocking ads, I suggest using dedicated adblockers. They’re better equipped to keep up with YouTube’s constant changes. This way, I can focus on making Vinegar better, and the adblockers can handle the rest.

Which Adblocker Should I Use?

There are many good adblockers out there. uBlock Origin is probably the most capable, but it’s not available for Safari. So, AdGuard (Mac, iOS) is a good alternative since their filter lists are pretty much the same.

If you’re already using an adblocker, it should work fine, too. Just make sure it’s updated with the latest anti-anti-adblock filters.

What about the Original Vinegar?

Don’t worry, I’m not removing the original Vinegar extension. When you install the app, you’ll see both extensions. If the original Vinegar extension works for you, you don’t have to switch to Vinegar Extract. You can pick the one that works best for you, just don’t enable them both at the same time.

But due to the issues I mentioned, I might be gradually reducing support for the original extension.

Vinegar was launched in 2021. Now, Vinegar 3 is here as a free update. I hope you find it useful. I think this update will ensure the longevity of Vinegar.