A personal family calendar hosted on GitHub Pages. PIN-protected, AES-256-GCM encrypted, installable as a PWA on Android.
- Monthly and list calendar views (FullCalendar.js)
- Custody week schedule with alternating color tint
- Vacations and events with color coding by type
- Event descriptions shown as subtitles on calendar tiles
- Data saved as encrypted JSON to this repo via GitHub API
- PIN gate — calendar is locked behind a PIN on every visit
- Works offline after first load (PWA)
| Type | Color |
|---|---|
| Custody week | Green |
| My vacation | Blue |
| Daughter vacation | Orange |
| Other event | Purple |
- Open
https://YOUR-USERNAME.github.io/calendar/#init - Set a PIN (minimum 4 characters)
- Open the ⚙ Settings menu and enter:
- GitHub Username
- Repository name (e.g.
calendar) - Personal Access Token — fine-grained PAT with Contents: Read and Write on this repo
- Click Save
The setup URL (#init) is only required once. After a PIN is set, that URL is no longer needed for normal use.
If you need to set up on a new device, open Settings → copy the New device setup link and open it in the new browser.
- Visit
https://YOUR-USERNAME.github.io/calendar/ - Enter PIN to unlock
- Click any date to add an event
- Click an existing event to edit or delete
- Changes are saved automatically to
events.jsonin this repo
All event data is stored in events.json in this repository, encrypted with AES-256-GCM. The encryption key is derived from your PIN using PBKDF2 (100 000 iterations, SHA-256). Without the correct PIN, the data cannot be decrypted.
events.json format after first save:
{
"encrypted": true,
"salt": "<hex>",
"iv": "<hex>",
"data": "<base64 ciphertext>"
}Open the site in Chrome → tap the browser menu → Add to Home Screen. The app runs in standalone mode (no browser chrome).
Settings (⚙) → Change PIN → enter new PIN. All data is re-encrypted with the new key and saved automatically.
To wipe all data and start fresh:
- Replace
events.jsonwith[] - Clear
localStoragein browser DevTools (Application → Local Storage) - Visit
#initto set a new PIN
Create at: GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens
Required permissions:
- Repository: this repo only
- Contents: Read and Write
Store the token only in the app's Settings modal (saved to localStorage, never committed to the repo).
- FullCalendar.js v6 (CDN)
- Web Crypto API (built-in, no external crypto library)
- GitHub Contents API
- Pure HTML/CSS/JS — no build step, no framework