# I Built an App to Talk to My Dad My dad is from France. So he's a native French speaker. However, I was born and raised in the U.S., so I only learned English. I've wanted to learn French for a long time. I thought it would be fun to be able to speak to my dad in his native language and to communicate with his side of the family. ## Existing Resources To do so, I spent an enormous amount of time doing the Duolingo French course. I gained some vocabulary, but I didn't really feel like I actually learned very much. Duolingo is a great way to get your feet wet in learning a language, because it's fun and very gentle. But it's primarily designed to be fun, I think. Not really to teach you a lot. I also took French classes in high school and college. Both were even worse than Duolingo, I think. The less I say about them, the better. The issue with both of Duolingo and with language classes in school is that they're not based on spaced repetition. It's possible to overstate the benefits of spaced repetition in some contexts. However, when studying a language, spaced repetition is a massive cheat code. In my opinion, it is the foundation of effective practice. ## My Woodworking Project A couple years ago, my girlfriend wanted a media console to put under our TV. She was in love with this one, but we couldn't justify spending so much on it: ![[CleanShot 2025-12-14 at [email protected]]] I had never done a woodworking project before, but the more I thought about it, the more I thought I should be able to make something like that out of wood for much less than $700. And I realized I could build it exactly how we wanted. I could let her pick the color, and I could add a vertical space to store my Playstation. Fast-forward a week, and I had this: ![[Pasted image 20251214150720.png]] ![[Pasted image 20251214151049.png]] To make it, I had to borrow a friend's car to get to and from Home Depot, as well as borrowing a drill and some woodworking space from my landlord. But now I have a piece of furniture that feels truly personal and unique and makes me happy every time I look at it, as well as reminding me of the generosity of everyone around me. Ever since I did that, I had a hunger for making things "custom". I learned the lesson that it may not be as hard as it seems to do it yourself, and there might be a lot of joy in having it your way. ## Devine & Orca At some point, I listened to an interview with Devine from 100Rabbits. If you don't know 100Rabbits, they're basically a couple who lives on a boat and makes software and videogames. Pretty much living the dream life. Anyway, Devine made Orca, which is a 2D visual programming language for making music. In the interview, it was mentioned that it took very little willpower for Devine to make music with Orca, because it was natural to do so while working on the software itself. (There's no way to test any changes made to Orca without making some music.) And for whatever reason, "software maintenance" is one of a task that Devine can do without depleting their finite supply of willpower for the day. That little bit of the interview stuck with me because I related to it. I just love coding and making software. So it felt like a clever insight that building tools can make the activity they support feel effortless. ## A Home-Cooked Meal In the classic Robin Sloan post "[An app can be a home-cooked meal](https://www.robinsloan.com/notes/home-cooked-app/)", he describes how you can make an app as a gift to yourself and others, without expecting commercial success. An app can be a little thing you make for your family, rather than for the whole world. ## The App Eventually, all of this culminated in one goal. I needed to make my own French app. Motivated by: 1. **Poor existing resources**: My frustration with the poor quality of instruction available on Duolingo and informal French classes. 2. **Woodworking project**: My desire for things to be custom-made to exactly how I like them. 3. **Devine & Orca**: The idea that I could learn French incidentally while working on the app, in addition to the time I spent explicitly studying. 4. **Home cooked meal**: My siblings are also interested in learning French, so I could be making the app for them as well as for myself. It turned out to be a success! 1. **Poor existing resources**: My app is honestly just better than Duolingo and others. Well, better for me. It might not be better for people who have different needs and desires than I do. But because my app is based on spaced repetition, I learn much more per unit time than elsewhere. I wrote more about this in [[what-I-learned-building-a-language-learning-app]]. 2. **Woodworking project**: Every day I spend 0.5-1 hours studying French. Everything I see on my screen is exactly where I want it to be. And it does exactly what I want it to do. 3. **Devine & Orca**: Some web developers use tools that let them quickly see particular screens without actually getting their site into a state where it would naturally show that screen. I have a "you're all caught up on reviewing for the day" screen in my app. I could use one of these tools to see what that would look like without actually catching up on my reviews for the day, but I consciously decided not to do anything like that. So, every time I want to make a change to that screen, it forces me to catch up on my reviews 😅 4. **Home cooked meal**: My little sister is a gifted artist, and she even drew me an awesome retro-futuristic icon to use for it. That really makes it feel like a home-cooked meal to me. In addition to my siblings, some friends have used it as well. One of the most fun parts is how it's brought me closer to my dad. As a native speaker, he is an authority on how the French language works. So when making the app, I often have to consult him on the best way to teach something, or to help me evaluate data quality, or ask if an explanation is correct, and so on. I'm lucky that he's always happy to help. (When it comes to learning French he's pretty much my biggest cheerleader.) Even though I made it for myself, I don't mind if others use it. The app is [yap.town](https://yap.town), and in addition to French I've also added Spanish and German as those are the languages my friends wanted to learn. (Source code is on [GitHub](https://github.com/anchpop/yap).) Some random people on the internet have found it already, and it's actually warmed my heart to hear about how it's helped them. Just keep in mind that it's a free/unmonetized hobby project so it might not be perfect yet 😊 Happy yapping! ## Postscript Random notes I wanted to include but couldn't figure out how to do so naturally: There were some side benefits I didn't expect as well. I ended up going down tons of rabbit holes that I would have gone down otherwise, which resulted in me learning a lot. For example, the French word "bois" can either mean "drink" when used as a verb, or it can mean "wood" when used as a noun. An interesting task in computer science is to take an unlabeled sentence, like "Tu bois", and figure out that "bois" is being used as a verb in that context. There are off-the-shelf models for this, and they work extremely well for English, but I couldn't find any good ones for French. [So I made my own state-of-the-art models to use in my app](https://huggingface.co/collections/anchpop/lexide-nlp-models) 😅. It was also an excuse to play with a tech stack that I had always wanted to try: front-end development using Rust. I like React for writing UI code, but I really don't like writing complex logic in Javascript. So I decided to implement the business logic in Rust, compiled to a WASM module, and then use call it from the React Frontend. I wrote more about this combination in my post [[rust-and-react]]. I really think that this combination was crucial to my eventual success in this project, as I just love writing Rust and I would have quickly gotten bored if I could only use Javascript. And there's something funny about doing something yourself. In my experience, imperfections in something you made yourself are not nearly as annoying as imperfections in a part that you bought off the shelf. When I buy a product with obvious flaws, I feel as if I got scammed or ripped off. But if all the problems are my fault, then it's just a reminder of what to do improve upon in future projects.