Skip to content
Container Display Notifications
WebSocket Streaming
Notification History
Urgency Levels
Custom Icons
Auto-Expiration
Categorization
POST /notify
Container Display Notifications
WebSocket Streaming
Notification History
Urgency Levels
Custom Icons
Auto-Expiration
Categorization
POST /notify
Container Display Notifications
WebSocket Streaming
Notification History
Urgency Levels
Custom Icons
Auto-Expiration
Categorization
POST /notify
Container Display Notifications
WebSocket Streaming
Notification History
Urgency Levels
Custom Icons
Auto-Expiration
Categorization
POST /notify
kit / notifications / hero
NotificationsHoody Notifications

Desktop Notifications Over HTTP.

Send Linux desktop notifications to any container display with a single HTTP POST. The Notification Server runs notify-send on your container's X11 display — trigger an alert, fetch the history, or stream events live.

notify · hoody-n

# Send a notification to display 0

curl -X POST "https://abc123-def456-n-1.node-us-1.containers.hoody.com/api/v1/notifications/notify"

-d '{"display":"0","summary":"Build Complete","urgency":"normal"}'

# Response

{"success":true}

kit / notifications / lifecycle
How It Works

Three Steps. One HTTP Call Each.

Every notification follows the same lifecycle: trigger it over HTTP, deliver it to the target display via notify-send, then fetch the history or stream it live.

01

Trigger

A POST to /notify calls notify-send on the target X11 display. Supply summary and display, plus optional body, category, urgency, expire_time, or icon.

notifications — trigger

# Fire a notification

curl -X POST .../notify

{"display":"0",

"summary":"Build Complete",

"urgency":"normal"}

 

{"success":true}

02

Deliver

notify-send hands the alert to the system's notification daemon on the target X11 display. It appears in any connected display session and auto-expires according to its urgency and expire_time.

notifications — deliver

# notify-send on display :0

notify-send → X11 :0

 

▸ Build Complete

normal · auto-expires

03

Fetch or Stream

GET /[display] returns notification history with optional limit, since, username, and session filters. Or open a WebSocket to /stream?displays=0 for real-time push.

notifications — fetch

# Poll history

curl .../0?limit=50

 

# Or stream live

new WebSocket(

"wss://.../stream?displays=0"

)

kit / notifications / urgency
Urgency Levels

low. normal. critical.

The urgency field takes one of three documented values that map directly to notify-send behavior. Pick the right one and the notification daemon handles the rest.

low

Quiet and quick to dismiss. Pair with a short expire_time like 3000 ms for background tasks, telemetry, or informational pings that should not steal focus.

"urgency": "low",

"expire_time": 3000

normal

The standard level, used whenever urgency is omitted. The notification daemon shows it at the configured timeout and dismisses it automatically.

"urgency": "normal"

// default — omit to use this

critical

Stays on screen until acted on. Pair with expire_time 0 for system failures, build errors, or anything that demands immediate attention.

"urgency": "critical",

"expire_time": 0

kit / notifications / channels
Channels

Fetch History or Stream Live.

Two read channels for two needs: REST for audit logs and one-shot queries, WebSocket for dashboards and real-time monitors.

GETGET /[display]Fetch
WSWS /streamStream

Pull notification history for one or more displays. Filter by limit, since timestamp, username, or session. Use it for audit logs, one-shot queries, and batch processing.

fetch history

# last 50 for display 0

curl ".../0?limit=50"

# only since a timestamp

curl ".../0?since=1749025000000"

JSON with a notifications array — each object carries id, summary, body, urgency, category, icon_url, and timestamp.

Subscribe with displays=0,:1,2 or displays=all and receive each notification the moment it fires. Use it for dashboards and real-time monitoring.

stream live

# open a WebSocket

const ws = new WebSocket(

"wss://.../stream?displays=0"

)

# handle each push

ws.onmessage = (e) => {

const msg = JSON.parse(e.data)

// msg.summary, msg.body, msg.urgency

}

A WebSocket upgrade (HTTP 101), then a JSON message pushed for every new notification on the subscribed displays.

kit / notifications / usecases
Use Cases

From Build Pipelines to ML Jobs.

Anywhere a long-running process needs to signal completion or failure, one HTTP POST is all it takes.

CI/CD Alerts

A long-running build finishes and a single HTTP POST raises a notification on the container display — visible in any active display session.

System Monitoring

Server alerts route to a desktop notification on the container's X11 display, with urgency set to critical so failures stay on screen until acknowledged.

Long-Running Tasks

Data exports, video rendering, ML model training, and backup jobs all notify on completion — no polling, no dashboards to babysit.

Automated Workflows

Cron jobs, scheduled tasks, and automation scripts post to /notify on success or failure, then a monitor streams those events over WebSocket.

kit / notifications / api
API REFERENCE

5 Endpoints. One Notification Server.

Trigger, fetch, and stream desktop notifications — plus icons and a health check — all over plain HTTP.

Base URL https://abc123-def456-n-1.node-us-1.containers.hoody.com

Trigger

1 endpoint

POST .../api/v1/notifications/notify

POST
/api/v1/notifications/notifyTrigger a new desktop notification on the target display via notify-send

Fetch & Stream

2 endpoints

GET .../api/v1/notifications/{display}?limit=50

GET
/api/v1/notifications/{display}Get notifications for one or more specified displays
WS
/api/v1/notifications/stream?displays=0,1Real-time notification stream over a WebSocket connection

Icons

1 endpoint

GET .../api/v1/notifications/icons/{iconId}

GET
/api/v1/notifications/icons/{iconId}Get a notification icon by its icon ID

Health

1 endpoint

GET .../api/v1/notifications/health

GET
/api/v1/notifications/healthService health check for the notification server
kit / notifications / cta

Notifications Are One HTTP POST Away.

Any script, service, or automation that can make an HTTP request can raise a desktop notification on your container display.

Read the Docs