Wallpaper, system accent and mail notifications for Windows — as one coherent thing rather than four utilities that ignore each other.
Pick a wallpaper, and Lucent derives an eight-shade palette from it and applies that palette as the whole Windows accent: title bars, Start, the notification centre, menus and its own interface, all from the same source. Notifications for important mail arrive in a panel drawn in the same colours.
Everything is per-user. No administrator rights, no services, no drivers, and every change is reversible from Settings → Personalisation → Colours.
Two downloads. Take the first; the second only if you want a translucent taskbar.
Download Lucent-windows-x64.zip from
Releases, unzip it, and run:
.\install.ps1Installs to %LOCALAPPDATA%\Programs\Lucent with a Start menu shortcut. To remove it:
.\install.ps1 -UninstallLucent-TaskbarGlass-windows-x64.zip makes the taskbar translucent and tints it with
your accent. Lucent is fully functional without it — theme, wallpaper, notifications
and mail are all in the main package.
It ships separately because Windows offers no supported way to restyle the taskbar. The
only route is to get code running inside explorer.exe, which TaskbarGlass does through
InitializeXamlDiagnosticsEx — a Microsoft API, the same one Visual Studio's Live Visual
Tree uses. Windows performs the load; no process memory is written and nothing is patched.
It is still a third-party DLL inside a system process, and that is what antivirus
software reacts to, regardless of how it got there. Rather than make everyone accept
that tradeoff, it is a download you choose. The installer explains what it does and waits
for you to agree, and the whole mechanism is about forty lines in
lucent_taskbar/inject.cpp.
There is no trick that makes the warning go away. Obfuscating the injection, packing the binary, or having the installer add antivirus exclusions would each be a way of hiding what it does — and would make it less trustworthy, not more.
Requires Windows 11. Developed and tested on 11; the theming works on 10, the glass taskbar does not.
Derives an eight-shade ramp from the current wallpaper and writes the entire Windows accent palette, then hands the colour to DWM so surfaces recolour immediately instead of at next sign-in.
lucent theme # derive from the current wallpaper and apply
lucent theme --check # report every accent surface and whether they agree
lucent theme --dry-run # show what would change, write nothingTwo details cost real time to get right, and are documented in
theme.dart for anyone attempting the same thing:
- The accent registry values are RGBA in memory (
0xAABBGGRRas a DWORD), and theAccentPaletteentries arer,g,b,abytes. Writing them the other way round swaps red and blue, so a blue accent renders orange. Reading your own writes back cannot detect this — it agrees with itself perfectly. QueryUISettings.GetColorValue(UIColorType.Accent)instead, which is what Firefox, UWP apps and Start actually read. - Writing the registry does not reach DWM. It loads colorization once and keeps it, so
title bars stay on the previous colour no matter what you write. Settings doesn't merely
write the registry either — it calls
DwmSetColorizationParameters, which is undocumented and exported by ordinal only. That call lives inlucent_agent.
lucent search "misty forest" # list matches, apply nothing
lucent apply .\photo.jpg # apply a local file
lucent next # fetch and apply the next unseen wallpaper
lucent schedule on --every hour nature # rotate on a timer
lucent fav # manage favourites
lucent match "#2E1513" # find wallpapers matching a colourlucent seen is a never-repeat history, so rotation doesn't circle back to the same five
images.
Desktop notifications for important mail, plus a lightweight inbox — sender and subject only, clicking a row opens the real message.
Any IMAP account works, with presets for Gmail, Proton Mail (via Bridge), Outlook, Fastmail and iCloud, and a custom server for anything else.
lucent mail setup # save an app/bridge password
lucent mail login # or sign in with Google (OAuth)
lucent mail check # poll now
lucent mail list -n 10 # recent messages
lucent mail background on --every 5 # keep checking with Lucent closed
lucent mail test # fire a sample notificationNotes worth knowing before you set it up:
- Gmail: an app password is the default and needs nothing but 2-Step Verification. OAuth 2.0 with PKCE is also implemented and available, but every Gmail read scope is classified restricted by Google, so it needs your own Cloud OAuth client — a shared one would require an annual third-party security assessment.
- Proton Mail is end-to-end encrypted, so there is no IMAP server to reach directly. Proton Mail Bridge must be running; it decrypts locally and serves IMAP on this machine. Bridge requires a paid Proton plan. This preset is untested against a live Bridge.
- Credentials are stored DPAPI-encrypted, bound to your Windows account, so the file is useless if copied elsewhere. Nothing is ever written in plain text.
- Background checks run through Task Scheduler, so notifications keep arriving with Lucent closed.
Lucent draws its own notification panel rather than using the Windows toast — a rounded layered window that slides up above the taskbar, tinted with the current accent, with a dismiss button and a click target that opens the message.
The sound is synthesised rather than shipped as an opaque asset: two sine notes a perfect
fifth apart, 620 ms, peaking at −5.2 dBFS so it sits under whatever you are already
listening to. Regenerate or retune it with
tool/make_sound.dart.
Requires the Flutter SDK (which includes Dart) and Visual Studio 2022 with the Desktop development with C++ workload.
git clone https://github.com/novaxertz/lucent.git
cd lucent
.\build-all.ps1 -ZipBuilds all five projects and stages both packages into dist\. Use -SkipFlutter when
only the C++ has changed — it is the slow step by a wide margin.
Individual pieces:
cd lucent_cli; dart compile exe bin/lucent.dart -o build/lucent-cli.exe
cd lucent; flutter build windows --release
cd lucent_toast; .\build-release.cmdlucent_cli |
Pure Dart. Palette extraction, system accent, wallpaper sources, IMAP and OAuth. All the logic lives here. |
lucent |
Flutter GUI. Depends on lucent_cli by path, so both stay in step. |
lucent_toast |
C++ notification popup — GDI+ and UpdateLayeredWindow for per-pixel alpha. |
lucent_taskbar |
C++ glass taskbar. Ships as the separate package. |
lucent_agent |
C++ windowless launcher, plus the DWM accent push. |
The GUI is a front end over the CLI's library, not a reimplementation, so the two share one config and cannot disagree about what is applied.
lucent_cli/tool/ holds the probes used to verify behaviour against the live system —
probe_imap.dart exercises the IMAP path and the loopback certificate rule,
probe_nosnap.dart checks that an arbitrary accent survives into Windows intact.
Roughly in the order I would do them. This is a personal project, so no promises about timing — but these are known gaps rather than vague ambitions.
- Folder picker for mail.
ImapClient.listMailboxes()already works and returns the real folder list from the server; nothing surfaces it yet, so non-Gmail accounts type their mailbox name by hand. Wiring it to a dropdown is the next obvious step. - Re-authenticate button. When a Gmail OAuth token expires, Lucent says so clearly but gives you nowhere to click — you have to know to go back to the connection form.
- Mute switch for the notification sound. The plumbing exists (
--silenton the toast,silent:onNotify.toast); nothing in the UI sets it. - Session-only credentials. Keep the password in memory for as long as Lucent is open and never write it to disk. The tradeoff is that background checks stop working, since a scheduled task with nothing stored has nothing to authenticate with.
- Verify the Proton preset against a live Bridge — see the caveat below.
- Signed binaries, if the project ever attracts enough users to justify a certificate.
Issues and pull requests are welcome, particularly from anyone who can test a provider I cannot.
- It depends on undocumented Windows internals.
DwmSetColorizationParametersis exported by ordinal, and the XAML tap relies on diagnostics interfaces Microsoft does not promise to keep. A Windows feature update can break either, and eventually will. - The binaries are unsigned, so SmartScreen will warn on first run until the project has enough downloads to build reputation.
- The Proton preset is untested. Everything else is exercised against a live account.
- Applying a theme restarts
StartMenuExperienceHostandShellExperienceHostso they pick up the new colour without a sign-out. An open Start menu closes; nothing else is affected.
MIT — see LICENSE.