Skip to content

About

No description, website, or topics provided.

Resources

Contributing

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

LiteWidgets

Desktop widgets for Windows that stay out of the way — of your screen, and of your CPU.

Written in pure C17 against raw Win32 and GDI+. No runtime to install, no dependencies to vendor, one executable and one text file.

Fifteen built-in style presets


What it does

  • Lives on the desktop layer. Widgets sit above your wallpaper and behind your windows. Win+D and "show desktop" don't touch them.
  • Stays out of the way of clicks. A clock passes input straight through to the desktop icons underneath. Widgets you actually use — notes, images — keep their clicks, and either default is one config key away.
  • Sleeps between updates. A clock showing hours and minutes wakes up once a minute, not sixty times. Seconds and animation are opt-in, and only then does it tick faster.
  • Plays nicely with live wallpapers. It doesn't reparent itself into WorkerW, which is what makes Wallpaper Engine reload its scene.
  • Configures itself from one INI file — or from a settings editor with a live preview, if you'd rather not hand-edit hex colours.
  • Per-monitor DPI aware, with anchors so a config survives a resolution change or a move to a different machine.

Widgets

Type What it is
clock Digital or analog. Custom time and date patterns, locale-aware day and month names, optional seconds, blinking separator, sweeping second hand.
notes A text file you can edit in place: click it and type. Selection, clipboard and undo work the way they do everywhere else, and it saves itself. Optionally re-reads the file when something else changes it.
image A PNG/JPEG, fitted with contain, cover or stretch, clipped to the panel's rounded corners. Click it to pick a file, or drop one on it.
gauge CPU, memory, disk and battery, drawn as bars, rings or just the numbers. One widget holds as many readings as you list — source = cpu, memory, disk — stacked, in a row or in a grid. Optional detail line (17.9 / 31.8 GB) and a warning colour past a threshold in either direction, per reading.
calendar A month view with today marked. Locale, Monday or Sunday weeks, optional ISO week numbers, and the adjacent months dimmed in the margins.

Styling

Everything visual is a config key, and every key works on every widget that has text.

Gradient text Linear gradients on the panel and on the text, in four directions
Glowing terminal clock Glow, plus a separator that dims on odd seconds
Outlined clock with a drop shadow Glyph outlines and drop shadows, with no panel at all
Analog dial Analog dials: ticks, rings, hand widths, sweep

Also: corner radius, borders, letter spacing, line spacing, case transforms, alignment, padding, per-widget opacity, and 15 built-in presets — midnight, glass, minimal, neon, sunset, aurora, terminal, blueprint, carbon, paper, nord, mocha, dracula, gruvbox, solarized.

A preset is just a bundle of defaults, so you can start from one and override only what you want:

[clock]
type=clock
preset=neon
font_size=72
glow_radius=14        ; the preset's glow, but stronger

Settings

Right-click the tray icon, or double-click it, for a visual editor. It's built from the same property table the config parser uses, so it can never fall behind the file format.

The settings editor

The preview on the right calls the same painter the desktop does, so what you see is exactly what you get — including transparency, which is why it's drawn over a checkerboard.

Colour rows carry a swatch, a hex field and an alpha slider. The font list draws every installed family in its own face. The whole window follows your system light or dark setting.

Arrange on desktop makes every widget draggable in place, snapped to an 8px grid — hold Shift for the last few pixels — and writes the positions back as anchor-relative offsets when you're done.

Install

Grab LiteWidgets.exe and the config folder from Releases, put them side by side, and run it. It lands in the system tray.

To start it with Windows, tick Start with Windows in the tray menu — it writes a single value under HKCU\...\CurrentVersion\Run and removes it again when you untick it.

Build it yourself

Needs Visual Studio with the "Desktop development with C++" workload.

build.bat

That's it — build.bat finds and initialises MSVC itself. The result is bin\LiteWidgets.exe, statically linked, no redistributable required.

CMake works too:

cmake -B build && cmake --build build --config Release

Configuration

Widgets live in config/widgets.ini, which the app creates on first run from the tracked config/widgets.example.ini. The live file is deliberately not in git, so your own layout never shows up as a change to the repository.

One [section] per widget:

[clock]
type=clock
preset=midnight
anchor=top_right
x=-60
y=64
width=360
height=156
font_size=66
time_format=h:mm tt
date_format=dddd, d MMMM
date_transform=upper
date_letter_spacing=3

x and y are offsets from the anchor, not absolute coordinates, so top_right with x=-60 stays 60px from the right edge whatever the screen does.

Full key reference → (generated from the source, so it can't drift)

Example configs →

Command line

LiteWidgets.exe [--config <path>] [--settings]

--config points at a specific INI; --settings opens the editor on start. Launching a second copy tells the running one to reload instead of stacking duplicate widgets.

Resource use

Windows 11, release build, measured in steady state:

Config Private bytes CPU
One clock, hours and minutes 3.9 MB 0.000 s over 90 s
Four widgets, one ticking every second with a glow 4.9 MB 0.31 s over 60 s (0.5% of a core)
Six readings in two gauges, plus a calendar (examples/dashboard.ini) 4.5 MB 0.016 s over 300 s (0.005% of a core)

The first row is the point. A clock that only shows hours and minutes has nothing to do for 59 of every 60 seconds, so it does nothing — the timer is armed for the next minute boundary rather than polling. Every gauge reading keeps its own schedule — a second for CPU, half a minute for a disk, even when they share a widget — and the widget repaints only when a number it draws would change; a calendar looks at the date four times an hour and repaints once a day. Cost scales with how often you've asked something to change, not with how many widgets are on screen.

How it works

Widgets are layered WS_POPUP windows, painted into a premultiplied ARGB bitmap with GDI+ and pushed to the screen with UpdateLayeredWindow. Config is parsed into one typed struct, and painting is a pure function of that struct — which is how the settings preview, the desktop, and the offscreen renderer all stay pixel-identical.

Architecture notes →

Contributing

Bug reports and pull requests are welcome. Desktop integration is the fragile part, so please mention your Windows version, monitor layout, display scaling, and any wallpaper software you run.

Contributing guide →

License

MIT. See LICENSE.

About

No description, website, or topics provided.

Resources

Contributing

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages