Calendar Settings Audit & Simplification Proposal
Current State: 41 Settings
The calendar app has 41 settings defined in CalendarAppSettings. Only 13 are exposed in the Settings UI. The remaining 28 are either used internally with hardcoded defaults or are dead code.
All Settings by Category
A. View Settings (9) — Core, keep all
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 1 |
defaultView |
'week' | 'month' | 'agenda' |
'week' |
Yes |
ViewsBar, SettingsModal |
| 2 |
weekStartsOn |
0 | 1 |
1 (Mon) |
No |
WeekView, MonthView, DateStrip, viewStore |
| 3 |
showOnlyWeekdays |
boolean |
false |
Yes |
WeekView, MonthView |
| 4 |
showWeekNumbers |
boolean |
false |
Yes |
WeekView |
| 5 |
timeFormat |
'24h' | '12h' |
'24h' |
Yes |
WeekView, formatTime/formatHour |
| 6 |
filterHoursEnabled |
boolean |
false |
Yes |
WeekView, useVisibleHours |
| 7 |
dayStartHour |
number |
6 |
Yes |
WeekView, useVisibleHours |
| 8 |
dayEndHour |
number |
20 |
Yes |
WeekView, useVisibleHours |
| 9 |
allDayDisplayMode |
'header' | 'block' |
'header' |
Yes |
WeekView |
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 10 |
headerCompact |
boolean |
false |
No |
CalendarHeader |
| 11 |
headerWeekdayFormat |
'full' | 'short' | 'hidden' |
'full' |
No |
CalendarHeader |
| 12 |
headerShowDate |
boolean |
true |
No |
CalendarHeader |
| 13 |
headerAlwaysShowMonth |
boolean |
false |
No |
CalendarHeader |
C. DateStrip Settings (8) — Not in UI, used by DateStrip
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 14 |
dateStripShowMoonPhases |
boolean |
true |
No |
DateStrip |
| 15 |
dateStripShowEventIndicators |
boolean |
true |
No |
DateStrip |
| 16 |
dateStripShowWeekday |
boolean |
true |
No |
DateStrip |
| 17 |
dateStripHighlightWeekends |
boolean |
true |
No |
DateStrip |
| 18 |
dateStripShowMonthDividers |
boolean |
true |
No |
DateStrip |
| 19 |
dateStripCompact |
boolean |
false |
No |
DateStrip |
| 20 |
dateStripShowWeekNumbers |
boolean |
false |
No |
DateStrip |
| 21 |
dateStripCollapsed |
boolean |
false |
No |
DateStripFab, Layout |
D. Tag/Filter Settings (2) — Runtime state, not user preference
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 22 |
tagStripCollapsed |
boolean |
true |
No |
Layout |
| 23 |
selectedTagIds |
string[] |
[] |
No |
MonthView, TagStrip, Layout |
E. Mode Toggles (3) — Runtime state, not user preference
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 24 |
immersiveModeEnabled |
boolean |
false |
No |
Layout |
| 25 |
showTasksInCalendar |
boolean |
false |
No |
WeekView, Layout (reset on load) |
| 26 |
sidebarCollapsed |
boolean |
true |
No |
Layout (reset on load) |
F. Birthday Settings (2) — In UI
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 27 |
showBirthdays |
boolean |
true |
Yes |
WeekView, MonthView, Layout |
| 28 |
showBirthdayAge |
boolean |
true |
Yes |
WeekView, BirthdayPopover |
G. Quick View Pill (2) — Not in UI
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 29 |
quickViewPillViews |
CalendarViewType[] |
['week','month','agenda'] |
No |
ViewModePill |
| 30 |
customDayCount |
number |
30 |
No |
viewStore (agenda range) |
H. Event Defaults (2) — In UI
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 31 |
defaultEventDuration |
number |
60 |
Yes |
EventForm |
| 32 |
defaultReminder |
number |
15 |
Yes |
SettingsModal |
I. Voice Input (1) — In UI
| # |
Setting |
Type |
Default |
In UI |
Used By |
| 33 |
sttLanguage |
'de' | 'auto' |
'de' |
Yes |
voice-recording composable |
Simplification Proposal: 41 → 18 Settings
Principle: Settings should be user-visible preferences that persist. Runtime UI state (sidebar open, tag selection) and hardcoded component behavior belong elsewhere.
Keep as Settings (18)
These are genuine user preferences that should persist across sessions:
| # |
Setting |
Rationale |
| 1 |
defaultView |
User choice |
| 2 |
weekStartsOn |
Regional preference, add to UI |
| 3 |
showOnlyWeekdays |
User choice |
| 4 |
showWeekNumbers |
User choice |
| 5 |
timeFormat |
Regional preference |
| 6 |
filterHoursEnabled |
User choice |
| 7 |
dayStartHour |
User choice |
| 8 |
dayEndHour |
User choice |
| 9 |
allDayDisplayMode |
User choice |
| 10 |
showBirthdays |
User choice |
| 11 |
showBirthdayAge |
User choice |
| 12 |
defaultEventDuration |
User choice |
| 13 |
defaultReminder |
User choice |
| 14 |
sttLanguage |
User choice |
| 15 |
dateStripShowMoonPhases |
Unique feature, worth keeping as user choice |
| 16 |
dateStripShowEventIndicators |
Useful toggle |
| 17 |
dateStripHighlightWeekends |
Useful toggle |
| 18 |
dateStripCompact |
Layout preference |
Remove — Convert to Hardcoded Defaults (12)
These are not exposed in any UI and their defaults are always used:
| Setting |
Default |
Reason to Remove |
headerCompact |
false |
Never toggled, no UI |
headerWeekdayFormat |
'full' |
Never toggled, no UI |
headerShowDate |
true |
Never toggled, no UI |
headerAlwaysShowMonth |
false |
Never toggled, no UI |
dateStripShowWeekday |
true |
Always true, no reason to hide |
dateStripShowMonthDividers |
true |
Always true, no reason to hide |
dateStripShowWeekNumbers |
false |
Duplicate of showWeekNumbers |
quickViewPillViews |
['week','month','agenda'] |
Only 3 views exist, always all shown |
customDayCount |
30 |
Hardcode in agenda view |
Remove — Move to Component-Local State (11)
These are runtime UI state, not persistent preferences. They should be $state() variables in the components that use them:
| Setting |
Current Behavior |
Where to Move |
dateStripCollapsed |
Persisted |
$state(false) in DateStrip/Layout |
tagStripCollapsed |
Persisted |
$state(true) in Layout |
selectedTagIds |
Persisted |
$state([]) in Layout or a tagFilterStore |
immersiveModeEnabled |
Persisted |
$state(false) in Layout |
showTasksInCalendar |
Reset to false on load |
$state(false) in Layout |
sidebarCollapsed |
Reset to true on load |
$state(true) in Layout |
Note: selectedTagIds could arguably persist, but the current behavior (persisting filter state) can confuse users who forget they have filters active. Resetting on load is safer.
Proposed New Interface
export interface CalendarAppSettings extends Record<string, unknown> {
// View
defaultView: CalendarViewType;
weekStartsOn: 0 | 1;
showOnlyWeekdays: boolean;
showWeekNumbers: boolean;
timeFormat: '24h' | '12h';
filterHoursEnabled: boolean;
dayStartHour: number;
dayEndHour: number;
allDayDisplayMode: 'header' | 'block';
// Display
showBirthdays: boolean;
showBirthdayAge: boolean;
dateStripShowMoonPhases: boolean;
dateStripShowEventIndicators: boolean;
dateStripHighlightWeekends: boolean;
dateStripCompact: boolean;
// Event defaults
defaultEventDuration: number;
defaultReminder: number;
// Voice
sttLanguage: 'de' | 'auto';
}
New Settings UI Sections
| Section |
Settings |
Currently in UI |
| Ansicht |
defaultView, weekStartsOn, timeFormat, showOnlyWeekdays, showWeekNumbers |
Mostly yes, add weekStartsOn |
| Stunden |
filterHoursEnabled, dayStartHour, dayEndHour |
Yes |
| Anzeige |
allDayDisplayMode, dateStripCompact, dateStripShowMoonPhases, dateStripShowEventIndicators, dateStripHighlightWeekends |
Partially |
| Termine |
defaultEventDuration, defaultReminder |
Yes |
| Geburtstage |
showBirthdays, showBirthdayAge |
Yes |
| Spracheingabe |
sttLanguage |
Yes |
Migration Steps
- Move UI state to component-local
$state() (sidebarCollapsed, tagStripCollapsed, etc.)
- Replace header settings with hardcoded values in CalendarHeader
- Replace removed dateStrip settings with hardcoded values in DateStrip
- Remove
quickViewPillViews and customDayCount (hardcode)
- Update
CalendarAppSettings interface
- Update settings store (remove getters, toggles, cloud sync exclusions)
- Update SettingsModal to expose
weekStartsOn and dateStrip display settings
- Add localStorage migration to handle existing users (read old keys, map to new)
Impact Assessment
| Change |
Risk |
Files Affected |
| Remove header settings |
Low — defaults always used |
CalendarHeader.svelte, settings store |
| Move UI state out |
Medium — need to wire up component state |
Layout, DateStripFab, TagStrip |
| Remove quickViewPillViews |
Low — only 3 views exist |
ViewModePill.svelte |
| Add weekStartsOn to UI |
Low — just add dropdown |
SettingsModal, settings page |
| localStorage migration |
Low — one-time migration function |
settings store |