Buffer upload → auto-rotate (EXIF) → resize to 1800px max → JPEG 82% progressive. Typical phone photo drops from 4-8 MB to ~200-400 KB. sharp prebuilt binaries include libvips so no Alpine package changes needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When a task is created or reassigned to a staff member, a push notification
is sent to any devices they have subscribed on. Keys are auto-generated on
first boot and stored in the config table (no manual VAPID setup needed).
- Backend: web-push dep, push_subscriptions table, lib/push.js (VAPID +
send), routes/push.js (vapid-key / subscribe / unsubscribe endpoints),
push notify wired into task-core createTask and tasks PATCH reassignment
- Frontend: switched vite-plugin-pwa to injectManifest strategy, custom
sw.js handles precache + push event + notificationclick, usePushSubscription
hook requests permission and registers subscription on login
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>