140 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 4.6 8add7ddc10 Update README for v0.4.0 and Gitea migration
Rewrite to accurately reflect current stack (Next.js + Express/JSON server),
Docker deployment, ntfy push notifications, and Gitea CI setup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 14:37:56 -04:00
nmemmert eb6cbcc3d4 Merge main into master, bring in Gitea workflow 2026-08-26 14:35:19 -04:00
nmemmertandClaude Sonnet 4.6 4426b0a380 Migrate workflow to Gitea Actions
Build & Publish Docker Image / build-and-push (push) Successful in 5m42s
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>
2026-08-26 14:31:55 -04:00
Claude 26ef999c17 fix: replace em dash in ntfy title headers with ASCII dash
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.
2026-08-02 19:54:51 +00:00
Claude 2f445bdc91 docs: clarify ntfy requires no account, note unverified commits 2026-08-02 17:52:49 +00:00
Claude ce62493057 docs: update README and compose for notifications and timezone
- 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
2026-08-02 17:48:55 +00:00
Claude 965c47d66a feat: add ntfy push notifications for daily digest and per-prayer reminders
- 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)
2026-08-02 14:45:18 +00:00
nmemmertandClaude Sonnet 4.6 13c00e9322 Remove VOLUME instruction from Dockerfile
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>
2026-07-21 10:33:20 -04:00
nmemmertandClaude Sonnet 4.6 a35ba756ca Fix prod image: move build deps to devDependencies, restore proper npm install
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>
2026-07-21 10:01:38 -04:00
nmemmertandClaude Sonnet 4.6 c2459c000e Fix build stage: use npm install instead of npm ci
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>
2026-07-21 09:07:34 -04:00
nmemmertandClaude Sonnet 4.6 daa7eb1a0d Fix Docker build: upgrade to node:22-alpine, install only server deps
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>
2026-07-21 09:04:39 -04:00
nmemmertandClaude Sonnet 4.6 96c4b541f9 Add color-coded calendar dots, prayer notes, and export prayer log
- 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>
2026-07-21 08:39:16 -04:00
nmemmertandClaude Sonnet 4.6 57937d986d Add prayer log and calendar view
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>
2026-07-21 08:32:06 -04:00
Claude ea0f84806d fix: use bind mount for persistent data on ZimaOS
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.
2026-07-18 23:44:02 +00:00
Claude 2b3d6a540c Add DOCX export endpoint and Export button
- 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
2026-07-18 23:36:25 +00:00
Claude af836d4ec9 Add person field, full-text search, and search highlighting
- 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
2026-07-18 23:32:37 +00:00
Claude 8bda0b814c Add tag filtering and fix browser title
- 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
2026-07-18 23:28:17 +00:00
Claude bdf27b8b99 Generate prayer ID on server to fix crypto.randomUUID browser compat
Older browsers (and non-HTTPS contexts) don't have crypto.randomUUID.
Move ID generation to the server using Node's built-in crypto module.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
2026-07-18 17:18:12 +00:00
Claude a27b35191d Fix permissions handling and surface write errors to the UI
- 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
2026-07-18 17:06:00 +00:00
Claude e6710b3419 Fix Express 5 wildcard route crash
Express 5 requires named wildcard params — '*' is invalid, use '*splat'.
This was causing the container to crash-loop on startup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
2026-07-18 16:43:02 +00:00
Claude 821132967f Add GitHub Actions CI/CD, update docker-compose and README
- 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
2026-07-18 16:21:28 +00:00
Claude 898c12b57d Add express and cors dependencies
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
2026-07-18 16:20:33 +00:00
Claude 1b8e307d4c Persist prayer data to a mounted Docker volume via Express API
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
2026-07-18 16:20:17 +00:00
Claude 1d37105e4b Add Dockerfile and docker-compose for production deployment
Multi-stage build: Node 20 builds the React app, nginx serves the static files on port 3000.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DReRqHxSYuVfCzTzQGD9hZ
2026-07-18 16:18:34 +00:00
Claude 9e82ec2f1a Add prayer journal app with request + answer tracking
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
2026-07-18 16:18:00 +00:00
nmemmert 5da449e6ef v0.4.0: Dashboard navigation, enhanced Today's Prayers, fresh compose form 2026-01-19 12:23:55 -05:00
nmemmert c36c3b1c38 Bump version to 0.3.0 and update what's new 2026-01-19 10:16:45 -05:00
nmemmert 497af40398 0.3.0 2026-01-19 10:14:52 -05:00
nmemmert 67c5ff1b35 Major improvements: Firebase data migration, enhanced loading screens, multi-day prayer tracking
- Migrated all localStorage data to Firebase for cross-device sync
  - Prayer drafts now stored in users/{userId}/drafts
  - Reminder settings in users/{userId}/settings
  - Prayer statistics in users/{userId}/statistics
- Implemented persistent 'most prayed for' tracking in Firebase
- Enhanced loading screen with animated backgrounds and gradients
- Fixed auth session restoration on hard refresh
- Added prayedDates array for multi-day prayer tracking
- Calendar now accurately shows all days a prayer was prayed for
- Enabled Firestore offline persistence for offline-first experience
- Updated Firestore security rules for new data structure
- Improved clock display (removed leading zero from hours)
- Moved clock below date on homepage with appropriate sizing
- Fixed data loading race conditions between auth and Firestore
2026-01-19 10:11:57 -05:00
nmemmert 2c29fc28d6 chore: update app icons to new prayer journal design
Replace old praying hands icon with new prayer journal on cloud icon (192x192 and 512x512 PNG files)

Completes visual branding refresh across all screens
2026-01-19 09:29:06 -05:00
nmemmert aa3a35bc4a feat: add app icon branding to all remaining page headers
- CalendarView header now displays icon
- ReflectionsList header now displays icon
- AnsweredPrayers header now displays icon
- ThingsToPrayFor header now displays icon

Completes visual identity unification across all main screens
2026-01-19 09:10:39 -05:00
nmemmert 74686cece1 chore: remove legacy routes and email APIs 2026-01-19 09:05:31 -05:00
nmemmert e53e8088bb Unify nav styling; replace remaining emojis with Lucide icons (cards + loader); add brand icon in top nav 2026-01-19 08:32:00 -05:00
nmemmert 46fa6097a1 Unify gradients and text: standardize app/page.tsx backgrounds; set Clock to white text for dark theme consistency 2026-01-19 08:29:44 -05:00
nmemmert e5aa9b3e37 BottomNav: replace emoji icons with Lucide, unify icon sizes and actions 2026-01-19 08:24:10 -05:00
nmemmert e2add8223c Replace emoji headings with Lucide icons; unify heading icon styles across pages 2026-01-19 08:23:08 -05:00
nmemmert d760b34ba4 Standardize design across all pages - consistent dark gradient theme, typography, and card styling 2026-01-19 08:20:19 -05:00
nmemmert 6a9237d76d Fix top navigation overlap - standardize pt-24 padding on all pages 2026-01-19 08:16:52 -05:00
nmemmert 7a96380ae9 Replace ClientLayout with inline providers in layout.tsx 2026-01-19 08:12:46 -05:00
nmemmert 9fc41fffb9 Remove unused components from redesign - Admin, ClientLayout, EmailTemplatesManager, LoadingSkeleton, Navbar, PrayerChain, PrayerGoalsManager, PrayerTemplatesManager, Profile, SharePrayer 2026-01-19 08:11:21 -05:00
nmemmert b2cea9c0a3 Fix Firestore undefined value error when creating prayers 2026-01-17 15:17:31 -05:00
nmemmert a1236c173d Remove email verification requirement for adding prayer entries 2026-01-17 13:40:45 -05:00
nmemmert 3c5da024b9 Remove email verification requirement 2026-01-16 11:46:35 -05:00
nmemmert ed526b39b1 Update navigation for iPhone safe areas 2026-01-16 11:19:43 -05:00
nmemmert d6f4576105 Fix safe area insets for iPhone using CSS custom properties 2026-01-16 11:14:29 -05:00
nmemmert 61ecd7679a Add safe area support for devices with rounded corners and home indicators 2026-01-16 11:09:15 -05:00
nmemmert 0704984a3c Add cross-platform prayer reminder notifications with ReminderBanner component 2026-01-16 10:58:27 -05:00
nmemmert 618ab3a756 feat: cross-platform prayer reminders (iOS, Android, Windows, Linux)
- Detect platform and disable Web Push for iOS (Safari limitation)
- For iOS: Enable in-app reminders instead of push notifications
- Add platform-specific UI messaging
- Add test notification button for debugging
- Track last reminder date in localStorage
- Fix notification permission checks
- Support all platforms: iOS (in-app), Android/Windows/Linux (push + in-app)
2026-01-16 10:35:37 -05:00
nmemmert a3de1aaa1a feat: add daily prayer reminder push notifications with time picker 2026-01-16 10:07:45 -05:00
nmemmert 49d1bdb47d feat: show different colors in Journal calendar for prayer entries vs prayed for activities 2026-01-16 10:03:13 -05:00