Mobile-first web app: turn khutbah notes, lectures, Quran reflections, halaqa notes, and reminders into structured summaries, action steps, and shareable cards—not fatwas or rulings.
Treat this repo as safe to make public: tracked files must not contain database passwords, Supabase service_role or secret keys, AI provider keys, JWTs, or real Project Refs. Clone .env.example to .env.local (or .env), add your values only on your machine, and rely on .gitignore (.env* with an exception for .env.example). The Next.js app uses the anon/publishable client key with RLS; SUPABASE_SERVICE_ROLE_KEY is optional and not used by app routes—never prefix it with NEXT_PUBLIC_.
Before inviting the first ~10 beta users:
- Database — Run
supabase/migrations/001_init.sql. If this project ran an older001withoutshort_summary/main_reminder, also runsupabase/migrations/002_short_summary_main_reminder.sql. Confirm RLS stays enabled onprofiles,deen_notes, andsaved_share_cards(see verification SQL below). - Supabase Auth — Site URL and redirect URLs match your deployment (
/auth/callback). Decide production email confirmation behavior. - Environment — Set variables from
.env.exampleon the host. PreferNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY;NEXT_PUBLIC_SUPABASE_ANON_KEYis an optional fallback when publishable is unset. Never put service_role inNEXT_PUBLIC_*; keepSUPABASE_SERVICE_ROLE_KEYserver-only and out of the browser bundle. - AI — Verify
AI_PROVIDERand API keys; smoke-test note generation in staging. - QA — Complete and sign off
docs/MVP_LAUNCH_QA.md. - Positioning — Copy stays humble: journal and reflection, not scholar or fatwa replacement.
- Next.js App Router, TypeScript, Tailwind CSS
- Supabase Auth + Postgres (RLS)
- Pluggable AI: OpenAI, Anthropic, or Groq (
AI_PROVIDER)
- Node.js 20+
- A Supabase project
- An API key for at least one AI provider
- Optional: Supabase CLI for
db push - Optional: Netlify CLI (installed in this repo as a dev dependency — use
npm run ntl -- …from the repo root)
From the repo root, the CLI is available without a global install:
npm run ntl -- --version
npm run ntl -- status
npm run ntl -- link
npm run netlify:deploy
npm run netlify:deploy:prodFor non-interactive use (agents, CI, scripts), set NETLIFY_AUTH_TOKEN in .env.local (create a personal access token under Netlify → User settings → Applications). For a one-time interactive login on your machine: npm run ntl -- login.
From the repo root (after installing the CLI):
For this project, use your Supabase dashboard Project Ref when linking locally. Find it under Project Settings → General (not the full database password).
supabase login
supabase init
supabase link --project-ref YOUR_PROJECT_REF
supabase db pushsupabase initcreatessupabase/config.tomlif you do not already have it; keep migration SQL insupabase/migrations/as the source of truth.
If supabase db push fails with “already exists” (you already ran 001_init.sql in the SQL Editor), the remote DB matches that migration but Supabase’s history does not yet. Mark it applied, then push again:
supabase migration repair 001 --status applied --linked
supabase db pushUse 002 instead of 001 if only the second migration was applied manually. Run supabase migration list to see local vs remote status.
Run in SQL Editor (or supabase db execute):
-- Tables exist in public schema
select table_name
from information_schema.tables
where table_schema = 'public'
and table_name in ('profiles', 'deen_notes', 'saved_share_cards')
order by table_name;
-- RLS enabled (relrowsecurity should be true for each)
select c.relname as table_name, c.relrowsecurity as rls_enabled
from pg_class c
join pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'public'
and c.relkind = 'r'
and c.relname in ('profiles', 'deen_notes', 'saved_share_cards')
order by 1;Expect three rows in the first query and rls_enabled = true for all three in the second. Policies in the migrations scope access by auth.uid() for tenant-owned rows.
-
Clone and install
npm install
-
Configure Supabase
- Settings → API: copy project URL (e.g.
https://YOUR_PROJECT_REF.supabase.co) and the publishable client key (or legacy anon key — same permission level; never theservice_rolekey forNEXT_PUBLIC_*). - Authentication → URL configuration: set Site URL to
http://localhost:3000(and your production URL on Vercel). - Redirects:
http://localhost:3000/auth/callback(andhttps://your-domain.com/auth/callbackin production).
- Settings → API: copy project URL (e.g.
-
Database
- Option A — SQL Editor: run
supabase/migrations/001_init.sqland, if needed,002_short_summary_main_reminder.sql. - Option B — CLI: use Supabase CLI workflow and confirm with the verification SQL.
If Postgres errors on
execute functionfor triggers, useexecute procedurefor the same trigger names (see Supabase/Postgres docs for your version). - Option A — SQL Editor: run
-
Environment variables
cp .env.example .env.local
Fill in at minimum:
NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY(preferred) orNEXT_PUBLIC_SUPABASE_ANON_KEY,AI_PROVIDER, the matching model env (OPENAI_MODEL/ANTHROPIC_MODEL/GROQ_MODEL), and that provider’s API key. Do not commit.env.local. -
Auth for local dev
- Under Authentication → Providers → Email, consider disabling Confirm email while developing so sign-up can log in immediately. Re-enable for production.
-
Run the app
npm run dev
Open http://localhost:3000.
- Import the repo; set the same env vars in the Vercel project (including optional
SUPABASE_SERVICE_ROLE_KEYonly if you add server jobs that need it—never as a public var). - Point Supabase Site URL and redirect URLs at your Vercel domain.
Before closing out a release, follow docs/DEPLOY_CHECKLIST.md (commit/push → confirm Netlify commit → curl route health).
- In the site’s Environment variables, set
NEXT_PUBLIC_SUPABASE_URLandNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEYfor your Supabase project. - If
NEXT_PUBLIC_SUPABASE_ANON_KEYmight be wrong or from another project, remove it. The app uses publishable first when it is non-empty, but deleting a bad anon avoids confusion and mistaken “which key is live?” during rollouts. - Run Deploys → Clear cache and deploy site after any
NEXT_PUBLIC_*change so the new values are inlined into the client bundle. - After deploy, hard refresh the site and sign in again so session cookies match the deployed URL and keys.
From the repo you can also use npm run netlify:deploy:prod (see Netlify CLI); env vars are still managed in the Netlify UI or via npm run ntl -- env:set … when authenticated.
| Command | Description |
|---|---|
npm run dev |
Dev server |
npm run build |
Production build |
npm run start |
Start production |
npm run lint |
ESLint |
npm run test |
Vitest (AI schema) |
DeenNotes is for organizing Islamic learning and personal reflection. It does not provide fatwas or religious rulings. Users should consult a qualified scholar or imam for religious decisions.