Commit Graph

782 Commits

Author SHA1 Message Date
Ulas Kalayci d00bb0aaa8 Redesign GitHub Pages: Hero-Layout, Sektionsreihenfolge, Dark Mode Farben
- Hero: Tablet-Screenshot neben Überschrift platziert, mobile Screenshot entfernt
- Grid-Layout für Hero-Bereich (Text links, Bild rechts)
- Sektionsreihenfolge: "Your Data. Your Private Place" vor "Features"
- Dark Mode Farben an App-Design angepasst (aus tokens.css):
  - Neutral-Skala: #1A1A18, #222220 statt #111015, #222130
  - Akzent: #818CF8 (Indigo-400) statt #A78BFA
  - Konsistente Farbgebung mit der App
- Responsive Design für neues Layout angepasst

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 12:55:30 +02:00
Ulas Kalayci 82f1a76a5d Update GitHub Page design and screenshots
- Implement modern design with DM Serif Display + DM Sans fonts
- Switch accent color to purple/violet (#6C3AED / #A78BFA)
- Add hero section with desktop + mobile mockups
- Add feature showcase with alternating layouts
- Add screenshot carousel
- Update all screenshots to new versions
- Maintain dark/light mode and EN/DE language support

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 12:36:20 +02:00
Ulas Kalayci dd5ba80541 Reorder GitHub Pages sections: Preview before Features
Improved content flow by showing screenshots (Preview section) before the Features section, giving visitors a visual first impression before diving into the feature list.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 11:29:11 +02:00
Ulas Kalayci f1dd8e5161 docs: update screenshots to reflect current UI state
Replace old screenshots with new ones showing updated dashboard design and weather widget. Update README to display mobile + desktop side-by-side, regenerate social preview images with new dashboard screenshot.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 11:22:37 +02:00
Ulas Kalayci 289b079f47 chore: bump version to 0.47.2
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 07:06:29 +02:00
dependabot[bot] 46aa5774e8 chore(deps): bump the production-dependencies group with 2 updates (#124)
Bumps the production-dependencies group with 2 updates: [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) and [tsdav](https://github.com/natelindev/tsdav).


Updates `express-rate-limit` from 8.4.1 to 8.5.0
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v8.4.1...v8.5.0)

Updates `tsdav` from 2.1.8 to 2.2.0
- [Release notes](https://github.com/natelindev/tsdav/releases)
- [Changelog](https://github.com/natelindev/tsdav/blob/main/CHANGELOG.md)
- [Commits](https://github.com/natelindev/tsdav/compare/v2.1.8...v2.2.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-version: 8.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: tsdav
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 07:04:14 +02:00
Ulas Kalayci fd5423f6c5 chore: bump version to 0.47.1
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 22:28:17 +02:00
Ulas Kalayci bc61311ebc fix(settings): resolve scope error for CalDAV/CardDAV load functions
Root cause: loadCalDAVAccounts and loadCardDAVAccounts were defined
inside the render function but called from bindIcsEvents (outside render),
causing ReferenceError when accessing Settings page.

Changes:
- Move loadCalDAVAccounts and loadCardDAVAccounts to top-level functions
- Add user parameter to both functions (no longer in render scope)
- Update all recursive calls to pass user parameter
- Move initial load code from bindIcsEvents to render function

Fixes the "loadCalDAVAccounts is not defined" error in v0.47.0.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 22:27:48 +02:00
Ulas Kalayci 10ef7006cd chore: bump version to v0.47.0
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 21:51:21 +02:00
Ulas Kalayci 6cdef0102c feat(settings): add dedicated Sync tab with CardDAV contacts integration
- Rename Calendar tab to Synchronization with two sections:
  * Calendar Sync (Google, Apple, CalDAV, ICS)
  * Contact Sync (CardDAV) - NEW
- Add visual tab grouping with CSS separators between sections
- Implement CardDAV account management UI:
  * Add/delete accounts
  * Enable/disable addressbooks
  * Manual sync trigger
  * Connection testing
- Add UX improvements:
  * Status badges (success/error/syncing)
  * Empty states with onboarding
  * Inline help tooltips (prepared)
  * Breadcrumb navigation (prepared)
- Update i18n keys in all 14 locales
- All 109 tests passing

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 21:50:59 +02:00
Ulas Kalayci 43225ee20c chore: bump version to v0.46.0 2026-05-04 20:32:26 +02:00
Ulas Kalayci 83d816c01b Merge branch 'feature/birthday-reminders' 2026-05-04 20:31:48 +02:00
Ulas Kalayci 82a1f2c239 feat: add flexible reminder options for birthdays
Add support for customizable birthday reminders with preset offsets
(none, at time, 15min, 1h, 1d, 2d, 1w, 2w) and custom intervals.
Users can now configure when to be reminded of upcoming birthdays.

- Add migration 31: reminder_offset, reminder_custom_amount, reminder_custom_unit to birthdays table
- Update POST/PUT /birthdays routes to accept reminder fields
- Add getOffsetMinutes() helper in birthday service
- Update birthdayReminderAt() to calculate reminder time with offset
- Modify syncBirthdayReminder() to handle empty offset (no reminder)
- Add renderBirthdayReminderSection() UI component
- Move reminder-custom CSS from calendar.css to reminders.css
- Add protocol check to service worker (non-http protocol guard)

All translations already present in de.json.
Tests: 109 passing, 0 failing.

Co-Authored-By: Rafael Foster <rafaelfoster@users.noreply.github.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:31:42 +02:00
Ulas Kalayci df45fba70e docs: update README Contacts module description
Reflect v0.45.0 CardDAV multi-account sync and multi-value contact
fields (multiple phones/emails/addresses per contact).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:10:30 +02:00
Ulas Kalayci 84664279c3 docs: update BACKLOG and remove emojis from CHANGELOG
- BACKLOG.md: remove BL-11 (implemented in v0.45.0), strip "Completed
  Features" section (CHANGELOG is authoritative source)
- CHANGELOG.md: no emojis found (already clean)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:10:11 +02:00
Ulas Kalayci 601d136a70 docs: remove session-specific PROGRESS.md
Remove CardDAV v0.45.0 session tracking document. Information is
preserved in git history, CHANGELOG.md, and archived design docs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:09:31 +02:00
Ulas Kalayci dd16078f7a docs: archive implemented plans, specs, and design documents
Move completed implementation plans (2026-04-20), design specs,
and audit documents to docs/archive/ for historical reference
while keeping the main docs/ directory focused on active
documentation.

Archived:
- 1 implementation plan (superpowers/plans/)
- 2 design specs (superpowers/specs/)
- 3 design documents (designs/)
- 5 audit/proposal documents (root level)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:09:23 +02:00
Ulas Kalayci 7349037880 docs: add repo cleanup design specification
Design document for comprehensive repository and documentation
maintenance after v0.45.0 release. Covers archiving strategy for
implemented plans/specs, BACKLOG/CHANGELOG updates, and README
improvements.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:06:44 +02:00
Ulas Kalayci d371e2b554 chore: release v0.45.0
CardDAV contacts integration with multi-value fields

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 19:11:20 +02:00
Ulas Kalayci 9c4f876c5b Merge branch 'feature/cardav-contacts'
# Conflicts:
#	package-lock.json
2026-05-04 19:10:13 +02:00
Ulas Kalayci fe0254e225 docs: update PROGRESS.md - all 15 tasks completed
Tasks 14-15 documentation:
- Task 14: OpenAPI routes documented (d0eb638)
- Task 15: CardDAV router mounted (8891097)

All 109 tests passing across 20 suites.
Implementation ready for final review and release.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:39:19 +02:00
Ulas Kalayci 8891097c7b feat(server): mount CardDAV router at /api/v1/contacts/cardav
Import and mount cardavRouter with requireAuth middleware. All
CardDAV management routes now accessible under /api/v1/contacts/cardav.

Router mounted BEFORE contacts router to ensure /api/v1/contacts/cardav
paths match before /api/v1/contacts.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:37:56 +02:00
Ulas Kalayci d0eb63840f docs(openapi): add CardDAV routes and update contacts routes
Document 8 CardDAV management routes (accounts, addressbooks, sync)
and update 3 existing contacts routes to reflect multi-value field
support.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:37:05 +02:00
ulsklyc 8f87b295e9 Update FUNDING.yml 2026-05-04 18:33:28 +02:00
Ulas Kalayci 0dc303b81a feat(contacts): add multi-value fields support to PUT /contacts/:id
Extend PUT /contacts/:id route to support updating phones, emails, and
addresses arrays with replacement semantics. Uses atomic transactions
to DELETE all existing multi-values then INSERT new ones. Validates
all multi-value fields before updating. Response includes full contact
with multi-value fields via loadMultiValueFields() helper.

Backward compatible: multi-value fields only replaced when present in
request body. Scalar fields (name, category, etc.) continue to work
independently.

Tests added:
- Update with multi-value fields (replacement semantics verified)
- Validation error on invalid phone data (400)
- Backward compatibility: update without multi-values preserves them

All 109 tests pass.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:31:01 +02:00
ulsklyc 3a8a7dd3b0 Update Buy Me a Coffee username in FUNDING.yml 2026-05-04 18:29:58 +02:00
Ulas Kalayci 9e346dca5f docs: update PROGRESS.md for Task 12 completion 2026-05-04 18:25:30 +02:00
Ulas Kalayci 966a6d46e3 feat(contacts): add POST /contacts with multi-value fields
Implements Task 12: Extend POST /contacts to accept and persist phones,
emails, and addresses arrays. Uses atomic transactions to ensure all
related records are created together or rolled back on error.

- Validation: validatePhones/Emails/Addresses before insert
- Transaction: db.transaction() for atomic Contact + Multi-Values
- Backward compatible: Multi-value fields are optional
- Refactoring: Extracted loadMultiValueFields() helper (DRY)
- Response includes all multi-value fields with generated IDs

Tests: 3 new tests (create with multi-values, validation, backward compat)
TDD workflow: RED → GREEN → REFACTOR → Commit

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:25:18 +02:00
Ulas Kalayci 859a205299 docs: update PROGRESS.md for Task 11 completion 2026-05-04 18:18:38 +02:00
Ulas Kalayci fe8af33568 feat(contacts): add GET /contacts/:id with multi-value fields
Implements Task 11: Extend GET /contacts/:id to include phones, emails,
and addresses arrays. Each multi-value field is queried from its respective
table (contact_phones, contact_emails, contact_addresses) and mapped to
camelCase response format with isPrimary boolean conversion.

Tests: 2 new tests (contact with multi-values, empty arrays)
TDD workflow: RED → GREEN → Commit

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:18:07 +02:00
Ulas Kalayci 6e02c9e5b6 docs: session 2 handoff - Tasks 9-10 complete, ready for Task 11
Session 2 Summary:
- Task 9: PUT /addressbooks/:id (toggle enabled/disabled)
- Task 10: POST /accounts/:id/sync (with _mockSyncAccount)
- 101 tests passing (16 suites)
- Ready for Task 11: GET /contacts/:id with multi-value fields

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:57:41 +02:00
Ulas Kalayci 112cf55e66 docs: update PROGRESS.md for completed Task 10
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:54:45 +02:00
Ulas Kalayci 674fe796b3 feat(cardav): implement POST /accounts/:id/sync endpoint
Adds route to sync all enabled addressbooks for an account with mock support for tests.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:54:03 +02:00
Ulas Kalayci f895776911 docs: update PROGRESS.md for completed Task 9
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:47:55 +02:00
Ulas Kalayci 9ec7fda6b0 feat(cardav): implement PUT /addressbooks/:id endpoint
Adds route to toggle addressbook enabled/disabled state with bool validation.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:47:26 +02:00
Ulas Kalayci 749e6ac79b docs: update PROGRESS.md for Tasks 6-8 completion (session pause) 2026-05-04 17:36:57 +02:00
Ulas Kalayci 362f711290 feat(validate): add bool validator
Add boolean field validator for use in CardDAV addressbook toggle
route and other boolean validation needs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:13:54 +02:00
Ulas Kalayci c078a48884 feat(cardav): implement POST /accounts/:id/addressbooks/refresh endpoint
Add addressbook refresh route. Loads account from DB, delegates to
CardDAVSync.discoverAddressbooks() to run PROPFIND, then returns
updated addressbook list from DB.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:13:14 +02:00
Ulas Kalayci 12e8edf4c3 feat(cardav): implement GET /accounts/:id/addressbooks endpoint
Add addressbook listing route. Queries carddav_addressbook_selection
table directly, ordered by name. Returns empty array if account has
no addressbooks.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:11:53 +02:00
Ulas Kalayci 29646960fe docs: update PROGRESS.md for completed Task 5 2026-05-04 17:10:57 +02:00
Ulas Kalayci dd5ac8812c feat(cardav): implement POST /accounts/:id/test endpoint
Add connection test route. Loads account from DB and delegates to
CardDAVSync.testConnection() to verify credentials and discover
addressbooks without saving.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:10:25 +02:00
Ulas Kalayci 38fa84c3d4 docs: update PROGRESS.md for completed Task 4 2026-05-04 17:05:14 +02:00
Ulas Kalayci ca92cb2a86 feat(cardav): implement DELETE /accounts/:id endpoint
Add account deletion route with ID validation. Delegates to
CardDAVSync.deleteAccount() which cascades to addressbooks and
contacts via foreign key constraints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:04:39 +02:00
Ulas Kalayci 39f3db99f7 docs: update progress after completing tasks 1-3
Tasks completed:
- Task 1: Multi-value validators (validatePhones, validateEmails, validateAddresses)
- Task 2: CardDAV router setup (GET /accounts)
- Task 3: POST /accounts endpoint

Test infrastructure established:
- _setTestDatabase/_resetTestDatabase for DB mocking
- _mockTestConnection for CardDAV API mocking
- 91 tests passing

Next: Task 4 (DELETE /accounts/:id)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:01:35 +02:00
Ulas Kalayci f7eb73b835 feat(cardav): implement POST /accounts endpoint
Add account creation route with validation. Delegates to
CardDAVSync.addAccount() which creates account and discovers
addressbooks. Returns 201 with account + addressbooks array.

Add _mockTestConnection() helper for testing CardDAV routes without
real server connections.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 16:54:52 +02:00
Ulas Kalayci 930800eed9 fix(cardav): improve router security and test coverage
- Remove error message leakage (return generic 'Interner Fehler')
- Remove unused imports (str, collectErrors, MAX_TITLE, MAX_URL)
- Add _resetTestDatabase() for proper test cleanup
- Add test for populated accounts case with shape validation
- Import 'after' from node:test for proper teardown

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 16:51:21 +02:00
Ulas Kalayci cf68bff25f feat(cardav): create cardav router with GET /accounts
Add CardDAV API router with GET /accounts endpoint. Returns all
CardDAV accounts from database via cardav-sync service. Added test
infrastructure with _setTestDatabase helper for isolated API testing.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 16:47:24 +02:00
Ulas Kalayci db5f95059f chore: release v0.44.1
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 16:39:16 +02:00
Copilot 21c85fd418 fix: remap apple external_source during CalDAV migration
Fixes #119

Moves apple→caldav conversion into table rebuild to avoid CHECK constraint violation during migration to v0.44.0.
2026-05-04 16:38:07 +02:00
Ulas Kalayci a71547562e feat(contacts): add multi-value array validators
Add validatePhones, validateEmails, validateAddresses for CardDAV
multi-value contact fields. Validates array structure, required
fields, type checks, and max lengths.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 13:01:22 +02:00