<div align="center">
<img src="focus-app-icons/icon-256.png" width="120" alt="taskbar-focus">
# taskbar-focus
**A tiny focus timer for Windows that actually silences your notifications.**
Work in 25-minute stretches. While you're focused, Windows goes quiet.
When you take a break, everything comes back.
*A Windows application. Needs Windows 10 or 11, 64-bit.*
</div>
---
## Install
**With [Scoop](https://scoop.sh)** — recommended, and updates cleanly:
```powershell
scoop bucket add taskbar-focus https://github.com/yoelrosenthal/taskbar-focus
scoop install taskbar-focus
```
Later: `scoop update taskbar-focus`
**With Cargo**, if you have Rust:
```powershell
cargo install taskbar-focus
```
**Just the executable:** download `taskbar-focus.exe` from the
[latest release](../../releases) and run it. Nothing to configure — put it
wherever you like.
> **Windows 11 hides new tray icons.** If you don't see it after starting,
> click the `^` arrow near the clock and drag **taskbar-focus** onto the
> taskbar.
## What you get
### A timer that sits on your taskbar
A small window showing the countdown, sized to sit on the taskbar out of the box:
```
▌ Focus 23:16
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
```
- **Drag it** anywhere by its middle. **Resize it** from any edge.
- Make it big and it switches to a stacked layout with a large clock.
- **Click it** to pause or resume.
- It stays on top so you can always see it, and remembers where you put it.
Turn it on in Settings, or from the tray menu. *Reset window size* puts it back.
### Quiet while you work
When focus starts, Windows **Do Not Disturb** switches on. When a break starts,
it switches off. That's the whole point of the app.
Your **priority** apps and contacts still get through — it uses exactly the mode
Windows' own "Do not disturb" button uses, and never touches your priority list.
### A muted bell, because Windows will not draw one
Windows only lights its own muted icon for a change the taskbar made itself, so
muting from another program usually leaves no visible trace. This app draws that
trace instead — the same crossed-out bell — and it follows Do Not Disturb however
it was switched on, including by you.
- a **separate bell beside the clock**, present only while you are muted
- a **bell in the compact timer window**, next to the countdown
Both are on by default and can be switched independently under *Do Not Disturb*
in Settings. Windows 11 files new tray icons behind the `^` arrow — drag the bell
out once and it stays where you put it.
The timer's tray icon is left alone: sixteen pixels hold a progress ring or a
bell, not both.
### A tray icon that shows progress
| 🔴 Red ring filling up | Focused |
| 🟢 Green ring | On a break |
| ⚪ Grey ring | Nothing running |
| Faded | Paused |
**Left-click** starts, pauses and resumes. **Right-click** for everything else.
### Shortcuts
| <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>F</kbd> | Start, pause or resume |
| <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>B</kbd> | Skip to the next interval |
They work from any app, and you can change them in Settings.
## How a session flows
Finish a focus session → a short break starts by itself → after a set number of
sessions you get a long break instead. Four in Pomodoro 25/5, two in Deep Work
90/15, and you can change it per preset. Breaks end by going idle, so *you*
decide when to start working again.
Don't like that? Turn the automatic sequence off and drive it by hand.
**Strict focus** makes stopping or skipping a running focus session ask first,
so a stray click can't end it.
## Presets
Three to start with — **Pomodoro 25/5**, **Deep Work 90/15**, **Short 15/3** —
and you can edit them or add your own with *Save as new preset*. Switch between
them from the tray menu.
## From the command line
Handy for shortcuts, stream decks, or scripts. Commands go to the running app,
so you never end up with two timers.
```powershell
taskbar-focus --start # start focusing
taskbar-focus --break # take a break
taskbar-focus --toggle # start / pause / resume
taskbar-focus --skip # next interval
taskbar-focus --stop # stop
taskbar-focus --preset "Deep Work 90/15" # switch preset
taskbar-focus --quit
```
## Good to know
**If your antivirus complains.** It might. Muting notifications and restarting a
Windows service look, from the outside, like something suspicious — and a
brand-new unsigned program has no reputation yet. Run
`taskbar-focus --explain` to see precisely what it touches; it's read-only and
works without the app running. Everything it does is logged to
`%APPDATA%\taskbar-focus\activity.log`. On a work machine, ask IT to allow it
rather than turning off your protection. Or switch off **Mute notifications
during focus** and use it as a plain timer.
**Windows' own muted icon usually will not appear.** Notifications really are
muted, but the area beside the clock is drawn by Explorer, which caches that
state and does not update without being restarted. Restarting the desktop for an
icon is unreasonable, so the app draws
[its own mark](#a-muted-bell-because-windows-will-not-draw-one) instead.
**Your settings** live in `%APPDATA%\taskbar-focus\config.toml` — plain text you
can back up, sync or edit by hand.
**It handles the awkward cases.** Computer sleeps mid-session? Counts the time
asleep by default (or ignores it, or pauses — your choice). Changed the system
clock? Ignored. Closed the app mid-session? It comes back **paused**, with the
time you were away deducted. Explorer restarted? The tray icon reappears.
**Privacy.** No network access at all — there's no networking code in it. No
telemetry, no accounts, no auto-update. It never needs administrator rights.
## Uninstall
`scoop uninstall taskbar-focus`, or `cargo uninstall taskbar-focus`, or just
delete the `.exe`.
Either way, settings stay in `%APPDATA%\taskbar-focus` until you delete that
folder. Do Not Disturb is switched back when the app exits.
## For developers
```powershell
cargo build --release # target\release\taskbar-focus.exe
cargo test
cargo install --path . # install your local build
```
Merging a pull request into `main` publishes a release: GitHub Actions bumps the
version, writes the `CHANGELOG.md` entry, tags the commit, builds, attaches a
build provenance attestation, updates the Scoop manifest and publishes to
crates.io. How big the bump is comes from a `release:major`, `release:minor` or
`release:patch` label on the pull request; `release:skip` merges without
releasing.
Pushing a tag by hand (`git tag v0.2.0 && git push origin v0.2.0`) still works,
for re-cutting a release. Either way the tag must match the version in
`Cargo.toml` — the workflow checks this first and stops if it doesn't.
Publishing to crates.io needs a `CARGO_REGISTRY_TOKEN` repository secret (from
[crates.io/settings/tokens](https://crates.io/settings/tokens)). Without it that
step is skipped, and everything else still runs.
The interesting part is [`src/os/dnd/`](src/os/dnd/) — Windows has no supported
API for setting Do Not Disturb, so that module explains what it does instead,
and why.
This repository doubles as its own Scoop bucket: the manifest in
[`bucket/`](bucket/) is updated automatically on each release.
## License
MIT — see [LICENSE](LICENSE).