# Helpers — index Cross-cutting utilities. See [`schema.md`](../schema.md) for the memory-map conventions. | File | Purpose | |------|---------| | `ViewModelBase.cs` | `INotifyPropertyChanged` + `SetProperty()` — base for all ViewModels | | `RelayCommand.cs` | `ICommand` implementation for all button actions | | `AppLog.cs` | File logger to `%APPDATA%\ytLlive\startup.log`; startup checkpoints + unhandled-exception capture (the crash this map is named for) | | `FocusPreservingListBox.cs` | `ListBox` subclass that keeps selection/focus coherent when the selected item is deleted; `IsSelectable` predicate skips hidden scenes; drag-reorder guard | | `OAuthCredentials.cs` | Baked-in Google OAuth client ID/secret (desktop app; loopback callback) | | `ImageCache.cs` | Image byte caching (assets live in the DB) | | `InverseBoolToVisibilityConverter.cs` / `NotNullToVisibilityConverter.cs` | XAML value converters for visibility bindings | Related: [`Themes/Controls.xaml`](../Themes/Controls.xaml) styles the lists this class backs; [`Models/index.md`](../Models/index.md) and [`ViewModels/index.md`](../ViewModels/index.md) for the objects it works on.