Move .github/workflows/ → .gitea/workflows/ and update secrets
to use REGISTRY_USER/REGISTRY_TOKEN with git.necloud.us registry.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
HTTP headers only accept bytes 0-255; the em dash (U+2014) caused
'Cannot convert argument to ByteString' errors. Replace non-ASCII
chars in the title header and use plain hyphens in title strings.
- README: document ntfy push notifications setup, per-prayer reminders,
self-hosted ntfy, updated feature list and stack table
- docker-compose.yml: add TZ environment variable with instructions
so daily digest and reminder times fire at the correct local time
- Server-side cron (node-cron) checks every minute for scheduled notifications
- Daily digest: sends all active prayers as a summary at a configured time
- Per-prayer reminders: pick days of the week per prayer; fires at configured time
- Settings panel in UI to configure ntfy topic, digest time, reminder time
- Test notification button to verify ntfy is working
- Settings stored in data/settings.json (persisted alongside prayers)
VOLUME ["/data"] was causing Docker to create an anonymous volume for
/data that shadowed the bind mount defined in docker-compose.yml,
leaving the container with an empty /data instead of the host data.
The bind mount in docker-compose.yml is sufficient; no Dockerfile
VOLUME needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The production stage was using an ad-hoc npm install without package.json,
which could pull unexpected package versions and lost the lockfile guarantee.
Moved all React/build/test/type packages to devDependencies so the production
stage can use npm install --omit=dev cleanly, installing only express, cors,
and docx — exactly what server.js needs. Regenerated lockfile to match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
npm ci fails when the lockfile was generated on a different platform
or npm version than what runs inside the container. npm install is
more forgiving and resolves the exit code 1 in the build stage.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The production stage was running npm ci --omit=dev against a macOS-
generated lockfile on linux/alpine, which caused exit code 1. Switch
to installing only the three packages the server actually needs
(express, cors, docx) so the lockfile is irrelevant in that stage.
Also upgrades to node:22-alpine (current LTS) to clear the Node 20
deprecation warning on GitHub Actions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Each prayer gets a consistent color derived from its ID; calendar
dots now use those colors so you can see which prayers were covered
at a glance, and the day-detail panel color-codes each entry too
- New Notes field on every prayer card for scripture, updates, and
mid-prayer thoughts — separate from the answer field, freely editable
- Word export now includes Notes and Prayer Log sections for each prayer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each prayer card now has a "Prayer Log" section where you can record
when you prayed, with an optional note per session. A Calendar tab
shows a monthly view with dots on days you prayed; clicking a day
reveals which prayers were covered and any notes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace named volume with direct bind mount to
/media/ZimaOS-HD/AppData/Prayer/Data so data survives
container recreation without relying on Docker volume management.
- GET /api/export generates a Word document with all non-archived prayers
- Accepts ?status=active|answered|all and ?tag= query params to match
the current filter/tag selection in the UI
- Document sections: Active Prayers + Answered Prayers with page break,
each prayer showing person, request, answer, dates, and tags
- Styled with Palatino Linotype, page numbers in footer
- Export button in the toolbar triggers download of dated .docx file
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
- New 'Who are you praying for?' field on prayer cards (optional)
- Person name shown in primary color above the request text
- Search bar filters across person, request, answer, and tags simultaneously
- Search terms highlighted in yellow/amber in results
- Tag filter and search combine with status filter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
- Tag filter bar appears when any prayers have tags; click to filter,
click again or hit Clear to reset. Tags on cards are also clickable.
- Status filter and tag filter combine (e.g. active + family tag).
- Browser tab title changed from 'React App' to 'Prayer Journal'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
- Server attempts chmod on data dir at startup if not writable
- All write routes now catch errors and return 500 with a readable message
- Added /api/health endpoint to diagnose mount issues
- Frontend propagates server errors to a visible banner
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
- GitHub Actions builds and pushes to ghcr.io/nmemmert/prayer on every
push to main; PRs build only (no push). Uses GHA layer cache for speed.
- docker-compose references the published image, adds healthcheck,
restart policy, and explicit env vars.
- README rewritten: Docker usage, data persistence, CI/CD, dev setup.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
Replaces localStorage with a JSON-file backend (server.js). Prayers are
stored in /data/prayers.json, which is mounted as a named Docker volume so
data survives container restarts and rebuilds. React fetches from /api/prayers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
Todo-list style app where users can add prayers, record how God answered
them, filter between active/answered, and tag entries for organization.
Persists to localStorage. Clean warm serif aesthetic with dark mode support.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ