English | 한국어
v0.17.13 — built 2026-09-11
Download hgfloater.exe — v0.17.13, 650 KB · All releases
HGFloater is a lightweight desktop utility for Windows 11 and above. A small translucent widget floats on your desktop; clicking it opens a dashboard that launches your shortcuts, switches between running windows, and puts volume, brightness, opacity, and a command console one click away. It is written in pure C against the Win32 API with zero external dependencies: the whole program is a single executable of about 650 KB that needs no installer and no runtime, so it starts instantly and stays out of your way.
- Overview
- Install and First Run
- The Two Windows
- The Floater
- The Taskbox
- The Toolbar
- The Options Menu
- The Command Box
- Monitor Thumbnails
- Notes
- Keyboard Reference
- Mouse Reference
- Configuration File
- Files and Directories
- Building From Source
- Project Layout
- Tests and Verification
- About the Developer
- The HellGates Series
- License
HGFloater aims at one thing: making everyday desktop control faster than the stock taskbar allows. It works as a quick launcher, a task switcher, a system control panel (volume, per-display brightness and scaling, window opacity, screen lock), a command box for driving windows by name and number, and a note pad - all reachable from a widget you can park anywhere on any monitor.
Design principles worth knowing before you use it:
- Nothing runs in the background but the app itself. No services, no
installer. A single
hgfloater.exe. It writes exactly one registry value, and only if you switch Start with Windows on - the ordinary per-userRunentry, which you can see and delete yourself. - Plain files on disk, in one folder. Settings live in a plain
config.iniunder your user profile, and notes are plain.txtfiles beside it. Nothing is a database, everything is editable by hand, and the program writes no logs, caches, or temporary files. - Everything is adjustable in place. Size, opacity, font size, grid shape, and colors change live with the wheel or the keyboard, and persist by themselves.
- Keyboard and mouse are equal citizens. Every action has both a pointer gesture and a key.
- The taskbox has no background of its own. The desktop shows through
between the icons and behind the function buttons and shortcuts; only the
icons, their labels and the border are drawn. Each lettered function button
keeps one white line around it, because a button needs an edge to be a
button. A side effect worth knowing: clicks land on whatever is behind those
gaps, so drag the box by its
Mbutton rather than by the space between icons. - It follows the system theme. Switching Windows between light and dark mode re-colors everything immediately. The widgets invert it on purpose - a control has to stand out against the desktop behind it - while the document windows (notes, note list, clipboard history, command box, About) follow it directly: light grey page with black text on a light theme, black page with white text on a dark one. Under high contrast both defer to the colors you chose there.
- Download the latest
hgfloater.exefrom the Releases page. - Run it. There is no installer. On first launch it creates
%USERPROFILE%\.HellGates\hgfloater\with aconfig.iniand ashortcutsfolder, then shows the floater. - Add shortcuts. Drop
.lnkor.urlfiles into%USERPROFILE%\.HellGates\hgfloater\shortcuts. They appear in the taskbox automatically; pressEscin the taskbox to re-scan the folder immediately. A shortcut that points at a folder goes to theDirbutton's list rather than the icon grid. - Summon it from anywhere with
Win + Alt + Space(configurable).
Only one instance runs at a time. Launching hgfloater.exe again simply
signals the running copy instead of starting a second one.
The executable is unsigned, so nothing but the file itself vouches for it. Three ways to check, none of which require taking anyone's word:
- Verify the file. Every release lists the SHA-256 of the download.
In PowerShell:
Get-FileHash .\hgfloater.exe -Algorithm SHA256. If it matches the release notes, you have the file that was built here. - Try the
.zip, when a release carries one. Some releases also offer the same executable inside a zip, which browser download-protection tends to treat less harshly. - Read the source. All of it is in this repository under the MIT licence,
and the build is reproducible from the included
Makefile/build.bat.
One thing the binary demonstrably cannot do: reach the network. It imports no socket, HTTP, or download function of any kind, so it cannot phone home, fetch anything, or send anything anywhere.
Two features are switched off in the published builds until the executable
is code-signed — the maximize-button menu, which
needs a system-wide mouse hook, and Start with Windows, which writes one
value under the per-user Run key. Both stay in the options menu, greyed, reading
(off in this build).
HGFloater is built from two windows that trade places:
| Window | What it is | How you get it |
|---|---|---|
| floater | A small always-on-top widget: clock, date, host name, and system bars. | The default state. |
| taskbox | The dashboard: running windows, your shortcuts, and the toolbar. | Click the floater, or press the global hotkey. |
Expanding centers the taskbox on the floater and then pushes it fully inside that monitor's work area, so a floater parked at a screen edge never yields a clipped dashboard. Collapsing returns the floater to where it was — and if you moved the taskbox while it was open, the floater travels the same distance, so the pair stays where you left it.
The floater is the resting state: a compact translucent panel that stays on top of other windows.
What it shows
-
Clock and date, refreshed every second, sized proportionally to the widget itself.
-
Host name in a thin line across the top.
-
Status bars for CPU, temperature, GPU, memory, and battery: horizontal bars running behind everything - the host name included - with small labels down the left edge and each row's reading printed down the right. Full width means 100%; the two temperature rows use their own scale, below. A row whose value the machine does not report is absent entirely, which is why desktops have no battery row and machines without sensors have no
TMPorGPU. Setshow_stats=0inconfig.inito hide the whole panel. -
TMPis drawn on a fixed 20 to 100 degree Celsius scale rather than as a percentage, with the reading printed on its own bar, because the difference between 55 and 75 degrees matters more than a few pixels of bar length can say.GPUfollows it on the same scale, and it gets a better answer than the CPU does: the adapter's own sensor, read through the same interface Task Manager uses, with no vendor SDK and no driver. Plenty of drivers report nothing, and those machines simply have no GPU row.The CPU reading is read from an ACPI thermal zone your firmware exposes. That is the only temperature reachable without installing a kernel driver and running as administrator, and it is worth knowing what it is: a sensor on the board near the CPU, not the CPU die. It tracks the processor without being it, and it lags under a sudden load. Many machines expose no zone at all - on those the row simply is not there, the same way the battery row is absent on a desktop. If you need true per-core readings, use a tool built around a hardware-monitoring driver; HGFloater will not become one.
Firmware usually declares several zones, and often puts one it never updates in front of the live one, so a single reading taken blindly is a coin toss. HGFloater reads every zone, from both surfaces Windows offers - the WMI class and the thermal performance counters, which do not always agree about being available - and prefers a zone it has watched change over one that has only ever held the same number. Type
list sensorsin the command box to see all of them and which one is on the bar.
What you can do to it
- Left click — toggles the taskbox, from anywhere on the floater. It opens in place, and the floater hides itself while the taskbox is up.
- Hover — nothing, unless Open the Taskbox on Hover is switched on in the Options menu. With it on, resting the pointer on the clock's minutes — the two digits after the colon, and nothing else on the floater — opens the taskbox. The click above keeps working from anywhere either way.
- Left drag — moves the floater anywhere on any monitor. A press and
release without moving is a click and toggles the taskbox; a few pixels of
travel makes it a drag instead.
Alt + dragdoes the same and is the one to use with Open the Taskbox on Hover switched on, since the dashboard opens under the pointer before an ordinary drag can start. - Alt + Wheel — opacity.
- Ctrl + Wheel or Ctrl + Left drag — font size, which scales the whole widget with it.
- Alt + Arrows / WASD — moves the window from the keyboard.
T— opens the taskbox.CorCtrl + E— opens the Command Box.F1— About.
When the cursor leaves the taskbox, it collapses back to the floater after a half-second grace period, so brushing past the edge does not dismiss it.
While HGFloater is running, right-click the maximize button — the one left of the X — on any window, and you get HGFloater's menu for that window: Move to (0, 0), the same size presets the task icons offer, and Close, which shuts the menu without touching the window. Left-clicking the button still maximizes; right-clicking a caption button does nothing in Windows, so nothing was taken away.
It works on HGFloater's own document windows too — a note, the note list, the command box, the About window — and on any window whose title bar answers hit-tests its own way (a PuTTY-style utility): where the window declines to name its buttons, the DWM-computed button bounds say which third the click landed on.
Switch it off with Menu on Maximize Button in the options menu, or
caption_menu=0 under [etc]. Close HGFloater and the behaviour is gone —
there is nothing installed and nothing to uninstall.
Three cases where the click does what it always did, none of them a failure:
- Windows running as administrator. Windows does not let an unelevated program touch input bound for an elevated one, and HGFloater runs unelevated on purpose.
- Windows with no maximize button — nothing to right-click.
- Applications that report neither a maximize button nor caption-button bounds. Rare, and they simply keep their ordinary behaviour.
This is the only thing HGFloater does outside its own windows, and it needs a
system-wide mouse hook to do it. The hook reads the button and the coordinates
and nothing else; it holds no keyboard hook and never has. The design and its
costs are in docs/RFC-2026-07-caption-button-menu.md.
The taskbox is a grid of icons with a status line on top and a toolbar of built-in buttons.
-
Task icons come first: one per window, not one per program, in the order Windows reports them. A program with four windows open gets four icons, each going straight to its own window.
That now includes HGFloater's own windows — every open note editor, the note list, the clipboard history, the command box. All of them are ordinary application windows: each gets its own taskbar button, its own Alt-Tab entry, and all three caption buttons — minimize, maximize, close — and they stay open regardless of what the floater and taskbox do, until you close them. The floater, the taskbox and the toolbar stay out: they are the thing you are looking at.
-
Shortcut icons follow: one per
.lnkor.urlin your shortcuts folder.
- Open the options menu — the
Optbutton,Ctrl + O, or a right-click on the status line.- Choose Open Shortcuts Folder. Explorer opens on
%USERPROFILE%\.HellGates\hgfloater\shortcuts\.- Copy a shortcut into it — any
.lnkor.url. Drag one out of the Start menu, or right-click a program and Send to → Desktop, then move that file here.The new icon appears within a second. No restart, no settings screen: the folder is the setting.
To change the order, rename the files. Icons are sorted by file name, so putting a number in front controls where each one sits:
0001 Visual Studio Code.lnk 0002 Firefox.lnk 0010 Calculator.lnkPad the numbers to the same width —
0001, not1. The sort is a plain alphabetical one, so10would come before2otherwise. Leaving gaps (0010,0020,0030) means you can slip something in later without renaming everything after it.
- Left click activates a task or launches a shortcut.
Every icon carries its key in a small box at its top-left corner. The badge
is the whole chord: the S is Shift, so S3 means Shift + 3, which
activates that icon exactly as clicking it would.
- Windows take the digits:
S0toS9, the first ten, and no key past that. - Shortcuts take the letters:
SAtoSZ, in the order they sit in the grid.
They used to share one run of labels, all of it windows, so which key opened
what depended on how many windows happened to be open — and a shortcut had no
key at all. Split, both halves hold still: Shift + 3 is the fourth window
whatever else is running, and Shift + K is the same shortcut every time,
because the shortcuts folder is a list you keep. Past ten windows or
twenty-six shortcuts there is no badge and no key, which is honest: a label
nobody can press is furniture.
Shift is what keeps this clear of the bare-letter grid movement (WASD) and
of the bare C that opens the command box.
Every button in that half of the grid is framed — the function buttons and the shortcuts alike — in your Windows accent colour, two pixels thick. The taskbox is see-through, so "the background" is whatever you have on your desktop; a one-pixel white line vanished against a light wallpaper and was hard to find against a busy one. The accent is nudged toward the middle of its range first, because a very pale accent disappears on white and a very dark one disappears on black, and this line has to hold on both.
The function buttons wear the same badge, for the same reason: C shows
C, Note shows N, Clip shows CL, Opt shows CO, X shows CQ. The
modifiers are their initials in a fixed order — Ctrl, Alt, Shift, Win —
so CN is Ctrl + N and CSR is Ctrl + Shift + R. A button no chord reaches
wears nothing, and a key whose name is too long for the box (Space, Delete)
is left to the tooltip, which spells it out in full.
Hover a tabbed application's icon and its tabs appear next to it. Off by
default; turn it on with Show Tabs as Task Icons in the options menu, or
show_tabs=1 under [taskbox] in config.ini. The window keeps its single
icon — orderable like any other — and the hover box lists its tabs by title:
Pointing at a task icon outlines its window on the desktop. A frame appears around the window itself, so "which one is that?" is answered by where it is and not only by its name. Nothing else happens - the window is not raised, not focused, and the outline takes no clicks, because pointing at something is not choosing it. The keyboard focus does the same as the pointer. A minimized window is left alone: there is no place on the desktop to point at, and a frame around where it used to be would be a lie. A window sitting behind others is outlined all the same - the frame says where it is, not what is in front of it.
The box opens on hover and when the keyboard focus lands on the icon, so both ways of getting there work the same.
It never covers the icon. The box sits flush above or below it — never beside it — running right from the icon's left edge or left from its right edge, so the icon's whole width falls inside the box's and the two read as one piece. Of those four placements it takes the first that fits the display whole, which is what keeps it from running off an edge near a corner.
These keys are the box's, and they are the same in all three lists — the
tabs, the Dir folders and the Set controls:
| Key or click | What it does |
|---|---|
1-9 |
Straight to that row, whether or not you have stepped into the box. |
0 |
The last row, the same way. |
Up / Down |
Step into the box, and from then on move the selection in it. Down enters at the top row and Up at the bottom, so the selection lands where the key was already pointing. The box is what sits above or below the icon, so those keys reach it rather than stepping over it to the next row of icons. |
Tab |
Step into the box as well. On a Dir or Set button, Space does it too: activating the button opens its list and hands it the keyboard. |
Home / End |
The first row, the last row. The selected row is filled and marked, so where the arrows are standing is never in doubt. |
Left / Right |
Leave the box and move to the icon left or right — a list is a column, and sideways is what the grid means by those keys. The next icon opens its own box if it has one. One exception: on a row that holds a number they are less and more, the same as PageUp / PageDown. |
a-z, A-Z |
The labels past the ninth row (inside the box, because those letters move the grid outside it). |
Enter / Space, or a click |
Take that row: switch to the tab, open the folder, flip the switch. |
| A tooltip | On every Set row, as you arrive: which keys that row answers — the arrows for a number, Space or Enter for a switch. |
| Right click | Close that tab. The list stays up. (Tabs only.) |
Esc |
Leave the box. The keyboard stays in the taskbox, where it was. |
While you are using the keyboard, the pointer is ignored. The taskbox
answers the mouse continuously — a pointer resting on an icon opens that icon's
list, a pointer that has wandered off closes the box and eventually collapses
the taskbox — and all of that is wrong the moment you reach for the arrow keys,
because the pointer is then sitting wherever it was left. So the first key press
hands control to the keyboard, and it stays there until the mouse actually
moves: Space on a function icon opens that icon's list no matter where the
mouse is, and nothing the pointer is resting on will close it.
A pointed-at row is drawn selected, the same filled bar the arrows leave, so the row a click would take always looks like the row a click would take.
A row too long for the box says the rest in a tooltip — whether the pointer found it or the arrows did. The box is measured against its own rows first and takes the width they need, so most lists are read whole; the tooltip is for what is longer than any box should be.
Digits work immediately because the grid does not use them; the letters wait
for Tab because WASD moves the focus and C and N open other things.
The tabs are read when you look at them, once per box, and never on a timer — a window nobody hovers costs nothing at all.
Nothing about this is specific to browsers. What limits it is cost: a tab is not a window, so the only supported way to find one is UI Automation — a call into the other application's own UI thread, which is slow and can block if that thread is busy. Asking every window on the desktop would make that cost the cost of running HGFloater, so it asks only windows whose class is on a list:
| Built in | |
|---|---|
Chrome_WidgetWin_1 |
Chrome, Edge, Brave, Opera, and Electron apps |
CabinetWClass |
File Explorer |
MozillaWindowClass |
Firefox |
CASCADIA_HOSTING_WINDOW_CLASS |
Windows Terminal |
Notepad |
Notepad |
Any other application can be added with tab_classes under [taskbox],
semicolon-separated, no rebuild needed:
[taskbox]
tab_classes=SomeApp_Frame;OtherAppRun show windows class (s w class) in the command box to see the class of
every open window, which is where those names come from. An application whose
tabs UI Automation does not publish will simply keep its single icon.
The reading happens on a background thread, and the box draws from what was
last known while the fresh answer is on its way — a cross-process call whose
cost grows with the browser's own accessibility data is never waited for.
Anything that fails falls back silently to one icon for the window. Some
applications do not
publish off-screen tabs at all, and those tabs will not appear. The design and
what it costs are in docs/RFC-2026-07-tabs-as-task-icons.md.
- Left drag on a task icon reorders it within the grid.
- Right click (or
Enter/F2on the focused icon) opens its menu:- Run (&R) — start a new instance, or launch the shortcut.
- Focus (&F) — switch to the existing window.
- Close Window (&X) — task icons only. On a tab icon this reads Close Tab and closes only that tab, by invoking the tab's own close button; if the tab has no such button nothing is closed and the status line says so. Focus on a tab switches to that tab rather than only raising its window.
- Open File Location (&O) — shortcut icons only.
A single-line read-only field across the top of the taskbox.
- It shows one message at a time — the most recent one replaces its predecessor.
- Ten seconds after the last message it falls back to the current time,
written as
2026. 11. 23.(Tue) 13:24, and refreshes as the minute changes. - Right click it to open the options list (the same one the
Optbutton opens). - Left drag it to move the whole taskbox.
- Ctrl + Wheel over it changes only its own font size.
- Drag any border to change the grid: the taskbox snaps to whole columns, so no half icon is ever left hanging.
- Ctrl + Wheel (or
Ctrl++/-) scales icons and text together and keeps the window proportional. - Alt + Wheel (or
Alt++/-) changes opacity. Ctrl+R/0, orF5resets position, size, and opacity.
Twelve built-in buttons sit in the same grid as the icons. Their order is fixed. Each carries a short word rather than a single capital, three of them open a list instead of doing something outright, and the last two carry a reading: their colour is the value they hold.
The word is fitted to the button: up to three letters it stays on one line, and four to six letters are stacked on two, at a size the button can hold. The alternative — shrinking a long word until it fits across — ends at a size nobody can read.
A button's tooltip names its key. Hovering C reads
Command Box (C, Ctrl+E); a button that no chord reaches says only what it
does.
The chords come from the key table as the tooltip is
built, so a key you rebind is the key the tooltip shows.
| Button | Click | Drag / Wheel |
|---|---|---|
R Resize |
— | Drag resizes the taskbox grid. |
M Move |
Click moves the taskbox aside (see below). | Drag moves the window. |
X Exit |
Quits HGFloater. | — |
D Desktop |
Minimizes every window; click again to restore. | — |
C Command |
Opens the Command Box. | — |
Note Note |
Opens the note list. | — |
Clip Clipboard |
Opens the clipboard history, as Ctrl + L does; press again, with it in front, to close it. |
— |
Dir Folders |
Opens the folder list — the shortcuts that point at a directory. | — |
Set Settings |
Opens the control list: the pin, the switches, and the doors to the settings. | — |
Opt Options |
Opens the options menu, directly under the button. | — |
Ico Icons |
Opens the icon box: Vol, Mon and Alp, as icons you turn with the wheel. |
— |
Point at Dir — or land on it with the arrow keys, or click it — and the
folders appear in a list beside the button — above it or below it, whichever fits the screen, never over the
button itself. Click a row, or press its number, and that folder opens in
Explorer; the list and the taskbox both get out of the way, because a folder is
somewhere you are going.
The folders are the shortcuts you already have. Any .lnk in the shortcuts
folder whose target is a directory is listed here instead of taking a slot in
the icon grid — a folder is a place to go rather than a program to run, and a
dozen of them crowd out the programs. Nothing new to register: drop a folder
shortcut in, and it moves itself to this list. A shortcut that does not resolve
to a real directory stays an icon, which is what keeps anything unusual working.
Set is everything there is to set. Point at it — or land on it with the
arrow keys — and the same kind of list opens. Pointing at a
button and arriving at it with the keyboard are the same arrival, so neither
needs a click first. The rows are text, so they say their whole name and what
turns them:
The rows are grouped by what a row is, top to bottom:
| Row | What it does |
|---|---|
| Pin | Pins the taskbox open — while pinned, moving the mouse away no longer collapses it. Click, or Space / Enter, toggles. |
| the switches | Every on/off setting, one row each, with on or off beside it. Click, or Space / Enter, flips one. |
| Settings Window... | The settings window: every option, value and key in one list. |
| Edit Configuration | Opens the config file in your editor. |
| Reset Settings | Position, size and opacity back to their defaults. |
| (off in this build) | Last: the ones this build cannot switch. Listed rather than hidden, and out of the way of the ones that work. |
The last three came from the options menu. Everything about changing settings
belongs with the settings, so a reader looking for what to change finds one
list rather than two. They sit below the switches because a door is a bigger
step than a toggle, and Reset Settings is last of the three because it is the
one that throws work away.
A row with a number is turned; a row with a state is sw

0 comments
log in to comment.