Hide in Heart is a calm daily companion for hiding God's Word in your heart.
Rooted in Psalm 119:11 — it guides you through reading, reflection, memorization, and application in a quiet daily journey. No scores. No timers. Just Scripture, carried deeper each day.
"Your word I have hidden in my heart, that I might not sin against You." — Psalm 119:11
Built with Next.js 15 and TypeScript. Runs locally by default — optionally connects to Supabase for accounts, cross-device sync, and leaderboards.
Hide in Heart is Step 3 — Remember in the Scripture & ministry path of Prayer Sealed Ministries, Inc., built by Paul Clark. It is where God's Word moves from the page into the heart. If you're new to faith, the path begins with Gospel Journey — coming to know Jesus Christ as Lord and Savior.
| # | Stage | Project |
|---|---|---|
| 1 | Believe | Gospel Journey · repo |
| 2 | Understand | Scripture Journey · repo |
| 3 | Remember | Hide in Heart ← you are here |
| 4 | Discern | His Will Guide · repo |
| 5 | Intercede | Prayer Sealed |
| 6 | Pass It On | My Life With Christ (in development) |
Each session you walk through a short journey:
- Choose a topic — Pick a theme that meets you where you are: anxiety, fear, doubt, hope, and more.
- Read it — The verse appears with a brief devotional. Read slowly, two or three times. No timer.
- Practice it — Key words are removed. Place word tiles into the blanks to rebuild the verse from memory.
- Live it — Finish with a short application prompt so the passage moves from recall into real life.
- Word-tile memorization — the central mechanic, designed for mobile and desktop.
- Topic selection — 47 themes across 451 adult verses and 38 kid-friendly verses. Every theme now has verses.
- Practice mode — quick standalone verse practice without a full journey.
- Kids mode — age-appropriate verses across 5 themes with an Adults/Kids toggle.
- Three depth levels — beginner, intermediate, and expert control how many blanks appear.
- NIV / KJV / NKJV / ESV toggle — switch translations at any time.
- "Why memorize Scripture" page — encouragement and context for the practice.
- Offline-capable — a local verse set works without any backend connection.
- Reflections — save short written responses to application prompts after each journey.
| Layer | Technology |
|---|---|
| Framework | Next.js 15, React 19, TypeScript |
| Database & Auth | Supabase (optional — PostgreSQL + Auth) |
| Validation | Zod |
| Testing | Vitest |
| Monitoring | Sentry |
| Hosting | Vercel |
# Install dependencies
npm install
# Copy environment template and fill in your values
cp .env.example .env.local
# Start the dev server
npm run devThen open http://localhost:3000.
See .env.example for the full list. The key ones:
| Variable | Purpose |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anonymous/public key |
SUPABASE_SERVICE_ROLE_KEY |
Supabase service role key (server only) |
ADMIN_API_TOKEN |
Protects the admin verse management endpoint |
The app runs in local-only mode without Supabase credentials — all verses come from a built-in fallback set and auth features are disabled.
src/
app/ — Next.js App Router pages and API routes
components/ — Shared UI components
lib/ — Journey logic, verse helpers, auth, rate limiting
types/ — TypeScript domain types
supabase/
schema.sql — Full database schema with row-level security
seed.sql — Starter verse data
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Production build |
npm run lint |
ESLint (zero warnings) |
npm run typecheck |
TypeScript type check |
npm run test |
Run Vitest unit tests |
npm run preflight |
Pre-deploy validation |
MIT — see LICENSE.
The app runs in local-only mode by default — no database or accounts needed. All verses are served from built-in files and progress is saved in the browser.
To enable accounts, cross-device sync, real leaderboards, and the admin CMS, see the full setup guide:
/— home (two entry points: journey or practice)/play— daily journey/practice— standalone verse practice/why— why memorize Scripture/verses— browse the verse library/auth— sign in / sign up/profile— your journey walk/profile/reflections— devotional journal/leaderboard— community leaderboard/admin— verse CMS UI
GET /api/versesPOST /api/attemptGET /api/reflectionsPOST /api/reflectionGET /api/profile?userId=...GET /api/leaderboardPOST /api/admin/verse(requires Supabase authenticated admin role when Supabase is enabled)PUT /api/profile/translation(update preferred translation)
- Server-side validation and integrity checks on
/api/attempt. - Per-endpoint rate limiting for attempt, admin, and leaderboard APIs.
- Admin content write path now supports Supabase role-based authorization (
app_metadata.role=admin). - Local fallback mode keeps
x-admin-tokensupport for non-Supabase development.
npm run lint
npm run typecheck
npm run test
npm run build
npm run preflight- The app runs in local-only mode by default. Supabase is optional — see
docs/supabase-setup.md. - Verse text in this repository may require translation licensing review before commercial use.
GET /api/health- Returns readiness details, including Supabase connectivity when configured.
- Create a Vercel project connected to this repository.
- Add project environment variables from
.env.example. - Add GitHub repository secrets for workflow deployment:
VERCEL_TOKENVERCEL_ORG_IDVERCEL_PROJECT_ID
- Trigger deployment via push to
mainor manually from Actions.
Workflow files: .github/workflows/ci.yml, .github/workflows/deploy.yml
The intended production address is https://heart.prayersealed.org.
This app deploys to Vercel, not GitHub Pages; no repository CNAME file is required.
- In the existing Vercel project's Settings → Domains, add
heart.prayersealed.orgto Production. - In GoDaddy's DNS zone for
prayersealed.org, add a CNAME namedheartwith the exact target Vercel displays. Keep the other ministry DNS records unchanged. - Set the Vercel Production environment variable
NEXT_PUBLIC_APP_URL=https://heart.prayersealed.organd redeploy. This sets the metadata, sitemap, and robots sitemap URL throughgetAppUrl(). - Verify HTTPS, navigation, and generated metadata on the new address before redirecting the old domain.
- If Supabase authentication is enabled, update its Site URL and applicable allowed redirect URLs for the new origin, and verify sign-in and confirmation links.
Browser-local progress and reflections belong to the old origin and do not automatically transfer to the new domain. Keep the old address accessible until any required data migration has been handled.