Sig is a simple, caring medication reminder that lives on your phone. Set up your meds in seconds, get gentle nudges when it's time, and share it with family — each person's data stays private. No complex setup required. Just you, your health, and a little digital nudge.
Live demo: is81.net/sig
📱 iPhone users: After opening in Safari, tap Share → Add to Home Screen to enable push notifications even when the browser is closed.
- 👥 Multi-user — Register / login with JWT authentication
- 💊 Medication CRUD — Add drug name, dosage, time slots, notes
- 🔔 Web Push — Receive system notifications even when the browser is closed (iOS PWA supported)
- 🌐 i18n — 中文 / English / 日本語 / Español
- 📱 PWA — Add to home screen for native app experience
- 🗄️ SQLite — Zero-config database via sql.js (WebAssembly)
- 🌙 Dark mode — Auto-detected via
prefers-color-scheme - ⏰ Daily auto-reset —
takenstatus resets at midnight - 🛡️ Rate limiting & security headers — Built-in protection for auth endpoints
| Layer | Technology |
|---|---|
| Frontend | Vanilla HTML/CSS/JS (SPA, no framework) |
| Backend | Node.js + Express (ESM) |
| Database | SQLite via sql.js (WebAssembly, no native deps) |
| Auth | bcryptjs + jsonwebtoken (JWT) |
| Push | Web Push API + Service Worker + web-push (VAPID) |
| Scheduling | node-cron |
| Process | pm2 |
sig/
├── index.html # SPA frontend
├── sw.js # Service Worker (push receiver)
├── manifest.json # PWA manifest
├── locales/
│ ├── zh-CN.json / en.json / ja.json / es.json
│ └── i18n.js # i18n module
├── docs/ # Dev story & screenshots
└── server/
├── server.js # Express entry (port 3001)
├── db.js # SQLite init & queries
├── .env.example # Config template
├── middleware/auth.js # JWT middleware
├── routes/
│ ├── auth.js # Register / login
│ ├── reminders.js # CRUD + toggle
│ ├── push.js # Push subscription & test
│ └── stats.js # Public stats
├── services/
│ ├── scheduler.js # node-cron: 30s check + daily reset
│ └── push.js # web-push sender
└── utils/validate.js # Input validation
cd sig/server
cp .env.example .env # Edit .env with your config
npm install
npm start # http://localhost:3001Generate VAPID keys for Web Push:
npx web-push generate-vapid-keys
# Copy the output to VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY in .env
# Also update the public key in index.html (search for applicationServerKey)See CLAUDE.md in the repo root for full IIS + pm2 deployment guide.
Your data stays on your server. All medication records, user accounts, and push subscription tokens are stored in your own SQLite database. No data is shared with the developer or any third party. If you use the hosted demo at is81.net/sig, data resides on that server only.
- 🔒 All user passwords are hashed with bcrypt, JWT tokens expire after 7 days
- 🔐 HTTPS is required in production — Web Push and secure authentication depend on it
- 🗄️ All data stored locally in SQLite — no cloud, no analytics, no tracking
- 🔔 Push notifications are sent via standard Web Push protocol (your browser vendor may route them through their servers)
- 📍 The live demo at is81.net/sig is a personal instance — data is not shared or sold
MIT