Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
7e83b5a
Enhance header bar functionality with sidebar visibility controls
albert-gee Jul 22, 2026
cb5b906
Add Linux header bar service integration and enhance sidebar function…
albert-gee Jul 22, 2026
9b84b35
Refactor Linux header bar integration to use session-based state mana…
albert-gee Jul 22, 2026
e37077f
Implemented search architecture
albert-gee Jul 23, 2026
6e1584b
Refactor header bar and theme colors
albert-gee Jul 23, 2026
afed114
Update header bar and settings background colors
albert-gee Jul 23, 2026
838d7c5
Add GTK-style sidebar navigation and selectable tiles for settings. U…
albert-gee Jul 23, 2026
625d7dc
Refactor account synchronization and UI components for improved funct…
albert-gee Jul 23, 2026
d8fdb89
Add libhandy dependency and update application to use Handy for windo…
albert-gee Jul 23, 2026
51a31b8
Add native dialog channel and implement confirmation dialog handling.…
albert-gee Jul 23, 2026
f35c23d
Remove unused localization keys for time mode and time mode descripti…
albert-gee Jul 24, 2026
00c1e34
Refactor BusyMax components to enhance menu handling and UI consisten…
albert-gee Jul 24, 2026
c8e04fe
Refactor UI components for consistency and accessibility. Replace Yar…
albert-gee Jul 25, 2026
31e754a
Implement GTK theme compatibility for Yaru window decorations. Add fu…
albert-gee Jul 25, 2026
f4ebda0
Refactor dialog components to enhance accessibility and consistency. …
albert-gee Jul 26, 2026
5509c2b
Refactor color handling in schedule and dialog components for consist…
albert-gee Jul 27, 2026
8b766d0
Enhance BusyMaxDialogShell by introducing a customizable header. Repl…
albert-gee Jul 27, 2026
7c06bd4
Refactor menu session handling for improved responsiveness. Ensure sy…
albert-gee Jul 27, 2026
8e5414e
Refactor date and time picker components. Introduce compact mode for …
albert-gee Jul 28, 2026
7505398
Refactor native dialog styling to enhance visual consistency. Introdu…
albert-gee Jul 28, 2026
5e88748
Add localization for timezone selection and location search. Enhance …
albert-gee Jul 28, 2026
22f7cad
Add timezone package dependency. Update pubspec.yaml to include timez…
albert-gee Jul 28, 2026
942bb22
Add time zone selection dialog and catalog. Implement time zone locat…
albert-gee Jul 28, 2026
eb0b208
Refactor dialog styling and component structure. Remove unused dialog…
albert-gee Jul 28, 2026
ce9097c
Add native time zone selection dialog with search functionality. Impl…
albert-gee Jul 29, 2026
c4a82b9
Refactor native time zone dialog implementation. Replace GtkDialog wi…
albert-gee Jul 29, 2026
adeb462
Refactor BusyMaxApp state management. Remove window manager integrati…
albert-gee Jul 29, 2026
713a062
Enhance native time zone dialog behavior. Implement parent activation…
albert-gee Jul 29, 2026
cec35b6
Add Finnish localization support
albert-gee Jul 29, 2026
fb93c92
Update German localization strings
albert-gee Jul 29, 2026
9e4532e
Update Finish and Spanish localizations
albert-gee Jul 29, 2026
9b74154
Add native grouped list style support for time zone dialog. Enhance s…
albert-gee Jul 29, 2026
6e50732
add russian localization
albert-gee Jul 29, 2026
639efc6
Add locale resolution callback and refactor BusyMaxModalEditorScaffol…
albert-gee Jul 29, 2026
a12891d
Refactor locale handling in desktop notifications and update time zon…
albert-gee Jul 29, 2026
18035d6
Add locale resolution function to support Chinese script variations
albert-gee Jul 29, 2026
5c5ee3c
Add new locales, update fr and ru
albert-gee Jul 29, 2026
c8bb226
Update localizations
albert-gee Jul 29, 2026
5de090e
Refactor MiniCalendar and related components for improved layout and …
albert-gee Jul 29, 2026
b9e176c
Update localizations
albert-gee Jul 30, 2026
ae57feb
Update localizations
albert-gee Jul 30, 2026
35a0728
Update localizations
albert-gee Jul 30, 2026
6c15d79
Update localizations
albert-gee Jul 30, 2026
d929f90
Enhance header bar functionality with focus state management and moda…
albert-gee Jul 30, 2026
9ac4a4e
Add locale management and formatting utilities for BusyMax
albert-gee Jul 30, 2026
0ba83d8
Add locale support and enhance header bar functionality
albert-gee Jul 30, 2026
8ad2468
Add theme handling for header bar and improve control alignment. Refa…
albert-gee Jul 30, 2026
490b325
Replace splash screen with BusyMaxStartupView and enhance onboarding …
albert-gee Jul 30, 2026
08aa983
Add "Report an issue" label to header menu and implement associated a…
albert-gee Jul 30, 2026
e65e251
Ensure synchronous hide of GtkPopover before destruction to release m…
albert-gee Jul 30, 2026
4866db8
Add keyboard shortcuts for various actions and enhance menu entry str…
albert-gee Jul 30, 2026
5491588
Enhance calendar day semantics with unique tooltip keys and adjust da…
albert-gee Jul 30, 2026
5491957
Enhance header functionality by adding sidebar toggle shortcuts and i…
albert-gee Jul 30, 2026
361fbcd
Add localization support for sidebar panel visibility messages in mul…
albert-gee Jul 30, 2026
62b4021
Add highlightWhenOpen property to BusyMaxMenuButton for improved menu…
albert-gee Jul 31, 2026
43c4c39
Refactor dialog handling in busymax_dialogs.dart to use Navigator for…
albert-gee Jul 31, 2026
504f758
Add native menu state CSS for improved hover effects in header bar
albert-gee Jul 31, 2026
fa66906
Add discardChangesAction localization for multiple languages. Update …
albert-gee Jul 31, 2026
622f617
Add highlightSelectedDateOutsideMonth property to mini calendar for i…
albert-gee Jul 31, 2026
1647d91
Update Russian localization for discard changes prompts to enhance cl…
albert-gee Jul 31, 2026
1fa7418
Update Russian localization for discard changes prompts to improve cl…
albert-gee Jul 31, 2026
977c44a
Add tooltip theme customization for header bar to enhance visual cons…
albert-gee Jul 31, 2026
c1010e1
Add shrinkToFitHeight property to mini calendar for flexible height a…
albert-gee Jul 31, 2026
58ee3a3
Enhance tooltip styling by adjusting padding and border properties fo…
albert-gee Jul 31, 2026
8a5dfbf
Refactor modal barrier management to separate visibility and shade de…
albert-gee Jul 31, 2026
1cbe42a
Refactor native menu handling to improve structure and add support fo…
albert-gee Aug 1, 2026
771c81d
Refactor native menu handling to improve action management and shortc…
albert-gee Aug 2, 2026
bd5a889
Add Linux development desktop integration script for BusyMax
albert-gee Aug 2, 2026
326f176
Add Noto fonts to snapcraft configuration. Remove unused dependencies…
albert-gee Aug 2, 2026
dd70edf
Refactor main function to simplify window handling and remove unused …
albert-gee Aug 2, 2026
3f94eb3
Refactor native menu handling to remove unused popover-related code a…
albert-gee Aug 3, 2026
2721859
Update snapcraft.yaml to clarify Snap Store listing translations mana…
albert-gee Aug 3, 2026
42f5118
Refactor schedule_anchored_popover.dart for improved code readability…
albert-gee Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/flutter-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
ninja-build \
pkg-config \
libgtk-3-dev \
libhandy-1-dev \
libstdc++-12-dev \
libsecret-1-dev \
libjsoncpp-dev \
Expand Down
24 changes: 17 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ It brings calendar events and tasks into a native-feeling Linux desktop interfac
- Calendar views for day, week, month, year, and agenda planning.
- Task creation with lists, due dates, reminders, and repeat options.
- Event editing with calendar selection, time controls, repeat rules, and reminders.
- Compact agenda window for quick access to upcoming work.
- Tray shortcut for opening the main Agenda view.
- Integrations with Google Calendar, Google Tasks, Microsoft Calendar, and Microsoft To Do.

## Screenshots
Expand Down Expand Up @@ -67,29 +67,39 @@ It brings calendar events and tasks into a native-feeling Linux desktop interfac
<img src="docs/screenshots/main_window_edit_event.png" alt="BusyMax event editor" width="700">
</p>

<p>
<img src="docs/screenshots/agenda_window_agenda.png" alt="BusyMax compact agenda window" width="300">
<img src="docs/screenshots/agenda_window_agenda_event_details.png" alt="BusyMax compact agenda event details" width="300">
<img src="docs/screenshots/agenda_window_edit_event.png" alt="BusyMax compact agenda event editor" width="300">
</p>

</details>

## Prerequisites

- Flutter: https://docs.flutter.dev/install
- GTK 3 and libhandy development packages (`libgtk-3-dev` and
`libhandy-1-dev` on Ubuntu/Debian)
- `GOOGLE_OAUTH_CLIENT_ID` and `GOOGLE_OAUTH_CLIENT_SECRET`, see [Google Setup](docs/google_setup.md)
- `MICROSOFT_OAUTH_CLIENT_ID`, see [Microsoft Setup](docs/microsoft_setup.md)

## Run locally

Register the development launcher once so GNOME can associate BusyMax's native
Wayland windows with its desktop icon. The helper is idempotent and defaults to
the Flutter debug bundle:

```bash
tools/install_linux_dev_desktop.sh
```

Then run BusyMax normally:

```bash
flutter run -d linux \
--dart-define=GOOGLE_OAUTH_CLIENT_ID=<google-client-id> \
--dart-define=GOOGLE_OAUTH_CLIENT_SECRET=<google-secret-if-needed> \
--dart-define=MICROSOFT_OAUTH_CLIENT_ID=<microsoft-client-id>
```

Use `tools/install_linux_dev_desktop.sh --uninstall` to remove the development
launcher. Remove it before testing an installed Snap so the user-level launcher
does not take precedence; packaged Snaps register their own launcher.

## Feedback submissions

The native **Send feedback** form in the About dialog sends JSON to
Expand Down
9 changes: 6 additions & 3 deletions docs/beta_snap_release.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ OAuth-enabled Flutter build must run first.
## Prepare

Required: Linux amd64, the Flutter Linux toolchain, snapd, Snapcraft with LXD,
`unsquashfs` from `squashfs-tools`, and BusyMax Store access for publishing.
the `libhandy-1-dev` build package, `unsquashfs` from `squashfs-tools`, and
BusyMax Store access for publishing.

Check that the package versions match:

Expand Down Expand Up @@ -113,12 +114,14 @@ snap run busymax

Before upload, verify:

- Desktop search shows one BusyMax launcher; both main and Agenda windows open.
- Desktop search shows one BusyMax launcher; the tray Agenda action opens the
Agenda view in the main window.
- Google and Microsoft sign-in complete successfully.
- Tasks and events can be created, edited, completed, and deleted; a task
created in Agenda appears immediately without manual refresh.
- Accounts, settings, and data survive restart.
- Notifications and tray actions, including Agenda and Quit, work.
- Notifications and tray actions, including opening Agenda in the main window
and Quit, work.

## Upload To Beta

Expand Down
Binary file removed docs/screenshots/agenda_window_agenda.png
Binary file not shown.
Binary file not shown.
Binary file removed docs/screenshots/agenda_window_edit_event.png
Binary file not shown.
4 changes: 4 additions & 0 deletions l10n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ template-arb-file: app_en.arb
output-dir: lib/l10n/generated
output-localization-file: app_localizations.dart
nullable-getter: false
header: |
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: text_direction_code_point_in_literal, text_direction_code_point_in_comment
374 changes: 374 additions & 0 deletions lib/l10n/app_ar.arb

Large diffs are not rendered by default.

158 changes: 103 additions & 55 deletions lib/l10n/app_de.arb

Large diffs are not rendered by default.

134 changes: 92 additions & 42 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -39,31 +39,20 @@
"hideFromSchedule": "Hide from schedule",
"showInSchedule": "Show in schedule",
"noCalendarsSynced": "No calendars synced yet.",
"allDay": "All Day",
"allDay": "All day",
"moreItems": "+{count} more",
"@moreItems": {"placeholders": {"count": {"type": "int"}}},
"noEventsOrTasks": "No events or tasks",
"trayAgendaLoading": "Loading agenda...",
"trayAgendaSignInRequired": "Sign in to show agenda.",
"trayAgendaNoSources": "No visible calendars or task lists.",
"trayAgendaOpenBusyMax": "Open app",
"trayAgendaRefresh": "Refresh",
"trayAgendaError": "Agenda unavailable",
"compactAgendaTitle": "Agenda",
"compactAgendaSubtitle": "Upcoming",
"compactAgendaOverdue": "Overdue",
"compactAgendaClear": "Clear for now",
"compactAgendaOpenBusyMax": "Open BusyMax",
"compactAgendaHide": "Hide",
"compactAgendaNewTask": "New task",
"compactAgendaRetry": "Retry",
"compactAgendaRefresh": "Refresh",
"compactAgendaAllDay": "All day",
"compactAgendaDueToday": "Due today",
"compactAgendaDueTomorrow": "Due tomorrow",
"compactAgendaDueOn": "Due {date}",
"@compactAgendaDueOn": {"placeholders": {"date": {"type": "String"}}},
"compactAgendaMoreOverdue": "Load more overdue tasks",
"scheduleLoading": "Loading schedule...",
"scheduleUnavailable": "Schedule unavailable",
"scheduleNoSources": "No visible calendars or task lists",
"scheduleNoSourcesDescription": "Choose what to show in Settings, then refresh.",
"scheduleSignInRequired": "Connect an account",
"scheduleSignInDescription": "Sign in to sync calendars and tasks.",
"scheduleNoSearchResults": "No matching events or tasks",
"scheduleNoSearchResultsDescription": "Try a different search or clear the current filters.",
"refresh": "Refresh",
"trayOpenBusyMax": "Open BusyMax",
"agendaLoadMoreOverdue": "Load more overdue tasks",
"agendaLoadMoreNoDate": "Load more no-date tasks",
"viewDay": "Day",
Expand All @@ -84,7 +73,7 @@
"editEvent": "Edit event",
"eventTitle": "Event title",
"location": "Location",
"timeSlot": "Time Slot",
"timeSlot": "Time slot",
"startDateTime": "Start date/time",
"endDateTime": "End date/time",
"doesNotRepeat": "Does not repeat",
Expand All @@ -99,6 +88,29 @@
"conference": "Conference",
"noConference": "No conference",
"providerCalendar": "Provider calendar",
"formatBoldShortLabel": "B",
"formatBoldTooltip": "Bold",
"formatItalicShortLabel": "I",
"formatItalicTooltip": "Italic",
"formatUnderlineShortLabel": "U",
"formatUnderlineTooltip": "Underline",
"reminderMinutesBefore": "{minutes, plural, =1{1 minute before} other{{minutes} minutes before}}",
"@reminderMinutesBefore": {"placeholders": {"minutes": {"type": "int"}}},
"reminderAtStart": "At start",
"reminderHoursBefore": "{hours, plural, =1{1 hour before} other{{hours} hours before}}",
"@reminderHoursBefore": {"placeholders": {"hours": {"type": "int"}}},
"reminderDaysBefore": "{days, plural, =1{1 day before} other{{days} days before}}",
"@reminderDaysBefore": {"placeholders": {"days": {"type": "int"}}},
"availabilityFree": "Free",
"availabilityTentative": "Tentative",
"availabilityOutOfOffice": "Out of office",
"availabilityWorkingElsewhere": "Working elsewhere",
"visibilityDefault": "Default",
"visibilityPublic": "Public",
"visibilityPrivate": "Private",
"visibilityConfidential": "Confidential",
"sensitivityNormal": "Normal",
"sensitivityPersonal": "Personal",
"tasks": "Tasks",
"allTasks": "All tasks",
"tasksInList": "Tasks in {title}",
Expand Down Expand Up @@ -127,12 +139,12 @@
"shortcutGroupTaskEditing": "Task editing",
"shortcutCancelEditing": "Cancel editing",
"shortcutCancelEditingDescription": "Close task editing or task details",
"shortcutGroupCompactAgenda": "Compact agenda",
"shortcutRefreshCompactAgendaDescription": "Refresh the compact agenda window",
"shortcutHideCompactAgendaDescription": "Hide the compact agenda window",
"aboutBusyMax": "About BusyMax",
"aboutBusyMaxDescription": "ToDo and Calendar",
"aboutBusyMaxDescription": "Calendar and tasks",
"license": "License",
"apacheLicenseName": "Apache License 2.0",
"website": "Website",
"sourceCode": "Source code",
"reportAnIssue": "Report an issue",
"sendFeedback": "Send feedback",
"feedbackSubmit": "Submit",
Expand Down Expand Up @@ -160,6 +172,8 @@
"feedbackSuccess": "Feedback sent. Reference: {id}",
"@feedbackSuccess": {"placeholders": {"id": {"type": "String"}}},
"toggleSidebar": "Toggle Sidebar",
"showSidebar": "Show sidebar panel",
"hideSidebar": "Hide sidebar panel",
"accounts": "Accounts",
"currentAccount": "Current account",
"switchAccount": "Switch account",
Expand All @@ -168,10 +182,17 @@
"googleProvider": "Google",
"microsoftProvider": "Microsoft",
"signedInAccount": "Signed in",
"signOutThisAccount": "Sign out this account",
"revokeThisAccount": "Revoke this account",
"disconnectThisAccount": "Disconnect this account",
"deleteLocalDataForThisAccount": "Delete local data for this account",
"removeAccount": "Remove account…",
"removingAccount": "Removing account…",
"removeAccountDescription": "Stop syncing and remove this account’s data from this device.",
"removeAccountTitle": "Remove {account} from BusyMax?",
"@removeAccountTitle": {"placeholders": {"account": {"type": "String"}}},
"removeAccountConfirmation": "This deletes cached tasks, calendars, events, reminders, and pending offline changes from this device. Unsynced changes will be lost. Nothing will be deleted from Google or Microsoft.",
"revokeGoogleAccess": "Also revoke BusyMax’s access to this Google Account",
"revokeGoogleAccessDescription": "You will need to grant access again before reconnecting.",
"removeAccountAction": "Remove account",
"removeAccountFailed": "Could not finish removing the account. Try again.",
"accountRemovedGoogleRevokeFailed": "The account was removed from this device, but BusyMax could not revoke Google access. You can revoke it from your Google Account.",
"newList": "New list",
"signInToViewTaskLists": "Sign in to view task lists.",
"noTaskListsSynced": "No task lists synced yet.",
Expand Down Expand Up @@ -220,11 +241,6 @@
"time": {"type": "String"}
}
},
"searchTasks": "Search tasks",
"advancedFilters": "Advanced filters",
"showCompleted": "Show completed",
"showHidden": "Show hidden",
"showAssigned": "Show assigned",
"taskDetails": "Task details",
"editTask": "Edit Task",
"noTaskSelected": "No task selected.",
Expand Down Expand Up @@ -292,18 +308,27 @@
"pendingSync": "Pending sync",
"synced": "Synced",
"account": "Account",
"signOut": "Sign out",
"revokeGoogleAuthorization": "Revoke Google authorization",
"deleteLocalData": "Delete local data",
"deleteLocalDataConfirmation": "This removes the local account, synced tasks, and pending offline changes from this device.",
"sync": "Sync",
"manualFullSync": "Manual full sync",
"runInBackgroundWhenClosed": "Continue running when the window is closed",
"showTrayIcon": "Show tray icon",
"startMinimizedToTray": "Start minimized to the tray",
"requiresTrayIcon": "Requires the tray icon.",
"syncComplete": "Sync complete.",
"syncFailed": "Sync failed: {error}",
"@syncFailed": {"placeholders": {"error": {"type": "String"}}},
"notifySyncFailures": "Notifications on sync failure",
"notifyConflicts": "Notifications on conflicts",
"notifyDueToday": "Due-today notifications",
"eventReminders": "Event reminders",
"taskReminders": "Task reminders",
"notificationDetailLevel": "Notification detail level",
"notificationDetailPrivate": "Private",
"notificationDetailNormal": "Normal",
"quietHours": "Quiet hours",
"quietHoursDescription": "Pause notifications during this period.",
"quietHoursStart": "Quiet hours start",
"quietHoursEnd": "Quiet hours end",
"notifications": "Notifications",
"appearance": "Appearance",
"theme": "Theme",
Expand All @@ -316,7 +341,6 @@
"currentLocale": "Current locale",
"privacy": "Privacy",
"redactTaskContentInDiagnostics": "Redact task content in diagnostics",
"detailedNotifications": "Detailed notification text",
"developerDiagnostics": "Developer diagnostics",
"diagnostics": "Diagnostics",
"apiInspectorDisabled": "Show API inspector",
Expand All @@ -338,6 +362,10 @@
"@pendingOpAttempts": {"placeholders": {"count": {"type": "int"}}},
"retry": "Retry",
"discard": "Discard",
"discardChangesAction": "Discard",
"@discardChangesAction": {
"description": "Destructive confirmation button that throws away unsaved edits. Translate it distinctly from Cancel."
},
"discardChanges": "Discard changes?",
"discardChangesConfirmation": "This discards unsaved edits to this task.",
"retryCompleted": "Retry completed.",
Expand All @@ -353,5 +381,27 @@
"dueTodayNotificationTitle": "Tasks due today",
"dueTodayNotificationBody": "{count, plural, =1{One task is due today.} other{{count} tasks are due today.}}",
"@dueTodayNotificationBody": {"placeholders": {"count": {"type": "int"}}},
"notificationDetailsHidden": "Details are hidden by privacy settings."
"eventReminderNotificationTitle": "Event reminder",
"taskReminderNotificationTitle": "Task reminder",
"eventReminderNotificationBody": "Event starts soon.",
"taskReminderNotificationBody": "Task is due soon.",
"notificationOpenAction": "Open",
"notificationDetailsHidden": "Details are hidden by privacy settings.",
"previousMonth": "Previous month",
"nextMonth": "Next month",
"openMonthView": "Open month view",
"previousYear": "Previous year",
"nextYear": "Next year",
"openYearView": "Open year view",
"weekNumberTooltip": "Week {number}",
"@weekNumberTooltip": {"placeholders": {"number": {"type": "int"}}},
"resizeAllDayPanel": "Resize the all-day panel",
"scheduleItemCount": "{count, plural, =1{1 item} other{{count} items}}",
"@scheduleItemCount": {"placeholders": {"count": {"type": "int"}}},
"readOnlyCalendar": "This calendar is read-only.",
"selectTimeZone": "Select Timezone",
"searchLocations": "Search locations",
"noLocationsFound": "No locations found",
"deleteCalendarConfirmation": "Delete \"{title}\"?",
"@deleteCalendarConfirmation": {"placeholders": {"title": {"type": "String"}}}
}
Loading
Loading