A luxurious, futuristic calendar app implementing a 13Γ28 solar calendar system with astronomical anchors, events, and flexible holiday configuration.
Available on all platforms: Web, Windows, macOS, Android, iOS
β‘ Quick Start: START_HERE.md | π₯ Download: DOWNLOAD_AND_INSTALL.md | π Build: RELEASE_READY.md
- 13 months Γ 28 days + 1 Still Day = 364/365 days
- Astronomical anchors (Winter Solstice, Vernal Equinox, Summer Solstice, Autumnal Equinox)
- Gregorian β 77EZ conversion with UTC-safe date math
- Mobile-responsive design (tested 360px+)
- Premium UI with dark theme, gold/purple accents
- Event management (Create, Edit, Delete with confirmation)
- Flexible holiday system with presets (Astronomical, Human-layer, Regional/Religious)
- Export/Import JSON support
- Cloud sync across devices via Supabase
- User authentication (email/password or magic link)
- Group sharing with invite codes
- Offline-first - works without internet, syncs when connected
- Privacy-focused - works fully local if you don't configure cloud
- π Web - Any modern browser
- π₯οΈ Desktop - Windows, macOS, Linux (Electron)
- π± Mobile - Android, iOS (Capacitor)
- Same codebase, all platforms - Build once, run everywhere
- Zero build dependencies for web (pure HTML/CSS/ES6 modules)
- Native apps via Electron + Capacitor
- Modular architecture (state, calendar engine, auth, sync, groups)
- LocalStorage v2 schema with automatic migration
- Open
index.htmlin any modern browser - Set astronomical anchors in Settings (default: Dec 21 & Mar 20)
- View today in Today tab, or explore Month and Year views
- Create events in Events tab
- Configure holidays in Settings β Holiday Packs
All data stored in browser localStorage. No internet required.
Desktop:
# Windows, macOS, or Linux
npm install
npm run electron:dev # Development mode
npm run electron:build # Production installerMobile:
# Android or iOS
npm install
npx cap add android # First time only
npm run mobile:android # Open Android Studio
npm run mobile:build:android # Build APKSee BUILD_COMMANDS.md for quick reference or docs/BUILDING_APPS.md for complete guide.
- Follow setup guide: docs/SETUP_GUIDE.md
- Create a free Supabase project
- Run database schema from guide
- Configure credentials in app (Login tab) or
.envfile - Sign up/login to enable sync & groups
Cloud features are opt-in. The app works perfectly without them.
sol-calendar/
βββ index.html # Main app HTML
βββ styles/
β βββ theme.css # Theme tokens & components
βββ src/
β βββ app.js # Main app logic & UI rendering
β βββ state.js # Unified app state management (v2)
β βββ calendar.js # Calendar engine & date conversion
β βββ holidays.js # Holiday system with packs
β βββ storage.js # Legacy storage helpers (v1 compat)
β βββ auth.js # Supabase authentication wrapper
β βββ sync.js # Cloud sync engine (offline-first)
β βββ groups.js # Group sharing & collaboration
β βββ capacitor-init.js # Mobile native APIs
βββ electron/
β βββ main.js # Desktop app main process
β βββ preload.js # Secure IPC bridge
β βββ forge.config.js # Build configuration
βββ docs/
β βββ BUILDING_APPS.md # Native app build guide
β βββ SETUP_GUIDE.md # Cloud sync setup instructions
β βββ AUDIT_REPORT.md # Technical audit findings
β βββ DEV_CHECKLIST.md # Manual testing checklist
β βββ CALENDAR_RULES.md # Calendar system documentation
β βββ HOLIDAY_SYSTEM.md # Holiday packs & configuration
β βββ MIGRATION.md # Storage schema versioning
βββ assets/ # Icons & images (placeholder)
βββ .env.example # Environment variables template
βββ package.json # Dependencies (optional cloud features)
βββ README.md # This file
- April (28 days)
- May (28 days)
- June (28 days)
- July (28 days)
- August (28 days)
- Sol (28 days) β the 6th month
- September (28 days)
- October (28 days)
- November (28 days)
- December (28 days)
- January (28 days)
- February (28 days)
- March (28 days)
- 7 days per week: Sunday β Saturday
- 4 weeks per month
- No partial weeks
- Outside of weeks and months
- Marks end of year
- Optional leap Still Day (#366) if configured
- Rolls over at Vernal Equinox (default: March 20)
- Gregorian 2025 Q1 β Sol Year 2024
- Gregorian 2025 Q2-Q4 β Sol Year 2025
App converts Gregorian dates to 77EZ using astronomical anchors:
- Find most recent Winter Solstice (β€ target date)
- Count days from solstice
- Offset by solstice day# (default: 319)
- Wrap around year length
App searches Β±400 days around reference date to find Gregorian match.
Truth anchor: Winter Solstice is always day #319 (Dec 21 Gregorian by default)
- 77EZ Premium: Black backgrounds (#06060B), gold trim (#E7C26A), purple accents (#A88CFF)
- Luxury feel: Glassmorphic cards, subtle gradients, smooth transitions
- Human-friendly: No snark, clear labels, responsive to 360px mobile width
- Dark mode: Eye-friendly on all devices
| View | Purpose |
|---|---|
| Today | Current date in both calendars, events, holidays |
| Month | 28-day month grid with day numbers, holidays |
| Year | All 13 months + Still Day at once |
| Events | Add, list, delete events (with confirmation) |
| Settings | Anchors, data export/import, holiday toggles |
| About | Help & system info |
-
Astronomical (locked, always-on)
- Winter Solstice, Vernal Equinox, Summer Solstice, Autumnal Equinox, Still Day
-
Human Layer (on by default)
- Gift Day, Renewal Day, Family Day I & II, Expression Day
-
Regional/Religious (opt-in)
- US (MLK, Presidents, July 4, Veterans, etc.)
- Christian (Christmas, Easter, Epiphany)
- Jewish (Rosh Hashanah, Yom Kippur, Hanukkah)
- Islamic (Eid al-Fitr, Eid al-Adha)
- Hindu (Diwali, Holi)
- Enable/disable packs in Settings
- Locked packs (Astronomical) always visible
- Changes apply immediately to all views
- Settings saved to localStorage
- Gregorian (one-time): Fixed Gregorian date
- 77EZ (recurring): Same day# every year
- Create: Events tab β Enter name, type, date/day# β Add Event
- Edit: Events tab β Click event or Edit button β Modify β Save Changes
- Delete: Click Delete button (confirmation required)
- List: Events tab shows all with next occurrence
- Export: Settings β Export (includes events, settings, holiday prefs)
- Import: Settings β Import (restores complete app state)
{
version: 2,
settings: {
winterSolsticeDate: "2024-12-21",
vernalEquinoxDate: "2024-03-20",
winterSolsticeDayNo: 319,
leapStillDayEnabled: true,
showAdvanced: false
},
holidayPrefs: {
astro: true,
human: true,
us: false,
// ... other packs
},
customHolidays: [],
events: [
{
id: "evt_...",
name: "Birthday",
type: "gregorian|77ez",
gregorianDate: "2024-12-25", // for gregorian
dayNo: 341, // for 77ez
recurring: true|false,
createdAt: "2024-01-15T..."
}
]
}- Primary key:
77ez_calendar_v2(localStorage) - Migrates from v1 automatically
- Also maintains legacy keys for backwards compatibility
- Auto-saves on every state change via
setState() - Export/Import includes everything (settings + events + holiday prefs)
- β Mobile width ~360px: layout scales, no overflow, readable
- β "Today" Sol date matches Gregorian conversion with no +1 drift
- β Creating/editing/deleting event works; delete requires confirmation
- β Event edit works: Click event β Modal opens β Edit name/type/date β Save
- β Export downloads JSON; Import restores events/settings/holidays completely
- β Toggling holiday packs immediately updates all views
- β Settings save button works: Changes persist across reload
- β Calendar engine uses user anchors: Changing Winter Solstice Day# updates all conversions
- β Year/Month views show holidays and events distinctly
- β Offline: app works without network (no external APIs)
- β Timezone handling: detects user's TZ, displays correctly
- β Auth: Sign up, login (password + magic link), logout
- β Sync: Events sync across devices when logged in
- β Groups: Create group, invite by code, view shared events
- β Offline-first: Works offline, syncs when reconnected
- β Privacy: No data sent to cloud unless logged in
See docs/DEV_CHECKLIST.md for full test matrix.
calendar.js: Calendar engine (pure functions, no side effects)holidays.js: Holiday packs & preferencesstorage.js: Events & localStorage CRUDapp.js: UI rendering & state managementstyles/theme.css: All styling (reusable variables)
// state.js (v2)
loadAppState() // Unified state loader (migrates from v1)
saveAppState(appState) // Persists all state
exportAppState(appState) // JSON export (complete)
importAppState(data) // JSON import with migration
// calendar.js
dayNoFromGregorian(gDate, settings) // 1-365/366
monthDayFromDayNo(dayNo, leapEnabled) // {month, day} or {special}
yearLabelFromGregorian(gDate, vernalEqISO) // Year number
findGregorianForDayNoNear(dayNo, yearLabel, nearDate, settings)
winterSolsticeForYear(year, settings) // Anchor date for year
// holidays.js
getEnabledHolidayItems(prefs, customHolidays) // All active holidays
holidaysForGregorianDate(date, prefs, customHolidays)
holidaysForDayNo(dayNo, prefs, customHolidays)
loadHolidayPrefs() / saveHolidayPrefs(prefs)
// storage.js (legacy v1 support)
createEvent(name, type, data) // New event
getEventsForGregorian(date, state) // Events on date
bestNextOccurrenceDate(event, from) // Next event occurrenceNo build tool required. Just serve index.html with any HTTP server:
# Python 3
python -m http.server 8000
# Node.js (recommended)
npx http-server -p 8000
# Or open directly: file:///.../index.htmlVisit http://localhost:8000 and start using.
- Install dependencies:
npm install-
Follow docs/SETUP_GUIDE.md to configure Supabase
-
Serve as above - cloud features activate automatically when configured
Phase 1-5: Core Refactor (Audit-Driven)
- β Fixed Settings save button (was never mounted)
- β
Unified app state (
state.jsv2 schema) - β Calendar engine now uses user settings (not hardcoded)
- β Export/Import round-trips all data (settings + events + holiday prefs)
- β Event edit UI implemented (modal with validation)
- β Added toast notifications (no more alert boxes)
- β
State management with
setState()helper
Phase 6-8: Cloud Features (Optional)
- β User authentication (email/password + magic link)
- β Cloud sync with offline-first architecture
- β Group sharing with invite codes
- β Last-write-wins conflict resolution
- β Progressive enhancement (works without cloud)
See docs/AUDIT_REPORT.md for full findings and docs/DEV_CHECKLIST.md for testing.
Implemented (v2.0.0):
- β User authentication & cloud sync
- β Event sharing via groups
- β Offline-first with auto-sync
Future Ideas:
- β Custom holiday creation UI
- β Advanced recurring patterns (weekly, bi-weekly, etc.)
- β Dark/light theme toggle
- β Localization (i18n)
- β PWA installation
- β Calendar integrations (iCal export, Google Calendar sync)
Open source. Use freely.
File an issue or PR. Core rules (13Γ28, astronomical anchors) are non-negotiable; everything else is negotiable.
Built with β€οΈ and βοΈ for a better calendar.