v2.0.0
What's New
Cornerstone now includes a Construction Diary (Bautagebuch) that helps you maintain a detailed record of your home building project. Track daily activities, site visits, deliveries, and issues while the system automatically logs significant events like status changes, invoice processing, and milestone delays.
Highlights
- Manual Diary Entries -- Create five types of entries: daily logs, site visits, delivery records, issues, and general notes with weather tracking and photo attachments
- Automatic System Events -- Key project changes (work item status, invoices, milestones, budget breaches, schedule changes, subsidies) are automatically recorded in the diary
- Photo Attachments -- Attach photos directly when creating or editing diary entries for visual documentation
- Digital Signatures -- Capture signatures from users or vendors with a drawing canvas; signed entries become immutable for accountability
- Dashboard Integration -- A new "Recent Diary" card on the project dashboard shows the latest entries at a glance
- Filtering -- Filter entries by All, Manual, or Automatic with type-specific chips for quick navigation
2.0.0 (2026-03-18)
⚠ BREAKING CHANGES
- dav: OIDC_REDIRECT_URI environment variable has been removed.
The OIDC callback URL is now derived as <EXTERNAL_URL>/api/auth/oidc/callback,
falling back to the request's protocol and host when EXTERNAL_URL is not set.
Users who previously set OIDC_REDIRECT_URI should set EXTERNAL_URL instead
(e.g. EXTERNAL_URL=https://myhouse.example.com).
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): add getctag, supported-report-set, and calendar/addressbook-query support
iOS Calendar and Contacts require several properties and REPORT types
that were missing:
- Add CS:getctag (Calendar Server extension) to calendar and addressbook
collection properties — iOS uses this to detect changes and trigger sync - Add supported-report-set to advertise supported REPORT types
- Handle calendar-query and addressbook-query REPORT types by returning
all items (read-only collections, no server-side filtering needed) - Use replaceAll for etag/ctag placeholder substitution in collection props
Previously, iOS would connect successfully but show no events or contacts
because it sent calendar-query/addressbook-query REPORTs (which we returned
empty for) and had no getctag to trigger change detection.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): use regex replace instead of replaceAll for TS lib compat
The tsconfig lib target doesn't include es2021, so replaceAll is not
available on string types. Use .replace() with a global regex instead.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): PROPPATCH handler, root NS declarations, ETag consistency
- Register PROPPATCH HTTP method and add handlers for calendar/addressbook
collections (iOS sends PROPPATCH to set color, name, alerts) - Move CalDAV/CardDAV/CalendarServer namespace declarations to multistatus
root element instead of local declarations on child elements (iOS strict) - Fix ETag mismatch: REPORT now uses type-prefixed ETags (wi-/milestone-/
hi-/vendor-/contact-) matching PROPFIND depth 1 and GET responses - Add debug-level request body logging for PROPFIND/REPORT/PROPPATCH
- Add tests for PROPPATCH, ETag consistency, and namespace declarations
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): update davXml tests for root namespace declarations
Tests expected namespace URIs in collection prop templates and the
multistatus tag, but namespaces are now declared only on the root
<D:multistatus> element. Update assertions accordingly.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): fix calendar-home-set structure for iOS discovery
iOS PROPFINDs the calendar-home-set at depth 1 looking for children
with <C:calendar/> resourcetype. Previously, the home-set pointed
directly to the calendar collection (/dav/calendars/default/), so
depth 1 children were .ics files — not calendars. iOS could discover
the calendar via fallback but may not properly sync events from it.
Changes:
- Point calendar-home-set to /dav/calendars/ (parent collection)
- Point addressbook-home-set to /dav/addressbooks/ (parent collection)
- Add PROPFIND handlers for /dav/calendars/ and /dav/addressbooks/
that return the default collection as a child at depth 1 - Add current-user-privilege-set (read) to calendar and addressbook
collection props so iOS knows the user has read access
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): add temporary info-level DAV request/response logging
Log full request body (with Depth header) and response body (truncated
at 4000 chars) at info level for PROPFIND, REPORT, and PROPPATCH.
This will help diagnose why iOS receives calendar data but doesn't
display events. Remove after the issue is resolved.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
- fix(dav): parse iOS-style href elements with inline xmlns declarations
iOS sends multiget REPORT requests with <A:href xmlns:A="DAV:"> format
instead of the standard <D:href> format. The parseReportHrefs regex
did not accept attributes between the tag name and >, causing it to
return an empty array and producing empty multiget responses.
Fix: change regex from to <href[^>]*> to accept any attributes.
Also removes temporary debug logging hooks (no longer needed).
Features
- dav: add CalDAV/CardDAV server with vendor contacts and DAV token auth (#936) (6ed20b8), closes #933 create-name/#edit-name create-firstName/#create-lastName
- docs: add German translation to documentation site (#934) (5ddb133)
- i18n: add i18n infrastructure with English and German support (#929) (a6f4c05), closes #916 #916 #916
- i18n: extract all remaining hardcoded strings to i18n (#978) (980c77d)
- i18n: translate all budget pages (#939) (9a5d145), closes #920 #920 #920
- i18n: translate dashboard and work items pages (#937) (990b53d), closes #918 #918
- i18n: translate document components and remaining pages (#942) (9daf9d9), closes #922
- i18n: translate household items and milestones pages (#938) (0f38b21), closes #919 #919
- i18n: translate schedule and diary pages (#941) (f6e87fa), closes #921 #921
- internationalization for auth and settings pages (#935) (ebbcb30)
Bug Fixes
- e2e: fix E2E test failures caused by EPIC-17 i18n changes (#962) (bba222e), closes #964 #963 #961
- e2e: fix i18n E2E test strict mode and selector issues (#948) (f01d5c4)
- i18n: add language selector to ProfilePage (#965) (f41799d), closes #964
- i18n: add missing translation keys for vendors and household items (#946) (876354f), closes #943 #944 #943 #944
- i18n: complete missing translations and locale-aware formatting (#955) (cdd1d9f), closes #950 #951 #956 #957 #958 #952
- i18n: fix milestone detail edit button key path (#979) (7d83afd)
- i18n: UAT round 2 fixes (#968) (10de88d), closes #967
- i18n: UAT round 3 — terminology, budget, theme toggle (#971) (3673ca8), closes #970
Documentation
- add EPIC-13 diary documentation and task tracking to skills (#914) (5d79d2f)
- feeds: add CalDAV/CardDAV feed documentation (#930) (32695e9)
Chores
- add AGPL-3.0 license and Harmony CLA (#954) (664fb43)
- add i18n conventions to agent definitions and CLAUDE.md (#931) (2c02163)
- add timeouts to CI gate polling loops (#932) (b9e43de)
- agent metrics evaluation & process improvements (P1-P8) (#913) (7847c70)
- ci: replace CLA Assistant app with GitHub Action (#976) (d1027d8)
- harden dependency supply chain (#959) (8288572)
- i18n: add translator agent, glossary, and fix German terminology (#972) (6a260ba)
- migrate project board management from GraphQL to native gh project CLI (#925) (1d5c87f)
- reduce test output noise (#974) (3ee5717)