New App Launch: Lingua Fortis

Hi Everyone,

I am very excited to announce the launch of my new app, Lingua Fortis!

Lingua Fortis

Lingua Fortis is a language learning app that uses a natural language processing algorithm I wrote in order to automatically create study courses by analyzing large volumes of text in the target language, extracting the most common patterns, and presenting them to the user, starting with the simplest and most frequent patterns.

I built Lingua Fortis in order to solve a critical problem with most language learning courses, which is that the content in them does not mirror how the language is actually used. Students end up learning a random mixture of vocabulary and grammatical concepts, rather than drilling themselves to be able to instinctually produce the most frequently used patterns. In this way, Lingua Fortis prioritizes teaching them the patterns they will hear and use most frequently, without them having to memorize grammar rules or random vocab lists.

This program also uses a spaced repetition system, which is the most effective way to ensure users retain the information they are learning. In order to add sound, I used Google Text to Speech, specifically their high quality WaveNet voices.

Right now, users can learn the following languages on Lingua Fortis and I am adding more all the time:


You can learn these languages in any of about 30 translation languages (meaning you could learn French in English, or Danish in Japanese, etc.) so that native speakers of many languages can use the program.

While the algorithm that creates the courses was written Python, everything else was done in Bubble. In fact, I am proud to say that I was able to do all of this without altering the native capabilities of Bubble (there is no custom JavaScript in my app, for instance). The only way in which I didn’t use native feature of bubble was that I did use Firebase to store the language data just because of how much there is (there are about 200K virtual index cards per language course). I started work part time on the app on Memorial Day, which is really a testament to the power of Bubble. (I did reuse a lot of design elements from a previous bubble app I built which also helped me do this so quickly).

I had a great time building this and I want to thank everyone in the community for their help in the forums which has been crucial to my learning bubble.


This is awesome work Ryan!

1 Like

Thank you!!

Adding some screenshots:

Very impressive!

1 Like

Thank you!!!

Hey! Amazing what you’ve done. I’m new to the Bubble community and found your post by searching for Bubble apps that use SRS.

I’m just starting to learn how to use the platform and your report really cheered me up.

It’s been a challenge as I’m not a designer or a developer, but I’m excited!

Thank you! I am glad you like it. I am actually relaunching soon with a lot of changes/improvements.

Let me know if you have any questions as you build an SRS app - SRS can be very complex but it is definitely feasible in bubble!

Hey @icaroborges and @ryanellman I have just started working on building my SRS app too!

@ryanellman your post gives me a lot of courage knowing that someone has already done this on Bubble and that I am not going to be wasting all my time trying to build it here.

Are there any documentations/recordings about how you implemented the SRS system for Lingua Fortis in Bubble that we could take inspiration from? Appreciate all that you have done!


Hey! I saw the post you tagged me in. I am also in the process of research. If you wish, we can go tracing ideas. I was just thinking of coming back to that thread for more details…to ask Ryan questions.

I already know how an SRS app would work with Firebase as a backend, but my first experiences trying to implement it were unsuccessful. I’m not a programmer and implementing this involves working with code. Anyway, we can help each other.

Hi! There is no specific documentation describing how I put this together, but I would be happy to help with any specific questions you might have!

The main thing is to figure out which SRS algorithm you want to use. There are many.

The basic overview of my process is that all the card content is kept in firebase because it is too much data to upload to bubble in an efficient manner.

Then I have card trackers ‘Things’ stored in the bubble DB. I use these to keep track of which card is the current one in the course. I also have a list of scheduled cards. I use scheduled work flows to add items to the list of scheduled cards after the interval determined by the SRS algorithm has passed. Then, basically my card interface checks if there are any scheduled cards. If so, it will show all of those before showing a new card. Then once, it has run through all of those, it will show new cards.

I know this is a very coarse overview and a lot of details are left out, but this is the general overview.

I am just beginning to learn bubble so I can build the MVP too. Would you be interested in collaborating together in a dicord server perhaps? it’s much easier to be in the loop there I think, maybe we could invite @ryanellman (if he’s interested) to give us some pointers when we are stuck too?

Let me know and I will go ahead and create one for this project.

@ryanellman thanks for the overview, it definitely helps. Thank you. I will start building first and then bother you with the questions :wink:

1 Like

I’ve never used Discord, but I like the suggestion. How do we find ourselves there? I already created an account. My user is icaroborges#9413


its a indeed motivation what’s possible in bubble. App/site looks great. @ryanellman I see that your initial post is from 2020. I’m wondering how is it going - of course if you can share little bit? One thing is to launch app, other to establish user base and to convert them to happy customers.


I am not on discord but I am happy to help out here whenever you have a question that comes up :smile:

Good idea - I definitely recommend taking a swing at it and then letting me know if you get stuck. I will be able to help better when specific questions come up. But the general process is relatively simple:

  • Have API workflows that take the algorithm variables as parameters necessary
  • Send different parameters depending on the response from the user
  • Use these parameters to conditionally determine when to create a scheduled review item
  • Add these to the list of review items for the course

The actual execution is much more complex of course, but this is the basic overview. And you will have to make different backend design decisions based on what works for your app/database structure, but I think this is the ideal way to handle to actual scheduling of cards.

1 Like

Hi Pavol,

I appreciate your kind words! Much in the app has changed since I first posted this and I have implemented a lot of cool features like AI language tutors for all languages we offer, a phrase improver that suggests more natural ways to say things in your target language, and the ability to create custom courses.

I also plan on adding more languages soon!

I don’t want to publicly discuss too many details on the business results in this forum, but will say that I am soon leaving my job in the financial industry to focus on this business full time.

Let me know if you have any other questions. Are you also building an SRS based app?

1 Like

Thanks for the response!

Maybe I am still in early stages, but I am bit lost about why we need API workflows for setting up the SRS algorithm. I was of the impression that we might be able to set the algorithmic conditions to determine the Queue using the bubble’s workflow setup? Is that not possible?

Hi @ryanellman,

I really like this perseverance and idea behind to teach real word phrases. This is similar how online language school worked which I attended. Group of people learning phrases. Many times we did not understand what we are talking about. But later it sticked to us and we understood. Perhaps one day you could have online events with AI tutor :slight_smile: which will teach group.
I would need your app to teach me Hebrew :).

And I understand you do not want to discuss business in forum. I’m happy for you that you can leave job and work on your “baby” full time.

My industry is dating and I organize online events for people to meet effortlessly via video. I’m still in MVP private group phase in local market (with just a bunch of paying customers), before public launch. So therefore I was curious how long it took you to get to point you mentioned. :slight_smile:


Yes, you definitely can do that, in which case you may want to create a date field on the review card called something like “show after” so that cards are are only shown after their scheduling date using conditions. It really depends on how you set up your system.

Basically each course has a card number, which is the card the platform will show next to the user. After the user completes a card, if the user has no review cards scheduled, it will show the next card in the course that the user has not yet reviewed by setting this as the course’s card number after the user responds to the previous card. If there are review cards in the queue, then it will set the oldest one as the next card.

I use scheduled workflows to determine when to create a review item, but you could just as easily create it immediately and have a date field that is checked and if the current date/time < than the date in this field, then dont show the card yet.

I am not sure which is more efficient, but this would require you to check the date on every single card in the queue, every single time the user submits a response to a card, which is what makes me think you might be better off using scheduled workflows, especially because the number of cards in the queue could get very large (it would always be equal to the total number of cards the user has ever viewed, so it would grow linearly with usage). I have not tested this though, and I am not sure what the comparative efficiency is of scheduled workflows is in terms of WUs.

I think this does make it quicker for the user, since it minimizes the number of scheduled items that need to be sorted through any time the user responds to a card and the system is checking for the next card to show.

That’s really cool! Yes, I do believe that phrases based learning is one of the best ways to learn a language. My app actually starts at one level below complete phrases, and begins with helping you learn the individual word combinations that show up most frequently in the language and commit them to muscle memory.

I call these the “Smallest Meaningful Units” of a language, and they are generally the 2, 3, or 4 word combinations that form the building blocks of the language. As you commit these to muscle memory, you develop a very strong foundation in the language which then makes it easier to learn from content such as TV or engaging in real conversation.

This method was inspired by systems that make complete phrases the focus of study, but I found that approaching it using complete phrases made it harder for students to generalize their knowledge to create novel statements, since the only way to learn the meanings of the individual subcomponents of the phrase was by extrapolating from learning other phrases (this may be a good topic for my blog that I am launching for the app :smile:).

I would love to add a Hebrew course! The courses are created using a Python program I wrote that relies on the SpaCy library, and unfortunately SpaCy doesn’t have a Hebrew model yet. The second they do though, I will definitely be adding it :smile:!

That’s really cool that you were able to get started with a bunch of paying customers. Is your app geared towards a specific local market or are you eventually looking to have a global audience. I wish you luck with your business!