End user programming – my experience building an iOS app

Update: Sticky was approved on the App Store, you can download it here.

The void between users and builders of software is seldom considered.

A software builder sits in San Francisco and hopefully talks to and observes user needs and behaviors in order to build a product that has some utility. This sounds trivial, but anyone who has conducted user research knows how lossy this process is. YC is famous for preferring products where the founders are solving their own problem.

Software works at scale. This means specific/niche/edge case solutions are not interesting for tech companies. You are stuck with workflows that fit most users, not you.

After reading A Small Matter of Programming along with a bunch of Ink & Switch‘s academic-ish papers I decided to start building something for personal use.

Building a tool for myself

My pain point is that with thousands of notes in Obsidian I rarely refresh or re-read them. This leads to leaky knowledge and a not-so-fun ride down the forgetting curve.

I’ve tried Anki and obsidian-based flashcard tools in the past. However, I want to review my notes when in transit and on the move, not when working on my laptop.

I’m not currently studying for an exam or a formal qualification so existing iOS apps that have pre-made materials do not make sense.

I have a reasonable understanding of HTML, CSS, Javascript/ React and wanted to see how far I could get building alongside an AI.

I decided to build a text to flashcard iOS app that simply let me paste in notes and use a language model to convert the note into a set of flashcards.

I spent 4 weekends getting to a reasonable, usable MVP. Quick demo below:

My learnings from building the MVP

  1. start with the core data object, in this case it was a card/flashcard. I wanted the card to have some properties by default and then get enriched through usage by a spaced repetition algorithm
  2. after thinking about this data object of a flashcard, I knew it should be nested within a deck structure
  3. prototyped with a dummy json, building basic UI to figure out the flows
  4. sketching the flows in excalidraw and moving directly to code turned out to be the fastest workflow
  5. realized I needed to derive a new deck from cards belonging to multiple decks. The key part of spaced repetition is that you review content based on your prior response. You do not want to be forced into reviewed an entire deck, it defeats the object
  6. found and used a typescript spaced repetition algorithm (supermemo)
  7. AI part was fairly easy, the prompt to return a JSON object works well
  8. I chose to build with Expo and React Native rather than spending time learning Swift
  9. setting up authentication with firebase and firebase iOS was fiddly and wasted a bunch of time
  10. GPT4o mini is good enough for a simple task like this
  11. after making my first decks I realized I needed the ability to edit GPT responses before committing them to a new deck
  12. later added the ability to add or remove new cards to the generated deck
  13. finally added the ability for users to add/delete cards after the deck was created

LLMs are useful for front-end work

…but are not close for regular end-users to build a useful tool that requires a backend.

The current state of LLMs can help a novice or amateur enthusiast programmers to build something reasonable but there are still plenty issues that require Googling or reading stackoverflow/ forums to solve – especially database and backend issues.

Until models are 5/10x better, the minimum requirements is understanding some programming concepts and terminology.

The time consuming parts of building the app were rarely implementing a feature idea. What did waste time is debugging small issues and quirks of Expo, user authentication, all of the meta work around making software run.

Hitting these frustrating walls whilst trying to build will deter 99% of people.

Legend has it that during user testing of the original spreadsheet tool, it turned out 9 of of 10 people were just using the gridlines layout and doing zero computation.

Start with legos?

For most people, a better way to start could be making use of lego-like software such as Notion. Combining some default ‘pieces’ with self-written formulas can go a long way for simple tools.

For example here is a workout tracker I built for myself inside Notion. It is far more flexible than because I get to decide which metrics I care about, which exercise types I do, and how I want the data represented.

Wether choosing to build from scratch or create custom workflows in lego-like tools, we learn a lot about ourselves when crafting a tool to help us complete a job.