Looks like the Great Firewall or something like it is preventing you from completely loading www.skritter.com because it is hosted on Google App Engine, which is periodically blocked. Try instead our mirror:


This might also be caused by an internet filter, such as SafeEyes. If you have such a filter installed, try adding appspot.com to the list of allowed domains.

Scheduling (SRS)

This document describes what a client needs to know in order to calculate the proper new intervals when reviewing Items.

Getting Initial Values

Before you can calculate the correct scheduling interval, you'll need to download the SRS Configuration objects. These will give you the starting values for the given User.

The Scheduling Algorithm

1. Get the initial value

If the Item is new, the first interval is calculated this way:

  • score 1: initialWrongInterval
  • score 2: initialRightInterval / 5
  • score 3: initialRightInterval
  • score 4: initialRightInterval * 4

If the item is not new, then the algorithm constructs a factor, and the new interval is the old interval times this factor. The base factors are:

  • score 1: wrongFactor
  • score 2: 0.9
  • score 3: rightFactor
  • score 4: 3.5

There are four factors to choose from for the rightFactors and wrongFactors properties in the SRS Configuration. The factor is chosen from the list based on which range the old interval is in. The ranges are:

  • index 0: less than twenty minutes
  • index 1: twenty minutes to five hours
  • index 2: five hours to eight days
  • index 3: greater than eight days

    # given score and the reviewed Item, get the initial interval or factor

    config = getConfigForPart(item.part) # see SRS Config

    if not item.last:
        if score == 1: return config.initialWrongInterval
        interval = config.initialRightInterval
        if score == 2: interval /= 5
        if score == 4: interval *= 4
        return interval

    # the item is not new, so determine the factor
    if score == 2: return 0.9
    if score == 4: return 3.5

    # the factor is one of the variable ones in the SRS Config object.
    factors_list = config.wrongFactors if score == 1 else config.rightFactors
    divisions = [1200, 18000, 691200] # 20 minutes, 5 hours, 8 days
    index = len([d for d in divisions if item.interval > d])
    return factors_list[index]


2. If the Item is not new, adjust the factor.

  1. Adjust For Readiness: If score is 3 or 4, adjust the factor based on the readiness of the item. That is, if the item is scheduled for two days after the last time it was studied, but the person studied it only after one day, the factor should be "halved" (2.2 -> 1.6, ie 60% increase rather than 120%). Conversely, if it was scheduled for two days but the person studied four days after instead and got it right, "double" the factor (2.2 -> 3.4, 120% -> 240%).
        assert factor > 1
        factor -= 1
        factor *= actual_interval / scheduled_interval
        factor += 1
    This adjustment is so that, if you study something too early and get it right, the scheduling doesn't get pushed forward very much, since the likelihood you would have gotten it right was high. But if you study something late, and you got it right anyway, the interval gets a boost.
  2. Accelerate New, Known Items. If the item has never been gotten wrong, and this is one of the first four reviews, multiply the factor by 1.5 (unlike in 1., this is actually just factor *= 1.5, so 2.2 -> 3.3).
        factor *= 1.5
    The SRS can't tell when a new Item has been encountered before by the User. But if the User gets the Item correct each and every time when it first appears, it's a pretty safe bet the User is familiar with the word or character. This adjustment pushes the item out that much faster so the User can focus on Items she doesn't know.
  3. Decelerate Hard Items. If the item has been gotten wrong frequently (> 50% wrong) and been studied quite a few times (> 8 times), adjust the factor downward:
        pct_right = successes / reviews
        factor *= pct_right ** 0.1
    If an item has been gotten wrong the majority of the time, then clearly it's not sticking. This adjustment gives such Items a boost in frequency so they can be focused on more.

3. If the Item is not new, generate the new interval with the adjusted factor

    new_interval = old_interval * factor

4. Randomize the interval

Adjust the interval to +- 7.5%.

    random_adjustment = 0.925 + (random.random() * 0.15) # between 1.075 and 0.925.
    interval *= random_adjustment

5. Bound the interval

Make sure the interval is within bounds based on the score. For maximum:

  • score 1: 7 days
  • all other scores: 10 years

For minimum:

  • score 2: 5 minutes
  • all other scores: 30 seconds

    interval = min(interval, 604800 if score == 1 else 315569260)
    interval = max(interval, 300 if score == 2 else 30)