AppForce1: news and info for iOS app developers

Chris Vasselli, creator of Nihongo app, a modern Japanese dictionary and study tool

February 18, 2021 Jeroen Leenarts
AppForce1: news and info for iOS app developers
Chris Vasselli, creator of Nihongo app, a modern Japanese dictionary and study tool
AppForce1: news and info for iOS app developers +
Help us continue making great content for listeners everywhere.
Starting at $3/month
Support
Show Notes Transcript

Chris Vasselli is the perfect example of the one thousand fans principle. A subscription based income from a niche product. How cool is that, doing what you love for a small group of dedicated end-users.

Nihongo app - A modern Japanese dictionary and study tool.
Demo of the OCR feature in Nihongo
Chris Vasselli on Twitter

Runway
Put your mobile releases on autopilot and keep the whole team in sync throughout. More info on runway.team

Lead Software Developer 
Learn best practices for being a great lead software developer.

Sendy, send newsletters, 100x cheaper
A self hosted email newsletter, send emails via Amazon SES without sacrificing deliverability.

Disclaimer: This post contains affiliate links. If you make a purchase, I may receive a commission at no extra cost to you.

Support the show

Rate me on Apple Podcasts.

Send feedback on SpeakPipe
Or contact me on Mastodon: https://hachyderm.io/@appforce1

Support my podcast with a monthly subscription, it really helps.

My book: Being a Lead Software Developer

Jeroen Leenarts:

Welcome to another special episode of my podcast. I'm sitting here with Chris facili. He is the creator of the knee hongo app. And it's an interesting story he likes to share with us because he's an indie developer. But in his own words, he took a while to get there. And we're probably going to dig into this a lot more. And by the sound of it is someone that is further along the same path that that I'm on currently because I have my day job and do some stuff on the site. So Chris, hi. Hi.

Chris Vasselli:

Thanks for having me.

Jeroen Leenarts:

So how are you doing today?

Chris Vasselli:

I'm pretty good. It's cold here in Vermont, that snow on the ground. So that's nice.

Jeroen Leenarts:

So and it's now at your place. It's afternoon writes? Yeah, about four o'clock in the afternoon. Okay, just to get things started. Most people if they know you, they probably know you from your product. Knee. hongo. Can you tell us a little bit about that product?

Chris Vasselli:

Yeah, sure. You hongo is, you know, I talked about it as a Japanese dictionary and study tool. Basically, it's got, you know, full Japanese dictionary in it, and then flashcards and some tools. So you can like paste, copy and paste text into it and look up words from the paste text really easily. As of about six months ago, you can now take pictures of you know, Japanese texts that you see out in the world. Or if you're reading manga, or something, you can take pictures to look up words. But the sort of unique thing that I was trying to do with building the hongo was to make it easy to have more context for the words that you're studying. So instead of just going and getting a list of vocabulary off the internet, the 1000 most common words in Japanese or something like that. It's all about finding ways to study words that you're actually encountering in your real life. Or in you know, if if you're into video games, playing Japanese video games, or if you're living in Japan, things you're encountering in real life. So every word that you look up in the dictionary automatically gets turned into a flashcard. And when you like, copy and paste text into the app, it automatically finds all the words in it and turns those into flashcards. So and then it sort of links back to those. So if you're looking at a word later, you can see Oh, I saw this, you know, this word showed up from this chapter of an ebook I was reading or this mug I was reading or something like that. So that's kind of the basic premise of the app is really trying to add more context to the words and vocabulary that you're studying in Japanese.

Jeroen Leenarts:

Why your Japanese dictionary app?

Chris Vasselli:

Yeah, I mean, it all started, I was living in Japan. I lived in Japan for two years. And when I was there, I was studying Japanese full time at a Japanese language school. And it was kind of just the, you know, the the app that I wish existed. So you know, I can actually tell the story where when I was starting off in Japan, I was studying in Japan. You know, I had apps that I was using, I had a flashcard app, I use one called flashcards to locks. I had a Japanese dictionary app that I was using. And, you know, I would try to look up words in my Japanese dictionary, and then make the flashcards and flashcards to locks to like be to study those words that I'm actually encountering. It got so tedious just this act of constantly trying to write out all of the definitions of the word, looking them up copying the definitions over making flashcards and finding myself spending way more time just making the flashcards than I was actually studying and learning. So I ended up my first sort of attempt at solving this problem was I figured out that the Japanese dictionary app I used had an export option where you could export to like a CSV file. And you could export that to Dropbox. And, and the flashcard app I used had an import that you could import, you know, obviously, completely different format. But so I had this whole thing set up where when I was living in Japan, I'd leave my laptop sitting out on my little desk in my tiny Japanese apartment, connected to the internet, I had a folder action so that it would detect when a new file got added to a certain folder and Dropbox, it would detect when I like uploaded one of these exported word lists from the dictionary app, run a script that would convert the file from the format that they export to the format expected by my flashcard app. And then I could go on my phone and go and then down in a wait 30 seconds and then go and download it into my flashcard app from Dropbox. So I kind of got to this point where I was like, Wait, there's got to be, you know, a better way to do this. And that's kind of where any home goes. That was like the first thing I did with the Home Depot was basically build out a dictionary that would automatically create flashcards from the words I looked up. That was like feature number one, and that's just something that I wanted for myself. And then it's all sort of like that was the core sort of flow I wanted and then I've sort of added on to that and added on and added on for a while now.

Jeroen Leenarts:

I'm here A lot of interesting stuff because I know that the hongo app is an iOS application. If you're an iOS developer, did you study Japanese in Japan? How the heck did all that happen? Well, where do I start? I guess, let's start at the beginning. Okay, when did you? When did you grown interest into computers? Computer Science, maybe programming?

Chris Vasselli:

Sure. I mean, I, it all kind of grew out of videogames. For me. I was really into video games as a kid, I still am very into video games. And so in my freshman year of high school, I took my first programming class, and I took a visual basic class. So you know, this is all Visual Basic is very focused on forms and buttons and fields and sort of just the basic sort of stuff like that.

Jeroen Leenarts:

Was that Visual Basic dotnet, or Visual Basic? Five or six?

Chris Vasselli:

Oh, man, I don't remember. So this was 2001. So whatever it would have been, then

Jeroen Leenarts:

I think that was like before the Common Language Runtime. So that would be like the true original Visual Basic.

Chris Vasselli:

Yeah. So. So I was, I was learning this stuff. And you know, but there was some point where we learned how to make like a shape. And then I learned how to do keyboard input. And then there was like, then one day, they introduced the timer. Oh, and it was just this moment where like, wait, I have a shape, I have keyboard input, and I have a timer, I could make a game with this. And it was like this lightbulb moment. And I went home that night. And I made I made Pong, you know, just like a basic two player Pong, but like, Okay, if I detect if the keyboard is, you know, I have a timer that runs and then every, whatever number, you know, seconds or frames or whatever it detects if the key is down, and then it moves this shape around. And yeah, I mean, in retrospect, that was a pretty pivotal moment for me that I kind of figured out how to do that. And then I went on and took Java classes in high school and switched over mostly to doing Java stuff. But in high school, I just did a lot of making games, like I made a lot of 2d 2d stuff, I liked to just play around with trying seeing how to build games in different genres. So I made, you know, a platformer game, I made a sort of shmup shoot 'em up game, I made, like an Advance Wars style strategy game, and just played around with it a lot and love doing that. So. So that's kind of how I got into the coding side. Um, and, and then I went to college and got a degree in computer science ended up just really sticking with that, and really enjoying doing that. And I went to work at my first job out of college, actually, I had an internship in college, and then that went to my full time job was at a company called Big fix. And they're, like, Enterprise Security Management. stuff. So, so various, sort of the kind of software that you'd have installed on like, say, you're a company with like, hundreds of 1000s of computers all over the world, and you need to be able to have visibility into what software is installed on them. And, you know, what, what, if they have the latest patches, what their energy, you know, sec power saving settings are like all this sort of stuff. So we wrote like a little client that would run on all the machines, and then you know, a server component that could and control and you know, deploy patches and things like that. So very different from what I'm doing now.

Jeroen Leenarts:

So just to recap a little bit, you did Visual Basic in your freshman year, in high school, high school. Yeah. Yeah. And then you to Java classes, you graduated. And then you started working at this company that did remote management of machines. Yeah. So and then what happened? Because we're not like, in any way, shape, or form close to an indie developer lifestyle? By the sounds of it.

Chris Vasselli:

No. I mean, that was around the time I started doing some side projects. Again, I did a game. So my first iOS project was a game called pipe drop, which is still still out there on the App Store. And, and that was like iOS, maybe? I think I started in iOS two, I think it was I was four by the time I actually released it, but very early, early going of iOS, and did that on the side. The company I worked for got bought by IBM. I stayed there for a little bit, but then was kind of just not really wanting to work for IBM and wanted to do something different. So my husband got a job teaching English in Japan through the JET Program. And so I went with him to Japan. Yeah, so with him to Japan, I basically left my job and did the full time Japanese language classes for two years while I was there. And during that time was when you know, actually my original plan when I went to Japan was I wanted to just make games Like, I went there with the idea, okay, I'm leaving my job. This is my chance to just do my own thing. I'm going to be an independent. I'm going to be an indie game developer. You know, that was my plan.

Jeroen Leenarts:

And how young were you done?

Chris Vasselli:

Oh, yeah. 21 Something like that. Yes. Yeah.

Jeroen Leenarts:

Okay. So full of ideas and hoping Yes. Which is good. Because that's what you need to be at that age. Yeah. So

Chris Vasselli:

I mean, it's,

Jeroen Leenarts:

I sound old now.

Chris Vasselli:

No, I know. Yeah. Dreams. What are those?

Jeroen Leenarts:

So yeah, you were you were in Japan, focusing your attention to the Japanese language and the indie game developer lifestyle. Yep. So you mentioned your husband. So were you already married at that point? Or was it still something that was ahead in the future?

Chris Vasselli:

We were married by then. Okay, so we met got married maybe a year before we left for Japan.

Jeroen Leenarts:

So how did the two of you meet?

Chris Vasselli:

We met in high school actually. We met in high school sweethearts. Yeah, exactly. Yeah. So we met in high school, and then got married actually, exactly 10 years after we met.

Jeroen Leenarts:

So then you were in Japan? Yep. Studying, trying to become an indie app developer, then what happens?

Chris Vasselli:

Yeah, so um, you know, what I found was, as much as I liked making games, these like little projects that were just kind of fund checking, kind of trying to build a game engine for, you know, a platformer, game game engine for this or that. When I decided I wanted to get serious about it, I decided, you know, it doesn't really make sense for me to making these game engines, game engines have been kind of commoditized. I'm not sure if that's the right word. But there's unity, there's all these things that the engineer in me said, it makes no sense for me to be spending my time rebuilding this from scratch, I should be using the tools that are out there. And then I can just focus on the actual game making part. The problem with that was once I started to do that, I find I didn't like that nearly as much. I just found, like, without the technical challenges of trying to actually build, you know, the internals of the game, and more focused on just like game design, and the game scripting sort of stuff. I like it, but not something I could do, you know, 40 hours a week, and and be satisfied with that. So.

Jeroen Leenarts:

So you basically you pivoted from game development to other areas of software development.

Chris Vasselli:

Yeah, exactly. So it was really then that I sort of had around that time when I was kind of realizing that, and honestly, that was a tough realization, that was hard, because that was, this was something I had been thinking about for since I was a kid, you know, wanting to be a game game developer, and then realizing, you know, all this sort of goal I had been striving for for so long, and then feeling like I wasn't living up to that, you know, that was really, really hard. And one of the things that really helped pull me out of that was just finding something to dive into, and really get passionate about which I was like, Okay, this is this thing that I really want to exist, and just really focusing on that. And, you know, so that was when I kind of started working on the hongo. And, and yeah, it was really sort of a tool for me to really pull out of kind of what could have been a really bad depression, I think, was just having this thing to focus on. And, and, you know, I'm really glad I did now it's, yeah, so because I mean, the story that goes from there, then as we come back from Japan, I basically launched an E hongo. About a month before we came back from Japan. And for the next like two years, it basically didn't make any money. And I was fine with that. I basically had built it for myself, and I wanted to launch it on the App Store, as you know, an accomplishment, but wasn't really focused on it making money. I went back and joined a new company with some of my colleagues from big my big fix days. We formed a startup, I worked on that, that one got that startup got acquired by box. And so I went and worked at box for four years, I think it was or maybe three.

Jeroen Leenarts:

And in the meantime, you kept adding and improving the hongo.

Chris Vasselli:

Yeah, so I kept on it on the side, when I could and kept building it and got to a point where, you know, it was making enough, my initial goal was definitely to stick it out until, you know, I could have that be, you know, a full time income. And I didn't quite get there before I left to go on it full time. But I got to the point where I felt like okay, I have a path here we have enough savings to sort of,

Jeroen Leenarts:

you could decide upon, I give myself an X amount of time, and if it succeeds, it succeeds. If it fails, then we'll just consider other options.

Chris Vasselli:

Exact That's right. So that's the point that I got to after. Yeah, I guess four years at box. And then. And that was two years ago now. So. So yeah, it's continued to grow. And now I'm doing it. You know, I wouldn't say I'm a full time indie developer, because I really split my time with being just a stay at home dad, I have a four year old kid now. And so it's, you know, a pretty great lifestyle that I get to, you know, keep on working on this while he's at school, and then spend a lot of time, you know, in the afternoons and get to sort of have that half of my life, that's sort of half fulfilling half of my life as well.

Jeroen Leenarts:

Okay. So just to grab back a bit on box, you were, what was your role there, I was soft developer or?

Chris Vasselli:

Well, so I came in, I did a bunch of different things at Box, actually, I came in as part of this group that was doing the security related work. And I actually went on the iOS app team, sort of as almost like a guest developer on their team. For a while, it wasn't really part of their team, but I came on to do some security work. So I developed this extra level of encryption, an extra layer of encryption in their their iOS app on top of what Apple provides. So that was basically based on your like box credentials in your box, like at Box specific credentials. And then I went, and we were building out our box for desktop, which is a got releases Box Drive is the name of the public name for it. And so I was the Mac developer for that. So I basically built from scratch their, their Mac UI for their, their desktop client. And then my like, last year there, I just decided to try something totally different that I've never done before. And I went and worked on their web app team for a year. So it gives

Jeroen Leenarts:

you valuable experience and techniques that you can now use for any hongo, I guess. So with an E hongo. You did it as a as a as a passion project for quite some time. And at some point, you started gaining income from it. But can you look back and say, What were key moments in the business model of the hongo that actually allowed you to start creating an income out of it and actually growing that out to like, a sustainable income for you and your family?

Chris Vasselli:

Yeah, sure. Well, the first key moment, I mean, the first things are just around pricing. I started as a single $4 in app purchase to unlock clippings and flashcards. So basically extra functionality.

Jeroen Leenarts:

So that was like a pay once model.

Chris Vasselli:

Yep, pay once model. At some point, I decided to up that to $8. And like, basically got the same number of sales at $8 as $4, maybe a little bit less, but like, there was just no reason to do it at four instead of eight. Then the next big moment that I had was, was when I had a big surge in downloads from China. And this was kind of surprising to me as it was an English Japanese dictionary, wire, why am I getting all these downloads from China. And I eventually found that there was a someone on like a Japanese or not, I'm sorry, a Chinese sort of q&a website, almost like Quora, but in Chinese had written up almost like a guide to how to use my app to look up Japanese words, then get and use all the features of the app to get to Japanese words. And then when you have the English definition, to run it through. At the time, it was a workflow now shortcuts, iOS shortcuts to automatically then translate that to Chinese. And so there was this whole contingent of people that were using it. And it was like a highly upvoted post that drove all this traffic to my app. So I took that as a sign that I needed to take this Chinese Chinese users more seriously, and went ahead and spent a bunch of time working on localization into Chinese. And I couldn't get access to a data source for Japanese definitions of Japanese words in Chinese. But I just did what they were doing and tried to make it a better experience. So I machine translated all of the English definitions upfront, and added them in basically next to the English you can have it so that it will show the Chinese machine translation. And all of the like searching within the app will search against the Chinese machine translations and things like that. So it just kind of make gives it a little more first class support to this flow of having the Chinese translations so that has been really popular in China for a long time was my largest market, you know, up until maybe six months to a year ago, which was kind of mind boggling to me and I never would have thought of that that. That Chinese machine translations of the English definitions of Japanese words would be useful. But it was. So that was a big one.

Jeroen Leenarts:

Okay. And you mentioned that that that that source of downloads sort of dried up like a year ago, he's me, you mentioned

Chris Vasselli:

it leveled off level, whereas I'm getting growth elsewhere as the Chinese stuff has kind of leveled off or maybe gone down a little bit in the last year, whereas I'm finally kind of getting traction in, in Europe and in the United States now, that I didn't have before. So I've continued to go on and do localizations into more languages. A lot of the all the other languages, I actually have native written definitions for the Japanese words.

Jeroen Leenarts:

So how big is the word list for Japanese terms in your dictionary app,

Chris Vasselli:

it's about a right now it's at about 190,000. Japanese words. So it uses a project called JM dict, which a lot of the Japanese dictionaries and apps you'll find out there use. So that's yeah, up to about 190,000 with English translations. And then I think the second highest is Russian or German, I think at like 60, or 80,000, or something like that. So

Jeroen Leenarts:

and with each localization you do you have to do translation, or that's already available in this TMD data source.

Chris Vasselli:

So I do the translations for the UI of the app, but I, the translations, so I do the translations for the UI. And then I have a whole system setup, that'll automatically every time I down, I have a Jenkins job that every week, it generates the new set of new JMX dict. File, finds all of the untrained and machine translated strings, you know, all of the strings that don't have a translation into say German. And it'll run those through a machine translator. So when you're using the app in German, maybe half all the common entries will have native trans native translations, all of the other entries will have machine translated translations. And so every time I add a language, it's sort of adding that but it's mostly automated at this point.

Jeroen Leenarts:

So how many languages does the app supports?

Chris Vasselli:

It's English, German, Spanish, French, traditional Chinese simplified Chinese, and Russian.

Jeroen Leenarts:

Okay. So and because there's a big difference between Well, language as, as, as Westerners know, it, compared to, for instance, China, or Japan, because they have like, the symbols that they use for writing, is that like, challenging to wrap your head around? If you're any regular iOS app developer out there? Or how is it to like, work with these symbolic languages?

Chris Vasselli:

Yeah, I mean, there's some quirks to it. Like, fonts are kind of a funny thing, I'll give you an example of a bug that's very specific to that. I was getting these reports that, like things were getting cut out like strings or elements of the UI were getting cut off and things like that, or looking looking wrong, or showing showing the wrong character. And what I finally realized is, because the system font is San Francisco and San Francisco doesn't exist, for Chinese or Japanese, they have their own, like, fonts that are effectively the system font. The system font for Chinese draws certain characters differently than the system font for Japanese. And if your phone is, say, in English, or the but the, you have like the preferred language order, if Chinese is above Japanese, it's going to use the Chinese version of the characters when it draws them. So even in my app, when I'm trying to display Japanese characters, it will display them using the system font in Chinese, which is going to display them differently than the Japanese font. So funny things like that, where I have to, like I can't rely on the system font, displaying things in a consistent way. So I have to be really careful to be like using the correct font in different places, making sure I'm using a Japanese font. Other than that, I mean, Apple is all of the, you know, stuff in Objective C and Swift all use UTF, eight strings pretty easily and universally. So there's not a lot of challenge there. You kind of get into all the same challenges that you have with localizing entity language. So like Russian has been tricky, just because it's a lot of the texts and Russian comes out really, really long. You know, all the sort of classic localization problems like that,

Jeroen Leenarts:

but okay. Currently, the app is listed within app purchases that are recurring. Is that change that you made? A long time ago? Or when did you switch from the single purchase to like a subscription model?

Chris Vasselli:

Yeah, that's kind of the next store step. Next step of that story,

Jeroen Leenarts:

I noticed that you have recurring subscriptions in your app. When did you create that change? Because you mentioned the leveling off of the Chinese market like a year ago. But when did you make the change from a single purchase to a subscription based model?

Chris Vasselli:

Yeah, that was about three or four years ago. And that was another big moment that had a big impact on on the income from the app. I did it right, just about right when Apple started allowing apps to switch to subscription models, apps that weren't doing, you know, content updates, but we're doing feature updates. So I made that switch. And that definitely had a big impact, I think, I'd guess it may be doubled my income from the app switching to that. So I switched from a single $8 in app purchase to a recurring subscription with a lifetime option. The lifetime option was effectively the same in app purchase actually is the exact same in a purchase as the$8. Purchase used to be. But I switch to something where I now have an $8 per three month subscription, a $20 per year or a $50. Lifetime. Yeah. And so that's helped a lot. That was a big, big help. And then.

Jeroen Leenarts:

So what was the feedback that what was the feedback that you were getting? When you made this change to your product, because of obviously, the people that already had the lifetime subscription option at a at a low rates, they could continue working with the app the way it already was, I guess. But any any feedback positive or negative when you made this change?

Chris Vasselli:

Very little, I mean, I think most people that owned it already, probably were oblivious to the fact that the price changed. I did get like one really nasty App Store review of someone saying this person's, you know, price gouging that, you know, don't pay attention to any of these five star reviews. They're all from before he changed the pricing. And now, you know, I don't know something like that. So I got a little bit of pushback on that, but not a significant amount, not enough to worry about it.

Jeroen Leenarts:

But it does it change the way that you look or deal with your products and feature developments if you have like either, initially you had like single purchase events. And now you have like, pretty much a recurring income stream because people are subscribed to your product, it does that change your way of working or how you deal with feature releases on your products.

Chris Vasselli:

It does. And the biggest thing about it that I really love is it sort of aligns what I want to be spending my time on with what's going to make me more money. And what I mean by that is, when I had a single in app purchase, once someone purchased it, that was it, like they weren't going to be able to give me any more money. So I ended up feeling compelled to spend a lot more time on marketing and trying to get people to make that one purchase, you know, trying to get people improve the experience the like, free part of the app experience, improve the free part of the app, improve the Yeah, the marketing and try and do Facebook ads and all this sort of stuff. Once I switch to a subscription model all the sudden, actually just making this paid experience of the app better. So that people will continue their subscriptions is directly in tied to how much money I make from the app. So that that really feels great, because that's the part that I really enjoy more, much more than the marketing is actually building out new features. And now that's like, I can feel really good that well, this is what I need to be doing to keep my subscribers happy.

Jeroen Leenarts:

So and how sticky are your subscribers if I might ask?

Chris Vasselli:

Um, it's a good question. I'm it's still steadily growing. I think I'm up to maybe a little over 1000 subscribers now. So I definitely have significant churn but but it's overall I'm, I'm, you know, growing slowly, so I feel pretty good about that. And, you know, I just people are some people are going to be taking a Japanese language class for a semester or something, and then they're not going to use Japanese anymore. So I understand that. Yeah. I don't expect people to sort of use it forever.

Jeroen Leenarts:

Um, so let's see. We talked about ni hongo in the sense. Yeah, ni hongo is currently an iOS app. And I think it also runs on the new M one apple silicon if people try that. So how's that experience been for you like supporting somewhat like this new platform, even though it is strictly an iOS app? By the looks of it?

Chris Vasselli:

Yeah, It's kind of nice in a way that I can dip my toes into the Mac catalyst world. And I can get an app out there without needing to deal with all of the, you know, making sure I have x86 versions of all of the libraries that I'm importing and things like that. So I did get the developer transition kit. And I built me hongo on it, which was kind of a pain, to be honest, like, these days are definitely rough, rough products, not meant for public consumption. So but I got it running. And I was able to fix a couple crashes. And I adjusted some of the text, you know, that was very iOS specific, like, go to the Settings app and do XYZ, I could change to go to System Preferences and do this and things like that. So I have, I think, a grand total of maybe 20 users that are on the Mac version right now. And I don't have an M one Mac yet. So they're kind of, you know, the wild west there right now.

Jeroen Leenarts:

Yeah, they're testing it for you.

Chris Vasselli:

Exactly. They're testing it for me. And, you know, I'd be happy to fix anything if it goes wrong. But it's not a focus right now, just because the number of people is so small. But like I said, it was a nice way actually to kind of test the waters. And I think if I go into a Mac catalyst, now, Mac catalyst version, a lot of the a good chunk of the work has already been done just getting that the M M, one Mac version going. So it sort of splits up that work nicely. And I think I'd like to do it, I think it's a natural app to do a Mac catalyst version, because a lot of people want to create their flashcard decks on the Mac, or copy and paste text from a website that they're viewing on their Mac, or things like that. And then they want to do study their flashcards they want to do on their phone, and they want to read their, you know, ebook, or manga or something they want to do on their iPad. So it's like, there's a really natural way to use kneehole on all these devices. So it's a pretty natural fit to do Mac catalyst.

Jeroen Leenarts:

So um, if you look at a product, is there any backend involved with Nihon Gore's all the data packaged in the app binary,

Chris Vasselli:

it's basically all in the app binary, it's actually been really nice, as you know, a developer with experience and apps that have more of a back end component. Just like from a testing perspective, it's so nice to not have to worry about having a back end that you're interacting with and have everything feel a little more self contained. And deterministic, is nice. But yeah, I'm working on Cloud syncing right now. And that's going to be the biggest sort of, you know, quote, unquote, back end feature I have. But even that is I'm not running my own servers, I'm just using Cloud kit, and letting you know, Apple do that part.

Jeroen Leenarts:

So using the cloud kit, key value data store, most likely, I guess, to sync the data between the devices.

Chris Vasselli:

I'm using that for this, like preferences and things like that, but the Oh. So I'm, I'm using a library called ensembles for the syncing, because that's mostly a core database app. And I tried out the core data over cloud kit, stuff that Apple added in iOS 13, and didn't quite fit my needs. So I'm using a library called ensembles, which then basically ensembles is just a layer that sits atop any cloud file system. So you can choose your back end, it could be cloudkit. It could be Firebase. It could be, you know, Dropbox, any any number of things. But I'm choosing to use Cloud kit for them

Jeroen Leenarts:

now, because it scales nicely with the amount of usage of your product. Yeah, and I don't have to pay anything. So basically, the data is serialized into into cloudkit records, then,

Chris Vasselli:

yeah, so basically, ensembles does everything in terms of files. And so it treats cloudkit Almost as if it were like a virtual, like a file system. So you actually have each record represents a file, and then you have a record that represents like a directory, and things like that. So it's sort of this weird abstraction layer where it's turning cloudkit into a file system. Even that's not how it really normally is. But and then ensembles sort of works with having files that contain lists of changes, basically, like these JSON files that are lists of this, you know, this core data object with this identifier made a change to this property. And so it's all sort of, there's sort of a bunch of layers of abstraction there.

Jeroen Leenarts:

Oh, well, the cool part is that you don't have to run your own data center now. And, and one is this syncing feature. Is it already live or are you still working on it?

Chris Vasselli:

Still working on it? I'm hoping maybe by the end of this month, I can get it out but it was one of these features that I started, you know, back in June or something and thought this year would go a little differently. So I thought I'd have it out by the end of September. And here we are in January. And

Jeroen Leenarts:

so So what are your plans for 2021? With ni hongo. And you're in the end your indie dev lifestyle?

Chris Vasselli:

Yeah, I mean, I've got a huge backlog, I get feature requests from people all the time. So I want to, you know, take off some of those feet common feature requests, adding example sentences onto a flashcards is a big one. Things like search as you type, you know, the searches, right now you have to type something out in the hit enter. So I want to make that faster. And then the bit larger scope things is I think a Mac catalyst version is something I'd love to tackle this year. I was waiting on the cloud syncing before doing that, because I think, like I said, I think your phone is still going to be kind of your primary tool for any hongo. And the Mac is a little bit of a secondary one. And so you really need to be able to sync the data for that to work well. So. But now that I've got the cloud syncing, almost done, Mac catalyst app would be great.

Jeroen Leenarts:

Um, one thing that we didn't discuss yet about your product is that you also use the camera to detect Japanese literature's from any source out there. So any challenge is there to actually do the machine translation of what you actually capture with the camera to something that is usable within your app.

Chris Vasselli:

Yeah, there was a lot that went into that feature, I've the first thing I did was I used I spent a lot of time trying to get Tesseract to work well, this is a library that's been around for maybe 20 years, Google sponsors it now. And with Tesseract, I'd be running the machine or the OCR the optical character recognition on device. And that was really appealing to me, because you know, the app is so there's no back end for the app right now. So that was really appealing to just keep it on on device, you don't have to have an internet connection. So I started by working really hard at trying to get Tesseract to work well and just was not getting good results, I'd have accuracy in the like 60 to 70% range. Whereas Google's OCR cloud, OCR would be like 95%. So I ended up, you know, building a whole toolset that's agnostic to what back end you're using, you could stick Tesseract in there, you could do a call off to Google's servers, or Microsoft or any other service. I ended up settling on Google's just because they're, you know, as getting the best performance from them. So I ended up using Google's cloud back end. But then the other thing that I really wanted to focus on was coming up with a better way to present this to users. So a really common pattern that you'll see in apps for doing OCR is you have a little sort of viewfinder box, and you drag around this viewfinder box in the corners of this and position it over the text that you want to do the OCR on, and then it'll like show the definition of that word next to it or something like that. Yeah. Or in the case of Google Translate, you take a picture, and then you like scrub your finger over the text and sort of draw around the text you want. So I wanted to try something different. And what I came up with was this idea of having the text basically turn into turn blue, and make it look like you can just tap on it. And so that's what I did is I basically made it so every word that it detects it highlights in blue, and you can tap on them to like get a little pop over that shows the definition. So there was a lot of work that went into that of doing, I actually got to dive into some core image stuff and metal shaders. And to do that thresholding, the, where you tried to detect the edge of the character, so that I could turn just the pixels within the character blue. Because what you get back from Google is just a bounding box around the text that it detected. But I wanted to actually highlight very precisely the character and turn it blue in the image. And so that was actually a lot of fun and really interesting new area to get into of trying to do that thresholding and image processing stuff.

Jeroen Leenarts:

Okay. And this is typically because if I'm correct you using the online Google Cloud Vision API for this, but this is typically one of those features, features that you cannot do without this feature that you cannot do without a subscription model, right? Because if it's a one time purchase, then how are you going to offset the costs of interacting with this API? I guess?

Chris Vasselli:

It's true. And that's one you know, good case for doing the the subscription model i and i I was paranoid about that I was very paranoid, like, it's really a little scary when you're first going to launch this feature, and like, well, what if people are, you know, taking 50 photos a day, and I totally miscalculated, and I'm gonna go broke, but I actually end up spending, I think I spend, I send 20 bucks to Google a month or something. So, you know, I probably could not, you know, I'm not worried about my lifetime subscribers, you know, making me go bankrupt or anything.

Jeroen Leenarts:

Okay. Well, really cool. Because basically, it's, it's a simple app, if you look at it, and you hongo but it packs a lot of features, and you do some, some interesting things within the app, just to streamline the to streamline the process for the end user. So people learning Japanese probably will end up with this app quite naturally. I think. So are there any other things that you would like to share with my listeners?

Chris Vasselli:

Hmm, um, I mean, I think that's been, I guess, I would love to just emphasize that my path was not, you know, straight, straight to, you know, high profitability. This was something that I really enjoyed finding something that I wanted to work on. I was happy to be working on it every day, because I was using it every day. And it was something that I wanted. And going into that with that mindset, I think made it a lot less stressful, I think, just to be able to not be so much focused on making a ton of money, but just building something that I loved, and I wanted, and then sort of nurturing that on the side. And yeah, I think from the time that I started it to now it's been about eight years, I think. And so it's just been kind of a slow, slow, steady process. And you know, that's a total, totally legitimate alternative path towards indie development.

Jeroen Leenarts:

So because it's now I think, four years ago, that you really started gaining traction on the product, right? And that's about right. And when did you? When did you actually quit your day job and fully focus on anyango?

Chris Vasselli:

About two years ago and

Jeroen Leenarts:

a half, two years ago? Okay, cool. So yeah, that's an interesting journey, I think. And it's interesting to hear that, that you actually took a while to actually develop the product, because you really were scratching your own itch. And in the end, you ended up something that was, maybe by chance, I don't know how focused you were on actually marketing it, but that it was really something that was marketable, and creates the sustainable income for you and your family. Any parting words of wisdom or tips that you'd like to share with people?

Chris Vasselli:

I think another thing is just don't tie your own self worth to your professional goals. I think that was a lesson I learned really hard with that experience of trying to become an indie, indie game developer. I think keeping a fair distance between that and realizing that, you know, there's other other paths that your life can take, and, and that's good, too, and, and to not sort of have your heart set in one direction was something that was important for me to learn. And I would definitely suggest anybody else that's trying to do this to sort of have that flexibility in mind.

Jeroen Leenarts:

So keep your mind open and find what you're passionate about. Yeah. Okay, Chris, thank you very much for your time. It was an interesting story you were able to share with people that are listening. And thank you so much for your time. Thanks for having me.