Erster Schritt der Aufteilung von WeeklyView.tsx (D1). Die sieben gemeinsamen Typen lagen in der Komponentendatei; SettingsSidebar und GridTaskBlock importierten sie von dort und zogen sich damit die gesamte 11.900-Zeilen-Komponente in ihren Abhaengigkeitsgraphen. WeeklyView.tsx re-exportiert die Typen weiterhin, bestehende Importe bleiben also unveraendert -- kein Anfassen der beiden Importeure noetig. 11.906 -> 11.830 Zeilen. Mit npm run build verifiziert: Exit 0, 36 Seiten generiert, /tasks unveraendert bei 265 kB. v1.117.5 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
13 KiB
13 KiB
Changelog
All notable changes to this project are documented in this file.
[1.117.5] - 2026-09-07
Changed
- Die gemeinsamen Datentypen der Wochenansicht liegen jetzt in
src/lib/weekly/types.ts(Task,CalendarEvent,SomedayList,ViewStyle,KanbanStage,CellDuration,RecurringTaskException).SettingsSidebarundGridTaskBlockimportierten sie bisher ausWeeklyView.tsxund zogen sich damit die gesamte 11.900-Zeilen-Komponente in ihren Abhängigkeitsgraphen.WeeklyView.tsxre-exportiert die Typen weiterhin, bestehende Importe funktionieren also unverändert. - Erster Schritt der Aufteilung von
WeeklyView.tsx: 11.906 → 11.830 Zeilen. Mitnpm run buildverifiziert (Exit 0, 36 Seiten,/tasksunverändert bei 265 kB).
[1.117.4] - 2026-09-07
Fixed
- Der Build meldet wieder ESLint-Fehler:
eslint.ignoreDuringBuildssteht auffalse. Es waren nur zwei echte Errors im gesamten Projekt (let jsonstattconst jsoninSettingsSidebar.tsx), beide behoben.next lintendet jetzt mit Exit 0. Die 695 Warnungen — 470-malno-explicit-any, 209 ungenutzte Variablen, 11 unvollständige Hook-Abhängigkeiten — blockieren den Build nicht und werden fortlaufend abgebaut.
[1.117.3] - 2026-09-06
Security
.env.production.saveund.env.localaus dem Arbeitsverzeichnis gelöscht — mitshredüberschrieben, damit die Werte nicht aus freiem Speicher rekonstruierbar bleiben. Beide waren identische Kopien derselben Zugangsdaten.- Klartext-Werte in
deployment-notes.mdundINFRASTRUCTURE_REQUIREMENTS.mddurch Platzhalter ersetzt (je drei Vorkommen: DB-Passwort,NEXTAUTH_SECRET, SMTP-Passwort). Die Dateien bleiben als Dokumentation lesbar. - Damit liegt außerhalb der Git-Historie kein Zugangsdatum mehr im Projekt.
[1.117.2] - 2026-09-06
Security
- Weitere Dateien mit echten Zugangsdaten aus dem Git-Index genommen (lokal bleiben sie
erhalten):
deployment-notes.mdundINFRASTRUCTURE_REQUIREMENTS.md— letztere führt das Datenbank-Passwort sogar unverschleiert als**Password**: …auf. Ebenfalls entfernt:.env.production.save, der ursprüngliche Fund. - Passwort aus
tests/debug/db-connection-test.spec.tsentfernt; dort stand eine vollständige Connection-URL samt echter IP. .gitignoregreift jetzt auf.env*statt auf eine Liste fester Namen. Die alte Regel listete.env.production, weshalb.env.production.savedurchs Raster fiel.
Changed
TODO.md: Die Rotation des Datenbank-Passworts ist in einen neuen Block F verschoben — bewusst zurückgestellt. Die Datenbank hört auf einer privaten LAN-Adresse, und bei selbst gehostetem Supabase steckt dasselbe Passwort an mehreren Stellen, was einen halben Wechsel gefährlich macht. Enthält jetzt einen Prüfbefehl, mit dem sich ohne Klartext-Ausgabe feststellen lässt, ob eines der geleakten Passwörter noch aktiv ist.
[1.117.1] - 2026-09-06
Fixed
docs/secret-rotation.md, Schritt 2: Die Anleitung ging von Supabase Cloud mit Dashboard und "Reset database password"-Knopf aus. Tatsächlich läuft Supabase selbst gehostet per Docker auf einem eigenen LXC (siehescripts/supabase-setup.sh) — es gibt kein Cloud-Dashboard. Korrigiert samt Ports (6543 Pooler, 5432 direkt, 8000 API, 8001 Studio) und dem tatsächlichen Weg überPOSTGRES_PASSWORDplusALTER USER, inklusive Backup-Schritt.
[1.117.0] - 2026-09-06
Security
- Rate-Limiting für alle Auth-Endpunkte:
signup(5/15 Min),resend-verification(3/15 Min),verify-email(10/15 Min) undreset-password(5/15 Min), je Client-IP. Bisher waren sie unbegrenzt aufrufbar — beliebig viele Mails über den eigenen SMTP-Zugang, beliebig viele Rateversuche auf Verifizierungscodes. - Passwort-Reset-Token wird nur noch als SHA-256-Hash gespeichert. Bisher lag er im Klartext in der Datenbank: Lesezugriff auf die DB genügte, um fremde Konten zu übernehmen.
- Tote Mock-Login-Route
src/app/api/auth/login/route.tsentfernt. Sie verglich gegen ein hartcodiertes Fake-Passwort, erzeugte ein bedeutungslosesmock-jwt-token-…und war über die Middleware-Ausnahme für/api/auth/*ohne Anmeldung erreichbar. Kein Login-Bypass, aber sie protokollierte jede probierte E-Mail-Adresse. - Passwort-Reset nutzt jetzt bcrypt-Kosten 12 statt 10 — gleicher Wert wie beim Signup.
Fixed
npm testlief ins Leere: Das Skript riefjestauf, obwohl es weder eine Jest-Config noch einen einzigen Jest-Test gibt. Zeigt jetzt auf Playwright;jest,ts-jestund@types/jestsind entfernt (letzteres kollidiert mit den Playwright-Globals).- Falscher
sonar.projectKeyim GitHub-Workflow — er hätte in ein zweites, leeres SonarQube-Projekt geschrieben statt in das bestehende.
Changed
- Die zwölf Wegwerf-Skripte aus der Fehlersuche (
login-debug,css-debug-test, …) liegen jetzt untertests/debug/und sind pertestIgnoreaus dem normalen Testlauf genommen. Aktiv bleiben die drei echten Testdateien. Erreichbar übernpm run test:debug.
Added
TODO.md: abhakbare Liste aus dem Repository-Audit.docs/secret-rotation.md: Anleitung zum Austausch der Zugangsdaten, ohne dass ein Wert auf dem Bildschirm erscheint.scripts/quality-check.sh: bündeltnpm audit, Typecheck, Lint und den SonarQube-Scan für den nächtlichen Lauf.npm auditfehlte bisher komplett.
[1.116.4] - 2026-09-06
Fixed
- Improved calendar event text contrast while retaining the calendar-colored background.
[1.116.3] - 2026-09-05
Added
- Calendar events can now be reassigned to another editable calendar from the event editor.
- Moving an event updates the source and target calendar caches.
Changed
- Calendar event backgrounds now use the calendar color with a lighter, readable contrast.
- Google event-specific colors no longer override the selected calendar's color.
[1.116.2] - 2026-09-05
Fixed
- The remove action now applies to saved local location suggestions only. OpenStreetMap search results remain available, while removed saved locations are deleted from the user's stored location list.
[1.116.1] - 2026-09-05
Fixed
- Display preferences such as the number of visible days now remain device-specific. Automatic profile saving no longer sends browser-only settings back to the shared account.
- An explicitly selected day count now survives mobile reloads and orientation changes.
- Cancelled or superseded location autocomplete requests no longer update the event form.
- Photon autocomplete requests now have a five-second timeout and input length limit.
[1.116.0] - 2026-09-04
Added
- Added a two-day reminder preset for calendar events.
- Added optional address and business autocomplete using Photon/OpenStreetMap, with debounced server-side search and OpenStreetMap attribution.
- Users can keep their original location text or explicitly select a suggested result.
[1.115.3] - 2026-09-03
Fixed
- Drag & drop in views wider than 7 days: the drop target was keyed by weekday
(
date.getDay()), which is only unique inside a 7-day window. In a 21-day view every column sharing the weekday of the hovered one lit up as a drop target — three mirrored highlights, one per Tuesday. Now keyed by the local date. - Same bug, worse half:
handleDropresolved the target date withvisibleDays.find(d => d.getDay() === dayOfWeek), so dropping a task on the second or third Tuesday of a wide view silently scheduled it on the first Tuesday. The drop now uses the column's own date. Tasks dragged in a >7-day view before this fix may sit on the wrong date. - The inline "click an empty slot to add a task" input had the same weekday key, so clicking one slot opened an input in every column with that weekday.
[1.115.2] - 2026-09-03
Changed
scripts/update-app.shis now the single update path, used both for a manual deploy and for the boot run;my-weekly-todo-update.servicepoints at it. There were two near-identical scripts and they drifted — thenpm cifix from 1.114.1 only ever landed in update-app.sh, so the boot path kept runningnpm install.scripts/boot-update.shis now a shim that calls it, kept only so a not-yet-recopied unit file still works.- The update log moved from
/var/log/app-boot-update.logto/var/log/my-weekly-todo-update.log.
Added
update-app.shskips the rebuild whenHEADalready matchesorigin/mainand.next/standalone/server.jsexists, so a reboot no longer costs a full rebuild. Pass--forceto rebuild anyway.update-app.shtakes aflocksingle-instance lock, so a boot run and a manual run can no longer install into the same tree at once — which is how node_modules ended up in a state npm could not clean up.update-app.shrunsprisma migrate deployandprisma generate(previously only the boot script did), and copies.envinto the standalone output.
Fixed
update-app.shno longer fails at boot trying to restart a PM2 process that does not exist yet. It restarts only when the PM2 daemon is actually running, and otherwise leaves the start topm2-root.service, which is ordered after this unit. It deliberately does not probe withpm2 describe, since any pm2 command spawns a daemon that would race the real service.
[1.115.1] - 2026-09-03
Fixed
scripts/boot-update.sh(the "update on reboot" unit): every command was piped intotee, soset -eonly ever saw tee's exit status. A failednpm installornpm run builddid not stop the script and did not fail the systemd unit — it logged "Boot update finished" and left a half-built tree. Now usesset -euo pipefail, logs through a singleexecredirect, and traps ERR.scripts/boot-update.sh: switched fromnpm installtonpm ci. Same fix update-app.sh got in 1.114.1 —npm installrewrites package-lock.json, leaving the tree dirty so the nextgit pullaborts.scripts/boot-update.sh: body wrapped in a function so bash parses it in one go. The script lives inside the checkout it pulls, sogit pullrewriting it mid-run made bash resume at a stale file offset.scripts/boot-update.sh: setGIT_TERMINAL_PROMPT=0so a git credential prompt fails fast instead of hanging the unit at boot, where there is no tty.scripts/my-weekly-todo-update.service: raisedTimeoutStartSecfrom 300 to 1800.npm ci+prisma generate+next buildtakes far longer than 5 minutes in the container; systemd SIGTERMed the oneshot unit mid-install, which left anode_modulestree npm could no longer remove (ENOTEMPTY: rmdir node_modules/date-fns/isEqual).package-lock.json: version resynced withpackage.json(missed in the 1.115.0 commit).
[1.115.0] - 2026-09-03
Added
- Day columns: a "Custom" option next to the 1/2/3/5/7 presets, where any number of days from 1 to 31 can be typed (e.g. 14, 21, 28). The chosen value shows up as its own chip beside the presets and is available in every place the day count can be set — sidebar, both settings flyouts, the desktop toolbar and the header overflow menu.
Fixed
- Day grid and all-day grid only had CSS for
cols-1/2/3/5/7, so any other day count silently fell back to a 5-column layout. Both grids now derivegrid-template-columnsfrom the actual day count.
[1.114.2] - 2026-09-01
Fixed
- Deploy script: copy
public/and.next/static/into.next/standalone/after the build.next.config.jssetsoutput: 'standalone', and Next.js does not copy those itself. Without the copy every deploy left the old chunk hashes in the standalone tree, so the browser's requests for the new chunks 404'd, React never hydrated, and the app hung on "Loading session..." — while the API kept returning 200, which made it look like an auth problem.
[1.114.1] - 2026-09-01
Added
scripts/update-app.sh: the production deploy script, now version-controlled instead of living only on the server. Hardened withset -euo pipefail(a failedgit pullused to still trigger a rebuild and PM2 restart on unchanged code) and switched fromnpm installtonpm ci(npm install rewrote package-lock.json, leaving the tree dirty so the next pull aborted).
[1.114.0] - 2026-09-01
Added
- Focus Mode: "SKIP" button to move on to the next task of the day without completing the current one. Skipped tasks are remembered until Focus Mode is closed, and the timer resets for each new task. The button is disabled when no other task is left for today.
Changed
- Styling settings: removed the standalone "Element Colors" and "Weekend Colors" sections — those controls now live only in the CSS Variables panel (added there in 1.113.1).
- Styling settings: larger, borderless color swatches and bigger labels in the CSS Variables panel.
[1.113.1] - 2026-07-08
Changed
- CSS Variables panel: added the existing "Today Highlight", "Past Days", "Saturday" and "Sunday" color controls as their own groups (bound to the same profile fields as the standalone Element/Weekend Colors sections, so both stay in sync).
- CSS Variables panel: every row now shows the color swatch before its label.
[1.113.0] - 2026-07-08
Added
- Styling settings: "CSS Variables" panel with a color picker and description for every
customizable color token in
globals.css(base colors, settings sidebar, design token aliases, event colors, all-day chips). - Styling settings: "Custom CSS" textarea to inject a personal stylesheet that loads after the app's default styles and can override any rule.