SnapOtter
ca2ef5b3f4
feat: add OIDC/SSO authentication (#3)
Add OpenID Connect (OIDC) authentication alongside existing
username/password login. Users can log in via any standards-compliant
OIDC provider (Keycloak, Authentik, Authelia, Google, Azure AD, Okta)
while preserving full backward compatibility.
- OIDC Fastify plugin with lazy discovery, PKCE, cookie-based sessions
- Login page OIDC button, auth hook updates, settings dialog badges
- 28 integration tests, OIDC setup guide with provider examples
- Fix pre-existing test failures (content-aware-crop, watermark, SVGZ)
- WAL checkpoint fix for SQLite test stability
Closes #3
# Conflicts:
# apps/api/src/lib/env.ts
# apps/api/src/routes/tools/watermark-image.ts
# pnpm-lock.yaml
# tests/integration/color-palette.test.ts
# tests/integration/compare.test.ts
# tests/integration/watermark-image.test.ts
2026-05-14 22:31:26 +08:00
..
2026-05-12 23:19:20 +08:00
2026-05-09 18:02:58 +08:00
2026-05-12 23:19:20 +08:00
2026-05-12 23:19:20 +08:00
2026-05-12 23:19:20 +08:00
2026-04-24 23:50:47 +08:00
2026-05-13 15:47:28 +08:00
2026-04-29 23:47:19 +08:00
2026-04-22 18:10:04 +08:00
2026-05-07 19:41:30 +08:00
2026-05-14 17:42:07 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-05-09 09:02:29 +08:00
2026-05-13 10:05:42 +08:00
2026-05-08 21:10:39 +08:00
2026-05-01 19:51:47 +08:00
2026-05-09 18:02:58 +08:00
2026-05-09 18:02:58 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-08 15:18:38 +08:00
2026-05-14 17:42:07 +08:00
2026-05-01 19:51:47 +08:00
2026-05-14 17:42:07 +08:00
2026-05-09 09:02:29 +08:00
2026-05-11 17:33:51 +08:00
2026-04-26 12:03:08 +08:00
2026-05-01 19:51:47 +08:00
2026-05-11 21:57:40 +08:00
2026-05-01 19:51:47 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-04-24 18:06:29 +08:00
2026-05-14 16:59:40 +08:00
2026-05-01 19:51:47 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 13:45:08 +08:00
2026-04-22 18:10:04 +08:00
2026-05-09 18:02:58 +08:00
2026-05-12 03:58:42 +08:00
2026-05-13 11:35:33 +08:00
2026-05-01 02:26:52 +08:00
2026-05-09 19:52:11 +08:00
2026-05-09 09:02:29 +08:00
2026-05-14 17:53:40 +08:00
2026-04-26 12:03:08 +08:00
2026-05-09 19:52:11 +08:00
2026-05-09 18:02:58 +08:00
2026-05-11 22:47:10 +08:00
2026-05-09 18:02:58 +08:00
2026-05-08 16:13:34 +08:00
2026-05-08 15:17:18 +08:00
2026-05-01 19:51:47 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 19:30:37 +08:00
2026-05-09 18:02:58 +08:00
2026-04-22 18:10:04 +08:00
2026-05-01 19:51:47 +08:00
2026-04-26 12:03:08 +08:00
2026-04-22 18:10:04 +08:00
2026-05-13 10:05:42 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-07 19:41:30 +08:00
2026-04-22 18:10:04 +08:00
2026-05-01 19:51:47 +08:00
2026-05-01 19:51:47 +08:00
2026-05-09 18:02:58 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 16:59:13 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 21:33:50 +08:00
2026-05-13 21:33:50 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 09:02:29 +08:00
2026-05-12 23:19:20 +08:00
2026-03-26 01:10:51 +08:00
2026-05-14 10:46:24 +08:00
2026-05-09 18:02:58 +08:00
2026-05-13 16:18:28 +08:00
2026-05-01 19:51:47 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-14 17:42:07 +08:00
2026-05-09 18:02:58 +08:00