I developed vocaBull which is a flashcard web app a few years ago, and I use it almost every weekday.

vocaBull (vb, for short) is deployed on Pythonanywhere.com, but the free plan for pythonanywhere gets slow frequently, forcing me to wait for a few seconds before I see a new flashcard.

As vb is Flask and Jinja2-based, it needs to render an HTML page for every flashcard at the server. This has made it frustrating to use vb from Pythonanywhere.

The good news is that I learned JavaScript + Vue recently. I can move all logic to JS, and thus accessesing the Python backend only at the initial loading and/or when a user clicks “sync with server” button. I have been thinking about face-lifting/remaking vb for some time now.

vocaBull/vb introduces the Shifting Learning Window (SLW) method, which is rougly a combination of small high-frequency learning window and large low-frequency window.

Using vb every weekday, I noticed a critical issue with my SLW method. I have to admit that the effectiveness/efficiency is less than more popular SRS (Spaced Repetition Software) such as in Anki.

SLW is optimized for frequency and SRS is optimized for the forgetting curve, which is time-based. SRS is supported by science.

So, I’d like to borrow a few time-based techniques from SRS. Here is the rough idea.

  • The current learning window (3-5 words) repeats words in the window until user clicks “OK”. Then, the word moves to the tail of the next waiting window.
  • The waiting window (3-5 words) ensures “OK” words will reappear shortly.
  • If user clicks “OK” again, it moves back to the tail of the waiting window, and so will re-appear but less frequently.
  • If user clicks “Memorized”, the word will move (back) to a word pool or a “book”.
  • Words in a book will reappear based on SRS. First a day later, then in 2 days, 4 days, etc., ie, achieving spaced repetitions.

I won’t use SRS for words that a user is actively memorizing. I think frequency-based is better in this phase of learning because the speed of moving to a new card would be different among users.

I mean with SRS, a fast user would encounter the same word once every 5 words, while a slow user could always encounter the same word or every 2 words. Repetition/exposure would be different depending on how fast he/she moves to a new card.

I’d say this is a combination/hybrid of frequency-based SLW and time-based SRS.

Another thing that I want to address is not to penalize after skipping a few days or even weeks. With SRS, for example, if you restart a session after a month, many words are “due”, which means time to review. You are continuously given only review words without seeing a new word for a long time.

Maybe I could do like, skipping no-session-days. Instead of absolute due dates, I could have due day counters. This would violate the important concept of SRS, but who cares? People can be busy, take vacations once in a while, sometimes not feel like learning. Maybe he/she has worked on other books for months.

If user works on a session daily, it acts exactly the same as SRS. If he/she skips days or weeks, there will be no penalty of the so-called, due debt hell. I think the due penalty is so demotivating to many users.

I wish vocaBull 2 will be a kinder, more lenient alternative to pure SRS like Anki.

Well, this will be a fun summer project for me this year.