| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Ailurus is a cross-platform Flutter app for tracking birthdays and anniversaries, with support for both Gregorian dates and Chinese lunar dates. It is designed as a local-first personal calendar utility, with optional CalDAV synchronization for people who want to keep their event data in sync across devices.
Ailurus focuses on a small, opinionated set of personal calendar workflows:
The main user flows are exposed through four routes:
The repository is set up as a cross-platform Flutter app. It currently includes platform folders for:
Ailurus is local-first. Even without CalDAV configured, the app can store and manage events locally.
Event data is persisted as JSON in the app support directory.
The payload structure is intentionally simple:
{
"schemaVersion": 1,
"data": [
{ "...event record json...": true }
]
}EventRepository keeps an in-memory map of EventRecord objects, persists changes atomically via a temporary file rename, and exposes both query and watch-style APIs to the UI.
Sync and appearance settings are also persisted as JSON in the app support directory.
This file stores things like:
When CalDAV is enabled, Ailurus does not write arbitrary third-party calendar content. Instead, it manages its own ICS resources using a stable naming convention:
The ICS shape and sync behavior are documented in:
Ailurus uses a local-first, optional two-way CalDAV synchronization model.
At a high level, a sync run does this:
Conflict handling is a simplified last-writer-wins strategy based on timestamps. The implementation also includes protection against partial remote reads, so a failed remote fetch does not immediately cause an overwrite or deletion decision.
The sync entry path is:
The codebase is organized around a small app shell plus feature modules.
lib/
app/ # App bootstrap, router, theme
core/ # Shared low-level types and utilities
features/
events/ # Event domain, persistence, calculations, UI
settings/ # Sync settings, CalDAV service, settings UI
generated/ # Generated localization output
l10n/ # ARB resources and localization helpers
main.dart # Entry point
The events feature is split into domain, data, and presentation concerns:
This is the core product feature: managing event records and turning source dates into upcoming occurrences.
The settings feature owns both user preferences and synchronization behavior:
This module is where configuration, remote sync, and sync status all come together.
Localization is managed through ARB files under lib/l10n/, with a small helper wrapper in lib/l10n/app_texts.dart.
Do not manually edit generated localization files under lib/generated/l10n/.
At the center of the app is EventRecord, which represents a stored event. It includes information such as:
Occurrence calculation is handled separately so that stored source dates and displayed upcoming dates remain decoupled.
For interoperability, Ailurus serializes events into calendar resources with:
That allows the app to preserve app-specific information such as:
If you change ICS generation or parsing rules, update these docs as well:
flutter gen-l10n
flutter analyze
flutter test
flutter run -d linuxAilurus is intentionally lightweight. It is not trying to be a general-purpose calendar client. The current architecture is optimized for:
If you want to extend the app, the best starting points are usually:
| Back | FazBrowse Home | New Git URL |