Blanket plays ambient noise through GStreamer on the GNOME desktop
Listen to different sounds
At a glance
- What is it?
- Blanket is a single-window GTK4 application that plays bundled sounds for focus and sleep, distributed mainly as a Flatpak. Its value is its narrowness, and the same narrowness is what rules it out for scripting, servers and older desktops.
- Who is it for?
- Blanket suits a Linux desktop user who wants one window of ambient noise and nothing more, and it fails anyone who needs scripting, a timer or a portable setup. Take it from Flathub rather than from source unless libadwaita 1.5.0 or newer and Python 3.11 are already installed, because the dependency line in the documentation is looser than the packaging metadata.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 18 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A GTK4 window driving a GStreamer 1.0 audio pipeline
Blanket is a Python application that puts one GTK4 window in front of a GStreamer 1.0 playback graph. PyGObject is the bridge. The package under blanket/ binds widgets from gtk4, widgets and styling from libadwaita, and the audio graph from gstreamer, so every control in the interface is an ordinary toolkit object and the sound engine sits behind it.
The stated purpose is narrow. The description line is Listen to different sounds, and the project expands that into improving focus and raising productivity, with a second use for falling asleep in a noisy environment. That framing removes the usual checklist: the README does not describe a timer, a pomodoro cycle, a task list, a playlist editor or a per-sound mixer. The model is a grid of sounds, each one switched on and left running.
The audio travels with the project rather than arriving from a service. SOUNDS_LICENSING.md sits at the repository root and tracks where the bundled sounds came from and under what terms they may be reused, so anyone repackaging a build inherits that question rather than answering it. Beside the Python package the tree carries data/, po/, brand/, doc/ and build-aux/, which is the usual GNOME split between installed assets, translations, artwork, documentation and packaging helpers.
Nine package repositories sit beside one Flathub listing
Flathub is the only channel the project itself points at. The README links a Flathub listing under the identifier com.rafaelmardojai.Blanket, and no other download appears on the page. Everything below that line is somebody else repackaging the tree.
The table has 9 rows: Alpine Linux edge, Arch Linux extra, Fedora through the tuxino/Blob Copr, NixOS unstable, openSUSE, Ubuntu through the apandada1 PPA, Void Linux, MX Linux and Debian trixie. Eight of those name an individual maintainer, while Debian trixie is attributed to the Debian GNOME Team. That distinction is the practical difference between the Flathub build and the rest, because a single named maintainer is one person whose package breaks when the upstream stack moves.
Ubuntu gets 2 rows rather than 1, one tracking published versions and one tracking every commit, which lets a user choose how closely the package follows the repository. None of these entries is a command to copy. Each is a package name that your distribution package manager already understands, so choosing among them is a matter of how closely you want to track upstream rather than of installation syntax.
Building from source with Meson, Ninja and libadwaita 1.5.0
The source path has two forms. You can clone the repository and run it from GNOME Builder, which keeps the desktop integration intact, or you can drive Meson from a terminal. The README gives the terminal form as two commands, and the install step needs root, so run it in a container or on a spare machine if you do not want a system-wide copy under /usr/local.
meson builddir --prefix=/usr/local
sudo ninja -C builddir installAfter the first command you should have a builddir directory, and after the second the application should be installed under the prefix you passed. The dependency list is the part that decides whether this works at all: Python 3 as python, PyGObject as python-gobject, GTK4 as gtk4, libadwaita at 1.5.0 or newer as libadwaita, GStreamer 1.0 as gstreamer, Meson as meson and Ninja as ninja. Six of those seven come from one or two upstream projects, so a distribution with an older libadwaita blocks the build before any Blanket code is compiled.
The build line says Python 3, pyproject.toml requires 3.11
Here is what a careful build catches first. The requirements list asks for Python 3 and names the distribution package python, with no version floor attached to it. The packaging metadata is stricter, because pyproject.toml declares requires-python as 3.11 or later, and the same file pins version 0.8.0. A machine on an older Python 3 interpreter satisfies the README line and is then rejected by the project metadata, with no further explanation anywhere in the documentation.
That gap is small but it is the kind of detail that turns into an afternoon. Anyone following the README literally on an older distribution will discover the floor only when Meson or the build backend refuses the tree, and the error will not name the README line that sent them there. The rest of the declared environment is looser than you might expect: nothing in the pyright section pins a GTK or GStreamer type version, and the two development dependencies are typing stubs and a linter rather than runtime libraries.
On maintenance, the project is not archived and the last push to master was on 2026-09-04, so commits do land on the default branch. Blanket is distributed under GPL-3.0, recorded in COPYING at the repository root.
Meson build files and a uv.lock describe two separate paths
Read the repository layout and two toolchains show up side by side. meson.build, meson_options.txt and build-aux/ describe an installable artefact that a distribution can package, and blanket.spec lets RPM-based systems build the same tree. Next to them sit pyproject.toml and a uv.lock at the root, plus a development dependency group holding pygobject-stubs at 2.17.0 or newer and ruff at 0.12.5 or newer.
The install section never mentions Meson's Python path, uv or ruff, so a reader has to infer the split. One chain produces a system install that appears in a menu and runs against the distribution's GTK4. The other exists for typing and linting during development, which is what the pyright configuration and the stub package are for. Nothing in the documentation wires the two together, so a first-time contributor following only the README gets an installed binary and no editor support.
There is also blanket.doap, the freedesktop file that carries project metadata for software directories, alongside CONTRIBUTING.md, TRANSLATORS.md and the po/ directory. Translation happens on Weblate, and the README asks for help there when a language is missing or incomplete.
The GNOME dependency chain is where Blanket stops fitting
The cost of Blanket is the stack underneath it. GTK4, libadwaita at 1.5.0 or newer, GStreamer 1.0 and PyGObject all have to be present, and the Flatpak route is the only one that bundles them for you. On a bare container, a server or a distribution that froze libadwaita an age ago, there is no documented fallback, no headless mode and no server mode, and the project does not claim one.
Beyond packaging, the project says nothing about scripting surfaces. No command line interface is described, no configuration file path is given, no keyboard shortcut list appears, and no sleep timer is mentioned, so there is no documented way to start a sound on a schedule, to point several machines at one preset or to drive the app from a stream deck. Absence in a README is not proof of absence in the code, but it does mean an adopter cannot rely on any of it without reading the source.
One more boundary matters for anyone shipping a build: the terms for the bundled sounds live in SOUNDS_LICENSING.md rather than in the README, and the sound assets are part of the tree. The main document carries a GNOME Circle badge and a badge asking that the application not be themed, both of which point to a project that wants its own look preserved rather than restyled per distribution.
Six ports rebuilt the sound grid for platforms Blanket skips
The project treats portability as somebody else's job and credits 6 efforts as inspired by it. Blankie is a native macOS app. Blanket+ is published in the Microsoft Store as a Windows version. Blanket Web is a web clone, and feeltheblow is a web app. Soothing Noise Player and Blankee cover Android. Aria is listed separately because it was written from scratch with Kotlin and Compose Multiplatform for Android, web and desktop.
The split between those entries is the useful part. Blankie, Blanket+ and the web versions reimplement the same idea, a grid of switchable ambient sounds, on a stack Blanket does not target, while the Python and GTK4 code stays where it started. Aria goes further and abandons the original stack instead of wrapping it, which is what a rewrite across three targets usually means.
For an engineer choosing a tool, that list is a practical signal about maintenance reach. Blanket is maintained by one developer and community contributors, and each port lives in a separate repository with its own update history, so no fix to the Python application reaches a Windows user through any of these projects.
Editorial conclusion
Blanket suits a Linux desktop user who wants one window of ambient noise and nothing more, and it fails anyone who needs scripting, a timer or a portable setup. Take it from Flathub rather than from source unless libadwaita 1.5.0 or newer and Python 3.11 are already installed, because the dependency line in the documentation is looser than the packaging metadata. Anyone redistributing a build should read SOUNDS_LICENSING.md first, since the bundled sound assets are part of the tree and the main document leaves their terms to a separate file.
Frequently asked questions
How do I install Blanket on Linux?
The README points at a Flathub listing under the identifier com.rafaelmardojai.Blanket. It also lists packages for Alpine Linux, Arch Linux, Fedora, NixOS, openSUSE, Ubuntu, Void Linux, MX Linux and Debian trixie, maintained outside the project.
What do I need to build Blanket from source?
The dependency list names Python 3, PyGObject, GTK4, libadwaita at 1.5.0 or newer, GStreamer 1.0, Meson and Ninja, and the packaging metadata requires Python 3.11 or later. Meson and Ninja produce the install itself, while GNOME Builder can run the tree directly.
Does Blanket work on Windows or macOS?
No native build for either platform appears in the repository. The README points to Blankie for macOS and to Blanket+ in the Microsoft Store as separate projects inspired by Blanket.
Can Blanket be controlled from the command line or a script?
No command line interface, configuration file path or scripting entry point is described in the documentation. Everything described happens inside the application window.
How do I help translate Blanket?
Translations are managed on Weblate, and the README asks for help there when a language is missing or incomplete. Translator credits are tracked in TRANSLATORS.md, with the translation files under po/.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/rafaelmardojai-blanket)Was this useful?