Solaris is a Windows desktop app that automatically adjusts monitor brightness and color temperature based on the position of the sun. It calculates solar elevation for your location in real time and maps it to a brightness curve you can customize. Color temperature shifts from daylight (6500 K) to warm (1000 K) as the sun goes down. Works across multiple monitors, supports per-app profiles, integrates with weather data, and exposes a local API for automation.
Built with Flutter. Talks to monitors over DDC/CI, with software overlay dimming for displays without DDC/CI.
Solaris tracks the sun's elevation for your coordinates and adjusts brightness and color temperature throughout the day. Two circadian modes are available:
Solar phases — set brightness and color temperature targets for four milestones (Night, Sunrise, Day, Sunset). Solaris resolves astronomical times for each phase and transitions smoothly between them.
Adaptive curve — maps solar elevation to a normalized range that compensates for seasonal variation, so daytime brightness reaches 100% even in winter at high latitudes. The curve is editable with Bézier control points and presets.
Each connected display can have its own brightness offset. You can adjust a specific monitor individually or control all screens at once. Solaris communicates with monitors over DDC/CI for hardware-level brightness control, falling back to a software overlay on displays without DDC/CI support (laptops, secondary screens).
When your monitor's minimum hardware brightness is still too bright, Solaris can dim further — down to −100% — using a lightweight screen overlay. For displays without DDC/CI, the overlay also handles standard 0–100% brightness. The overlay is click-through (no input lag), invisible to screenshots and screen sharing (OBS, Discord, Zoom), and capped at 85% opacity so you never accidentally black out the screen.
Modifies the display gamma ramp at the GPU level, so it works across all connected screens. Range: 6500 K (daylight) → 1000 K (candlelight). Can be set globally or per-monitor.
Automatically detects fullscreen games and locks brightness and color temperature to fixed values (e.g. 80%, 6500 K) until you exit. Configurable delay when alt-tabbing to avoid flickering. Supports whitelist and blacklist by executable name.
Override brightness and/or color temperature for specific applications. Ships with 25 built-in rules for creative software (Photoshop, DaVinci Resolve, Blender, Figma, etc.) that lock color temperature to 6500 K for accurate color work. You can add your own rules with custom curves, fixed values, or inherit global settings. Configurable exit delay so settings don't flicker when switching between apps.
Brightness adjusts based on current weather conditions — dims during overcast, rain, or snow, stays normal on clear days. Color temperature can also shift warmer during bad weather. Weather data comes from WeatherAPI.com, with Open-Meteo as a fallback. The dashboard shows animated weather backgrounds.
Bind keyboard shortcuts to common actions: brightness up/down, next/previous preset, toggle auto mode. Step size is configurable.
Coordinates can be set automatically via GPS, by searching for a city (Mapbox geocoding), or by clicking on an interactive map. Your choice is saved between sessions.
Checks for new releases on GitHub at startup and every 24 hours. Downloads are verified with SHA-256 and validated against GitHub's SLSA Artifact Attestations to ensure they were built by CI from the open-source code. The native updater (solaris_updater.exe, C++17) creates a backup before applying and rolls back automatically on failure.
Note
Custom builds (IS_OFFICIAL_RELEASE=false) have auto-updates disabled. Updating from a custom build to an official release may reset saved API keys due to Windows DPAPI encryption scope.
Solaris can incorporate your sleep data to fine-tune brightness and color temperature throughout the day. Three modes are available: a permanent schedule (set your sleep/wake times once and the app uses them every day — no API or external apps needed), a local API for integration with desktop sleep trackers, and Google Fit sync.
When enabled, four circadian models are applied:
- Wind-down — gradually reduces brightness and warms the screen before bedtime; restores daytime settings before expected wake-up.
- Bio-morning — shifts the circadian anchor if you wake earlier or later than usual.
- Sleep pressure — after 16+ hours awake, gently dims and warms the screen to reduce strain.
- Sleep debt — if your last sleep was under 6.5 hours, maintains a softer lighting profile for the next day.
A built-in HTTP server (default port 45321, toggle it in the Sleep tab) accepts sleep data from desktop trackers or scripts. Binds to 127.0.0.1 by default; LAN mode (0.0.0.0) requires API token authentication. Operates independently from the Control API.
Endpoints:
POST /api/sleep/sessions — push sleep session history (JSON array)
POST /api/sleep/status — report real-time sleep state ({"is_sleeping": true})
Syncs sleep history from Google Fit. Because Google classifies sleep data as a restricted scope, official builds don't ship with credentials — you use your own:
- Create a project in Google Cloud Console.
- Configure OAuth consent, add
fitness.sleep.readscope, add yourself as test user. - Create a Desktop OAuth Client ID.
- Paste Client ID and Client Secret into Settings → API Keys in the app (or into
.envfor build-time config).
Solaris runs a local HTTP + WebSocket server that lets external tools (Home Assistant, Stream Deck, Node-RED, custom scripts) query state, change settings, and subscribe to events.
Highlights:
- 28 action commands —
set_brightness(−100 to 100),set_temperature(1000–6500 K), preset management, app override management, and more. - Monitors can be targeted by friendly slugs (
display-1,dell-u2720q,primary) or system paths. - Token-based auth with granular per-scope permissions. Rate limiting, CORS/CSWSH protection, DNS rebinding guard.
- 23 outbound webhook event types with HMAC-SHA256 signatures, SSRF protection, WAL buffer, and dead letter queue.
- WebSocket at
/api/v1/ws— bidirectional JSON, request correlation viacmd_id, selective module subscriptions. - Interactive OpenAPI docs at
/api/v1/docs.
Full documentation is in docs/:
| Document | Contents |
|---|---|
| Architecture & Security | Auth formats, security pipeline, RFC 7807 errors, OpenAPI setup |
| REST Endpoints | State endpoints, action command catalog, friendly slugs |
| Webhooks | Event catalog, HMAC signatures, SSRF protection, DLQ |
| WebSocket | Connection, subscriptions, cmd_id correlation |
Advanced features (Mapbox maps, WeatherAPI weather, Google Fit) require API credentials. You don't need to rebuild — keys can be entered at runtime in Settings → API Keys.
Keys take effect immediately — no restart needed. They're stored locally and encrypted with Windows DPAPI (bound to your Windows user account and device). Runtime keys override any build-time .env values.
Without keys, Solaris still works — core circadian brightness and color temperature are fully functional. Missing keys only affect specific integrations:
| Integration | Without key |
|---|---|
| Interactive map | Shows a padlock; coordinates can still be entered manually |
| WeatherAPI | Falls back to Open-Meteo (free, no key needed) |
| Google Fit | Disabled; local sleep API still works |
Grab the latest .zip from Releases, extract, run solaris.exe.
Requirements: Flutter SDK (stable), Windows 10/11. Works with all displays (hardware DDC/CI control, or software overlay for screens without DDC/CI).
git clone https://github.com/maksim0-debug/Solaris.git
cd solaris
cp .env.example .env # optional: fill in API keys
flutter pub get
dart run build_runner build --delete-conflicting-outputs
flutter run -d windowsRelease build:
flutter build windows- Framework: Flutter (Windows desktop)
- State: Riverpod (AsyncNotifiers, StreamProviders)
- Hardware: Dart FFI + win32 for DDC/CI brightness; Win32 GDI for GPU gamma ramp; native C++ overlay for non-DDC screens and sub-zero dimming
- Solar math: Spherical trigonometry (solar_calculator, sunrise_sunset_calc)
- APIs: WeatherAPI.com, Open-Meteo, Mapbox, Google Fit
- Updater: C++17 with miniz, SLSA attestation verification
lib/
├── l10n/ # Localization (English, Russian, Ukrainian)
├── models/ # Data structures
├── providers/ # Feature logic (weather, temperature, lifecycle)
├── screens/ # UI screens
├── services/ # Core services (monitor control, solar math, hotkeys)
├── theme/ # Styling
└── widgets/ # Reusable UI components
- Privacy Policy
- MIT License
- miniz (MIT) — compression library used by the updater