[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105303":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},105303,"hokum","anomalyco\u002Fhokum","anomalyco","Notifications for Wayland that look like they belong on a computer from this decade. Drawn with Rune.","https:\u002F\u002Fhokum.app",null,"Rust",220,9,113,4,0,52,156,84.2,"MIT License",false,"dev",true,[],"2026-11-01 00:13:54","# Hokum\n\nA control center for Wayland that looks like it belongs on a computer from this decade.\n\nHokum is one app for compositors with `zwlr_layer_shell_v1` (niri, sway, Hyprland, river and\nothers), drawn with [Rune](https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Frune), our Rust UI framework:\n\n- **Notifications:** a freedesktop notification daemon (`org.freedesktop.Notifications`) whose\n  cards slide in, restack on springs and get out of the way.\n- **Sound:** output, input and the apps playing, on PipeWire. Devices, ports, Bluetooth\n  codecs and balance a row down; profiles, virtual outputs, routing and the clock in\n  the pane beside them.\n- **Bluetooth:** power, connected and paired devices with battery, on BlueZ. Pairing (codes\n  inline), trust, rename and forget a row down; adapters and raw properties in the pane beside them.\n\nOne window holds all three, one section each. One tray icon opens a panel with the output's\nvolume and device, the microphone while something records, your Bluetooth devices and Do not\ndisturb.\n\n## Install\n\nFrom the AUR:\n\n```sh\nparu -S hokum-bin\n```\n\nOn Debian and Ubuntu (use `linux-arm64-deb` on ARM):\n\n```sh\ncurl -fLo \u002Ftmp\u002Fhokum.deb https:\u002F\u002Fanoma.ly\u002Frelease\u002Fhokum\u002Fdesktop\u002Fstable\u002Flinux-x64-deb\nsudo apt install \u002Ftmp\u002Fhokum.deb\n```\n\nOn Fedora and openSUSE (use `linux-arm64-rpm` on ARM):\n\n```sh\ncurl -fLo \u002Ftmp\u002Fhokum.rpm https:\u002F\u002Fanoma.ly\u002Frelease\u002Fhokum\u002Fdesktop\u002Fstable\u002Flinux-x64-rpm\nsudo dnf install \u002Ftmp\u002Fhokum.rpm\n```\n\nWith Nix, try it with `nix run github:anomalyco\u002Fhokum`. On NixOS, add the flake as an input\nand install it so D-Bus activation and the user unit find it:\n\n```nix\n# hokum = inputs.hokum.packages.${pkgs.stdenv.hostPlatform.system}.default;\nenvironment.systemPackages = [ hokum ];\nservices.dbus.packages = [ hokum ];\nsystemd.packages = [ hokum ];\n```\n\nOr download the `hokum` executable from [Releases](https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fhokum\u002Freleases)\nand install it on your `PATH` together with the systemd unit, D-Bus activation file and launcher\nentry from [`packaging\u002F`](packaging). Development builds of `dev` are on the\n[dev channel](https:\u002F\u002Fanoma.ly\u002Frelease\u002Fhokum\u002Fdesktop\u002Fdev.json).\n\nHokum starts through D-Bus activation on the first notification. To start it with your session\ninstead, and stop another daemon (mako, dunst, swaync) holding the name:\n\n```sh\nsystemctl --user enable --now hokum.service\n```\n\nThe first time it runs, Hokum shows one welcome card of its own with a button into Settings. It\nremembers that in `~\u002F.local\u002Fstate\u002Fhokum\u002Fwelcomed`.\n\nSound needs PipeWire (with WirePlumber) and Bluetooth needs BlueZ; without them their sections\nsay so in one line and the tray panel leaves them out. The packages depend on `libpipewire`\nand recommend `pipewire`, `wireplumber` and `bluez`.\n\n### Desktops\n\nHokum runs on compositors with layer-shell: niri, sway, Hyprland, river and others, and KDE\nPlasma. It doesn't run on GNOME, which has no layer-shell to draw cards with; there it says so\nand exits.\n\nSome desktop shells are the notification server themselves rather than a separate daemon, and\nthey never let another one take the name, `--replace` included: turn off the shell's own\nnotifications first, then start Hokum.\n\n- **KDE Plasma:** System Tray settings → Entries → Notifications: Disabled (or remove the\n  Notifications widget), then `systemctl --user enable --now hokum.service`. If Plasma still\n  holds the name, log out and back in.\n- **Omarchy:** see [docs\u002Fomarchy.md](docs\u002Fomarchy.md).\n\nWhen a shell keeps the name, Hokum says which one and what to do, and exits with status 78,\nwhich `hokum.service` doesn't restart on.\n\n## Use\n\n```sh\nhokum                     # the window (starts Hokum if it isn't running)\nhokum sound               # the window on Sound\nhokum bt                  # the window on Bluetooth (or hokum bluetooth)\nhokum service [--replace] # run in the background (what hokum.service starts)\nhokum check [path]        # report problems in config.kdl, or in a theme or config file\nhokum dismiss [--all]     # close the newest card, or every card\nhokum invoke              # do what clicking the newest card does\nhokum dnd [on|off|toggle] # print Do not disturb, or set it (--json, --watch for bars)\nhokum update [--install]  # check for a new build now (and install it)\nhokum --version\n```\n\n`dismiss`, `invoke` and `dnd` are for keybindings and bars, like `makoctl`. `hokum dnd on` saves\nto `config.kdl` just as the settings window's switch does. They call `app.hokum.Daemon` on the\nsession bus (`Dismiss`, `Invoke`, `SetDoNotDisturb` and a `DoNotDisturb` property that announces\nits changes), which scripts can use directly.\n\nLike Hex, Hokum is one process: the service owns the bus name, draws the cards on a\nclick-through overlay, hosts the window, runs Sound and Bluetooth on their own threads and keeps\nthe tray icon. Launching `hokum` again shows that window. A module that can't start, or fails\nlater, says so in its section and leaves the rest running.\n\n### Modules\n\nSound and Bluetooth are on unless `config.kdl` turns them off; the end of each section's\nadvanced pane has a button for it too. With both off there's no tray icon.\n\n```kdl\nmodules {\n    sound #true\n    bluetooth #false\n}\n```\n\n### Cards from the modules\n\nWhen the default output's volume or mute changes from outside Hokum (volume keys, `wpctl`, an\napp), one Volume card shows the level and updates in place; it shows through Do not disturb.\nA Brightness card does the same when the screen's backlight changes. When a paired Bluetooth device connects, a card says so with its battery, and one more warns once\nwhen a device's battery drops below 20 % (again only after it's been back above 30 %). Turn them\noff with `osd #false`, `brightness #false` and `bluetooth-notifications #false` in `modules`.\n\n### Bluetooth pairing\n\nHokum registers a BlueZ pairing agent, so pairings started from Hokum prompt in Hokum, with the\ncode under the device. It asks to be the *default* agent (the one that answers pairings a\ndevice starts, and untrusted devices asking for a service) only when no other Bluetooth app\nthat keeps one is running (blueman's applet, blueberry, Plasma's Bluedevil); then those keep\nanswering them.\n\n- **One config file:** `~\u002F.config\u002Fhokum\u002Fconfig.kdl` starts from a theme and overrides anything:\n  look (`tokens`), layout (`template`), per-app and per-text `rule`s, `behaviour` and `modules`\n  (which only the config sets; themes are just looks). The\n  settings window edits the same file, keeping your comments, and hand edits apply as you save.\n  See [docs\u002Ftheming.md](docs\u002Ftheming.md).\n- **Themes:** eight built in (Soft, Crisp, Capsule, Ribbon, Terminal, Bubble, Signal, Pill), shown\n  in a gallery as real cards, plus Omarchy on Omarchy, which follows its current theme's\n  colours. Capsule, with app icons, is the default. Custom themes are written\n  by your coding agent: the settings window gives you a prompt that points it at\n  [hokum.app](https:\u002F\u002Fhokum.app) (the same guide as [docs\u002Fthemes.md](docs\u002Fthemes.md)), the\n  complete guide to the format. A Rhai script can rewrite\n  or drop notifications too.\n- **Per app:** mute, how long its cards stay, and breaking through Do not disturb, for every app\n  that has sent you a notification.\n- **Icons and pictures:** app icons from your icon theme (the one your desktop set: GNOME's,\n  KDE's or GTK's setting), found from whatever names the app: its icon, its `desktop-entry`,\n  its Flatpak, Snap, AppImage or systemd app unit, or its name. A browser's notification from\n  an installed web app (`--app=https:\u002F\u002F…` launchers, Omarchy's and Linux Mint's) shows as that\n  app. The pictures notifications carry (avatars, album art) show beside the text, unless the\n  picture is just the app's icon again. Emoji draw in colour.\n- **Behaviour:** screen corner, how long cards stay, how many show, pause while hovered, and\n  Do not disturb (only critical notifications and apps you allow show).\n- **Sounds (opt-in):** `behaviour { sound #true }` plays a sound for new cards, with its own\n  for critical ones and per-app `rule`s; apps' `sound-file`, `sound-name` and `suppress-sound`\n  hints count. See [docs\u002Ftheming.md](docs\u002Ftheming.md#sounds).\n- **Cards:** action buttons, a click for the default action (with an XDG activation token, so\n  the app can raise its window on Wayland), a right-click to dismiss, progress bars (`value`), and\n  in-place replacement by `x-dunst-stack-tag` \u002F `x-canonical-private-synchronous` (volume,\n  brightness). Critical notifications stay until dismissed. Slack's `[workspace] in #channel`\n  titles become the sender, the message, and the channel beside the app's name. Omarchy's\n  click commands, buttons and glyphs work too.\n\nHokum keeps `config.kdl`, your `themes\u002F` and `script.rhai` in `~\u002F.config\u002Fhokum\u002F`, and notices\nwhen any of them change.\n\n## Updates\n\nHokum never updates itself without a click. A minute after it starts, and then hourly (every 30\nminutes on dev builds), the service fetches its channel's release manifest\n(`https:\u002F\u002Fanoma.ly\u002Frelease\u002Fhokum\u002Fdesktop\u002F\u003Cchannel>.json`, sent as `hokum\u002F\u003Cchannel>\u002F\u003Cversion>`).\nWhen the published executable for your machine differs from the running one (compared by\nsha256), one Hokum card says so:\n\n- Installed as a plain file you can write (`~\u002F.local\u002Fbin\u002Fhokum`): **Update** downloads it,\n  checks its size and sha256, replaces the executable and restarts Hokum, which then says\n  \"Hokum updated\". If anything fails, the card says what and the old executable stays.\n- Installed by a package manager (AUR, .deb, .rpm): the button copies the command that updates\n  it (`paru -Syu hokum-bin`, for instance) with `wl-copy`, or opens hokum.app.\n\nDismiss the card and that build stays quiet until Hokum restarts or a day passes. Like Hokum's\nother cards it waits out Do not disturb. Failures are silent and retried at the next check. To\nturn checks off, set `check-for-updates #false` in `behaviour` in `config.kdl`. Builds run from a\ncargo `target\u002F` folder never check. `hokum update` checks now; `hokum update --install` does what\nthe card's button does.\n\n## Build\n\nNeeds the PipeWire headers and clang for bindgen (`pipewire` and `clang` on Arch;\n`libpipewire-0.3-dev libspa-0.2-dev clang libclang-dev pkg-config` on Debian and Ubuntu).\n\n```sh\ncargo build --release\ntarget\u002Frelease\u002Fhokum service --snap cards.png --scene demo   # headless render, no D-Bus\ntarget\u002Frelease\u002Fhokum --snap settings.png --scene hokum\ntarget\u002Frelease\u002Fhokum --snap sound.png --scene sound          # Sound and Bluetooth on mocks\ntarget\u002Frelease\u002Fhokum --snap panel.png --scene panel --size 364x440\n```\n\n`HOKUM_SOUND_BACKEND=mock` and `HOKUM_BLUETOOTH_BACKEND=mock` run the service on fake devices.\n\nReleases are cut by `.github\u002Fworkflows\u002Frelease.yml`; see [docs\u002Freleasing.md](docs\u002Freleasing.md).\n\n## License\n\nMIT\n",2,"2026-10-31 04:26:22","CREATED_QUERY"]