Projects

An iOS App for Capturing Notes as Text Files

Bebop is an iOS app for capturing notes as text files, saved and synced to the iCloud/Dropbox directory of your choice.

I built it as a companion to desktop apps like NVAlt and Obsidian (and as a way of learning iOS development).

The basic version of the app is free and unlimited: no ads, no logins, no tracking. For a one-time purchase (no subscriptions either!), you can upgrade to Pro and support future development.

Download Bebop in the App Store

This writeup details some of the inspirations and design/development choices behind the 1.0 version.

1. BYODA (Bring Your Own Desktop App)

I’ve long relied on quick text notes for capturing fleeting ideas. I’ve tried almost every notes app imaginable, from Apple Notes to Evernote to Bear and Obsidian. What’s worked best for me is a combination of two things: 1) a speedy way of searching, reviewing, and organizing notes from my Mac and 2) a phone interface dedicated to – or rather, singularly obsessed with – capture.

For the former, the fastest, most powerful apps all work with an open format: a plain-text file. There might be markdown support layered on top, but they can still be read by any text editor, which means I’m not locked into any single app. I tend to prefer ones where you can keyboard shortcut into a search box, start typing, and quickly find (or add) new notes. Many folks swear by Obsidian and NVAlt. I currently use FSNotes.

2. Small Screens Are Not Just Smaller Big Screens

The second piece, a capture-obsessed mobile app, was harder to find. Most mobile notes apps seem premised on the idea that small screen are big screens, only smaller. They are not. We use our phones in different ways, in different contexts. To me, big screens facilitate review and organization. You can see everything laid out in front of you. Smaller screens are better at fleeting, on-the-go capture.

What I had been using on my iPhone, more or less happily, was an app called Captio. Captio let you email a note to yourself. Every time you opened the app, it presented you with a blank compose window. When you hit Send, it sent the email with a satisfying swish. The compose window would immediately blank out, presenting a pristine surface on which to dump your next shower thought.

This felt like the right interface – though I did have one minor quibble (addressed later). On the backend, I rigged up a Rube Goldbergian Zapier action (as many Zapier actions are) to convert the email to a text file and place it into the Dropbox folder that held my archive of MacOS-searchable notes.

It all worked well enough. Until I got a new phone and discovered that Captio was no longer actively being developed, and didn’t work my new phone’s latest iOS version. A while later, a clone appeared: Captioo, with two O’s, seemingly from a different developer, that added third-party ads at the bottom of the compose interface (which OG Captio did not have).

It sent me looking for alternatives. When I didn’t find any that worked as satisfyingly as the original, it got me wanting to build my own. And if I was building my own, I thought I might as well bypass the whole email-processing step. I’d just use the built-in iCloud Drive functionality (which also lets you choose a Dropbox folder if you have the Dropbox iOS app installed) and save the files there directly.

3. Capture First, Capture Fast

Here’s my main gripe with almost every notes app: Their interfaces are too cluttered with formatting options and navigation. Each of these options is another choice, another micro-decision I have to make. Capture is deprioritized in favor of note management. When I open these apps spur-of-the-moment to jot down a new idea, I might have to tap Done or Back or dismiss the keyboard to quit out of editing an existing note, (and in some cases also go back to a list of all my notes) before even being able to create a new one. Every single step here is its own bit of friction. Sometime I’d lose part of a thought by the time I could even bring up a new note.

These action/navigation buttons are often placed in opposing corners of the screen, too, requiring greater thumb-travel. My nit with Captio was somewhat related: the Save button was in the top right corner, instead of the bottom half ergo-zone where your thumbs are. Maybe this was a remnant of smaller screen sizes common when the app first launched in 2016. Or maybe it was an intentional design choice to get you to be more thoughtful about what notes you’re saving.

But what I really want is just to get the idea down fast, thoughtfulness be damned. I can finesse the wording later when I review on my Mac. So you bet I put that effin’ Save button right in the bottom right corner of the compose window. I muted the initial state to preserve that feeling of a fresh new page, ready to accept whatever brilliant (or banal) thought. I also had an idea to, once you started typing, animate the button up to prevent errant taps:

0:00
/0:11

There are certain contexts in which I do might want to keep an existing note open, in order to add to it over time. But I didn’t want those to get in the way of capturing new notes. That’s what I mean by “capture first.” A metaphor I tried to keep in mind was a reporter’s notebook, wire-bound at the top edge, easy to flip and write, flip and write.

My solution for those keep-a-note-open moments turned out to be …

4. Flashback Notes

In day-to-day testing of an early build, the app worked almost too well. I’d often save a note and immediately think of something else to add something to it. I wanted a way to easily add things to the previous note. But I also didn’t want to build a full-on note browser that would take me away from the capture-first mentality.

So I came up with the idea to quickly flash back to the just-saved note. You smash the button in the top right corner and it brings back the last note:

0:00
/0:23

And since you could do it for one note, I thought, why not a few more?

0:00
/0:23

It turns a more open-ended decision in typical note-browser model (“Where is my previous note in this list of notes?”) into a yes/no decision (“Is this the note I’m looking for?”). Again, I’m thinking of that reporter’s notebook: You quickly flip back one page at a time asking, Is this it? It’s a lighter cognitive load, at least for how my own brain works (I’m the same way when it comes to tidying things around the house).

Even this seemingly simple Flashback feature introduces an order of magnitude of complexity. Now I have to retrieve past notes from the filesystem, update them, signal the user that they’re editing instead of creating anew, manage conflicts when the file path changes outside the app, etc. I have to address interactions like:

  • What happens if you’re looking at a previous note and go do something else for a while? (The app has a timeout period, after which it’ll present a blank note again.)
  • What if you’ve edited a previous note but haven’t yet saved the changes? (It’ll ignore the timeout and keep that note visible.)
  • What if, say, you’re out birding on a Saturday morning and jotting down a new bird you saw every few minutes in a blank note and then your battery dies before you’re able to hit Save? (It uses SceneStorage to restore whatever was in the textarea.)

I added the Flashback feature in the second build I sent out to beta testers. Pretty much every subsequent build involved behind-the-scenes work to get it to work as expected in different contexts.

At this point, I felt I had enough for a usable, version 1.0 app. I’ll talk about pricing in a bit, but first …

Technical Interlude: Coding with AI Copilots

I probably wouldn’t have made this app had ChatGPT or Github Copilot not existed. I briefly tried to learn iOS programming a few years ago through the very-excellent resource Hacking With Swift, but SwiftUI had just debuted, and the timing was such that I didn’t want to have to learn Swift, not do anything with it for a while, then come back years later only to have to relearn SwiftUI.

I was amazed by how quickly I was able to spin up a working prototype, one that let me select a directory in iCloud Drive and start saving notes to it. But once I got serious about fleshing it out for an App Store release, I discovered that:

  • There’s a significant lag between the training data and the most recent versions of iOS/Xcode. The generated code would often be in Swift (or even Objective-C) because there hadn’t been a way to do it in SwiftUI yet. Other times the code would be deprecated in the latest version of SwiftUI. Maybe this wouldn’t be so much an issue with a mature programming language, but with one as new as SwiftUI, it was.
  • The AI tools rarely generated code that worked right away. But they were a good scaffolding for learning. I’d spend the rest of a coding session trying to learn the ins and outs of a particular concept. I mentioned Hacking With Swift above; they remain one of the best resources.
  • AI worked best when I knew exactly what code I wanted – as an on-steroids autocomplete – or as a conversation buddy to help me figure out the right search terms for looking up human-made tutorials.

On that last bit: I have front-end development experience (though it’s been years since I touched anything not related to my website template) and I was able to get ChatGPT to explain iOS development in terms of the vocabulary I already have. I’ve come to see these tools in their current state as a kind of universal translator. They can translate across languages, natural languages and programming languages and metaphoric languages and in-group vernacular/jargon – with all the contradictions and lossiness inherent in any kind of translation. They’re less the wide-reaching super-intellegence they’re commonly made out to be than they are an “improbable translator” with debatable sentience, a slightly evolved Babel Fish.

5. Non-Shitty Free Version, Non-Subscription Upgrade

Bebop has no logins, no tracking, and runs natively on iCloud Drive, so I have no hosting or email-sending costs. It’s a side project that I built first and foremost for myself. For the free version of the app, the basic goal was to make it not shitty.

So there are no ads. There are no limits to how many notes you can save. There are some basic customizations, too, like footers and timestamps.

I wanted to offer a paid upgrade for those who find the app useful. The “Pro” version is essential all the fiddly nice-to-haves like color themes, additional Flashback notes (the free version caps you at three), a setting to automatically wrap shared text in quotes, and another to put the cursor at the start of links you’ve share from other apps (my personal preference). Some of these features do make capture marginally more efficient, depending on your workflow.

I decided very early on: No subscriptions. I have subscription fatigue, you have subscription fatigue, we all have subscription fatigue (and this is coming from someone who runs a membership program). But from the product/development side, I think they unconsciously set you on upgrade treadmill, of having to churn out new features to justify the value of the subscription. It leads to bloat, to products becoming overly complicated for new and existing users alike. I find myself longing for the days when I could buy a piece of software and freeze its features in carbonite. I redownloaded Photoshop CS6 the other day and was bummed it wasn’t compatible with Apple Silicon. Maybe I’m just getting old.

To be clear: I’m not against subscriptions, and I pay for plenty of them. They’re a stabler foundation on which to build a small business, for sure. But I’m not trying to turn this app into a full-time business – I have one of those already. So I chose to offer the Pro upgrade for a one-time in-app purchase. The price is $4.99 (in the US), effectively a tip or coffee.

Final Thoughts, What’s Ahead

I do have more improvements planned, most of them small, a few bigger, all of them to scratch some personal itch. One thing that you can’t do with Bebop right now is easily retrieve an old note (unless it’s one of your Flashback ones). This bugs me enough the few times I need to do it from my phone that I want to work out a clever solution that doesn’t detract from the capture-first, reporter-notebook feel of the app.

Mostly, though, I’m happy to share this Version 1.0 with the world. Download Bebop in the App Store and try it for yourself.