For AI agents: the complete documentation index is available at https://open-spaced-repetition.github.io/ts-fsrs/llms.txt, the full documentation bundle is available at https://open-spaced-repetition.github.io/ts-fsrs/llms-full.txt, and this page is available as Markdown at https://open-spaced-repetition.github.io/ts-fsrs/guide/model/fsrs-5.md.

FSRS-5

FSRS-5 has 19 trainable weights. It keeps the fixed FSRS-4.5 forgetting curve and adds a grade-dependent same-day stability update.

See the Model overview for the shared symbols and Model contract.

Formula source

Reviewed against awesome-fsrs Wiki — FSRS-5.

Forgetting curve and interval

R(t,S)=(1+19t81S)−1/2R(t,S)=\left(1+\frac{19t}{81S}\right)^{-1/2}
I(r,S)=81S19(r−2−1)I(r,S)=\frac{81S}{19}\left(r^{-2}-1\right)

Initial memory

S0(G)=clamp⁡(wG−1,Smin,Smax)S_0(G)=\operatorname{clamp}\left(w_{G-1},S_{min},S_{max}\right)
D0(G)=w4−ew5(G−1)+1,Dinitial=clamp⁡(D0(G),1,10)D_0(G)=w_4-e^{w_5(G-1)}+1,\qquad
D_{initial}=\operatorname{clamp}\left(D_0(G),1,10\right)

Difficulty

ΔD=−w6(G−3),D∗=D+ΔD10−D9\Delta D=-w_6(G-3),\qquad
D^*=D+\Delta D\frac{10-D}{9}
D′=clamp⁡(w7D0(4)+(1−w7)D∗,1,10)D'=\operatorname{clamp}\left(w_7D_0(4)+(1-w_7)D^*,1,10\right)

Stability after review

For t>0t > 0, or when enableShortTerm is disabled, the rating selects the following branch.

HG=w15H_G = w_{15} for Hard and 11 otherwise; EG=w16E_G = w_{16} for Easy and 11 otherwise.

When enableShortTerm is enabled, CC is the previous stability multiplied by exp⁡(−w17w18)\exp(-w_{17}w_{18}); otherwise, C=SC = S:

Sf=min⁡(w11D−w12((S+1)w13−1)ew14(1−R),C)S_f=\min\left(w_{11}D^{-w_{12}}\left((S+1)^{w_{13}}-1\right)e^{w_{14}(1-R)},C\right)
Sr=S[1+ew8(11−D)S−w9(ew10(1−R)−1)HGEG]S_r=S\left[1+e^{w_8}(11-D)S^{-w_9}\left(e^{w_{10}(1-R)}-1\right)H_GE_G\right]
Sraw′(G)={Sf,G=1Sr,G∈{2,3,4}S'_{raw}(G)=
\begin{cases}
S_f,&G=1\\
S_r,&G\in\{2,3,4\}
\end{cases}

CC is an implementation cap for post-lapse stability, not a separately configured stability floor. The model then clamps Sraw′S'_{\mathrm{raw}} to the range from Smin⁡S_{\min} to Smax⁡S_{\max}.

Same-day update

Here, “same-day” means the model receives elapsedDays = 0; the model does not inspect calendar dates. Direct callers and the scheduler’s chrono determine the elapsed value.

When enableShortTerm is enabled and t=0t = 0:

S′=clamp⁡(Sew17(G−3+w18),Smin,Smax)S'=\operatorname{clamp}\left(
S e^{w_{17}(G-3+w_{18})},S_{min},S_{max}
\right)