This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
CycleCare is a small web app that estimates where I am in my menstrual cycle, lets me log symptoms, mood and energy, and then asks a local AI model for general self-care and meal ideas for the day.
The friend I built it for is me. I wanted a simple way to understand my cycle without creating an account or putting my health data on a server I don't control. I haven't handed it to anyone else, so everything in this post comes from my own use.
It is a wellness companion, not a medical tool. It doesn't diagnose, recommend medication, or make medical predictions.
Demo
The video uses fake data only. It shows me setting a cycle date and food preferences, logging symptoms, checking the dashboard, and generating suggestions from the local gemma2:2b model.
Code
CycleCare — a local cycle companion
Built for the DEV / Hacktoberfest 2026 "Build for a Friend" challenge. The friend I built it for is me. A small, local menstrual-cycle tracker with wellness and meal suggestions from an open-weight AI model running on my own laptop.
🌸 About CycleCare
CycleCare is a small web app I built for myself to track my menstrual cycle, log daily symptoms, and get general self-care, hydration, and meal ideas from a local open-weight AI model (Gemma, run through Ollama). Everything runs on my own laptop, with no account and no cloud service.
💡 The Problem
I wanted a simple way to understand where I am in my cycle, but most cycle apps ask me to create an account and keep my health data on their servers. I didn't want that for something this personal.
So I built CycleCare to run entirely on my own…
How I Built It
Frontend: React and Vite
Backend: Python and FastAPI
Database: SQLite, a single file on my machine
AI: Gemma (gemma2:2b), an open-weight model, run locally through Ollama
The flow:
I save my last period date, average cycle length and food preferences.
I log a daily check-in with symptoms, mood, energy and notes.
When I click "Generate Suggestions", the backend reads my data from SQLite and builds a structured prompt from my cycle day, phase, symptoms, preferences and restrictions.
It sends the prompt to Ollama's /api/generate endpoint and asks for JSON back.
The backend parses the JSON and checks its shape, and the UI shows self-care, hydration, movement, sleep, 2 to 3 meal ideas and one short piece of guidance.
The system prompt tells the model not to diagnose and not to recommend medication. If Ollama isn't running, the app doesn't crash. It falls back to a generic built-in plan, labelled as coming from the built-in knowledge base, not the AI model.
I used an AI coding agent to generate most of the code. I then ran the app myself and tested it through the full flow. The backend, the Ollama call and the UI all work together on my laptop.
Limitations:
It's built for one user and tested only by me.
It needs a laptop running Ollama, so I can't deploy it for others to try.
Cycle phases are simple estimates from the last period date and average cycle length. They aren't reliable for irregular cycles and shouldn't be used to plan or avoid pregnancy.
A 2B model can be slow, generic or inconsistent, and the meal ideas are general suggestions, not nutritional advice.
SQLite is unencrypted, so anyone with access to my laptop could read the data.
Why Does Open Innovation Matter?
My data stays on my machine. Cycle and symptom data is deeply personal. With local inference, my prompts never go to a third party.
No account, no API key, no cost. After the one-time model download, it runs for free.
I control the model. The model name is one config setting, so I can swap it for a different Gemma size or another open-weight model without changing the code.
A closed API would have meant sending this data to a company's servers and paying per request.
Safety
CycleCare is a wellness companion and is not intended to diagnose, treat, or prevent medical conditions. AI-generated suggestions are general wellness information and should not replace professional medical advice.
Top comments (0)