Skip to content

Commit d410ab5

Browse files
authored
Merge pull request #39 from markrai/refinements_and_docs
multiple UX refinements, PWA enablement, and docs
2 parents 844f9f9 + b9bb1db commit d410ab5

20 files changed

Lines changed: 1109 additions & 52 deletions

File tree

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,28 @@
33
> **Upgrades:** No breaking changes in **3.7.x** / **3.8.x** / **3.9.x** / **3.10.x** / **3.11.x** unless noted below.
44
55

6+
## [3.11.3] - 2026-04-05
7+
8+
### Features
9+
10+
- **Board (mobile)** — When a todo drag starts, lane tabs briefly flash (**300ms**) so it is obvious they accept drops; tab labels stay readable above the drop overlays.
11+
- **Web Push (PWA)** — After sign-in, the client auto-subscribes when **both** VAPID keys are set on the server; **`SCRUMBOY_PUSH_BY_DEFAULT_IF_VAPID`** removed (VAPID presence is the operator signal). Per-user autosub progress in **localStorage** with resilient retry when the permission prompt is dismissed vs blocked.
12+
13+
### Fixes
14+
15+
- **Board (drag-and-drop)** — Success toast **“Todo moved to …”** only when the todo changes **lane**; same-lane reorder no longer shows a redundant toast (lane titles still come from the board workflow, not hardcoded names).
16+
17+
### Improvements
18+
19+
- **Settings → Customization****Background notifications (PWA)** is grayed out with a one-line notice when Web Push is unavailable (no VAPID on the server, or anonymous board mode).
20+
21+
### Documentation
22+
23+
- **`docs/mcp.md`** — MCP documentation added/expanded.
24+
- **`docs/pwa.md`** — Push flow and env vars aligned with streamlined enablement; key generation note includes **[VapidKeys.com](https://vapidkeys.com/)**.
25+
26+
---
27+
628
## [3.11.2] - 2026-04-04
729

830
### Fixes

README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<p align="center">
22
<img width="372" src="internal/httpapi/web/githublogo.png" alt="scrumboy logo" />
33
<br />
4-
<img src="https://img.shields.io/badge/version-v3.11.2-blue" alt="version" />
4+
<img src="https://img.shields.io/badge/version-v3.11.3-blue" alt="version" />
55
<a href="LICENSE">
66
<img src="https://img.shields.io/badge/license-AGPL--v3-orange" alt="license" />
77
</a>
@@ -22,6 +22,7 @@
2222
- [Encryption key (optional)](#encryption-key-optional)
2323
- [OIDC / SSO login (optional)](#oidc--sso-login-optional)
2424
- [TLS / HTTPS (optional)](#tls--https-optional)
25+
- [PWA / Web Push (optional)](#pwa--web-push-optional)
2526
- [Frontend build note](#frontend-build-note)
2627
- [Why Scrumboy?](#why-scrumboy)
2728
- [Who is this for?](#who-is-this-for)
@@ -109,6 +110,10 @@ See [`docs/oidc.md`](docs/oidc.md) for full setup details, constraints, and trou
109110
- HTTPS is enabled only when both `SCRUMBOY_TLS_CERT` and `SCRUMBOY_TLS_KEY` files exist.
110111
- Otherwise, the server runs on HTTP by default.
111112

113+
### PWA / Web Push (optional)
114+
115+
Install the app from the browser for a standalone window and better mobile UX. **Background assignment alerts** use the **Web Push API** with **VAPID** keys on the server. When both keys are set, signed-in clients attempt to subscribe automatically (browser permission may be prompted). Details and subscriber contact semantics: **[`docs/pwa.md`](docs/pwa.md)**.
116+
112117
### Frontend build note
113118

114119
The Docker image and `go run` embed prebuilt assets under `internal/httpapi/web/dist`. If they are missing, build them:
@@ -167,7 +172,7 @@ Simplicity of a light Kanban, with the power of structured systems: Roles, sprin
167172

168173
## Integrations & API Access
169174

170-
Scrumboy supports API access tokens for automation, integrations, and programmatic MCP access (legacy HTTP and JSON-RPC — see below).
175+
Scrumboy supports API access tokens for automation, integrations, and programmatic MCP access (legacy HTTP and JSON-RPC — see below). Full MCP guide for developers and agents: [`docs/mcp.md`](docs/mcp.md).
171176

172177
You can create a token from the API and use it to call MCP endpoints directly — no browser session or cookies required.
173178

@@ -197,7 +202,7 @@ Scrumboy exposes a **Model Context Protocol (MCP) compatible JSON-RPC endpoint**
197202

198203
**Endpoint:** `POST /mcp/rpc`
199204

200-
This is separate from the `/mcp` HTTP endpoint above and follows **JSON-RPC 2.0** (`initialize`, `tools/list`, `tools/call`, etc.). See [`API.md`](API.md) for full detail.
205+
This is separate from the `/mcp` HTTP endpoint above and follows **JSON-RPC 2.0** (`initialize`, `tools/list`, `tools/call`, etc.). See **[`docs/mcp.md`](docs/mcp.md)** for tools, auth, response shapes, and examples; **[`API.md`](API.md)** for the full HTTP/MCP behavior reference.
201206

202207
#### Example: `initialize`
203208

@@ -288,9 +293,9 @@ None of these are required for basic startup.
288293
| `SCRUMBOY_TLS_CERT` | `./cert.pem` - TLS cert for HTTPS |
289294
| `SCRUMBOY_TLS_KEY` | `./key.pem` - TLS key for HTTPS |
290295
| `SCRUMBOY_INTRANET_IP` | `192.168.1.250` - LAN IP to log for intranet access |
291-
| `SCRUMBOY_VAPID_PUBLIC_KEY` | (empty) - **Web Push.** VAPID public key (URL-safe base64). Required together with private key for PWA background assignment notifications. |
296+
| `SCRUMBOY_VAPID_PUBLIC_KEY` | (empty) - **Web Push.** VAPID public key (URL-safe base64). Required together with private key for PWA background assignment notifications and for post-login auto-subscribe in the SPA. |
292297
| `SCRUMBOY_VAPID_PRIVATE_KEY` | (empty) - VAPID private key (URL-safe base64). |
293-
| `SCRUMBOY_VAPID_SUBSCRIBER` | (empty) - Contact URL for VAPID `sub` claim (e.g. `mailto:ops@example.com`). Defaults to `mailto:scrumboy@localhost` if unset. |
298+
| `SCRUMBOY_VAPID_SUBSCRIBER` | (empty) - Contact for VAPID JWT `sub` (not tied to IdP). Use a **plain email** (e.g. `ops@example.com`); the server adds `mailto:`. Or set a full `mailto:...` or `https://...` URL explicitly. If unset, a built-in default is used. |
294299
| `SCRUMBOY_DEBUG_PUSH` | (empty) - Set to `1` to log push send/prune on the server. |
295300

296301
`docker-compose.yml` overrides some of these (e.g. `SQLITE_BUSY_TIMEOUT_MS=5000`).
@@ -369,6 +374,8 @@ Invariants (e.g. canonical URL `/{slug}`, no UI links to `/p/{id}`) are enforced
369374

370375
# Documentation
371376

377+
- **MCP (HTTP tools + JSON-RPC):** [`docs/mcp.md`](docs/mcp.md) — tool catalog, auth, legacy vs `/mcp/rpc`, examples (agents & automation). See also [`API.md`](API.md) for exhaustive MCP HTTP detail.
378+
- **PWA / Web Push (VAPID):** [`docs/pwa.md`](docs/pwa.md) - keys, subscriber contact, post-login auto-subscribe when VAPID is configured, Settings opt-out, tradeoffs.
372379
- **Roles and permissions:** `docs/ROLES_AND_PERMISSIONS.md` - project roles, backend authorization, anonymous boards.
373380
- **Audit trail:** `docs/AUDIT_TRAIL.md` - action vocabulary, event model, integration points.
374381

cmd/scrumboy/main.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,16 @@ func main() {
8989
}
9090

9191
srv := httpapi.NewServer(st, httpapi.Options{
92-
Logger: logger,
93-
MaxRequestBody: cfg.MaxRequestBodyBytes,
94-
ScrumboyMode: cfg.ScrumboyMode,
95-
MCPHandler: mcp.New(st, mcp.Options{Mode: cfg.ScrumboyMode}),
96-
EncryptionKey: encKey,
97-
OIDCService: oidcSvc,
98-
VAPIDPublicKey: cfg.VAPIDPublicKey,
99-
VAPIDPrivateKey: cfg.VAPIDPrivateKey,
100-
VAPIDSubscriber: cfg.VAPIDSubscriber,
101-
PushDebug: cfg.PushDebug,
92+
Logger: logger,
93+
MaxRequestBody: cfg.MaxRequestBodyBytes,
94+
ScrumboyMode: cfg.ScrumboyMode,
95+
MCPHandler: mcp.New(st, mcp.Options{Mode: cfg.ScrumboyMode}),
96+
EncryptionKey: encKey,
97+
OIDCService: oidcSvc,
98+
VAPIDPublicKey: cfg.VAPIDPublicKey,
99+
VAPIDPrivateKey: cfg.VAPIDPrivateKey,
100+
VAPIDSubscriber: cfg.VAPIDSubscriber,
101+
PushDebug: cfg.PushDebug,
102102
})
103103
st.SetTodoAssignedPublisher(srv.PublishTodoAssigned)
104104

0 commit comments

Comments
 (0)