<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Spartan Rich</title>
    <description>The latest articles on DEV Community by Spartan Rich (@spartanrich430).</description>
    <link>https://dev.to/spartanrich430</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4199901%2Fc0dc0a01-d12c-4d3c-af28-461b24d87050.png</url>
      <title>DEV Community: Spartan Rich</title>
      <link>https://dev.to/spartanrich430</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spartanrich430"/>
    <language>en</language>
    <item>
      <title>How to Implement Spaced Repetition (SM-2) in JavaScript</title>
      <dc:creator>Spartan Rich</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:32:01 +0000</pubDate>
      <link>https://dev.to/spartanrich430/how-to-implement-spaced-repetition-sm-2-in-javascript-3kg2</link>
      <guid>https://dev.to/spartanrich430/how-to-implement-spaced-repetition-sm-2-in-javascript-3kg2</guid>
      <description>&lt;p&gt;I spent a weekend convinced I could write a better review scheduler than the one Piotr Wozniak published in 1987. I couldn't. What I ended up with was a cleaner understanding of SM-2, the algorithm behind SuperMemo and, for most of its life, Anki. If you're adding any kind of "review this later" feature to an app, it's the place to start.&lt;/p&gt;

&lt;p&gt;This post walks through SM-2 in plain JavaScript, points out the parts that trip people up, and covers what I'd change before shipping it to real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea in one paragraph
&lt;/h2&gt;

&lt;p&gt;Hermann Ebbinghaus measured his own forgetting in the 1880s and found that memory drops fast after you learn something, then levels off. Each time you successfully recall it, the drop gets slower. Spaced repetition takes advantage of that: review an item right before you'd forget it, and push the next review further out every time you get it right. SM-2 is a small set of rules for deciding how far out "further" is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each card needs to store
&lt;/h2&gt;

&lt;p&gt;Every item you schedule carries three numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;repetitions&lt;/code&gt;: how many times in a row it's been recalled correctly&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;interval&lt;/code&gt;: days until the next review&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;easeFactor&lt;/code&gt;: how quickly the interval grows, starting at 2.5&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus a due date, which you calculate from the interval.&lt;/p&gt;

&lt;p&gt;After each review the user grades their recall from 0 to 5. In the original paper 5 means perfect recall, 3 means correct but hard, and anything below 3 counts as a failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sm2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;repetitions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;easeFactor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quality&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repetitions&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repetitions&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;easeFactor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;repetitions&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;repetitions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;easeFactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;easeFactor&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;easeFactor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;easeFactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;due&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;due&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;due&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;repetitions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;easeFactor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;due&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;repetitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;easeFactor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sm2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fresh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// due tomorrow&lt;/span&gt;
&lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sm2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// due in 6 days&lt;/span&gt;
&lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sm2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// due in about 15 days&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole algorithm. Twenty-odd lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ease factor formula, decoded
&lt;/h2&gt;

&lt;p&gt;The ease update looks like line noise, so plug in numbers. A grade of 5 adds 0.1. A grade of 4 adds nothing. A 3 subtracts 0.14. A 0 subtracts 0.8, though the floor of 1.3 stops it from going lower than that.&lt;/p&gt;

&lt;p&gt;So a card you keep finding hard grows its interval slowly, around 1.3x per review at worst. A card you always nail grows faster and faster. The 1.3 floor matters more than it looks. Without it, a card you failed a few times would end up with an ease near zero and get shown to you every day forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bite you in production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Grades.&lt;/strong&gt; Nobody wants six buttons. Anki settled on four (Again, Hard, Good, Easy), and most apps go even simpler. If you map "Again / Good / Easy" onto 1 / 4 / 5, the algorithm still behaves sensibly. I'd avoid letting users pick 0 through 5 directly. They'll use 3 and 5 and nothing in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Late reviews.&lt;/strong&gt; SM-2 assumes people review on the due date. They don't. If a card was due 10 days ago and the user still remembers it, that's a stronger signal than an on-time success, but plain SM-2 ignores it. A common patch is to compute the next interval from the actual days elapsed instead of the scheduled interval when the answer is correct. Small change, much better behaviour for people who go on holiday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timezones.&lt;/strong&gt; I set &lt;code&gt;due&lt;/code&gt; with &lt;code&gt;setDate&lt;/code&gt; above to keep the demo short. In a real app, store due dates as calendar days in the user's timezone, or someone in Kolkata will get tomorrow's cards at 5:30 in the morning and wonder what broke. I've shipped that bug. It's embarrassing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is SM-2 still worth using?
&lt;/h2&gt;

&lt;p&gt;For a side project or an MVP, yes. It's predictable, it's easy to debug, and you can explain it to a user in two sentences.&lt;/p&gt;

&lt;p&gt;It isn't state of the art anymore, though. Anki added FSRS (Free Spaced Repetition Scheduler) as an option in version 23.10. It fits a memory model to each user's actual review history instead of using fixed constants. If your app ends up with lots of review data per user, FSRS is worth a look. If you're starting from zero data, SM-2 gets you shipping this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The harder problem sits upstream of the scheduler
&lt;/h2&gt;

&lt;p&gt;The scheduler turned out to be the easy part. The hard part was deciding what to put on the card in the first place.&lt;/p&gt;

&lt;p&gt;Most of what I want to remember doesn't arrive as flashcards. It comes from a YouTube talk, a podcast episode, a long article, a reel someone sent me. Turning a 40-minute video into three or four reviewable ideas is real work, and most people (me included) never do it. So the videos sit in Watch Later and the scheduler has nothing to schedule.&lt;/p&gt;

&lt;p&gt;That's the gap &lt;a href="https://www.recl.app" rel="noopener noreferrer"&gt;Recl&lt;/a&gt; is built around. You save videos, reels, podcasts or articles, it summarizes them, sorts them into topics, and then uses spaced repetition to bring the key points back before they fade. The scheduling logic is the same family of ideas as the code above. The difference is that the cards come from what you already consume, so you don't have to write them yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bctunov5mgk9dd56ud3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bctunov5mgk9dd56ud3.jpg" alt="Recl feed showing a summary card" width="720" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A saved article turned into a short summary card in Recl's feed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're building something similar, my advice is to spend less time tuning the interval math and more time on getting content into the system with as little friction as possible. A perfect scheduler with an empty queue helps nobody.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Copy the function above, make a dozen cards from something you read this week, and grade yourself honestly for two weeks. You'll get a feel for the intervals faster than from any paper. And if you'd rather the cards wrote themselves from the stuff you save, &lt;a href="https://www.recl.app" rel="noopener noreferrer"&gt;give Recl a try&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Spartan Rich, and I build &lt;a href="https://www.recl.app" rel="noopener noreferrer"&gt;Recl&lt;/a&gt;, an AI learning app that turns saved videos, podcasts and articles into summaries and spaced-repetition reviews.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>algorithms</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building an AI Summarizer and Spaced-Repetition App: Lessons Learned</title>
      <dc:creator>Spartan Rich</dc:creator>
      <pubDate>Thu, 22 Oct 2026 07:43:02 +0000</pubDate>
      <link>https://dev.to/spartanrich430/building-an-ai-summarizer-and-spaced-repetition-app-lessons-learned-4e82</link>
      <guid>https://dev.to/spartanrich430/building-an-ai-summarizer-and-spaced-repetition-app-lessons-learned-4e82</guid>
      <description>&lt;p&gt;&lt;em&gt;Product and engineering lessons from making saved videos, podcasts and articles actually stick, without the hype.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://www.recl.app" rel="noopener noreferrer"&gt;Recl&lt;/a&gt;, an app that takes the videos, reels, podcasts and articles you save, summarizes them with timestamps, sorts them into topics, and uses spaced repetition to bring the key ideas back before you forget them.&lt;/p&gt;

&lt;p&gt;You won't find architecture diagrams here. Stacks and models change; the decisions above the code have mattered more. These are the lessons I'd pass on to anyone building AI learning tools, a few of which I learned the slow way.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A summary nobody can verify is a summary nobody trusts
&lt;/h2&gt;

&lt;p&gt;The first instinct with an LLM summarizer is to make the output clean and confident: a tidy paragraph, five neat bullets.&lt;/p&gt;

&lt;p&gt;But users can't tell a correct bullet from a slightly wrong one. For learning content, slightly wrong is worse than nothing, because people will remember it and repeat it.&lt;/p&gt;

&lt;p&gt;Timestamps fixed that. When every key point links back to the moment it came from, the summary turns into an index. If something looks off, you tap it and hear the original. That choice did more for trust than any amount of prompt tuning.&lt;/p&gt;

&lt;p&gt;So treat summaries as a way into the source, and show provenance wherever you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Nobody actually wants the summary
&lt;/h2&gt;

&lt;p&gt;It's easy to think the product is the summary. Nobody wakes up wanting a summary of a podcast they've already half-listened to. They want to &lt;em&gt;remember the part that mattered&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That changes what you generate. Review material needs one idea per item, so it can be recalled on its own, and it needs to be phrased so the user can check whether they really know it. It also has to be worth keeping. Most sentences in a video don't deserve a slot in someone's long-term memory.&lt;/p&gt;

&lt;p&gt;That last requirement is the hard one. Generating more is easy. Choosing less is where the work is, and it's mostly a product problem. A better model won't solve it for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Spaced repetition was built for flashcards
&lt;/h2&gt;

&lt;p&gt;Spaced repetition has decades of research behind it: review at growing intervals, and make each review an act of retrieval instead of rereading. Classic implementations assume the user wrote the cards and chose to sit down for a study session.&lt;/p&gt;

&lt;p&gt;Saved content breaks both. The user tapped "save" while scrolling and never planned to study. A few things follow.&lt;/p&gt;

&lt;p&gt;Reviews have to be short. If a review feels like homework, people skip it, and a skipped review counts for nothing.&lt;/p&gt;

&lt;p&gt;The schedule has to forgive. People miss days, and a system that answers with a giant backlog teaches them to stop opening the app.&lt;/p&gt;

&lt;p&gt;Context matters at review time too. A bare question pulled from a podcast can feel disconnected; a pointer back to the timestamp helps people re-anchor.&lt;/p&gt;

&lt;p&gt;Keep the core of spaced repetition (growing gaps, active recall) and redesign everything around it for people who never signed up to "study."&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Capture friction is the whole funnel
&lt;/h2&gt;

&lt;p&gt;The smartest review engine in the world does nothing for content that never got saved into it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoyiw72cgucpk459mf92.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoyiw72cgucpk459mf92.webp" alt="Saving a YouTube video to Recl in one tap from the share sheet, with save progress steps" width="720" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;One-tap save: Recl reads the video and pulls out the key ideas in the background.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every extra tap between "this is interesting" and "this is saved" loses people. That's why one-tap saving mattered so much, and why Recl started on Android, the web and a Chrome extension, with iPhone coming soon. Meeting people inside the apps and browser they already use beats asking them to copy links into a new place.&lt;/p&gt;

&lt;p&gt;Count the steps to capture and fight for every one. It's unglamorous work that pays off.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Organization should be automatic and legible
&lt;/h2&gt;

&lt;p&gt;People want everything organized without doing the organizing. Automatic topic sorting solves that, with a catch: if the system files things in ways the user doesn't understand, they stop trusting the topics and fall back to scrolling a flat list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bh011db4ghq799uu5m5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bh011db4ghq799uu5m5.webp" alt="Recl library topics grid with Self-Improvement, Psychology, Artificial Intelligence and other topics" width="720" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Topics view: saves grouped into topics automatically.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keeping topics legible helps. Give them plain names, and make it visible why an item landed where it did. A view of how topics relate to one another helps as well; in Recl that's the knowledge graph. Done well, it also shows users how much they've saved on one subject compared to another.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Q&amp;amp;A over personal content has to stay grounded
&lt;/h2&gt;

&lt;p&gt;"Ask your saved content" sounds simple until you hit the edges. When the answer isn't in what the user saved, the right response is to say so. Filling the gap with general knowledge that looks like it came from their library is worse than no answer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyx6clo0w99msrxrl2kd2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyx6clo0w99msrxrl2kd2.webp" alt="Recl Ask answering a question about saved startup videos with cited sources" width="720" height="1600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ask: questions answered from your own saves, with links back to the sources.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Answers that point back to sources keep the feature honest. Add semantic search, so people can find things by meaning when they've forgotten the exact words, and you cover most of the "I know I saved something about this" moments.&lt;/p&gt;

&lt;p&gt;In a personal knowledge tool, "I couldn't find that in your saves" belongs on the feature list.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Freemium forces clarity
&lt;/h2&gt;

&lt;p&gt;A free tier makes you decide what the core loop is. For Recl it's save, understand, remember. That loop has to be useful for free, or nobody sticks around long enough to care about anything else. It's a helpful constraint.&lt;/p&gt;

&lt;p&gt;What have you run into building in this space, especially around review scheduling? Leave your lessons in the comments.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spartan Rich is the maker of &lt;a href="https://www.recl.app" rel="noopener noreferrer"&gt;Recl&lt;/a&gt;, an AI learning app that summarizes saved videos, reels, podcasts and articles with timestamps and uses spaced repetition to help you remember them. Available on Android, web and Chrome, with iPhone coming soon.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
