{"id":25209328,"url":"https://github.com/mrofisr/sakeenah","last_synced_at":"2026-02-04T01:26:22.858Z","repository":{"id":269690430,"uuid":"907857886","full_name":"mrofisr/islamic-wedding-invitation","owner":"mrofisr","description":"A beautiful, modern, and interactive islamic wedding invitation website built with Vite ( React ), Tailwind CSS, and Framer Motion. Created with ❤️ by @mrofisr.","archived":false,"fork":false,"pushed_at":"2025-03-22T04:33:50.000Z","size":8798,"stargazers_count":77,"open_issues_count":0,"forks_count":16,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-09T21:15:05.888Z","etag":null,"topics":["frammer-motion","islam","islamic","lucide-react","react","reactjs","tailwindcss","vite","vitejs","wedding","wedding-invitation","wedding-invitation-card","wedding-template","wedding-website"],"latest_commit_sha":null,"homepage":"https://islamic-wedding-invitation.vercel.app","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrofisr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["mrofisr"]}},"created_at":"2024-12-24T15:08:52.000Z","updated_at":"2025-04-09T15:46:18.000Z","dependencies_parsed_at":"2025-01-27T14:45:32.852Z","dependency_job_id":"afafe12e-f97a-431b-9abb-1cfd380adef4","html_url":"https://github.com/mrofisr/islamic-wedding-invitation","commit_stats":null,"previous_names":["mrofisr/islamic-wedding-invitation","mrofisr/sakeenah"],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrofisr%2Fislamic-wedding-invitation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrofisr%2Fislamic-wedding-invitation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrofisr%2Fislamic-wedding-invitation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrofisr%2Fislamic-wedding-invitation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrofisr","download_url":"https://codeload.github.com/mrofisr/islamic-wedding-invitation/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248111971,"owners_count":21049578,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["frammer-motion","islam","islamic","lucide-react","react","reactjs","tailwindcss","vite","vitejs","wedding","wedding-invitation","wedding-invitation-card","wedding-template","wedding-website"],"created_at":"2025-02-10T13:16:45.683Z","updated_at":"2026-02-04T01:26:22.844Z","avatar_url":"https://github.com/mrofisr.png","language":"JavaScript","funding_links":["https://github.com/sponsors/mrofisr"],"categories":["Other (122 projects)"],"sub_categories":["JavaScript"],"readme":"# Sakeenah: Modern Islamic Wedding Invitation Platform\n\n![Build](https://img.shields.io/badge/build-passing-brightgreen)\n![License](https://img.shields.io/badge/license-Apache%202.0-blue)\n![Version](https://img.shields.io/badge/version-2.0.0-orange)\n\n## Overview\n\nSakeenah is a production-ready, database-driven wedding invitation platform designed for modern couples who value both aesthetics and functionality. Built on a scalable client-server architecture with PostgreSQL multi-tenancy, it enables hosting unlimited wedding invitations from a single deployment with personalized guest experiences.\n\n![Sakeenah Preview](public/preview.png)\n\n## Business Problem\n\nTraditional wedding invitations face significant challenges:\n\n- **Manual guest tracking**: Paper-based RSVPs result in incomplete attendance data and last-minute uncertainties\n- **Static content delivery**: Generic invitations lack personalization, reducing guest engagement\n- **Limited scalability**: Single-event websites require separate deployments for each wedding\n- **Poor mobile experience**: Desktop-only designs fail to reach 70%+ of guests accessing from mobile devices\n- **Missing analytics**: No visibility into invitation opens, wish submissions, or attendance trends\n\n## Solution\n\nSakeenah delivers a comprehensive digital invitation platform:\n\n**Personalized Guest Experience**: URL-based guest identification pre-fills names and tracks individual invitation engagement without requiring login.\n\n**Multi-Tenant Architecture**: Host unlimited weddings from a single deployment with complete data isolation and per-wedding customization.\n\n**Mobile-First Design**: Responsive layouts optimized for smartphones ensure seamless experiences across all devices and screen sizes.\n\n**Real-Time Interaction**: PostgreSQL-backed wish system with attendance tracking provides instant feedback and engagement metrics.\n\n**Edge Deployment Ready**: Cloudflare Workers support enables global distribution with sub-50ms response times and 99.99% uptime.\n\n## Core Features\n\n### Guest Management\n\n- Personalized invitation links with base64-encoded guest names\n- Automated name pre-filling in hero sections and wish forms\n- Attendance tracking (attending, not attending, undecided)\n- Real-time wish submission with PostgreSQL persistence\n\n### Multi-Tenant System\n\n- Unique wedding identifiers (UIDs) for URL routing\n- Database-driven wedding data (no code changes needed)\n- Isolated wishes and analytics per wedding\n- Centralized deployment for unlimited events\n\n### User Experience\n\n- Smooth animations powered by Framer Motion\n- Background music controls with autoplay support\n- Countdown timer to wedding date\n- Interactive confetti effects\n- Google Maps integration for venue directions\n- Digital envelope with bank account details\n\n### Technical Capabilities\n\n- REST API backend with Hono framework\n- PostgreSQL connection pooling for high concurrency\n- Asia/Jakarta timezone standardization\n- Zod schema validation for API requests\n- React Router v7 for client-side navigation\n\n## Technical Stack\n\n| Layer      | Technology         | Purpose                                   |\n| ---------- | ------------------ | ----------------------------------------- |\n| Runtime    | Bun 1.3.5          | Package management and server execution   |\n| Frontend   | React 18 + Vite    | Fast build tooling and reactive UI        |\n| Backend    | Hono               | Lightweight edge-compatible API framework |\n| Database   | PostgreSQL         | Multi-tenant data storage                 |\n| Styling    | Tailwind CSS       | Utility-first responsive design           |\n| Animation  | Framer Motion      | Declarative animations and transitions    |\n| Query      | TanStack Query     | Server state management and caching       |\n| Deployment | Cloudflare Workers | Global edge network distribution          |\n\n### System Architecture\n\n```\n┌──────────────────┐\n│   Client (SPA)   │  React + Vite (Port 5173)\n│  Mobile-First    │  React Router v7 + Framer Motion\n└────────┬─────────┘\n         │ HTTPS/REST\n┌────────▼─────────┐\n│  API Server      │  Hono (Port 3000)\n│  (Bun Runtime)   │  CORS + Zod Validation\n└────────┬─────────┘\n         │ PostgreSQL Protocol\n┌────────▼─────────┐\n│   PostgreSQL     │  Multi-Tenant Database\n│  (Connection     │  Per-Wedding Data Isolation\n│   Pooling)       │\n└──────────────────┘\n```\n\n## Quick Start\n\n### Prerequisites\n\n- Bun v1.3.5 or later\n- PostgreSQL v14+ (local or cloud-hosted)\n- Git\n\n### Installation\n\n1. **Clone and install dependencies:**\n\n   ```bash\n   git clone https://github.com/mrofisr/sakeenah.git\n   cd sakeenah\n   bun install\n   ```\n\n2. **Set up PostgreSQL database:**\n\n   ```bash\n   # Create database\n   createdb sakeenah\n\n   # Apply schema\n   psql -d sakeenah -f src/server/db/schema.sql.example\n   ```\n\n3. **Configure environment variables:**\n\n   ```bash\n   cp .env.example .env\n   ```\n\n   The `.env` file contains:\n\n   ```env\n   # Frontend\n   VITE_API_URL=http://localhost:3000\n\n   # Backend\n   DATABASE_URL=postgresql://username:password@localhost:5432/sakeenah\n   PORT=3000\n   ```\n\n   Update `DATABASE_URL` with your PostgreSQL credentials.\n\n4. **Add your wedding data:**\n\n   ```bash\n   # Copy the SQL template\n   cp src/server/db/add-wedding.sql.example my-wedding.sql\n\n   # Edit my-wedding.sql with your wedding details\n   # Then insert into database\n   psql -d sakeenah -f my-wedding.sql\n   ```\n\n   This will create your wedding invitation with a unique UID (e.g., `ahmad-fatimah-2025`).\n\n5. **Start development servers:**\n\n   ```bash\n   bun run dev\n   ```\n\n   This runs both frontend (Vite) and backend (Hono API) concurrently.\n\n6. **Access your invitation:**\n   - Frontend: `http://localhost:5173/your-wedding-uid`\n   - API endpoint: `http://localhost:3000/api/invitation/your-wedding-uid`\n\nReplace `your-wedding-uid` with the UID you defined in your SQL file.\n\n## Personalized Invitations\n\n### Enhanced Security \u0026 Privacy\n\nSakeenah implements a secure invitation system that protects guest privacy and prevents web scraping:\n\n**Security Features:**\n\n- Wedding UID and guest names stored in localStorage (not visible in URL after initial load)\n- URL automatically cleaned to `https://yourdomain.com` after data extraction\n- 30-day expiration for stored invitation data\n- Meta tags prevent Wayback Machine and search engine archiving\n- No URL injection vulnerabilities\n\n### Initial URL Pattern\n\nEach guest receives a unique invitation link that contains their wedding UID and encoded name:\n\n```\nhttps://yourdomain.com/\u003cwedding-uid\u003e?guest=\u003cbase64-encoded-name\u003e\n```\n\n**Components:**\n\n- `\u003cwedding-uid\u003e`: Your unique wedding identifier (e.g., `rifqi-dina-2025`, `ahmad-fatimah-2025`)\n- `?guest=`: Query parameter for guest identification\n- `\u003cbase64-encoded-name\u003e`: Guest name encoded in URL-safe base64 format\n\n**What Happens After First Click:**\n\n1. Guest clicks: `https://yourdomain.com/ahmad-fatimah-2025?guest=QWhtYWQ`\n2. System extracts and stores UID and guest name in localStorage\n3. URL automatically changes to: `https://yourdomain.com`\n4. All data persists in localStorage for 30 days\n5. Guest sees clean URL, data remains private\n\n**Real Examples:**\n\nInitial link sent to guest:\n\n```\nhttps://yourdomain.com/ahmad-fatimah-2025?guest=QWhtYWQlMjBBYmR1bGxhaA\n```\n\nURL after guest opens (automatically cleaned):\n\n```\nhttps://yourdomain.com\n```\n\nhttps://yourdomain.com/\u003cwedding-uid\u003e?guest=\u003cbase64-encoded-name\u003e\n\n```\n\n**Components:**\n\n- `\u003cwedding-uid\u003e`: Your unique wedding identifier (e.g., `rifqi-dina-2025`, `ahmad-fatimah-2025`)\n- `?guest=`: Query parameter for guest identification\n- `\u003cbase64-encoded-name\u003e`: Guest name encoded in URL-safe base64 format\n\n**Real Examples:**\n\n```\n\nhttps://yourdomain.com/ahmad-fatimah-2025?guest=QWhtYWQlMjBBYmR1bGxhaA\nhttps://yourdomain.com/rifqi-dina-2025?guest=U2FyYWglMjBKb2huc29u\nhttps://yourdomain.com/wedding-2025?guest=QmFwYWslMjBSdWRpJTIwJTI2JTIwS2VsdWFyZ2E\n\n````\n\n### Generating Guest Links\n\nUse the built-in script to generate personalized links for all your guests:\n\n```bash\nbun run generate-links\n````\n\n**Steps:**\n\n1. Edit `generate-links-example.js` and configure:\n\n   ```javascript\n   const INVITATION_UID = \"your-wedding-uid\"; // Your wedding UID\n   const BASE_URL = \"https://yourdomain.com\"; // Your production URL\n\n   const guestList = [\n     \"Ahmad Abdullah\",\n     \"Sarah Johnson\",\n     \"Bapak Rudi \u0026 Keluarga\",\n     // ... add all your guests\n   ];\n   ```\n\n2. Run the script:\n\n   ```bash\n   bun run generate-links\n   ```\n\n3. Output includes personalized links for each guest:\n\n   ```\n   1. Ahmad Abdullah\n      https://yourdomain.com/ahmad-fatimah-2025?guest=QWhtYWQlMjBBYmR1bGxhaA\n\n   2. Sarah Johnson\n      https://yourdomain.com/ahmad-fatimah-2025?guest=U2FyYWglMjBKb2huc29u\n   ```\n\n### Guest Experience\n\nWhen guests open their personalized link:\n\n1. **First Visit:**\n\n   - Click link: `https://yourdomain.com/wedding-2025?guest=encoded-name`\n   - System stores wedding UID and guest name in browser localStorage\n   - URL automatically cleans to: `https://yourdomain.com`\n   - Invitation loads with personalized greeting\n\n2. **Subsequent Visits:**\n   - Guest navigates to: `https://yourdomain.com`\n   - Data loads from localStorage automatically\n   - No need to click the original link again\n   - Works for 30 days from first visit\n\n**Features:**\n\n- **Name pre-filled**: Guest name automatically appears in hero section\n- **Wish form ready**: Name pre-populated in wedding wish submission\n- **Editable**: Guests can update their name if needed\n- **Attendance tracking**: Individual RSVP tracked per guest\n- **No login required**: Seamless experience without authentication\n- **Privacy protected**: Guest data stored locally, not in URL history\n- **Clean URLs**: No sensitive information visible in browser address bar\n\n**Data Persistence:**\n\n- Invitation data persists for 30 days in browser localStorage\n- Clearing browser data will require clicking the original link again\n- Each browser/device maintains separate invitation data\n- No server-side session management required\n\n### Distribution Methods\n\n**WhatsApp Template:**\n\n```\nAssalamualaikum Warahmatullahi Wabarakatuh,\n\nDengan memohon rahmat dan ridho Allah SWT, kami mengundang Bapak/Ibu/Saudara/i untuk menghadiri pernikahan kami:\n\n[Bride] \u0026 [Groom]\n[Date] | [Location]\n\nBuka undangan digital: [personalized-link]\n\nJazakumullahu khairan\n```\n\n**SMS Template:**\n\n```\n[Bride] \u0026 [Groom] wedding invitation\nDate: [date]\nView your invitation: [short-link]\n```\n\n**Email Template:**\n\n```\nSubject: Wedding Invitation - [Bride] \u0026 [Groom]\n\nDear [Guest Name],\n\nWe joyfully invite you to celebrate our wedding...\nView your personalized invitation: [link]\n```\n\n### Link Management Tips\n\n- **Test links first**: Always test generated links before mass distribution\n- **URL shorteners**: Use bit.ly or similar for cleaner WhatsApp sharing\n- **Track opens**: Monitor invitation views through attendance statistics\n- **Backup list**: Keep a spreadsheet of guest names and their unique links\n- **Resend capability**: Guests can request link resend via contact information\n\n## API Reference\n\n### Invitations\n\n**GET** `/api/invitation/:uid`\n\nRetrieves wedding details including agenda and bank accounts.\n\nResponse:\n\n```json\n{\n  \"uid\": \"wedding-2025\",\n  \"title\": \"Wedding of Ahmad \u0026 Fatimah\",\n  \"groom_name\": \"Ahmad\",\n  \"bride_name\": \"Fatimah\",\n  \"date\": \"2025-06-15\",\n  \"agenda\": [...],\n  \"banks\": [...]\n}\n```\n\n### Wishes\n\n**GET** `/api/:uid/wishes?page=1\u0026limit=10`\n\nRetrieves paginated wishes for a wedding.\n\n**POST** `/api/:uid/wishes`\n\nCreates new wish with attendance status.\n\nRequest body:\n\n```json\n{\n  \"name\": \"Guest Name\",\n  \"message\": \"Congratulations!\",\n  \"attendance\": \"attending\"\n}\n```\n\n**GET** `/api/:uid/stats`\n\nReturns attendance statistics:\n\n```json\n{\n  \"attending\": 45,\n  \"not_attending\": 12,\n  \"undecided\": 8,\n  \"total\": 65\n}\n```\n\n## Deployment\n\n### Option 1: Cloudflare Workers (Recommended)\n\nDeploy full-stack application to Cloudflare's edge network.\n\n1. Authenticate:\n\n   ```bash\n   wrangler login\n   ```\n\n2. Create Hyperdrive connection:\n\n   ```bash\n   wrangler hyperdrive create sakeenah-db \\\n     --connection-string=\"postgresql://user:pass@host:5432/sakeenah\"\n   ```\n\n3. Update `wrangler.jsonc` with Hyperdrive ID and domain\n\n4. Deploy:\n   ```bash\n   bun run deploy\n   ```\n\n**Benefits**:\n\n- Global edge distribution (100+ locations)\n- Sub-50ms response times\n- Automatic SSL certificates\n- 100,000 requests/day (free tier)\n\n### Option 2: Separate Hosting\n\n- **Frontend**: Vercel, Netlify, Cloudflare Pages (deploy `dist/` folder)\n- **Backend**: VPS with Bun, Railway, Fly.io, Render\n- **Database**: Supabase, Neon, Railway PostgreSQL\n\nProduction environment variables:\n\n```env\nVITE_API_URL=https://api.yourdomain.com\nDATABASE_URL=postgresql://user:pass@production-host:5432/sakeenah\n```\n\nBuild commands:\n\n```bash\nbun run build    # Frontend production build\nbun run server   # Backend production server\n```\n\n## Configuration\n\n### Database Method (Recommended)\n\nAdd wedding data via SQL templates:\n\n```sql\nINSERT INTO invitations (uid, title, groom_name, bride_name, date, ...)\nVALUES ('wedding-2025', 'Ahmad \u0026 Fatimah', 'Ahmad', 'Fatimah', '2025-06-15', ...);\n\nINSERT INTO agenda (invitation_id, title, date, start_time, ...)\nVALUES (1, 'Akad Nikah', '2025-06-15', '10:00', ...);\n```\n\nSee `src/server/db/add-wedding.sql.example` for complete template.\n\n### Static Config (Development Only)\n\nFor testing, edit `src/config/config.js`:\n\n```javascript\nconst config = {\n  data: {\n    title: \"Wedding of Ahmad \u0026 Fatimah\",\n    groomName: \"Ahmad\",\n    brideName: \"Fatimah\",\n    date: \"2025-06-15\",\n    location: \"Grand Ballroom, Hotel Majesty\",\n    // ... additional fields\n  },\n};\n```\n\n## Scripts\n\n```bash\n# Development\nbun run dev              # Run client + server concurrently\nbun run dev:client       # Frontend only (Vite)\nbun run dev:server       # Backend only (Hono API)\n\n# Production\nbun run build            # Build frontend to dist/\nbun run preview          # Preview production build\nbun run server           # Run backend server\n\n# Cloudflare Workers\nbun run deploy           # Build + deploy to Workers\nbun run cf:dev           # Test with Workers runtime\nbun run cf:tail          # View live deployment logs\n\n# Utilities\nbun run generate-links   # Generate personalized guest links\nbun run lint             # ESLint code validation\n```\n\n## Security \u0026 Compliance\n\n### Data Protection\n\n- **Multi-tenant isolation**: Database-level separation ensures wedding data never crosses boundaries\n- **CORS protection**: API access restricted to approved domains only\n- **Input validation**: Zod schemas prevent SQL injection and XSS attacks\n- **TLS encryption**: HTTPS enforced for all production deployments\n- **localStorage security**: Client-side data expires after 30 days automatically\n- **URL sanitization**: Sensitive parameters removed from URL after extraction\n- **Anti-scraping**: Meta tags and robots.txt prevent web archiving (Wayback Machine, etc.)\n\n### Authentication \u0026 Guest Privacy\n\n- **No login required**: Seamless guest experience via localStorage persistence\n- **Clean URLs**: Wedding UID and guest names hidden from URL after first load\n- **Session management**: Client-side storage with automatic expiration\n- **Database security**: PostgreSQL row-level security for data isolation\n- **Rate limiting**: Recommended for production to prevent abuse\n\n### Privacy Guarantees\n\n- **Minimal data collection**: Only wedding UID and guest name stored client-side\n- **No tracking**: Zero third-party analytics or tracking by default\n- **Public wishes**: Guest messages intentionally public for wedding celebration\n- **Data retention**: localStorage cleared after 30 days or manual browser cleanup\n- **No URL history**: Sensitive data not persisted in browser history or bookmarks\n- **Archive prevention**: Robots.txt and meta tags block Wayback Machine and web crawlers\n\n## Project Structure\n\n```\nsakeenah/\n├── src/\n│   ├── components/          # React UI components\n│   ├── pages/              # Route pages (LandingPage, MainContent)\n│   ├── context/            # React Context providers\n│   ├── config/             # Static configuration (deprecated)\n│   ├── server/             # Backend API\n│   │   ├── server.js       # Hono app initialization\n│   │   ├── db/             # Database schemas and migrations\n│   │   └── routes/         # API endpoint handlers\n│   └── main.jsx            # React application entry\n├── public/                 # Static assets (images, audio)\n├── dist/                   # Production build output\n├── vite.config.js          # Vite bundler configuration\n├── wrangler.jsonc          # Cloudflare Workers config\n└── package.json            # Dependencies and scripts\n```\n\n## Browser Support\n\n- Chrome/Edge 90+\n- Firefox 88+\n- Safari 14+\n- Mobile Safari (iOS 14+)\n- Chrome Mobile (Android 10+)\n\nUpdate browserslist database:\n\n```bash\nnpx update-browserslist-db@latest\n```\n\n## Support \u0026 Contributing\n\n### Issue Reporting\n\nReport bugs via [GitHub Issues](https://github.com/mrofisr/islamic-wedding-invitation/issues) with:\n\n- Steps to reproduce\n- Expected vs actual behavior\n- Browser/device information\n- Screenshots if applicable\n\n### Contributing\n\nWe welcome contributions from developers, designers, and the Muslim community! Please read our [Contributing Guide](CONTRIBUTING.md) for detailed information on:\n\n- Code of conduct\n- Development setup\n- Coding standards\n- Pull request process\n- Cultural guidelines\n\nQuick start for contributors:\n\n1. Read [CONTRIBUTING.md](CONTRIBUTING.md)\n2. Fork the repository\n3. Create a feature branch\n4. Make your changes following our guidelines\n5. Submit a pull request\n\n### Commercial Support\n\nFor custom wedding invitations based on this platform:\n\n- Must align with design philosophy and Islamic values\n- Portion of service fee donated to charitable institutions\n- Contact: [@mrofisr](https://github.com/mrofisr)\n\n## License\n\nLicensed under the Apache License 2.0. See [LICENSE](./LICENSE) for full terms.\n\nCopyright (c) 2024-present mrofisr\n\nYou may use, modify, and distribute this software under the Apache 2.0 terms, which require:\n\n- Preservation of copyright notices\n- Inclusion of license text in distributions\n- Documentation of modifications\n\n## Acknowledgments\n\n- Built with [Vite](https://vite.dev/), [React](https://react.dev/), and [Hono](https://hono.dev/)\n- Animations by [Framer Motion](https://www.framer.com/motion/)\n- Icons from [Lucide](https://lucide.dev/)\n- Hosted on [Cloudflare Workers](https://workers.cloudflare.com/)\n\n## Contact\n\n- GitHub: [@mrofisr](https://github.com/mrofisr)\n- Instagram: [@mrofisr](https://instagram.com/mrofisr)\n\n---\n\n**\"And among His signs is that He created for you spouses from among yourselves so that you may find comfort in them.\"** - Quran 30:21\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrofisr%2Fsakeenah","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrofisr%2Fsakeenah","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrofisr%2Fsakeenah/lists"}