Ulas Kalayci
7795a737c5
feat(installer): add web-based installer server and UI
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-21 13:23:06 +02:00
Ulas Kalayci
1ef4783902
feat(installer): add CLI install script
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-21 13:13:46 +02:00
Ulas Kalayci
7b663e08d4
chore: release v0.20.43
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-21 13:10:47 +02:00
Ulas Kalayci
e4b97368fb
feat(api): add first-run setup endpoint for admin bootstrap
...
POST /api/v1/auth/setup — unauthenticated, only succeeds when the
users table is empty. Enables first-admin creation via HTTP for
Docker deployments without shell access to the container volume.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-04-21 13:10:41 +02:00
Ulas Kalayci
143582458e
docs(installer): add reconnaissance findings and implementation plan
2026-04-21 12:49:45 +02:00
Ulas Kalayci
8f55855364
chore: release v0.20.42
2026-04-21 10:38:45 +02:00
ulsklyc
d1ec7367a0
fix(auth): resolve post-login navigate race condition and add version display ( #68 ) ( #70 )
...
Root cause: when auth.me() failed during initial navigation, the catch block
called navigate('/login') without clearing _pendingLoginRedirect. The outer
finally then fired a second concurrent navigate('/login'), which held
isNavigating=true while running. If the user submitted the login form (or
iCloud Keychain autofilled credentials) before the second navigation
completed, navigate('/', user) was silently blocked by the isNavigating guard —
login appeared to succeed but the app never advanced to the dashboard.
Fix: clear _pendingLoginRedirect in the catch block so the finally handler
does not spawn the duplicate navigation.
Also adds a GET /api/v1/version endpoint (no auth required) and shows the
version on the login page, so users can verify their PWA has received the
latest cached JS.
Resolves #68
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com >
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-21 08:19:53 +02:00
Ulas Kalayci
c1bdd4361d
chore: release v0.20.40
2026-04-21 06:55:52 +02:00
Ulas Kalayci
a8a50d31c5
chore: release v0.20.39
2026-04-21 06:52:52 +02:00
Ulas Kalayci
1570703f47
chore: release v0.20.38
2026-04-21 00:07:12 +02:00
Ulas Kalayci
1859d6a55b
fix(calendar): use dedicated resetToast key, explicit user_modified === 1 check
2026-04-21 00:06:53 +02:00
Ulas Kalayci
4aa8eefb51
feat(calendar): show reset link for user-modified ICS events in event popup
2026-04-21 00:04:29 +02:00
Ulas Kalayci
55cac140ef
fix(settings): move ICS card below Apple Calendar, fix toast messages, use syncing key
2026-04-21 00:03:14 +02:00
Ulas Kalayci
4f10f334fb
feat(settings): add ICS subscription management UI and i18n keys
2026-04-21 00:00:33 +02:00
Ulas Kalayci
21f1a382c8
feat(i18n): add ICS subscription locale keys
2026-04-20 23:58:35 +02:00
Ulas Kalayci
3cd5f31c0d
fix(calendar): NaN guard on subscription IDs, user_modified for all external sources
2026-04-20 23:57:15 +02:00
Ulas Kalayci
ed0618cf75
fix(calendar): apply ICS visibility filter to /upcoming endpoint
2026-04-20 23:55:20 +02:00
Ulas Kalayci
466860074a
feat(calendar): add ICS subscription routes and sync integration
...
- Add CRUD routes for /subscriptions (GET, POST, PATCH, DELETE)
- Add manual sync trigger: POST /subscriptions/:id/sync
- Add ICS visibility filter to GET /calendar (private vs. shared)
- Set user_modified=1 on PUT /:id for ICS events
- Add POST /:id/reset to clear user_modified on ICS events
- Wire icsSubscription.sync() into runSync() in server/index.js
2026-04-20 23:53:53 +02:00
Ulas Kalayci
3445e504a2
fix(ics): add color to ON CONFLICT DO UPDATE and per-iteration try/catch in sync loop
2026-04-20 23:46:06 +02:00
Ulas Kalayci
4d585fb288
fix(calendar): extend SSRF guard to cover fd00::/8 IPv6 ULA range
2026-04-20 23:40:38 +02:00
Ulas Kalayci
8559f98518
chore: release v0.20.37
2026-04-20 23:39:00 +02:00
Ulas Kalayci
7f1a199e33
feat(calendar): add ICS subscription service (fetchAndParse, sync, CRUD)
2026-04-20 23:38:46 +02:00
Ulas Kalayci
a4250b46ab
fix(calendar): add IF NOT EXISTS to idx_calendar_sub_extid unique index
2026-04-20 23:36:48 +02:00
Ulas Kalayci
8e042ad932
fix(calendar): add missing idx_calendar_sub to db-schema-test MIGRATIONS_SQL[11]
2026-04-20 23:34:41 +02:00
Ulas Kalayci
a64635b669
feat(calendar): add ics_subscriptions table and calendar_events columns (migrations v10-v11)
2026-04-20 23:32:42 +02:00
Ulas Kalayci
8479072afd
refactor(calendar): fix ics-parser module header and test chain consistency
2026-04-20 23:29:28 +02:00
Ulas Kalayci
583a1bdf23
refactor(calendar): extract ICS parser into shared ics-parser.js module
2026-04-20 23:25:50 +02:00
Ulas Kalayci
faa3c0159b
docs: add ICS subscription implementation plan
2026-04-20 23:18:00 +02:00
Ulas Kalayci
2419efbeaf
docs: add reviewed ICS subscription v2 spec
2026-04-20 23:06:44 +02:00
Ulas Kalayci
0b8c0213a1
docs: fix ambiguities in ICS subscription spec
2026-04-20 22:53:34 +02:00
Ulas Kalayci
a68b02ca04
docs: add ICS subscription design spec
2026-04-20 22:53:08 +02:00
ulsklyc
9ad1165d48
fix(auth): skip auth:expired dispatch for 401 on /auth/login ( #69 )
...
On Safari/iOS PWA cold start or after cookie clear, logging in with wrong
credentials triggered auth:expired, re-rendering the login page and losing
the error message. The login endpoint returns 401 for invalid credentials,
not for session expiry, so apiFetch must not fire auth:expired in that path.
Resolves #68
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com >
2026-04-20 21:37:29 +02:00
Ulas Kalayci
554024b67c
chore: release v0.20.33
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 13:12:43 +02:00
ulsklyc
c6e5d3cb4f
Fix Min/Max Temperature Aggregation for Forecast in Weather Widget ( #67 )
...
Fix Min/Max Temperature Aggregation for Forecast in Weather Widget
2026-04-20 13:12:04 +02:00
Konrad M.
14a5b4b76d
Update CHANGELOG.md
...
update changelog
2026-04-20 12:46:21 +02:00
Konrad M.
573e1553b8
fix weather forecast min/max values aggregation
2026-04-20 10:36:42 +00:00
Ulas Kalayci
4f7b73cf81
chore: release v0.20.32
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 12:05:40 +02:00
Ulas Kalayci
ecd4453b71
chore: release v0.20.31
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 11:02:00 +02:00
Ulas Kalayci
66f4cda41b
chore: release v0.20.30
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 10:53:56 +02:00
Ulas Kalayci
24dca4ed19
chore: release v0.20.29
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 10:50:55 +02:00
Ulas Kalayci
09b339e5f9
fix: use CSS media query as authoritative dark mode source for system preference
2026-04-20 10:37:24 +02:00
Ulas Kalayci
ca3da0eccd
fix: system theme selection immediately applies OS preference instead of reverting to light
2026-04-20 10:20:18 +02:00
Ulas Kalayci
e92487f464
feat: add FAB to meals page for quick meal creation ( #62 )
2026-04-20 10:15:04 +02:00
Ulas Kalayci
30d3d6cd13
fix: theme reverts to light on reload when system preference stored ( #61 )
2026-04-20 10:08:07 +02:00
Ulas Kalayci
e48d249fbe
chore: release v0.20.24
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 10:05:12 +02:00
Ulas Kalayci
aae895d704
feat: filter panel + english category keys
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 09:50:55 +02:00
Ulas Kalayci
b867917995
feat: kanban touch drag, swipe undo, dashboard task deep-link
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 09:44:50 +02:00
Ulas Kalayci
c8e20b22c8
chore: release v0.20.21
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 07:36:07 +02:00
Ulas Kalayci
87be39364d
chore: release v0.20.20
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-20 07:17:30 +02:00
Ulas Kalayci
40fc080c3a
chore: release v0.20.19
2026-04-20 07:09:07 +02:00