<?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: xinran hou</title>
    <description>The latest articles on DEV Community by xinran hou (@xinran_hou_cc50bc9dc7e9a7).</description>
    <link>https://dev.to/xinran_hou_cc50bc9dc7e9a7</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%2F4086286%2F42ba6c44-a479-4e88-a7e1-cecc2de3f1c3.png</url>
      <title>DEV Community: xinran hou</title>
      <link>https://dev.to/xinran_hou_cc50bc9dc7e9a7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xinran_hou_cc50bc9dc7e9a7"/>
    <language>en</language>
    <item>
      <title>How I made Zotero actually remind me to review my library items</title>
      <dc:creator>xinran hou</dc:creator>
      <pubDate>Sat, 22 Aug 2026 01:55:11 +0000</pubDate>
      <link>https://dev.to/xinran_hou_cc50bc9dc7e9a7/how-i-made-zotero-actually-remind-me-to-review-my-library-items-35lg</link>
      <guid>https://dev.to/xinran_hou_cc50bc9dc7e9a7/how-i-made-zotero-actually-remind-me-to-review-my-library-items-35lg</guid>
      <description>&lt;p&gt;Zotero is great at &lt;em&gt;storing&lt;/em&gt; references — papers, textbook notes, my ever-growing "wrong-answer book". What it never did was &lt;em&gt;nudge me to re-read the things I'd flagged&lt;/em&gt;. So I wrote &lt;code&gt;zotero-review-reminder&lt;/code&gt;, a small plugin that turns Zotero into a spaced-repetition study partner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I read a paper, flag it for review, then... never look at it again. Self-discipline is a terrible reminder system. I wanted something that would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pop a reminder on a schedule (every 7 days by default, at 09:00 — all configurable).&lt;/li&gt;
&lt;li&gt;Surface items whose &lt;code&gt;Next Review Date&lt;/code&gt; has already passed.&lt;/li&gt;
&lt;li&gt;Let me update review-related dates in one click.&lt;/li&gt;
&lt;li&gt;Work in batches across many selected items.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dates live in the item's &lt;code&gt;Extra&lt;/code&gt; field&lt;/strong&gt; as plain &lt;code&gt;key: value&lt;/code&gt; lines — &lt;code&gt;Next Review Date: 2026-08-28&lt;/code&gt;. No hidden database, no separate state. The data stays readable, editable, syncable, and survives export/migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The timer belongs to the plugin&lt;/strong&gt;, not to whichever window happened to load first. This was a real bug: in multi-window Zotero, a timer bound to a window gets silently killed when that window closes. Owning it in &lt;code&gt;onStartup&lt;/code&gt; and clearing it in &lt;code&gt;onShutdown&lt;/code&gt; fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day math is DST-safe&lt;/strong&gt;: I compare dates as UTC calendar days (&lt;code&gt;Date.UTC(y,m,d) / 86400000&lt;/code&gt;), so a 23-hour or 25-hour day doesn't shift a "due today" item by a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible build&lt;/strong&gt;: &lt;code&gt;python3 build.py&lt;/code&gt; produces a byte-identical &lt;code&gt;.xpi&lt;/code&gt; (fixed timestamps, deterministic zip order) — nice for review and distribution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Grab the &lt;code&gt;.xpi&lt;/code&gt; from the release page, then in Zotero: Tools → Plugins → ⚙️ → Install Plugin From File.&lt;/p&gt;

&lt;p&gt;Works on Zotero 7/8/9. MIT licensed.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/18126295767-cell/zotero-review-reminder" rel="noopener noreferrer"&gt;https://github.com/18126295767-cell/zotero-review-reminder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback very welcome — v0.1.0.&lt;/p&gt;

</description>
      <category>zotero</category>
      <category>productivity</category>
      <category>spacedrepetition</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a spaced-repetition review plugin for Zotero</title>
      <dc:creator>xinran hou</dc:creator>
      <pubDate>Fri, 21 Aug 2026 08:25:44 +0000</pubDate>
      <link>https://dev.to/xinran_hou_cc50bc9dc7e9a7/i-built-a-spaced-repetition-review-plugin-for-zotero-2bfe</link>
      <guid>https://dev.to/xinran_hou_cc50bc9dc7e9a7/i-built-a-spaced-repetition-review-plugin-for-zotero-2bfe</guid>
      <description>&lt;p&gt;I use Zotero to manage research papers, textbook notes, and a growing "wrong-answer book" for exam prep. The one thing it never did for me was &lt;em&gt;remind me to actually review&lt;/em&gt; the items I'd flagged. So I wrote a small plugin.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled reminders&lt;/strong&gt; — by default every 7 days at 09:00, configurable (interval, time, check frequency).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Due-item reminders&lt;/strong&gt; — items whose &lt;code&gt;Next Review Date&lt;/code&gt; has passed show up in a reminder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click date shortcuts&lt;/strong&gt; — mark Completed / Corrected / End dates as today, or set &lt;code&gt;Next Review Date&lt;/code&gt; to today + N days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch operations&lt;/strong&gt; — apply any of the above to all selected items at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preferences pane&lt;/strong&gt; — built into Zotero's settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design choices I care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All dates live in the item's &lt;code&gt;Extra&lt;/code&gt; field&lt;/strong&gt; as plain &lt;code&gt;key: value&lt;/code&gt; lines. No separate database, no hidden state — the data is readable, editable, syncable, and survives export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible build&lt;/strong&gt; — &lt;code&gt;python3 build.py&lt;/code&gt; produces a byte-identical &lt;code&gt;.xpi&lt;/code&gt; every time (fixed timestamps, deterministic zip).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timer lifecycle&lt;/strong&gt; — the reminder timer is owned by the plugin, not by whichever window loaded first, so multi-window Zotero doesn't silently kill your reminders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Works on Zotero 7/8/9. MIT licensed.&lt;/p&gt;

&lt;p&gt;Install: download the &lt;code&gt;.xpi&lt;/code&gt; from the release page, then Tools → Plugins → ⚙️ → Install Plugin From File.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/18126295767-cell/zotero-review-reminder" rel="noopener noreferrer"&gt;https://github.com/18126295767-cell/zotero-review-reminder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to take feedback — this is v0.1.0, and I'd especially like input on whether the Extra-field approach feels right vs. a dedicated item field.&lt;/p&gt;

</description>
      <category>zotero</category>
      <category>spacedrepetition</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
