|
1 | 1 | <p align="center"> |
2 | 2 | <img width="372" src="internal/httpapi/web/githublogo.png" alt="scrumboy logo" /> |
3 | 3 | <br /> |
4 | | - <img src="https://img.shields.io/badge/version-v3.9.4-blue" alt="version" /> |
| 4 | + <img src="https://img.shields.io/badge/version-v3.10.0-blue" alt="version" /> |
5 | 5 | <a href="LICENSE"> |
6 | 6 | <img src="https://img.shields.io/badge/license-AGPL--v3-orange" alt="license" /> |
7 | 7 | </a> |
|
12 | 12 |
|
13 | 13 | <img width="2975" height="1078" alt="image" src="internal/httpapi/web/github_preview.jpg" /> |
14 | 14 |
|
| 15 | +## Table of contents |
| 16 | + |
| 17 | +- [Quick Start](#quick-start) |
| 18 | + - [Run with Docker](#run-with-docker) |
| 19 | + - [Run from source](#run-from-source) |
| 20 | +- [Optional Configuration](#optional-configuration) |
| 21 | + - [Environment variables](#environment-variables) |
| 22 | + - [Encryption key (optional)](#encryption-key-optional) |
| 23 | + - [OIDC / SSO login (optional)](#oidc--sso-login-optional) |
| 24 | + - [TLS / HTTPS (optional)](#tls--https-optional) |
| 25 | + - [Frontend build note](#frontend-build-note) |
| 26 | +- [Why Scrumboy?](#why-scrumboy) |
| 27 | +- [Who is this for?](#who-is-this-for) |
| 28 | +- [Modes](#modes) |
| 29 | +- [Features](#features) |
| 30 | +- [Integrations & API Access](#integrations--api-access) |
| 31 | + - [MCP (JSON-RPC) for AI agents](#mcp-json-rpc-for-ai-agents) |
| 32 | + - [Webhooks (outbound HTTP)](#webhooks-outbound-http) |
| 33 | +- [Config](#config) |
| 34 | +- [Roles](#roles) |
| 35 | + - [System roles (instance-wide)](#system-roles-instance-wide) |
| 36 | + - [Project roles (per project)](#project-roles-per-project) |
| 37 | +- [Export scope](#export-scope) |
| 38 | +- [Import modes](#import-modes) |
| 39 | +- [Code layout (reference)](#code-layout-reference) |
| 40 | +- [Documentation](#documentation) |
| 41 | +- [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 \ |
| 266 | + -H "Content-Type: application/json" \ |
| 267 | + -H "X-Scrumboy: 1" \ |
| 268 | + -d '{"projectId":1,"url":"https://example.com/scrumboy-hook","events":["todo.assigned"],"secret":"optional-shared-secret"}' |
| 269 | +``` |
| 270 | + |
221 | 271 |
|
222 | 272 | # Config |
223 | 273 |
|
|
0 commit comments