{"id":44047062,"url":"https://github.com/lucalabs-de/end","last_synced_at":"2026-02-07T22:13:04.937Z","repository":{"id":191165240,"uuid":"676660755","full_name":"lucalabs-de/end","owner":"lucalabs-de","description":"Lightweight notification daemon displaying notifications as EWW widgets","archived":false,"fork":false,"pushed_at":"2024-04-04T09:50:34.000Z","size":7936,"stargazers_count":27,"open_issues_count":3,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-04T10:34:59.020Z","etag":null,"topics":["dbus","desktop-notifications","end","eww","haskell","linux","notification-daemon","notifications","wayland","x11"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucalabs-de.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-08-09T17:57:18.000Z","updated_at":"2024-04-04T05:53:46.000Z","dependencies_parsed_at":"2023-08-28T14:02:18.142Z","dependency_job_id":"7207db0c-b944-4842-811b-40e4022dd07f","html_url":"https://github.com/lucalabs-de/end","commit_stats":null,"previous_names":["lucalabs-de/end"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/lucalabs-de/end","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucalabs-de%2Fend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucalabs-de%2Fend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucalabs-de%2Fend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucalabs-de%2Fend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucalabs-de","download_url":"https://codeload.github.com/lucalabs-de/end/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucalabs-de%2Fend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29210203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T21:35:21.898Z","status":"ssl_error","status_checked_at":"2026-02-07T21:35:20.106Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dbus","desktop-notifications","end","eww","haskell","linux","notification-daemon","notifications","wayland","x11"],"created_at":"2026-02-07T22:13:04.413Z","updated_at":"2026-02-07T22:13:04.926Z","avatar_url":"https://github.com/lucalabs-de.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eww Notification Daemon\n\nThere are a few great notification daemons around. Unfortunately, they all use their own configuration language. \nIf you already use [eww](https://github.com/elkowar/eww) for your widgets, wouldn't it be great if you could just use it for your notifications as well?\n\n## Features\nThe Eww Notification Daemon, or End for short, allows you to do exactly that. It leverages eww's `literal` widget to dynamically display \nlibnotify notifications. You define the eww widgets that are used to display a notification and the eww window that they will appear in. \n\n![Example Eww Notifications](.github/screenshot.png)\n\n## Getting Started\nYou can either build the project yourself or use one of the prebuilt binaries under Releases.\n\n### Building from Source\n\n#### Using Stack\nI recommend using Stack to avoid dependency problems. To install Stack, just run\n\n```bash\ncurl -sSL https://get.haskellstack.org/ | sh\n```\nor check out [docs.haskellstack.org](https://docs.haskellstack.org/en/stable/install_and_upgrade/#manual-download) if you don't like `curl | sh`. \nThen run the following commands to build End. \n\n```bash\ngit clone https://github.com/lucalabs-de/end\ncd end\nstack install\n```\n\nThis will install the executable under `~/.local/bin`.\n\n#### Using Cabal\nYou can also use Cabal. The required tools can be installed by [GHCup](https://www.haskell.org/ghcup/).\nTo build End, run the following commands.\n\n```bash\ngit clone https://github.com/lucalabs-de/end\ncd end\ncabal build\n```\nYou will find the executable under \n```\ndist-newstyle/build/x86_64-linux/ghc-\u003cGHC version\u003e/EwwNotificationDaemon-\u003cEnd version\u003e/x/end/build/end\n```\n\n## Usage\nTo start the notification daemon, simply run the executable. You'll probably want to put something like\n```bash\nend \u0026\n```\nin your WM's init file. \n\n#### Eww Configuration\nYou need to provide an eww window that End will use to show notifications. For this to work, the window is required \nto contain the widget `(literal :content end-notifications)`, where `end-notifications` is an eww variable that needs to be defined using `(defvar end-notifications \"\")`.\n\n#### Commands\nThe following commands are supported.\n\n```bash\nend\n```\nStarts the notification daemon.\n\n```bash\nend stop\n```\nStops the notification daemon.\n\n```bash\nend close \u003cid\u003e\n```\nCloses the notification with the given ID. Useful for notifications that don't time out.\n\n```bash\nend action \u003cid\u003e \u003ckey\u003e\n```\nInvoke the action with identifier `\u003ckey\u003e` for the notification with the given ID.\n\n## Configuration\nEnd checks `$XDG_CONFIG_HOME/end` (most likely `~/.config/end`) for a `config.toml`, which is structured as follows.\n\n```toml\n[config]\n### Optional. Name of the widget used for general notifications. If this is not supplied, End \n### will fall back to a default widget (which is really ugly, so you'll want to set this ^^).\neww-default-notification-key = \"\"\n\n### Optional. Name of the eww window that the notifications are rendered in. If this is set,\n### End will manage the window for you. If not, you will have to open/close it yourself. \neww-window = \"\"\n\n### Optional. The maximal number of notifications that are shown at a time. When the current number\n### of visible notifications exceeds this value, the notification with the soonest timeout will be \n### dropped. If none of the notifications have a timeout, the oldest will be dropped.\n###\n### A value of 0 means that notifications will never get dropped.\nmax-notifications = 0\n\n### Optional. Defines whether multiple notifications should be displayed above each other (v) or\n### next to each other (h).\nnotification-orientation = \"v\"\n\n### Optional. Defines the timeouts for different types of notifications in seconds. A value \n### of 0 means that the notification will never timeout\ntimeout.urgency.low = 5\ntimeout.urgency.normal = 10\ntimeout.urgency.critical = 0\n```\n\n#### Custom Notification Widgets\nWe've seen that you can define your own notification widgets. \nThe notification data is supplied to the widget by the parameter `notification`, which is a JSON object of the following form\n\n```\n{\n    id: \u003cnotification id\u003e\n    application: \u003cApplication Name\u003e\n    icon: \u003cNotification Icon\u003e \n    summary: \u003cSummary\u003e\n    body: \u003cBody\u003e\n    hints: {\n        \"\u003chint key\u003e\": \u003chint value\u003e,\n        ...\n    },\n    actions: [\n        {\n            key: \u003caction identifier\u003e\n            name: \u003caction string\u003e\n        }\n    ]\n}\n```\n\nAs such, a general notification widget looks as follows.\n\n```yuck\n(defwidget end-notification \n [notification]\n ... your content ...)\n```\n\nThe parameters correspond to the libnotify [notification components](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html#basic-design).\n\n##### Images\nThe Notification Specification defines two different ways of attaching images to notifications. Applications may either supply a file path (using the `image-path` hint) to an image or the binary image data itself (using the `image-data` hint). Since eww does not have any way of parsing binary data, end converts the image for you and exposes a file path to the resulting image. The hints will thus never contain the `image-data` key, and if the notification contains an image the `image-path` hint will be set.\n\n\n#### Example Configuration \nYou can find a basic complete example configuration in the example folder.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucalabs-de%2Fend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucalabs-de%2Fend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucalabs-de%2Fend/lists"}