Changelog
What's new in SaaS Monitor
Every release, newest first. On your own server, updating takes two commands, and open screens reload on the new version by themselves.
Added
- The site speaks the languages of screens: the home page and the Stripe notification sound page in French, German, Spanish, Italian, Portuguese and Dutch (
/fr,/de…), English staying at its address. The home page is redesigned, presents the SaaS Monitor app, and its TV shows the demo's picture at once, and on phones. Self-hosted instances serve the site withX-Robots-Tag: noindex, its canonical links pointing to saas-monitor.com. - Docs on the site (
/docs), in every language: short guides to get started, put a screen on the wall, customize it, use the apps, check how the numbers are computed, connect safely and self-host, each linking to the detailed section of the guides indocs/. The header's Docs leads to them, and they are listed in the sitemap andllms.txt. - A help widget for an instance that sets
GLEAP_API_KEY(a Gleap project's SDK key): people write to its team from the dashboard, and from the site's pages through a Questions? button, which loads the widget only once clicked. Screens load no third-party script, and the widget leaves the dashboard's console and requests out of bug reports. Signing out forgets who was writing, so that the next person on a shared computer starts anew. - The server side of the SaaS Monitor app (iOS and Android): a phone opens a screen with its link, scanned from the QR code of Open on your phone in the screen settings, and its password if it has one, then gets notified of what happens, in the screen's language. Events gains a Phone column: payments, new subscribers, upgrades, reactivations, new customers and milestones notify by default, and each phone may turn a screen off or mute some of its events. Each thing is notified once, a burst as a single summary. Self-hosted instances notify through the Expo push service, with nothing to configure; the instance that publishes the apps sends to Apple and Google directly (
APNS_*,FCM_SERVICE_ACCOUNT), Expo standing in for phones it cannot reach. Notifications are instant with instant updates. A new link or a new password stops notifying the phones that followed the screen. POST /api/screens/:token/access(a screen's password for the proof that opens it, also accepted by the state endpoint as anX-Screen-Accessheader) andPUT/DELETE /api/screens/:token/devices(an installation of the app following a screen, with its Expo and native push tokens and its choices).- The demo screen in the SaaS Monitor app, its widgets and watches: the screen API answers for
demo(/api/screens/demo/state, and the same query string as/d/demo), from the web demo's simulation. Polls agree on what happened: every hour, on the hour, the demo starts over just below its goal, then something happens every 30 to 90 seconds. It has no password, accepts the phones that follow it without keeping them (it notifies nobody), and says recorded phrases. - Send a test celebration also notifies the phones following the screen, to check notifications end to end; the toast says how many were notified.
- The SaaS Monitor app plays moments as the screen's displays do, its sound then its voice, in the screen open on the phone and, on iPhone, as the sound of its notifications, even locked (Play sounds and voices in the app's settings). Notifications carry what each moment plays, and the sounds of every pack ship as files (
public/sounds), rendered from the display's own byscripts/generate-sounds.ts. - Lost subscriptions say why, in the feed, on their card and in the voice: canceled, won't renew (a cancellation at period end, with the date it ends), payment failed (Stripe's retries ran out) or paused. Churns recorded before take the reason their subscription shows.
- A voice announcement for failed payments, on its own switch, and phrases of their own for subscriptions set not to renew or paused.
- Customers without a name can be named by their email, masked (
j•••@gmail.com) or in full, on screens that show names and allow it. - Events, in the screen settings: for each kind of event, whether it is listed in the feed, shown as a card, plays its sound and is said out loud, each on its own. Payments made for Stripe Connect accounts have their own row: they may stay off the feed, which still fills up with the account's own activity.
- The standalone live demo says its data is simulated and invites visitors to put their own MRR on the wall. Shared on X or LinkedIn, a link to it shows a preview card.
- On saas-monitor.com, moments and milestones credit "saas-monitor.com" in small print, which each screen can turn off. It needs
SHOW_ATTRIBUTION=true: self-hosted servers never show it. - The landing page's TV can be heard: Hear it plays the demo's sounds and voice. The sound board plays every voice in its own language, and a FAQ answers what founders ask before connecting Stripe.
- New pages: Stripe notification sounds, with every sound to download as WAV; comparisons with Baremetrics, ChartMogul, Geckoboard, PingBell and ProfitWell Metrics; this changelog, with an RSS feed; the privacy policy, terms of service and legal notice of saas-monitor.com.
- A sitemap, structured data,
llms.txtand an Apple touch icon, for search engines and assistants. - After a test celebration, the dashboard offers once to share a photo of the wall or to star the project. The user menu links to GitHub, the docs, the changelog and feedback.
- Self-hosting without cloning:
compose.yamlruns the published image (amd64 and arm64),install.shprepares the folder and its secrets, andcompose.build.yamlbuilds from source. - Self-hosted dashboards ask, once in a while, for a star on GitHub: "Maybe later" asks again a day later, and starring or "Don't ask again" never asks again.
DISABLE_STAR_PROMPT=trueturns it off for the whole instance.
Changed
- A new subscription is announced first, then the payment that started it, even when Stripe records them seconds apart; upgrades and comebacks paid at once too. Payments of subscribers still play at once.
- Sound and voice settings keep to how they sound: which events play moved to Events. Screens keep the sounds and voice they had chosen.
- The Raspberry Pi guide sets a screen up with one block of commands.
- The list of screens, and the home page, show each screen as its wall does right now: its MRR or ARR, its growth over 30 days, its curve and its latest event, in its theme, colors and language, or what it waits for (a Stripe account, its first import, a failing key). Its language and sound show when they set it apart, test data and passwords too. Open, Copy link, its QR code and Edit are one click away, and the whole card opens its settings. A single screen spreads out, its link and QR code in sight.
Fixed
- Docs in the account menu opens the instance's own docs (
/docs) rather than the guides on GitHub. - A screen protected by a password stays unlocked after its kiosk restarts: the kiosk command no longer opens Chromium in incognito mode, which forgot the password at every reboot.
- The site speaks the languages of screens: the home page and the Stripe notification sound page in French, German, Spanish, Italian, Portuguese and Dutch (
Added
- An optional password per screen, on top of its link: each device asks for it once, in the screen's language, and changing it locks every device out again.
- Stripe Connect platforms: payments made for a connected account show with their own icon, and revenue only counts the application fee kept of them. Payments imported before are classified at the next Re-import data of the account.
- Voice announcements: a voice says what just happened, after the sound and on a switch of its own, for each kind of moment (payments for a connected account apart). Ten voices, two per language, in English, French, German, Spanish and Portuguese, with recorded phrases. With a Gradium API key (
GRADIUM_API_KEY), screens say their own phrases, with the customer's name, the amount or the plan, and variations picked at random.
Changed
- Moments stay on screen as long as each screen chooses (5 to 30 seconds, 10 by default, shorter when several arrive at once), in a larger card that reads from across the room.
- The landing page says what it costs: saas-monitor.com is free during the public beta, and self-hosting stays free for good.
Fixed
- Feed rows fit a narrow column: the country is a flag at the start of the details, and the account sits next to the time, instead of details running past the edge.
- In development, the database sees new columns after a schema change without a restart.
The first public release.
Screens
- MRR or ARR in large type with its 30-day growth, progress towards the next milestone or your own goal with the date you'll reach it, a chart over 30 days, 90 days, 12 months or all time, revenue today and this month, customers, net new MRR, and a live feed of new customers, payments and subscription changes.
- A moment on screen for every event, confetti for money coming in, and a full-screen celebration at each milestone.
- Sounds in three packs synthesized in the browser: cash register, chime and arcade.
- A dark or light theme, preset accents or your own color, and seven languages (English, French, German, Spanish, Italian, Portuguese, Dutch) with local number and date formats.
- Several Stripe accounts per screen, added up in one currency or taking turns, each moment naming the product it comes from.
- Made for unattended TVs: any resolution or orientation, display kept awake, recovery from outages, reload after updates, protection of OLED panels.
Stripe
- Read-only restricted keys, encrypted at rest.
- MRR as Stripe defines it: discounts, trials, cancellations at period end, billing intervals.
- A resumable import of subscriptions, a year of payments and the last week's new customers, then an incremental sync from the Events API: instant with webhooks, otherwise paced within Stripe's read allowance.
- Accounts billed in different currencies, converted with ECB rates.
Dashboard
- Workspaces and invitations, screens with a live preview editor and test celebrations, screen links that can be regenerated.
- Email and password sign-in with rate limits, optional GitHub and Google sign-in, and sign-ups that can be closed.
Self-hosting
- Docker Compose with MySQL 8.4, migrations on startup, and images for amd64 and arm64 on GitHub Container Registry.