Free, open-source Windows app that tells you when a prescription is about to run out. No account, no subscription, your data stays on your PC.
HealthC# · PythonGitHub @vger70OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Medicine reminder
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Windows desktop app that reminds the user to request a new prescription
from their doctor in time, before a medicine's stock runs out. Built
with C# on .NET 10 and WinForms.
MedReminder is an organizational reminder, not a medical device.
It does not provide diagnoses, therapy instructions, therapy changes
or clinical suggestions. Every therapy decision must be made with
your doctor.Read the full README ↗Windows desktop app that reminds the user to request a new prescription from their doctor in time, before a medicine's stock runs out. Built with C# on .NET 10 and WinForms.
MedReminder is an organizational reminder, not a medical device. It does not provide diagnoses, therapy instructions, therapy changes or clinical suggestions. Every therapy decision must be made with your doctor.
Keep track of the stock of medicines you take regularly and warn you, with a configurable lead time, when it is time to ask your doctor for a new prescription. The app computes days left and estimated run-out date from the therapy schedule, suspensions and schedule changes; it sends a Windows notification and/or an email when the stock falls below the threshold. Optionally, it also reminds the user at each scheduled dose time.
Medicines and stock
.ics): the day to request each prescription, the
run-out dates, the last day to collect a prescription and the
administrative deadlines, for Outlook, Google Calendar or a phone;
generic titles unless the user asks for the names. Low-stock emails
carry the run-out date as a calendar attachment.Notifications
StockEpoch: a new
package, a manual addition, a positive correction, or a stock count
that raises the stock above the warning threshold restarts the
warning cycle; intakes and negative corrections do not.Profiles
Several devices
Backup, export and restore
.mrz, Argon2id +
AES-GCM, user passphrase) for moving to another PC. Format
documented in docs/EXPORT-FORMAT.md.Application
| Layer | Technology |
|---|---|
| UI | WinForms on .NET 10 (net10.0-windows10.0.19041.0) |
| Application / Domain | C# 12+, nullable + implicit usings |
| Persistence | SQLite via EF Core 10 |
| SMTP | MailKit 4.x |
| Local credentials | DPAPI (Windows Data Protection API, CurrentUser scope) |
| Export / cloud snapshots | Argon2id (Konscious.Security.Cryptography) + AES-GCM |
| Auto-start | Registry HKCU\...\Run |
| Local notifications | Modern Windows toast via CommunityToolkit + tray balloon fallback |
| In-app help | WebView2 + Markdig (MD → HTML) |
| Barcode scan | USB scanner as keyboard input; webcam via Windows.Media.Capture + ZXing.Net |
| Localization | JSON dictionaries per language, hot-reloadable from disk |
| Logging | Serilog + daily rolling file |
| Tests | xUnit + FluentAssertions |
| Hosting | Microsoft.Extensions.Hosting (generic host + BackgroundService) |
6 projects + 6 test projects — details in
docs/ANALYSIS.md.
MedReminder.sln
src/
MedReminder.Domain/ pure entities and calculations (net10.0)
MedReminder.Application/ use cases and ports (net10.0)
MedReminder.Infrastructure.Portable/ SQLite/EF Core, archive cipher, localization, MailKit (net10.0)
MedReminder.Infrastructure/ DPAPI/registry/export (net10.0-windows)
MedReminder.UI/ WinForms + host (net10.0-windows10.0.19041.0)
MedReminder.DataImporter/ reference-catalogue import tool (net10.0)
tests/
MedReminder.Domain.Tests/
MedReminder.Application.Tests/
MedReminder.Infrastructure.Portable.Tests/
MedReminder.Infrastructure.Tests/
MedReminder.UI.Tests/
MedReminder.DataImporter.Tests/
assets/
medreminder.ico app icon (pill, multi-resolution)
localization/ JSON dictionaries (en, it, fr, es, de)
docs/
ANALYSIS.md technical analysis + architecture
EVOLUTION.md open evolution backlog
EVOLUTION-DONE.md shipped evolutions
EXPORT-FORMAT.md public .mrz archive format
CATALOGUE-DATA.md reference-catalogue sources and refresh
SYNC-FORMAT.md sync and circle storage format
PACKAGING.md publishing and distribution
USER_GUIDE.<lang>.md user guide (en, it, fr, es, de)
analysis/ per-feature design documents
prompt/ implementation prompts
dotnet restore MedReminder.sln
dotnet build MedReminder.sln -c Release
Output: src\MedReminder.UI\bin\Release\net10.0-windows*\MedReminder.exe.
dotnet test MedReminder.sln -c Release
Integration tests (MedReminder.Infrastructure.Tests) run on Windows
only (they use DPAPI and the registry); so do the UI tests. Domain,
application, portable-infrastructure and data-importer tests run on
any platform with the .NET 10 SDK.
See docs/PACKAGING.md for details. In short:
:: Framework-dependent (~10 MB, requires .NET 10 Desktop Runtime)
dotnet publish src\MedReminder.UI -c Release ^
/p:PublishProfile=win-x64-framework-dependent
:: Self-contained (~85 MB, no external runtime required)
dotnet publish src\MedReminder.UI -c Release ^
/p:PublishProfile=win-x64-self-contained
Windows x64
MedReminder's own executables and libraries, and the MSI, are
code-signed with a Certum Open
Source Code Signing certificate (SHA-256, RFC 3161 timestamp;
docs/PACKAGING.md §25). Until the certificate has built up
reputation, Windows SmartScreen can still show a blue dialog the first
time you launch MedReminder.exe or open the MSI installer:
Windows protected your PC Microsoft Defender SmartScreen prevented an unrecognized app from starting.
Click More info, then Run anyway. Windows remembers your choice for that specific file — subsequent launches do not prompt again. The UAC dialog raised by the MSI shows the verified publisher.
The binaries are built by the public GitHub Actions workflow
dotnet-desktop.yml from the
tagged source in this repository, then rebuilt locally from the same
tag and signed (publish-signed-release.ps1); the signed files replace
the release assets.
Everything the app writes lives under
%LOCALAPPDATA%\MedReminder\. Since Increment 15 the database is
per-profile — the root holds admin-managed shared files and the
profile registry, while each profile has its own subfolder under
profiles\. See docs/analysis/ANALYSIS-MULTI-USER.md §3 for the
full layout.
Shared, admin-managed:
| File | Content |
|---|---|
profiles.json | Profile registry (admin/user, PIN hash, LastUsedAt hint) |
smtp.settings.json | Shared SMTP transport (no password, no recipient) |
smtp.protected | SMTP password, DPAPI-encrypted (CurrentUser scope) |
backup.settings.json / backup.state.json | Automatic backup config (local and cloud-folder targets) + last-tick state |
cloud-backup.protected | Cloud-folder backup passphrase, DPAPI-encrypted (CurrentUser scope) |
donations.settings.json | Optional public Payment Link URLs for the Support Development dialog |
user.settings.json | UI language, reference-catalogue country, update-check preference, database-query logging (this device only) |
onedrive.protected / googledrive.protected | OneDrive / Google Drive sign-in tokens, DPAPI-encrypted |
household\ | Shared circle: operation log, settings, circle and device keys (DPAPI) |
catalogue\staging\ | Remote catalogue archive while it is imported; emptied every run |
logs/medreminder-YYYYMMDD.log | Daily rolling log, 30-day retention |
Per-profile, under profiles\<profile-id>\:
| File | Content |
|---|---|
medreminder.db (+ -shm, -wal) | This profile's SQLite database |
notifications.settings.json | This profile's email recipient, optional caregiver and doctor address |
ui.settings.json | This profile's text size and appearance |
sync.settings.json / sync.protected | Sync group, device and storage; group key, DPAPI-encrypted (only when sync is on) |
Nothing outside %LOCALAPPDATA%\MedReminder\ is written by the app,
except the backup, export and cloud-folder files written to folders
the user selects.
Sensitive fields (passwords, email bodies, medical notes) never reach
the logs.
Open Tools → Settings… → Email SMTP:
smtp.protected; the settings file never contains the
plaintext password).Under Settings → Notifications each profile sets its own recipient and an optional caregiver address.
Windows notifications need no configuration: they use the app's shared tray icon and modern Windows toast when available.
Tools → Settings… → Backup / Restore. Automatic-backup settings are visible to administrators only; export, import and restore from a cloud folder are available to every profile.
.db). If the PC is off at the preferred
time, the backup runs at the next start of the day..mrz snapshot of every profile into a
folder the user's cloud client synchronizes, or into OneDrive or
Google Drive directly. With a shared circle only the master
device writes it. Requires a
backup passphrase; losing it means the snapshots cannot be
restored..db file; the current DB is renamed
to medreminder.db.bak-YYYYMMDDHHMMSS before replacement, and the
app restarts automatically to release SQLite locks cleanly..mrz archive of the current profile,
portable across Windows accounts and PCs. Import overwrites the
current profile after a safety copy. Recommended way to move to a
new PC..mrz snapshots in a
folder and restores the selected one on this PC.The daily backup uses SQLite's online backup API
(SqliteConnection.BackupDatabase) — safe against concurrent
writes. See the user guide for the full procedure.
MedReminder is localized in English (default), Italian, French, Spanish and German. Change the language from Settings → General. The app restarts automatically to apply.
The language dictionaries are plain JSON files under
bin\...\localization\strings.<lang>.json — you can edit a
translation without recompiling the app. Advanced users can also
override any string by putting a strings.<lang>.json in
%LOCALAPPDATA%\MedReminder\localization\ (user override wins over
the shipped file).
Log path: %LOCALAPPDATA%\MedReminder\logs\.
Format: medreminder-YYYYMMDD.log — one file per day, 30-day
retention, 10 MB max per file (with automatic alphabetic roll past
that size).
Default level: Information. Contains scheduler ticks, notification
sends, sync and circle outcomes, errors with stack trace.
Executed SQL commands (text and duration, never parameter values) are
written only while Settings → General → Log database queries
(diagnostics) is on; administrators only, applied without a
restart. Passwords, email content and sensitive
dose/quantity values are never written to the logs.
EnsureCreated() on first run, not
EF Core migrations. Later schema changes are additive patches
applied idempotently on boot; a move to migrations would require a
baseline migration.MedReminder keeps your data on your PC and sends nothing to the developer. See PRIVACY.md.
Apache 2.0 — see LICENSE.