5af999c2efc1c2925d6bfa0a43fa025d4a3852226c9cda50ce55a509e186753c  ./.env.example
c479229cb6280252f7f8018f659cee9f8a7050d505ffb1a7fa98d0fe39083a55  ./.gitignore
4d6bff97f355e3b3a5093d0d8e9d26c711b40f8c4b6604cf1fdf7ae8ac177c1d  ./API_REFERENCE.md
67c2c0936d93a3c4edd2243f9e268865e427ec34eca1dddcbafc36dfdf7133b2  ./ARCHITECTURE.md
175b70db980c00a34964d41d6f792643e333dd865ed4220e551ce5c4a0f3be32  ./BUILD_VALIDATION.md
89a32a963adb59aeeb126315cf64122bf22ebb47f839b2cd96f86017b24e2244  ./CLOUDFLARE_RULES.md
4325b802710bb83b559769ec68ac4930c90fa23837a6c2c5a96feec74e62ed94  ./DEVELOPMENT_ROADMAP.md
4cee398f3c05412f85d9a09b09469d448b85f8b2cdabbfb478f68c83cd8612df  ./INSTALLER_MANIFEST.json
066ef43c9c26df1c683973a0e33541431aeeb221537a2c0e047b951b300ae17d  ./LICENSE.txt
6e16682fcec829bc7c2103323e5bf97851459d32083c8eccbd70a9aa30676aa4  ./README.md
94c19889f88f0cebc68f3740594b7f18a1ecbbafa405eb75f0472f455549bb24  ./RELEASE_NOTES.md
cf3be0d25d384984e7a78ddefe3d1d281df09dbb8e7a1849ea092d7cf2ca2dc4  ./SECURITY.md
efe23c2c26260c5ca69ad5bfa6b6da2d8c67bf29576b6bbc9e4e9a473ff30d75  ./THIRD_PARTY_NOTICES.txt
948b8cae52795ec0956f71b4f7c8ef07481b9910c23b2bb28210574e40936ecb  ./VERSION.txt
ea3d056a9db81bdd81091259989a3d264cd0cc4ab3c2036046813684d8d8ee32  ./app.js
5ae75a7f87f1dab503e05af445ee0d673b43581ad2e12c8a32cd27b58f5b7bbb  ./app/access/[code]/page.jsx
d7913f54d551395959b6a49d63b377347b716e83091e8835f877f2808c7d866a  ./app/admin-login/page.jsx
a51df7370502bb4bbab02fe681190995e01131d64326fef2be096f427678aed2  ./app/admin/qr/page.jsx
8c8ef03070a18ac88f4da6b4aa86afb96bf2e267ad3e8ac6cdad64250165dde5  ./app/admin/settings/page.jsx
423a3d787a52bd95453e94650dc5e825f6d7a28d945cb824933bf9ab2a124175  ./app/api/admin/qr/route.js
d0e60ba60ea0c0bb79e43e287fdf013405ab0d9a8b0e5957bc723268e721e3ca  ./app/api/admin/settings/route.js
c21d383e204f91e290284f599445478e4fc3037b9d54befa6a34680b1e335d48  ./app/api/auth/logout/route.js
6cb6b27ea2e479f011aabab7845c7ecec4bfb3495e132a92d5ef61890cd0c3b9  ./app/api/auth/password-login/route.js
c364993798caf8a17778fa724ecd22954490ff2db7a41c949244ba26b4f6d6e9  ./app/api/auth/request-code/route.js
1442248b73611eb7b4194790ef99a5de9dc8f2c999bfef01b2213ba70d2b433f  ./app/api/auth/verify-code/route.js
4ba34636dd669a9d6d1bff20f770169d58ead15ddb0cfb46cd6621452c04fa82  ./app/api/health/route.js
1310667c5cfe2e81c64095d89413d222afd6fe79d555fd052c723ae0281940dd  ./app/api/qr/[code]/png/route.js
105576e380e20de5447944043db5d235e9112183ebf65260e27c2497370a3b38  ./app/api/qr/[code]/svg/route.js
381bced1d285330a160b479a2c6632ea89e4b5561ead8416739ed935c868f347  ./app/api/qr/claim-account/route.js
526c63abce9b611a7f97c6faa8cf7eb7798b58e7af43cb41f9fcbcdfaae0c3e8  ./app/api/stories/[id]/route.js
ec02202f5825ad4e0ee986811f20cd4e1359c8775d57090709ae0bd6aac58217  ./app/api/stories/route.js
5378ed13af5f2366c3d26ce644c881bbe96ce743ef10ba94e83c2fab489256c2  ./app/api/uploads/complete/route.js
dfdb35497bd326ca5d77dc9a2ed20605a161e28aa8850fe3d65776a18431b016  ./app/api/uploads/presign/route.js
dbd67ba0764dfeccc58c888f14833f9fcbe1f780028dc81ec92e37a224f71d30  ./app/connect/[code]/page.jsx
ab536345b1f14dc3d694d46c2332241486c92d73ebb8f3fa310a50ad3361495c  ./app/dashboard/page.jsx
da8d97150d448abc4f25b2cc0c6aeab95bec7cc4ffab914b0ac039f7b8c6f89b  ./app/dashboard/story/[id]/page.jsx
c5b172a1a2bbd4bcdc30a058856426c95f8206fdd1d9e1025ad73d851e76bb82  ./app/globals.css
56f8e68f19ae046081e2706c3b3f2b2b09a1be88ce47072ec9b5e312ddb51b70  ./app/layout.jsx
a91a1a20ece8671b65a00a656ddf51cf3e64cd22460791b58d41a8d5a793de5c  ./app/login/page.jsx
0ac207afeaa9f5746bb9ab6824a4a64e962d97662bd17586ce667573c2c56858  ./app/not-found.jsx
1378188e502303ecdca01154b0630ca8be7bd55e608502732afca8ac118a338c  ./app/onboarding/page.jsx
780a18c5a1f0b9d263dd90c320eb24b6bddb57e518be1e6538e2bf8cf939f571  ./app/page.jsx
fd952f9b94ef14ee74df8142b41c716bee0b9c432a743dc2e9c438f48ef358f1  ./app/privacy/page.jsx
00cf6c89f7280c33ce16327e6f70b0ebad0a6df87afa14e928011517f72a8af4  ./app/q/[code]/page.jsx
5b74892c7edca70a7f06cc2c27ca9d4384868acf0f1c9fbb77ed813da1c4abe3  ./app/robots.js
e2bf8d4cff7418594ffab4e6926c603eee3f5089c39c4ca36dedcd6b1373476c  ./app/sample-story/page.jsx
c2e0319d6e178c370153e70973d4ab2c045722bd7eff90c001a5aa98fcb47c56  ./app/sitemap.js
a02c4fe2a4883a2ea9135d66c0cb5de439d23d86bc23f3afb79d0e0cd38d36bf  ./app/story/[slug]/page.jsx
000d4df7160586aecbe963bff4e870dae95f0caf5bb23ee1b8a0f16a5f4fc517  ./app/terms/page.jsx
95c3733ae1645d92fe071780398c4a27aeb98b73d64f6e8d594f800fa943b568  ./components/AdminPasswordLogin.jsx
410a63c38a3978e73e2053be49fe0c70cd017d678f3d14f61d0ddb56854324ca  ./components/AdminSettingsForm.jsx
e0d014969cc041203b313fddf6a0967462e76831700b14b421c8046304a2be9d  ./components/AuthCodeForm.jsx
b60cc11390e7639b370d089cee321f14bee95e4bac49d6d6e600bd2908618f02  ./components/ClaimAccountForm.jsx
96e5e66c25561ef7d0a98555196148b595e7a9baf4e3b24928604087eecc4ab3  ./components/CoverUploader.jsx
54d9cd18aa85d18bf904ea82aad76bb73b9d1c4a01aa24f4acff375fcb398912  ./components/Logo.jsx
1ac9ea05ab99a5073889673061d1d78c30a8b6d8a7437dc8f47af612949ebb84  ./components/LogoutButton.jsx
6fb2347ad29b4d8e7f1f634566532f58ce8656874a019f5731d73775c1484ae2  ./components/OnboardingForm.jsx
6ba279cf8037d35500fb3e49355b35d4bafb5f88b477a68debbaabc4ea4c4b18  ./components/QrBatchStudio.jsx
b8ca79b0ba96232c293873605725fa111d7f0b8de9af29177164ce6901369f43  ./components/SiteFooter.jsx
b077939b3e5ca9496e0e92ba5feda649dc2afbd9257c57a3eef72e3236f81611  ./components/SiteHeader.jsx
3b1cc2ca1670f5b64717b172870dcbfc0adc661f9ad20ad582e32d9e2be1624b  ./components/StoryEditorForm.jsx
14351bf4e025c9b83a10b8b372f94fed638d6a052c945d81c68abae544bf26c5  ./components/TurnstileWidget.jsx
427893e2f9fb008191f613ab969db7d5aac3a08b2f442bb3d0441ad3b9e40f9f  ./jsconfig.json
dee98d56d761cc5fe5f7b81539026a79fcb59ec0bdf93d73c3881ea2aebe1c3f  ./lib/audit.js
ee30843e9c58a17589862c30b7bc7e27e22687589784cba216390bb91efcd297  ./lib/auth.js
71f875c1036739a8f5fcd7316d845606a7ac5c6ce0e174d0eac8bbb9395efb4e  ./lib/claims.js
569d90388a22b294c8aefd97f058c242598e93c588d481884034e8402b477067  ./lib/crypto.js
31ff1f30089104e1a07f21a3e4ad391765b8361578032a392d13c436d7d8d2f3  ./lib/db.js
9244935602b8b550e7b37b0fd4f7e1a09654d5a604d622606a004f37f76c6261  ./lib/email.js
cd3f1bbbb0d52a5752e416e0c50321d12b7676fd9dc06aa078ea84adbffda307  ./lib/env.js
6d83a6f67c645485a626934a6c3a401e2f6d743e755d816de79f8d84672054cb  ./lib/password.js
316751f4643cf89b04e18ba2a243b794392da4f1eb8e37d3bf5d6150e6b32c19  ./lib/permissions.js
05637ec39b56c2dfa1ef73e3cf224df34b6f0228b359c8714e4dcb5f320b460f  ./lib/r2.js
5252620d1b1b338b77da8b12285243b8c113e48ec3978d819d411f1c25b2ad1c  ./lib/rate-limit.js
820e99b357e768bbeeae55c93dcc02e8482c08b62dc046f2b02c09fc8bf6f550  ./lib/security.js
fb4b6a0c54cc4c71391c53ab8d0634980407fb9f2c1e0e8fa35de5213daf510e  ./lib/settings.js
e325022309fa5d52d830b93d60d24141568338fe20b6be6bd459a6873535312d  ./lib/stories.js
ac086e4753cd3edd42e321ea8f0e2ed349f42253b2209a79710f95dd4eeda7c1  ./lib/turnstile.js
6732945f861458aec4c89f4eaf66918507dd48c4a36aaf68c44b4f2ae8ba68f5  ./lib/validation.js
79d763eba2b62a1db2043e7fcca81e2846467b286f3c0e60c1e8b374ff77eb85  ./next.config.mjs
3823bac576ea758381334bc18414c231551a43e481d5d1d0bc373a3648665e25  ./package.json
5b3a6cd8901573f22170ebfac5bdf3f3f2dbe1c7fe2e8f69cfeec3e83bd40bea  ./public/assets/family-generations.jpg
4185ef96b22dae90a5b49ee4db89d6f650bd2817425b050b9f26a2213d4f551f  ./public/assets/hero-portrait.jpg
e9d0f96528950be185cd2fe015d29e15dfc9e04e52aacf1340d4a0be6aa6fd4b  ./public/assets/memory-photos.jpg
322fdaf8ce051513ea40ec678c9fc8fa554bcafa797645cf758bb4436720fa4b  ./public/favicon.svg
97193b01a55bb88aabff481f3a32e79ab045feeedf2e8c78a0bb2a1889907be7  ./public/manifest.webmanifest
de95f4ef4c2d41df12852655ee15d89b9d25e4db94ea2218e0174e6b3516926c  ./r2-cors-production.json
7f98423772d008005419510a55d6fab4728dd829cf5cffd94a8319750b4f47fb  ./scripts/_load-env.mjs
4350095ea80e569d11c8008599534d94f6930fa5ecafb5f6e262d9cfcf35e839  ./scripts/check-env.mjs
07d1eafccfafa5b3b2871eb1354cc9bb9a0b5ee3f9301b68abd8a0413f5d99f6  ./scripts/cleanup-expired.mjs
b94c5b30ce974ec3b2ce4cbae1483c68442bbc2c2ebfa3147bbbc1a49973dafa  ./scripts/create-qr-batch.mjs
a74c676d21f6816d884f1e433352e2d3f29ae9bcef58836c43a98ba509bb181a  ./scripts/deploy-cpanel.sh
31ae7090f31f455a1d73b8f8cc24ac2ad7b9c2b31dea3ed32f17729984bb0e48  ./scripts/migrate.mjs
7728eb131a139550944cff5bebbed5b32ae978299de8fd9eb1bc29f081afbbd4  ./scripts/seed-admin.mjs
7dc613c826949259d7b045d1bafbcddc7e7884723533312724c77efa7684f2b0  ./sql/001_initial.sql
9d605e9e1a1f8dc0ddf57694f18e0fad5435f05711416812b017462f6ece1ee5  ./sql/002_story_prompts.sql
568ffeb4f13046ba446e9e8e0788af8873bad2ca2fc45e2bb951f509474161ef  ./sql/003_admin_settings_password_claim.sql
6c8c1ba23a71dd2690d70d16c24a8fc4d55fb4dcd7423a2bfa2ef68d01d472a4  ./sql/004_qr_purchase_binding.sql
