Skip to main content

Β· 4 min read
Martijn Smit

There are a few new things happening around WhatPulse in the last few weeks, ranging from long-requested quality-of-life improvements to an early preview of something much bigger. There are new community guidelines, and the privacy policy has been updated. Here's a rundown of everything:

Create and sync profiles across your computers​

If you use Profiles to track projects, clients, study sessions, or different types of work, this update should make life a lot easier. You can now create and manage your Profiles directly on the website, and your WhatPulse desktop apps will automatically sync them.

No more manually recreating the same profile on every computer. Create it once, and start tracking time towards it everywhere.

Watch the demo here: https://www.youtube.com/watch?v=5YF1tkYfQVw

Preview: Meet Pulsar, your data analyst​

For years, WhatPulse has been collecting detailed statistics about how you use your computer. Keystrokes, applications, websites, uptime, productivity habits, rankings - there's a lot of data in there.

The problem is that charts and dashboards don't always tell you what the data actually means. That's where Pulsar comes in πŸ‘‡

Pulsar data analyst preview

(click to zoom in)

Pulsar is a new data analyst built directly into your WhatPulse dashboard. You can ask questions about your stats in plain English, and Pulsar will analyze your data and answer in seconds.

A few examples:

  • β€œWhen am I most productive during the day?”
  • β€œHow does this week compare to last week?”
  • β€œWhich websites took the biggest chunk of my time?”
  • β€œShow me my peak typing hours.”
  • β€œHow has my productivity changed over the last three months?”

It also understands follow-up questions naturally. Ask β€œwhich days were strongest?” after a weekly summary, and it'll know what you mean.

Built with privacy in mind​

Pulsar is designed around the same privacy-first approach as the rest of WhatPulse. You control exactly what Pulsar can access through separate permission toggles for: Activity summaries, Application usage, Website usage, Computer details.

Pulsar permissions

Disable a category, and Pulsar simply cannot query that data. By default, Pulsar doesn't have any access until you explicitly grant it, and you can revoke permissions at any time. Pulsar also doesn't check any of your data until you ask it a question, so it's not analyzing anything in the background without your knowledge.

Available now in preview​

Pulsar is currently rolling out as a preview feature while I continue improving, potty-training it and learning what kinds of questions people actually want answered. During the preview, there's a monthly message allowance that resets on the 1st of each month.

Long term, Pulsar will likely become part of a separate WhatPulse Insights plan with higher usage limits, while still keeping some form of preview access available for existing users. I'm still figuring out the right balance there and seeing how much it costs for us to run. For now, I'd love for you to try it and share what you think.

Try Pulsar here: https://whatpulse.org/dashboard/insights

New community guidelines​

The WhatPulse community has grown a lot over the years, and with more interaction between users, competitions, leagues, reviews, and community features on the way, it felt like the right time to formalize some clear community guidelines.

There have always been rules around fairness and cheating on the leaderboards, but the new guidelines expand on that and also set expectations for how we keep the community welcoming and enjoyable for everyone.

You can read the full guidelines here.

Privacy policy updates​

I've also updated the privacy policy to reflect newer features like Web Insights and the AI provider used for Pulsar Insights.

As always, privacy remains a core part of how WhatPulse is designed. The updated policy clarifies what data is collected, how it's processed, and where third-party services are involved.

You can read the updated privacy policy here.

Β· 4 min read
Martijn Smit

I've just released WhatPulse v6.2, and it adds a few long-requested feature: word counting!

The headlines are word counting, a pause toggle for data collection, and a redesigned input history page. Beyond that, there are various UI tweaks, a new proxy configuration option in the login wizard, native Wayland support on Linux, and a handful of bug fixes.

Details below:

Word counting​

WhatPulse now tracks how many words you type, without ever storing the text. Word counts are inferred from keystroke patterns: word boundaries are detected from key events (spaces, punctuation, enter, etc.), corrections like backspace and delete are handled, and IME input methods are supported. Everything is processed locally and only the numeric counts are kept.

You'll see word counts on the overview tab, input history page, per-application stats, website stats (via the browser extension), exports, and the Geek Window. The feature is on by default and respects your existing keyboard and per-application tracking settings. New Geek Window variables (TotalWords, TodayWords) and Client API fields are available.

Word count in the overview tab

Pause data collection​

There are moments when you don't want WhatPulse watching β€” a benchmark, a stress test, a colleague typing on your machine, or just because. The new pause toggle in the tray popup stops collection until you resume it.

Pause toggle in tray popup

While paused, the status bar pill turns orange with an explanatory tooltip, the overview tab shows an amber banner with a one-click "Resume collecting" button, and the stats grid in the tray popup grays out behind an overlay so you know exactly what's going on. Activity that happens during the pause is dropped rather than buffered, so resuming doesn't retroactively log the paused-period input or bandwidth. The pause is intentionally runtime-only and resets when WhatPulse restarts.

Redesigned input history page​

The input history page has been rebuilt with a new look and better usability:

Input history redesign

  • Grouped bar chart with interactive legend: Click series in the legend to show/hide them. Hidden series free up bar width for the remaining ones. Your legend preferences are remembered across sessions.
  • Flexible time periods: Replaced the fixed period dropdowns with the same time period selector used on the uptime page: today through all-time, plus custom date ranges.
  • Group by hour, day, week, month or year: A new group-by control lets you zoom in or out on your typing and clicking trends. The default grouping is chosen automatically based on the time period you're viewing, and you can override it at any time.

Configure a proxy from the login wizard​

Users behind a corporate proxy can now configure their connection before logging in. A new "Configure proxy..." button on the login and activation pages opens a dedicated proxy dialog, so first-time setup no longer requires reaching the Settings tab (which is only available after authentication).

Native Wayland support on Linux​

The Linux AppImage now runs natively on Wayland instead of falling back to X11 compatibility mode. This should improve display scaling, input handling, and overall integration on modern Linux desktops running Wayland.

Smaller UI improvements​

  • Status bar actions: Reset and Export buttons have moved from individual tab pages into the shared status bar at the bottom. They update based on the active page, freeing up vertical space on every stats page. The export button is now consistently located across the app, and the reset button is less likely to be accidentally clicked.
  • New animated toggle: A shiny animated pill toggle replaces the previous mix of buttons and dropdowns for switching between chart and data views, giving a more consistent look across the app.

Fixed​

  • Fixed proxy settings not persisting between sessions; changes made in Settings > Proxy now save correctly and apply immediately without a restart.
  • Windows: Fixed a high CPU usage issue that could occur on startup when running as administrator.
  • Windows: Fixed mouse heatmap clustering on displays with DPI scaling, where clicks in the right and bottom portions of the screen were dropped or misattributed to the wrong monitor.
  • Windows: Improved detection of application version information, especially for games and smaller tools that don't include full version metadata.
  • Fixed the application sync window sorting by "last used" β€” it was sorting alphabetically on the text (e.g. "22 hours" before "3 days") instead of by actual date.
  • Fixed being able to open the FAQ window by clicking on empty space in the row instead of the actual text.

How to update​

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


Happy pulsing!

β€” Martijn & the WhatPulse team

Β· 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.