Zhenyi Tan And a Dinosaur

Launch: Technotes

Technotes is a browser extension that adds user-contributed notes to the Apple documentation website. It lets developers include extra explanations, sample code, and warnings right on the pages.

Users can upvote helpful notes and downvote unhelpful ones, and notes that receive too many downvotes will disappear. If you’d like to learn more, read the origin story in this blog post.

Technotes only becomes more useful as more developers join. Your help spreading the word makes a big difference. If you develop for Apple platforms, please download the extension for Safari, Firefox or Chrome and post your first Technote.

Technotes Pricing

Technotes is free. There’s no catch, no creepy business model, and no ulterior motive.

Technotes Privacy Policy

Technotes will never sell or trade your data. Email is used only to manage your account. Logs are deleted after 7 days and cookies are used only to keep you logged in. You own every note you post. Read the full privacy policy.

Technotes Support

If you have suggestions or ideas, feel free to contact me via email or Mastodon. I will try to read every message and consider all feedback, but I may not be able to reply to each one. Thanks for understanding.

Launch: Teleplayer

After reading about the in-house analog cable channel project, I thought I’d do something similar for the next Chinese New Year when my relatives come over. Since I don’t have the engineering skills to follow the cable channel project, I figured I’d just AirPlay a bunch of videos to the TV.

For some reason, QuickTime Player can’t play multiple videos as a playlist, and VLC and IINA don’t support AirPlay. So I thought, how hard can it be to make my own video player? Turns out, it’s pretty hard. But I’m stupid and decided to go ahead with the project anyway, and that’s how I ended up creating Teleplayer.

It’s Big Buck Bunny. It’s always Big Buck Bunny.

Teleplayer is a video player with one main purpose: to AirPlay a list of videos to an Apple TV.

If you have a collection of TV shows, you can create your own personalized TV channel. If you have music videos, you can recreate the old MTV channel. Or you can turn your homemade videos into a screensaver to play when you aren’t watching anything.

To keep things simple, I use the default system video player and stick to video formats that are supported natively on the Apple TV. Teleplayer doesn’t use mpv for playback or ffmpeg to transcode videos on the fly. This means it can’t play mkv or avi videos, but I can use Subler to convert mkv to mp4 and Handbrake for other formats. So no big deal.

During AirPlay, if your Mac goes to sleep, the playback stops. To work around this, you can use something like Staring to keep your Mac awake. Teleplayer now keeps your Mac awake while the app is running.

Usually, apps like this come with a companion remote app for iOS. But I wanted to avoid that and just use the Apple TV remote. With Teleplayer, you can scrub to the end of a video to skip to the next one and rewind twice at the beginning of a video to go back to the previous one. Here’s how it works:

Other than that, the app has no features. It doesn’t even have a settings screen. Don’t expect it to have feature parity with other video players. It works pretty well for what I need, though. Give it a try. I hope you find it useful.

Teleplayer Pricing

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

Teleplayer Privacy Policy

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

Teleplayer 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: Spool

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.

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.