Skip to main content

ยท 7 min read
Martijn Smit

WhatPulse 6.1 shipped a few weeks ago with dynamic heatmaps, a new login flow, and quieter updates. But the feature I've been most curious to see people use is Geek Window formulas. The release post only scratched the surface, so this is the deep dive.

The Geek Window has always been a transparent overlay that shows your stats on screen. Keys, clicks, bandwidth, uptime - raw numbers, updating in real time. That's useful, but it's also limited. You couldn't combine numbers, calculate rates, or derive anything from the data. You just got what we gave you.

Formulas change that. You can now write arithmetic expressions inside any Geek Window label, and WhatPulse will evaluate them live. This turns the overlay from a passive display into something closer to a dashboard you design yourself.

How it worksโ€‹

A formula lives inside {= ... } delimiters within a label's text. Anything outside those delimiters is plain text that renders as-is. Anything inside gets parsed, evaluated, and replaced with the result.

A label like this:

Session score: {= %TodayKeys% + %TodayClicks% + %TodayScrolls% }

...becomes something like Session score: 14,832 on your overlay.

You can mix multiple formulas in a single label:

K: {= %TodayKeys% } | C: {= %TodayClicks% } | Ratio: {= %TodayKeys% / %TodayClicks% }

The parser supports +, -, *, /, parentheses for grouping, and unary minus. Standard arithmetic precedence applies - multiplication and division before addition and subtraction - and parentheses override as expected.

Variables use %Name% syntax. There are about 40 of them covering unpulsed stats, totals, today's stats, ranks, and rates. The Insert statistic: dropdown in the label editor shows you all the available variables and their current values, which is a great way to explore what you can use in formulas.

Geek Window settings

What you can actually buildโ€‹

The syntax is simple. Four operators and some variables. But combinations get interesting fast.

Typing speed over your sessionโ€‹

The most obvious use: derive a rate from two stats.

{= %TodayKeys% / (%TodayUptime% / 60) } keys/min

This divides today's keystroke count by today's uptime converted to minutes. If you've typed 4,200 keys over 70 minutes of uptime, you'll see 60 keys/min.

Input mix breakdownโ€‹

Are you a keyboard person or a mouse person? You might already know, but now you can quantify it.

Keyboard: {= (%TodayKeys% / (%TodayKeys% + %TodayClicks% + %TodayScrolls%)) * 100 }%

This calculates what percentage of your input actions today were keystrokes versus the total of keys, clicks, and scrolls combined. A developer might see 70%+. A designer working in Figma might see 30%.

Network ratioโ€‹

If you're curious whether you consume more than you produce (most people do):

DL/UL: {= %TotalDownloaded% / %TotalUploaded% }x

A result of 12.50x means you've downloaded 12.5 times more data than you've uploaded over your WhatPulse lifetime. Developers running CI or pushing to cloud might see a surprisingly low ratio.

The "all time, right now" counterโ€‹

WhatPulse separates unpulsed (local) stats from pulsed (total) stats. If you want a true running total:

Lifetime keys: {= %LocalKeys% + %TotalKeys% }

This is one of those things that seems obvious but wasn't possible before formulas. Your total on the website only updates when you pulse. This label gives you the real number, right now.

Scroll-to-click ratioโ€‹

Scroll wheels and trackpad scrolling are a big part of how people navigate. How does your scrolling compare to your clicking?

{= %LocalScrolls% / %LocalClicks% } scrolls per click

If you're reading a lot of documents or code, this number climbs fast. I've seen mine hit 8x during code review sessions.

Bandwidth in human unitsโ€‹

Network stats are stored in bytes, which isn't how anyone thinks about bandwidth. Convert to something readable:

Down: {= %TodayDownloaded% / 1073741824 } GB | Up: {= %TodayUploaded% / 1048576 } MB

Download in gigabytes, upload in megabytes. Pick whatever scale makes sense for your usage.

Rank mathโ€‹

Ranks are numeric too, so you can do things like calculate a combined rank or an average across stats:

Avg rank: {= (%RankKeys% + %RankClicks% + %RankUptime%) / 3 }

This averages your key, click, and uptime ranks into a single number. Lower is better. It's a rough "overall ranking" that doesn't exist on the website.

Under the hoodโ€‹

For those curious about how the parser actually works - it's a recursive descent parser. Clean, no dependencies beyond Qt itself.

The expression grammar is straightforward:

  • An expression is one or more terms joined by + or -
  • A term is one or more factors joined by * or /
  • A factor is a number, a variable, a parenthesized expression, or a negated factor

This structure naturally handles operator precedence. Multiplication binds tighter than addition because parseTerm is called from within parseExpression, and parseFactor from within parseTerm. No precedence tables, no token lists - the grammar itself does the work.

The parser is strict by design. If it can't consume the entire expression cleanly, it returns an error. Division by zero returns an error. Unknown variables return an error. NaN and infinity return errors. In all cases, the label shows #ERR and your overlay keeps running. No crashes, no blank labels.

Results are formatted with locale awareness. If your system uses comma separators, you get 1,234. If it uses periods, you get 1.234. Whole numbers drop the decimals; fractional results show two decimal places.

Errors and how to fix themโ€‹

If you see #ERR on your overlay, here are the most common causes:

Misspelled variable. Variable names are case-sensitive. %localkeys% won't work - it needs to be %LocalKeys%. Check the variable references.

Division by zero. If a denominator variable is zero (like %TodayUptime% right after a restart), the formula returns an error. This resolves itself once the stat has a non-zero value.

Missing closing parenthesis. {= (1 + 2 } is a syntax error. Count your parentheses.

Trailing operator. {= 5 + } is invalid. Every operator needs operands on both sides (except unary minus).

Using a text variable. %CurrentProfile% is the one variable that returns text, not a number. Using it in a formula will error. It works fine in regular labels, just not inside {= ... }.

Tipsโ€‹

Start simple. Get one formula working before combining three. The #ERR output doesn't tell you which part failed, so short expressions are easier to debug.

Use parentheses liberally. Even when precedence would give the right answer, parentheses make your intent clear. Your future self will thank you when editing the label six months from now.

Mind the units. Uptime is in seconds. Distance is in inches. Bandwidth is in bytes. If your numbers look absurd, you probably need a conversion factor. Divide seconds by 3600 for hours, multiply inches by 0.0254 for meters, divide bytes by 1048576 for megabytes.

Layer your overlay. You can add multiple labels to the Geek Window. Instead of cramming everything into one formula, use several labels to build a personal dashboard. One for typing speed, one for network, one for your score - whatever matters to you.

What's nextโ€‹

Formulas are a foundation. Right now it's arithmetic on current and total stats. There's room to expand this - more variables, more functions, maybe conditional formatting. I'm watching how people use it before deciding what to add next.

If you've built something interesting with formulas, I'd like to see it. Drop by the Discord and share your setup. The best ideas for what to build next usually come from people actually using the feature.

WhatPulse 6.1 is available now. Update through the app or grab it from the downloads page.

ยท 3 min read
Martijn Smit

WhatPulse 6.1 introduces dynamic keyboard heatmaps, Geek Window formulas, faster updates, and a redesigned login flow. This release is packed with improvements that make your stats more accurate, your overlays more flexible, and your updates less disruptive.

Dynamic keyboard heatmapโ€‹

The keyboard heatmap now detects your keyboard layout and adjusts automatically. Whether you're using AZERTY, QWERTZ, Dvorak, or something custom, the heatmap will reflect the keys you actually use. The predefined layouts are still there, but you won't need to select the correct one anymore.

That means:

  • AZERTY, QWERTZ, Dvorak, and other layouts are reflected correctly
  • Key positions and labels match what you actually type
  • No more limit to the five predefined layouts

For now, non-alphabetic input methods (like Chinese, Japanese, and Korean) fall back to QWERTY. Proper support for those is something we're working on.

Turkish heatmap Heatmap automatically adapting to a Turkish layout

Geek Window formulasโ€‹

The Geek Window just got a lot more flexible.

You can now use formulas inside labels using {= expression }, which lets you calculate and display custom values directly in your overlay.

A few ideas:

  • Combine multiple stats into one metric
  • Show ratios (clicks vs keys, productivity splits, etc.)
  • Create your own "score" for the day

It turns the Geek Window from a display into something you can actively shape. If you're a power user who likes tweaking your setup, this is where things get interesting:

Geek Window formula example

20,500,000 keys is the target

Find more information, syntax details, and examples in the help center.

Faster, quieter updatesโ€‹

This release introduces a new patch-based update system to make updates faster and less disruptive.

  • Smaller downloads
  • Faster installs
  • Less disruption

On Windows, updates are now one click. On macOS, updates are now zero click.

Updater in action

Redesigned login wizardโ€‹

The login and onboarding flow has been redesigned to be clearer and more helpful.

Key improvements:

  • Better explanation of account states
  • Clearer paths for logging in vs creating an account
  • Prominent restore options if backups are available

If you've ever reinstalled WhatPulse or switched machines, this should feel much smoother.

Restoring settings options

Other improvements & fixes worth notingโ€‹

A few smaller changes that improve day-to-day usage:

  • Mouse heatmap exclusions now respect your app exclusions, so you can hide mouse activity in specific applications
  • Smarter sync timing avoids delays when frequently restarting your computer
  • Fixed duplicate application entries caused by versioned install paths
  • Resolved an issue where the realtime network chart could loop
  • Around 30 edge-case fixes to reduce crashes and improve stability

How to updateโ€‹

You can upgrade to WhatPulse 6.1 by using the "Check for Updates" option inside the app, or grab WhatPulse from the Downloads page.


Happy pulsing!

โ€” Martijn & the WhatPulse team

ยท 5 min read
Martijn Smit

WhatPulse has been collecting your computer usage data for years. Keystrokes, mouse movements, application screen time, network bandwidth, website visits. All of it stored locally in a SQLite database on your machine. Until now, exploring that data meant opening the WhatPulse app and browsing the dashboards we built for you.

Today we're releasing something different: a skill file that lets AI coding agents query your WhatPulse database directly. You type a question in plain English, and it writes the SQL, runs it against your local database, and gives you the answer.

ยท 3 min read
Martijn Smit

When we shipped 6.0, we also introduced a new issue reporter, which turned out to be one of the most important changes in the release. Apart from Web Insights, of course. ๐Ÿ˜‰

Within days, we started receiving detailed crash data across different platforms, hardware setups, and edge cases that are nearly impossible to reproduce in-house. That visibility made a big difference.

6.0.1 is the direct result of that.

This release focuses almost entirely on stability: fewer crashes, smoother shutdowns, safer background processing, and better handling of platform quirks.

ยท 4 min read
Martijn Smit

WhatPulse 6.0 is a major release, with Web Insights bringing website activity into your stats for the first time. Alongside that, this release delivers a more flexible UI, improved exports, and a long list of stability and performance improvements, especially on Windows.

This version lays the groundwork for deeper insights into how you actually use your computer, while making the core app more robust and pleasant to use day to day.


Web Insights: website activity trackingโ€‹

Web Insights introduces website-level activity tracking through new browser extensions, integrating your browsing activity directly into WhatPulse.

With Web Insights enabled, you can:

  • Track time spent and activity on websites, including keys, clicks, scrolling, and mouse movement
  • View website activity alongside applications inside the WhatPulse app
  • Associate website stats with profiles to separate work, personal, or other contexts
  • Export your website activity data for deeper analysis or reporting

Websites and applications side by side in the WhatPulse app Websites and applications side by side in the WhatPulse app