You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+36-1Lines changed: 36 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,35 @@
1
1
# Changelog
2
2
3
-
> **Upgrades:** No breaking changes in **3.7.x** / **3.8.x** / **3.9.x** unless noted below.
3
+
> **Upgrades:** No breaking changes in **3.7.x** / **3.8.x** / **3.9.x**/ **3.10.x**unless noted below.
4
4
5
5
6
+
## [3.10.0] - 2026-04-04
7
+
8
+
### Features
9
+
10
+
-**Event bus + SSE** — **`internal/eventbus`** fanout; **`PublishEvent`** on the server. Board refresh / members events go through the bus; **`sseBridge`** keeps the same SSE JSON as before.
11
+
-**`todo.assigned`** — Published after commit from **`CreateTodo`** / **`UpdateTodo`** when assignee changes (non-anonymous temp boards). SSE uses reason **`todo_assigned`**; handlers skip duplicate **`todo_created`** / **`todo_updated`** refresh when **`AssignmentChanged`**.
12
+
-**Webhooks (full mode)** — **`POST` / `GET` / `DELETE`****`/api/webhooks`** (maintainer, session; **404** in anonymous mode). Migration **050**; optional HMAC **`X-Scrumboy-Signature`**; async queue + worker, retries, JSON envelope with event **`id`** (for idempotency). Dispatcher enqueues in a goroutine with a detached context so SSE is not blocked.
13
+
14
+
### Fixes
15
+
16
+
-**Shutdown** — HTTP **`Shutdown`** before cancelling the webhook worker.
17
+
-**CreateTodo** — Same **`!isAnonymousBoard`** gate as **`UpdateTodo`** for assignment events.
-**OIDC / SSO - account linking for existing users** — When a user signs in with **Continue with SSO** and the IdP returns a **verified** email that already matches a **`users`** row (e.g. bootstrap owner or admin-created account from before OIDC), Scrumboy now **links** the **`(issuer, subject)`** identity in **`user_oidc_identities`** to that user instead of failing with a duplicate-email conflict. Local password hashes are unchanged; SSO and password login can both work for the same account when local auth remains enabled. Integration test **`TestOIDCAutoLinkExistingUser`** covers the full callback flow; the test **fake IdP** now relays **`nonce`** from authorize → token so end-to-end OIDC tests match real providers.
30
+
31
+
---
32
+
6
33
## [3.9.3] - 2026-04-05
7
34
8
35
### Improvements
@@ -15,6 +42,14 @@
15
42
16
43
---
17
44
45
+
## [3.9.2] - (no release)
46
+
47
+
### Note
48
+
49
+
-**Version number skipped in git** — There is no commit in this repository that sets **`internal/version/version.go`** to **3.9.2**, and no **`README`** / **`CHANGELOG`** reference to **3.9.2** before this note. After **3.9.1**, the next bump was **3.9.3** (commit **`2c5b576`**, *multiple UX enhancements…*). No separate user-facing changes are recorded under **3.9.2**; see **3.9.1** (OIDC **`dist/`** rebuild) and **3.9.3** (UX items above) for work in that window.
-[License and Contributions](#license-and-contributions)
42
+
15
43
## Quick Start
16
44
17
45
Runs in seconds. No setup required.
@@ -117,6 +145,8 @@ Simplicity of a light Kanban, with the power of structured systems: Roles, sprin
117
145
118
146
- Realtime SSE enabled boards for instant multi-user actions.
119
147
148
+
-**Webhooks (API-only, full mode):** Register URLs per project so Scrumboy can POST JSON when subscribed domain events fire (e.g. `todo.assigned`). For your own automations—not in-app or browser notifications. See [Integrations](#integrations--api-access).
149
+
120
150
- Customizable Tags: Users can inherit and customize tag colors.
121
151
122
152
- Advanced filtering: Search todos based on text or tags.
@@ -218,6 +248,26 @@ This enables:
218
248
- AI agents and MCP clients (use **`POST /mcp/rpc`** for JSON-RPC; **`POST /mcp`** remains available for the legacy `{ "tool", "input" }` envelope)
219
249
- Scripting/integrations without login flows
220
250
251
+
### Webhooks (outbound HTTP)
252
+
253
+
Scrumboy can **POST JSON to URLs you register** when certain events occur. This is for **server-side integrations** (your script, gateway, queue worker, etc.). It does **not** add notifications inside the Scrumboy UI; live boards still update via **SSE** as before.
254
+
255
+
-**Availability:****Full mode only** (endpoints are disabled in anonymous mode).
256
+
-**Who can configure:** Project **maintainers**, via the HTTP API only—there is **no settings screen** for webhooks yet.
257
+
-**API:**`POST /api/webhooks` (create), `GET /api/webhooks` (list yours), `DELETE /api/webhooks/{id}` — same session cookie / CSRF header rules as other mutating `/api/*` calls.
258
+
-**Events:** Subscribe to specific types (e.g. `todo.assigned`) or `*` for all delivered types. The set may grow over time; unused types in your list are harmless.
259
+
-**Security:** Optional per-webhook **secret**; when set, requests include an `X-Scrumboy-Signature` header (`sha256=` HMAC of the raw JSON body).
260
+
-**Semantics:** Best-effort delivery with retries on failure; not a durable external queue—design for idempotent receivers using the event `id` in the JSON body.
261
+
262
+
Example create (replace cookie / project id / URL):
263
+
264
+
```bash
265
+
curl -b cookies.txt -X POST http://localhost:8080/api/webhooks \
0 commit comments