The problem
Free timer tools dominate search and disrespect the user. Ad-stuffed pages, settings that don’t persist, no way to share or embed, no offline mode. There’s a real audience — teachers, broadcasters, event runners, fitness coaches — willing to pay a small amount for a timer that just works. We built for them.
What we built
TimerForge ships in two forms. The desktop app is built in Python with PyQt6 and packaged for Windows, macOS, and Linux via PyInstaller — one binary per platform, signed, auto-updating. The web SaaS is a Node and Express service with embeddable timer widgets, shareable URLs, persistent presets, branding controls, and Stripe-billed pro features (large displays, custom themes, scheduled timers, multi-device sync).
The automation angle
The interesting work was in the build and release pipeline. Each platform has different signing, notarisation, and packaging quirks; the CI pipeline handles all three from a single push. The web SaaS deploys behind Nginx with Stripe webhooks for licence activation, so a user buying on the marketing site is upgraded everywhere within seconds.
How it’s used
- Teachers running test timers on a projector.
- Streamers and broadcasters embedding countdowns in OBS scenes.
- Event runners pacing keynotes without an AV crew.
- Fitness coaches running intervals.
What it taught us
Cross-platform desktop is a real product surface in 2026 if you’re willing to do the boring work. The boring work — code signing, notarisation, auto-update, crash reporting — is the moat. Once it’s done, releases cost almost nothing and the surface is yours.
Two codebases, one product
The desktop app and the web SaaS are genuinely separate applications — PyQt6 on the desktop, Node and Express on the web — not one codebase compiled two ways. That was a deliberate call: a countdown timer on a desktop needs to survive without a network connection and feel native to each OS’s window chrome, while the web version needs to be embeddable in an iframe and share instantly by URL. Trying to force both out of one codebase would have meant compromising on whichever platform lost the argument. Keeping them separate means each can lean into what its platform is actually good at, at the cost of keeping feature parity a deliberate decision rather than something the build system gives you for free.
What ties them together is Stripe. A pro licence purchased on the web unlocks the same entitlement on desktop, checked against the same subscription record — the product is two apps, but the account is one.