Custom Scheduling through JS scripts inquiry?

I am using Anki to a learn a new language, but I am using a somewhat odd scheduling and I have largely achieved it through manual adjusting, what I want to is to achieve it automatically and it is the following:
1.To study a card followed by it’s reverse (created through the anki preset) and to revise in the same order.
2. to have the times 10min 1h 1h then 1d 2d 3d 5d 7d and so on.
3. Remove the fuzz factor completely.
I know it’s an odd schedule but it is the one that suits me best.
Can I leverage the custom scheduling feature to achieve such a thing? if yes should I post a request for the script here on other forum?

I’m unclear as to exactly what you mean by this. Do you mean you want to automatically control when a sibling card is scheduled for review; something like what the person in this thread was asking for? If the existing deck settings for burying siblings doesn’t provide what you want, then it’s quite tricky to do with JS in the custom scheduling but may be possible.

It could be easier with an addon but that’s of course not an option, if this is something you want to work in AnkiDroid/AnkiMobile as well.

You can implement almost any kind of scheduling scheme with the custom scheduling code. Yours is definitely possible, possibly excepting the (to me yet unclear) part about controlling the reverse card.

  1. Remove the fuzz factor completely.

This might be one exception, though I’m not sure. I think the fuzz is already applied to the interval you get in custom scheduling and removing that would require essentially recalculating the interval based on the current interval. Then there’s also the new Load balancer feature which I believe modifies the intervals after you answer the card and is on by default.

Another consideration is whether the custom scheduling is something you want in in every deck or only some decks. The custom scheduler is global like FSRS in that, if enabled, it applies to all decks. To only apply to some decks you’ll need to add a bunch more code and modify your card templates to implement a system where the card’s deck is communicated to the JS in custom scheduling. An example of this is in the old FSRS custom scheduling code linked to in the Anki manual.

A similar scheme could be used to communicate the card type to the custom scheduling code as well.

The “10min 1h 1h” part sounds like learning steps? You can certainly repeat the same interval in learning steps like “1h 1h 1h” to get three learning steps each an hour apart.

I’ve made my own custom scheduling code and can say that this can be big ask depending on the complexity but you can certainly post a request in this forum. Describe your exact specs in detail.

As it happens I just posted a how-to guide on custom scheduling in another thread, so perhaps you could try it out yourself? Personally, I’d be interested in making the guide even better for people new to coding rather than making specific code for one person; “teach a man to fish” and so on…

What I mean by the order of review is the following: I create a card the face X (German) the back Y (English), and it’s reverse Y,X using the template option in Anki, and I want to review them for same word right after each other. regarding the scheduling I managed to get the 1h 1h, but the days seems to be randomly multiplied I want it to be 1.5x like 1d then 2d then 3d 5d 7d and so on. P.S. I tried different burying options but I couldn’t achieve the desired result.

Right, I get it. You want the opposite of what the sibling burying options do; you actually want to keep the sibling cards always reviewed at the same time.

There is no built-in way to make sure that you always see the sibling cards one after the other during reviews, so you’d need an addon to do that. Hmm, considering that what you want is to in fact integrate the German–>English review and English–>German review into a single process, perhaps you should instead have a single custom card type for that?

regarding the scheduling I managed to get the 1h 1h, but the days seems to be randomly multiplied I want it to be 1.5x like 1d then 2d then 3d 5d 7d and so on.

Interval multipliers aren’t random, they’re definitely following a logic. If you have enabled FSRS then the logic is a machine learning algorithm so it can seem random. If you don’t have FSRS enabled then the multiplier is the card Ease - 250% ease → 2,5x multiplier on answering Good. The other multiplier are defined in deck settings (see screenshot below)

Anyway, if what you is in fact simply to always increase interval by 50%, then it doesn’t take much custom scheduling code. Do this:

  1. Disable FSRS, if it was enabled
  2. Set your deck Advanced settings as you like:
  • Most importantly, set Starting ease to 1.5 to ensure the first review (note: not learning step) has a multiplier of 1.5. The custom scheduling ensures that all subsequent reviews will continue to have the 1.5 multiplier.
  • Multipliers for the Hard interval and New interval (interval after answering Again) are up to you. These do not use the easeFactor but instead are what you define here.
  • Easy bonus adds to the interval when answering Easy. You probably want to set it to something other than 1,00 as that would make it useless because it becomes the same as answering Good (because the custom scheduling code below removes the effect of increasing the easeFactor when answering Easy)

  1. Then add this to your custom scheduling code. This makes it so that answering anything always keeps your interval multiplier at 1.5.
const againObj =
  states.again.normal?.relearning ||
  states.again.normal ||
  states.again.filtered?.rescheduling?.originalState;
const againRevObj = againObj?.review || againObj.learning;

const hardObj =
  states.hard.normal?.relearning ||
  states.hard.normal ||
  states.hard.filtered?.rescheduling?.originalState;
const hardRevObj = hardObj?.review || hardObj.learning;

const goodObj =
  states.good.normal?.relearning ||
  states.good.normal ||
  states.good.filtered?.rescheduling?.originalState;
const goodRevObj = goodObj?.review || goodObj.learning;

const easyObj =
  states.easy.normal?.relearning ||
  states.easy.normal ||
  states.easy.filtered?.rescheduling?.originalState;
const easyRevObj = easyObj?.review || easyObj.learning;

// For the answers that normally change easeFactor,
// instead keep it at 1.5 always so it never changes
if (againRevObj) {
  againRevObj.easeFactor = 1.5;
}
if (hardRevObj) {
  hardRevObj.easeFactor = 1.5;
}
if (easyRevObj) {
  easyRevObj.easeFactor = 1.5;
}
// Also set the easeFactor for Good so that existing cards with
// a different easeFactor are changed to use 1.5 too
if (goodRevObj) {
  goodRevObj.easeFactor = 1.5;
}

I tried the script but unfortunately it didn’t work, there was a card that was revised a 13 days ago so applying 1.5x would make the next review date make 20 days, it was 24 days. also regarding the order of review which add on are you suggesting I use?

That’s because adding the scheduling code doesn’t affect the easeFactor of any of your existing cards; because you’ve reviewed them before, they will have some value other than 1.5. It would change their easeFactor to 1.5 after you review them once. You can use this addon to modify the easeFactor of all your existing cards (set them to 150 with the addon).

also regarding the order of review which add on are you suggesting I use?

I spoke unclearly. I meant that you’d need an addon to be made for the purpose because one doesn’t exist. That’s why I suggested that, instead, you combine your two Front->Back and Back->Front cards into a single card type instead. Specifically, you’d modify Front->Back and delete Back->Front (or vice versa, whichever one has the most reviews at the moment.

So, to clarify, would this be an acceptable workflow for you? This would work as a single card type.

  1. Show word in German
  2. Try to remember what the word is in English
  3. Show word in English and hide word in German
  4. Then try to remember what the word is in German
  5. Show word in German once again, now both are shown
  6. Rate the review as Again/Hard/Good/Easy

Because if you want to separately rate your recall for German->English and English->German but still see both back-to-back, that would be the most complicated option that you’d need to get somebody to make an addon for you. But the above workflow wouldn’t need an addon, though would need some javascript in the card template.

I apologize, I don’t understand this bit.

It’s about making a single card template that fits what you said you wanted to do with two card templates earlier. I guess I misunderstood, you haven’t created the X,Y and Y,X cards yet?

I have created the cards already I have a deck full of them.
Regarding the workflow step 5 is unnecessary.
The new cards that the script is supposed to be applied to sometimes gives 3 days and sometimes 4 days what seems to be randomly.

Hey buddy, gentle reminder.

Hmm, that’s probably Anki’s fuzz. I guess the right way to do things is to get the current interval and multiply that by 1.5, disregarding whatever the easeFactor is.

So, you’d want to use the previousInterval from the code snippet from my guide in the other thread and modify the goodRevObj.scheduledDays = previousInterval * 1.5 instead. Similarly, you’d do easyRevObj.scheduledDays = previousInterval * <what_multiplier_you _want_for_easy?> for again, hard and easy. I’d imagine you don’t want the 1.5 multiplier for every answer button, right?

Changing the custom scheduling code like this makes the Advanced deck settings irrelevant, as everything is now managed in the code.

I have created the cards already I have a deck full of them.
Regarding the workflow step 5 is unnecessary.

Ok, so then the idea is to skip to the question side and only show the answer side. Then the most basic implementation is using hint fields for both the English and German fields.

For step 3 where the German word is supposed to hidden again you can start with just looking away for a moment after confirming the English word. To actually do the hiding properly requires adding a bit of javascript to control the hiding/showing.