What I am doing now
The same activities shown on my /now page, returned as structured JSON. Updates appear after the site deploys.
Read the /now page →Open JSON ↗
Request
GET /api/nowEnglish is the default. Add ?lang=zh for Chinese or ?lang=en for English. No other query parameters are supported.
curl --fail --silent --show-error 'https://leodeng.dev/api/now'Example response
This example shows one event. The actual response includes every event, including paused and finished activities.
{
"schemaVersion": 1,
"url": "https://leodeng.dev/now",
"language": "en",
"updatedAt": "2026-10-24T13:13:19+08:00",
"detailsFormat": "markdown",
"events": [
{
"id": "ipad-2-home-assistant",
"title": "iPad 2 + Home Assistant",
"status": "active",
"startedAt": null,
"updatedAt": "2026-10-24T13:13:19+08:00",
"finishedAt": null,
"details": "Working on compatibility between my iPad 2 and my Home Assistant server."
}
]
}Response fields
| Field | Meaning |
|---|---|
schemaVersion | Response format version. Currently 1. |
url | The human-readable /now page in the requested language. Resolve relative links in details against this URL. |
language | The language of title and details: en or zh. |
updatedAt | When the content was last edited, in ISO 8601 format. This is not the request time. |
detailsFormat | Always markdown. Details are source text, without rendered HTML. |
events[] | All activities. Each has id, title, status, startedAt, updatedAt, finishedAt, and details. |
events[].id | Stable activity identifier for matching activities between requests. |
events[].status | active: building now; recurring: ongoing activity; paused: on hold; finished: completed. |
events[].startedAt / updatedAt / finishedAt | Event dates use ISO 8601 with a timezone offset when available. Missing dates are null. Preserve the supplied timezone. |
Use it from an agent
Fetch the JSON, then filter events by status. For example, this lists the activities I am actively building:
curl --fail --silent --show-error 'https://leodeng.dev/api/now' \
| jq '.events[] | select(.status == "active") | {id, title, details}'HTTP behavior
GET returns JSON. HEAD returns the same response headers without a body. OPTIONS is supported for browser requests. Cross-origin reads are allowed. Responses may be cached for up to 60 seconds; polling once a minute is plenty.
Invalid query parameters return 400 with a JSON error. Unsupported methods return 405 with an Allow header. This endpoint is read-only.