<?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: Alfred Chaos</title>
    <description>The latest articles on DEV Community by Alfred Chaos (@alfredchaos).</description>
    <link>https://dev.to/alfredchaos</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%2F4169957%2Fe9cf424b-f7e6-48c2-852c-e6a4dca142f7.jpg</url>
      <title>DEV Community: Alfred Chaos</title>
      <link>https://dev.to/alfredchaos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfredchaos"/>
    <language>en</language>
    <item>
      <title>I built a period tracker that never asks for an account</title>
      <dc:creator>Alfred Chaos</dc:creator>
      <pubDate>Thu, 08 Oct 2026 00:21:54 +0000</pubDate>
      <link>https://dev.to/alfredchaos/i-built-a-period-tracker-that-never-asks-for-an-account-140o</link>
      <guid>https://dev.to/alfredchaos/i-built-a-period-tracker-that-never-asks-for-an-account-140o</guid>
      <description>&lt;p&gt;This week I shipped the first public version of Mori, an Android period tracker. The product rule I started with was simple: no account, ever, for the core features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why that rule
&lt;/h2&gt;

&lt;p&gt;Period data is some of the most sensitive stuff on a phone. In most tracker apps it ends up on a company server, attached to an email, behind a login the app demands before it even opens. That model has real-world consequences — after Roe v. Wade fell, the White House literally warned people about period tracker apps because server-side reproductive data can be subpoenaed.&lt;/p&gt;

&lt;p&gt;So I built the opposite default: records live in a local SQLite database on the phone. Without cloud sync, nothing ever leaves the device. There is no signup screen. You open the app, mark your period days on the calendar, and it gives you a prediction window for next time — computed on-device from your own history, with an explicit confidence label and an explanation of what it based the estimate on. Predictions are deliberately boring: deterministic math over your records, not a black-box model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calendar + cycle ring, tap to log/unlog dates&lt;/li&gt;
&lt;li&gt;Next-period range + ovulation/fertile-window estimates, always labelled as estimates (never as medical certainty)&lt;/li&gt;
&lt;li&gt;Optional local notifications that don't put health words in the notification body&lt;/li&gt;
&lt;li&gt;Full export and "delete everything" on-device&lt;/li&gt;
&lt;li&gt;English + Chinese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app itself has zero analytics. There is exactly one analytics script in the whole product, on the marketing landing page (GA4), because I needed to see if anyone found the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The paid part
&lt;/h2&gt;

&lt;p&gt;The model is buy-once, not subscription. Everything above is free forever — logging, history, predictions, export, delete, turning reminders off. The only thing that costs money ($3.99, one-time) is optional encrypted cloud sync. The server side is Go + Postgres; the snapshot is encrypted on the device before upload, and the backend never sees plaintext records. I didn't call it "end-to-end" in the docs because the server can unwrap the DEK during account recovery — being honest about that felt like the whole point of the exercise.&lt;/p&gt;

&lt;h2&gt;
  
  
  State of it
&lt;/h2&gt;

&lt;p&gt;It's a side-loaded APK from the site (&lt;a href="https://www.moricycle.com/" rel="noopener noreferrer"&gt;https://www.moricycle.com/&lt;/a&gt;) — not on Google Play yet, which is the main friction right now. iOS is planned, not started.&lt;/p&gt;

&lt;p&gt;Ask me anything about the sync crypto design, the deterministic prediction approach, or why I spent a month arguing with myself about the word "private" on the landing page.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>android</category>
      <category>indiedev</category>
    </item>
  </channel>
</rss>
