Calendifier 📅
Problem → Solution → Impact
Problem: Implementing RFC-compliant calendars manually is tedious and error-prone.
Solution: Calendifier parses and generates RFC5545 calendar formats for event management.
Impact: Saves time and reduces errors in building scheduling features for software projects.
Rationale
I wanted a fun project that created a next-gen calendar for both desktop and Home Assistant. I then wanted to make it fully featured with an NTP synchronised digital/analogue clock, with full and effective support for eventing. Then I fancied adding in some additional features so for extra fun and defiance I wrote in functionality for locale specific holidays. As a final coup de grace, I made it fully internationlised for a large number of locales around the world in foreign languages/numbering standards; that, by the way, was freaking HARD!
Challenges along the way
A standards-compliant calendar backend. RFC5545? I hardly knew her. The main app was HARD due to internationalisation; this was my first foray into internationalising an app and I did it for BOTH a browser AND home assistant dashboard cards.
Another really difficult thing for me was not only identifying holidays for locales which aren't British but making them appear correctly on the UI depending on the locale selected. However, aside from the aforementioned internationalisation support challenges, I really struggled through writing code to support RFC5545 which is basically the official canonical way to support Eventing in a Calendar application. I got there in the end though and I feel the UI is relatively intuitive for this purpose.
🌟 Overview
Calendifier is a sophisticated calendar system available in two deployment modes:
- 🖥️ Desktop Application - Cross-platform desktop calendar built with Python and PySide6
- 🏠 Home Assistant Integration - Web-based dashboard cards for Home Assistant with beautiful UI
Both versions feature comprehensive internationalisation supporting 40 languages and 40 countries, making it a truly global calendar solution. One huge takeaway I had from this piece of work was that internationalisation is an incredibly HARD thing to implement!
✨ Key Features
- 📅 Full Calendar Management - Monthly view with intuitive navigation
- 🌍 40-Language Support - Complete localisation with runtime language switching
- 🏳️ 40-Country Holiday Support - Intelligent holiday detection with native translations
- 🕐 Real-time Analog Clock - NTP synchronisation for accurate timekeeping
- 📝 Comprehensive Event Management - Create, edit, delete with categories and recurring events
- 🎨 Dynamic Theming - Dark/Light mode with instant switching
- 📝 Integrated Notes - Built-in note-taking functionality
- 📤📥 Import/Export - Support for iCalendar, CSV and JSON formats
- ⚙️ Extensive Configuration - Customisable settings for all preferences
🌍 International Support
🗣️ Supported Languages
| Code | Language | Notes |
|---|---|---|
| usgb | 🇺🇸🇬🇧 English | US & UK variants |
| ca | 🇨🇦 Français (Québec) | Quebec French |
| es | 🇪🇸 Català | Catalan |
| es | 🇪🇸 Español | Spanish |
| fr | 🇫🇷 Français | French |
| de | 🇩🇪 Deutsch | German |
| it | 🇮🇹 Italiano | Italian |
| br | 🇧🇷 Português | Brazilian Portuguese |
| pt | 🇵🇹 Português | Portuguese |
| ru | 🇷🇺 Русский | Russian |
| cn | 🇨🇳 简体中文 | Simplified Chinese |
| tw | 🇹🇼 繁體中文 | Traditional Chinese |
| jp | 🇯🇵 日本語 | Japanese |
| kr | 🇰🇷 한국어 | Korean |
| in | 🇮🇳 हिन्दी | Hindi |
| sa | 🇸🇦 العربية | Arabic |
| cz | 🇨🇿 Čeština | Czech |
| se | 🇸🇪 Svenska | Swedish |
| no | 🇳🇴 Norsk | Norwegian |
| dk | 🇩🇰 Dansk | Danish |
| fi | 🇫🇮 Suomi | Finnish |
| nl | 🇳🇱 Nederlands | Dutch |
| pl | 🇵🇱 Polski | Polish |
| tr | 🇹🇷 Türkçe | Turkish |
| ua | 🇺🇦 Українська | Ukrainian |
| gr | 🇬🇷 Ελληνικά | Greek |
| id | 🇮🇩 Bahasa Indonesia | Indonesian |
| vn | 🇻🇳 Tiếng Việt | Vietnamese |
| th | 🇹🇭 ไทย | Thai |
| bg | 🇧🇬 Български | Bulgarian |
| sk | 🇸🇰 Slovenčina | Slovak |
| si | 🇸🇮 Slovenščina | Slovenian |
| hr | 🇭🇷 Hrvatski | Croatian |
| hu | 🇭🇺 Magyar | Hungarian |
| ro | 🇷🇴 Română | Romanian |
| il | 🇮🇱 עברית | Hebrew |
| ee | 🇪🇪 Eesti | Estonian |
| lv | 🇱🇻 Latviešu | Latvian |
| lt | 🇱🇹 Lietuvių | Lithuanian |
🏳️ Holiday Support
The application automatically detects and displays holidays for 40 countries with intelligent cultural filtering:
| Code | Country | Holiday set | Supported |
|---|---|---|---|
| us | 🇺🇸 United States | Federal holidays | ✅ |
| ca | 🇨🇦 Canada | Jours fériés / Holidays | ✅ |
| gb | 🇬🇧 United Kingdom | Bank holidays | ✅ |
| es | 🇪🇸 Spain | National holidays | ✅ |
| fr | 🇫🇷 France | Jours fériés | ✅ |
| de | 🇩🇪 Germany | Feiertage | ✅ |
| it | 🇮🇹 Italy | Giorni festivi | ✅ |
| br | 🇧🇷 Brazil | Feriados nacionais | ✅ |
| pt | 🇵🇹 Portugal | Feriados nacionais | ✅ |
| ru | 🇷🇺 Russia | Праздничные дни | ✅ |
| cn | 🇨🇳 China | 法定节假日 | ✅ |
| tw | 🇹🇼 Taiwan | 國定假日 | ✅ |
| jp | 🇯🇵 Japan | 祝日 | ✅ |
| kr | 🇰🇷 South Korea | 공휴일 | ✅ |
| in | 🇮🇳 India | राष्ट्रीय अवकाश | ✅ |
| sa | 🇸🇦 Saudi Arabia | الأعياد الوطنية | ✅ |
| cz | 🇨🇿 Czech Republic | Státní svátky | ✅ |
| se | 🇸🇪 Sweden | Helgdagar | ✅ |
| no | 🇳🇴 Norway | Helligdager | ✅ |
| dk | 🇩🇰 Denmark | Helligdage | ✅ |
| fi | 🇫🇮 Finland | Juhlapäivät | ✅ |
| nl | 🇳🇱 Netherlands | Feestdagen | ✅ |
| pl | 🇵🇱 Poland | Święta państwowe | ✅ |
| tr | 🇹🇷 Turkey | Resmi tatiller | ✅ |
| ua | 🇺🇦 Ukraine | Державні свята | ✅ |
| gr | 🇬🇷 Greece | Εθνικές γιορτές | ✅ |
| id | 🇮🇩 Indonesia | Hari libur nasional | ✅ |
| vn | 🇻🇳 Vietnam | Ngày lễ quốc gia | ✅ |
| th | 🇹🇭 Thailand | วันหยุดราชการ | ✅ |
| bg | 🇧🇬 Bulgaria | Национални praznici | ✅ |
| sk | 🇸🇰 Slovakia | Štátne sviatky | ✅ |
| si | 🇸🇮 Slovenia | Državni prazniki | ✅ |
| hr | 🇭🇷 Croatia | Državni blagdani | ✅ |
| hu | 🇭🇺 Hungary | Nemzeti ünnepek | ✅ |
| ro | 🇷🇴 Romania | Sărbători naționale | ✅ |
| il | 🇮🇱 Israel | חגים לאומיים | ✅ |
| ee | 🇪🇪 Estonia | Riigipühad | ✅ |
| lv | 🇱🇻 Latvia | Valsts svētki | ✅ |
| lt | 🇱🇹 Lithuania | Valstybės šventės | ✅ |
✨ Home Assistant Features
- 🎨 Beautiful Dashboard Cards - Clock, Calendar, Events, Notes, Settings, Data Management
- 📱 Responsive Design - Works on desktop, tablet and mobile
- 🌐 Web Access - Access from anywhere on your network
- 🔄 Auto-Updates - Cards refresh automatically
- 🎯 Optimised Layout - No overlapping, proper spacing
🖥️ Desktop Application
Traditional desktop application for local use.
🎯 First Launch
On first launch, the application will: - 🔍 Auto-detect your system locale and set the appropriate language
-
🏳️ Match your country to display relevant holidays
-
🎨 Apply your system theme (dark/light mode)
-
📁 Create user data directory at
~/.calendar_app/
🌙 Dark Theme
☀️ Light Theme
🌍 Language Switching
📝 Event Management
📦 Building & Distribution
Calendifier supports multiple build targets for maximum compatibility across platforms:
🖥️ Cross-Platform Executable (Nuitka)
Build a single executable file for Windows, macOS and Linux:
⚙️ Configuration
🏠 User Data Location
The application stores user data in:
- Windows: %USERPROFILE%\.calendar_app\
- macOS: ~/.calendar_app/
- Linux: ~/.calendar_app/
📁 Configuration Files
settings.json- Application preferencesdata/calendar.db- SQLite databaselogs/- Application logsexports/- Exported calendar filesbackups/- Database backups
Made with ❤️ for the global community
Supporting 40 languages and 40 countries worldwide
Screenshots
