Zhenyi Tan And a Dinosaur

Launch: Sideways

Sideways is a Safari extension for rotating webpages when screen rotation is off.

I still can’t get over how weird this looks.

If you always keep the screen orientation on your phone locked, but… gah! I think this app is quite self-explanatory. Check it out if you want.

Sideways Pricing

Sideways is free, with no in-app purchases, no ads, and no tracking. Get it in the App Store today.

Sideways Privacy Policy

Sideways does not collect, store, or transmit any personal information.

Sideways Support

If you have any questions, email me or contact me on Twitter.

Launch: Monies

Now you can also track your monies like it’s 1979!

Monies is a very basic expense tracker app I made for my wife. It looks like a spreadsheet because she’d been using Excel to track her expenses. But it’s like a spreadsheet on… whatever the opposite of steroids is.

The whole point of the interface is to let you add items quickly. Just tap anywhere to start editing, then tap next on the keyboard to jump to the next cell. To delete an item, just clear its price and name, then tap Save.

There are no fancy features like linking bank accounts, charts, or even a settings screen. It is available for free on iPhone and iPad, and it syncs via iCloud. I hope you find it useful.

Monies Privacy Policy

Monies does not collect, store, or transmit any personal information.

Monies Support

If you have any questions, email me or contact me on Twitter.

Ikura Period Tracker Is Available on TestFlight

Ikura means “fish Roe” in Japanese.

About a month ago, the internet was full of “delete your period tracker now” posts. So I decided to check out what the popular period trackers are doing and make an app that does the opposite: Ikura is a period tracker that’s private, discreet, and secure.

I don’t have periods, and I’ve never used a period tracker, so let me know if I said something stupid.

Privacy First

I never understand why period trackers need your personal information to function. Or why that information needs to be uploaded to a cloud server. Most people probably want to keep their menstrual cycles to themselves, so Ikura doesn’t collect any data or require an account to use.

Also, you can use the app without an internet connection because it never makes any network requests. Think of it as a good old paper calendar, except Ikura is more secure.

You can import your data from the Health app. Ikura doesn’t export data to the Health app in case you’ve previously granted access to your health data to some “wellness” app.

Discreet Design

Ikura doesn’t look like a typical period tracker app. Instead, it somewhat masquerades itself as a calendar app to avoid attracting attention. It’s not pink and doesn’t use 🌷 flowers or ❤️ hearts in the UI, so you won’t feel uncomfortable using the app in a public place. There is no big header showing “next period in x days” to deter strangers from peeking at your screen. It doesn’t even mention “period” in the app.

You can also set the code words for period, menstrual cycle, and fertility windows.

Security Stuff

Ikura basically treats your data as if they’re passwords. The entire database is encrypted with SQLCipher. The encryption key is stored in the Keychain.

You can (and should) set a passcode to unlock the app.

It is Free

Ikura will be free, with no in-app purchases, no ads, and no tracking. You can sign up for the beta if you want to help test the app.

Launch: Sessions

Sessions is a free Mac app for watching WWDC session videos.

I made it because the videos in Apple’s Developer app are too small and not resizable:

In Sessions, the video view looks like this:

That’s it. That’s the only feature. The app is probably worse than the Developer app in every other way. If you’re interested, you can download it here.

Note: Sessions does not auto-update itself. You must visit this page and manually download new versions as needed.

Sessions Changelog

1.0.5 - Added events (e.g. WWDC22, WWDC21) to the sidebar.
1.0.4 - Added a preference to set SD/HD videos as the default.
1.0.3 - Added keyboard shortcuts ⌘ + ←/→ to skip backward/forward 10 seconds.
1.0.2 - Added “All Topic” sidebar item for easier searching.
1.0.1 - Added playback speed control.

My SwiftUI Wishlist for WWDC

These are some SwiftUI weirdness I discovered while making History Book. I hope they get fixed at WWDC.

This list is incomplete. I only include things that seem straightforward to fix.

1. View modifiers that work as expected

I wish it is possible to change the background of a List with a .background() modifier. Yes, I’m aware of the UIKit workaround.

I also wish it is possible to change the height and width of a .sheet with a .frame(height:width:) modifier. No, I’m not aware any workaround… unless you want to reimplement your own sheet.

2. Some control over the default spacing

Here’s the toolbar of the Notes app:

Here’s the SwiftUI replica:

The alignment of the toolbar buttons are slightly off:

Why? I don’t know. But if you set the maxHeight and maxWidth of the button to .infinity, you’ll notice some non-removable spacing around the button: And no, .ignoresSafeArea() doesn’t work in this case.

Similarly, it happens to views inside NavigationLink as well:

I wish it is possible to ignore the spacing.

3. Miscellaneous improvements to edit mode in List

  1. The “Done” text should be bold in an EditButton.

  2. The chevrons in NavigationLinks should be hidden in edit mode. (It would be even better if we have some control over the accessoryType.) Note the whacky animation of the chevrons.

  3. The items in a List should be clickable (e.g. to rename the items) in edit mode.

  4. The state of the highlighted item is buggy in a multiple-selectable List when the List enters/leaves edit mode.

  5. If the items in a List have rounded corners, the .swipeActions buttons should have rounded corners as well.

  6. Make it possible to attach a .confirmationDialog to a .swipeActions button. Compare it with the confirmation dialog in the Notes app: Notice how the delete button expands instead of disappears when the confirmation dialog shows up.

Launch: History Book

This is a somewhat common occurrence for me:

Credit: u/kissesnocturnal

You can search your browsing history in Safari, but that only works for the page titles and URLs. It gets tiresome when there are 20 pages with similar titles.

To solve this, some people will bookmark everything and meticulously tag them. Some people will copy URLs into their notes app and then add a description of why they saved them. Some people resort to never closing their browser tabs.

If you have similar problems, you might want to check out History Book.

History Book automatically saves the content of your browsing history for searching. And it does it in a privacy-friendly way.

By default, it only auto-saves pages that contain an article, so you don’t have to worry about it saving your sensitive data.

If you want, you can configure it to auto-save every webpage. If you are feeling paranoid, you can disable auto-save entirely. You can also exclude websites that you never want to auto-save.

Like Safari’s Reader Mode, it extracts and only saves the meaningful text. You can use it as a read-it-later app, but I mostly use it as a search app.

History Book Pricing

History Book is available for $6.99 on the App Store, with no subscriptions, no in-app purchases, no ads, and no tracking.

It’s a universal purchase so you only have to buy it once to use it on iPhone, iPad, and Mac. I hope you find it useful.

History Book Privacy Policy

History Book syncs the saved items via iCloud. Apart from the iCloud sync, History Book does not collect, store, or transmit any personal information.

History Book Support

If you have any questions, email me or contact me on Twitter.

Time Capsule is Dead. Long Live History Book.

This is also a TestFlight announcement post.

Last year, I wrote an app called Time Capsule. Time Capsule saved the entire webpage (including JavaScript/CSS/images) on your devices. There weren’t enough people interested in the app, so I killed the project.

In hindsight, Time Capsule had a few glaring issues:

  1. Web archiving is a niche thing, especially on mobile. Very few people want to save the entire webpage, especially if the saving process is slow.
  2. The saving process is slow. Because the app needs to fetch all the resources, base64-encode everything, and merge them into an archive file. And there are a lot of resources to process.
  3. The archive files were huge. Who would’ve thought an average webpage with an article is about 10MB?
  4. The sync requires a $3/month subscription. I need to rent a sync server to do cross-platform sync. It’s an ongoing cost, and the only way to cover that is to charge a subscription.

It’s not even a good business plan because most paid users will be the people who save tons of data. $3/month may not be enough to break even.

I still like the idea of saving webpages for full-text searching, though, so I gave it another go and created History Book.

Hopefully I got it right this time.

By default, History Book automatically saves webpages as you browse. And it only auto-saves pages that contain an article, so you don’t have to worry about it saving your sensitive data.

Like Safari’s Reader Mode, it extracts and only saves the “meaningful” text. As a result, the saved pages have no ads and are small enough to store in Core Data and sync via CloudKit.

Unlike Time Capsule’s share extension, History Book’s web extension can save pages that require login because it doesn’t need to load the page again in a separate window.

It uses iCloud for storage and sync. Meaning no ongoing server cost. Meaning no subscription.

History Book will be a paid app that costs $5.99 - $9.99 (I’m still deciding) and it will be available on iPhone, iPad, and Mac. I thought about making it free with an in-app purchase to unlock everything, but I don’t know how to cut features without making it crappy.

If you’re interested in beta testing History Book, send me an email or DM me your email on Twitter, and I will invite you to the beta.

Update: History Book is out!

I’m Making a New App

Long time no see!

If you follow me on Twitter, you probably already know about this: I’m making a new app. It’s called History Book, and it automatically saves the content of your browsing history for full-text searching later.

A lot of my searches are looking for things I’ve seen, so…

By default, History Book only saves “readable” webpages, so you won’t see pages like www.google.com littered around. You can also configure it to save every webpage or disable autosave altogether.

The app uses a Safari extension to save webpages, so it only works if you use Safari as your main browser.

There are no “Trash” or “Archive” folders because I don’t want to impose any folder structure on you. (Initially, the app didn’t even have folders.) But you can create and name any folders however you like.

Also, if a saved webpage contains an embedded YouTube video, History Book will replace it with a minimal HTML <video> tag. Because uhh, why not.


I’m now putting the finishing touches on the CloudKit stuff, and I should announce a TestFlight very soon, so stay tuned!

Launch: Search Filter

This will probably be my last Safari Extension for a while.

Why? Because the code of Vinegar was stolen and re-uploaded to the App Store twice. And I’m not sure how to protect my code from being stolen again.

(Yes, there was a second case. Yes, I filed a complaint to App Store a week ago. No, I haven’t heard back from Apple yet. Yes, I think there will be more cases like this in the future.)

Update: Apple has contacted the second developer. The developer has removed the app.

Anyway, Search Filter is a Safari extension that lets you delete spammy websites from Google or DuckDuckGo search results.

It’s like a spam filter for search results.

Here’s how it works: Swipe to delete any search results you don’t like. Tap the extension button to see the deleted websites, and recover them if you want. You can also delete image search results by tapping the red trashcan button.

Once you delete a search result, Search Filter will delete other search results from the same website, too. Deleted search results will stay deleted in subsequent searches.

I built Search Filter out of my frustration with StackOverflow scrapers, but that’s far from the only use case. You can use it to delete Pinterest, Quora, websites that publish clickbait, or other SEO’ed-to-the-death “content.”

Search Filter Pricing

Search Filter is free, with no in-app purchases, no ads, and no tracking. Get it in the App Store today.

Search Filter Privacy Policy

Search Filter does not collect, store, or transmit any personal information.

Search Filter Support

Traditional support is not offered, but I welcome feedback on Twitter at @zhenyitan.

Launch: Crappy VPN

Me: mom can we have VPN
Mom: we have VPN at home
VPN at home:

Crappy VPN is not a VPN. I don’t have a VPN, but I have some servers that I can ssh into. So when I need a proxy, I would set up an SSH tunnel. Crappy VPN is an app that simplifies that process.

Crappy VPN is built on top of the code of Staring. I only added a preference window and a few helper methods to execute the shell commands. Try building it yourself! Or download the app if you just want to use it.

Crappy VPN Privacy Policy

Crappy VPN does not collect, store, or transmit any personal information.