شبكة وطنية حية لرصد المياه، توقع الأزمات، وإدارة الطوارئ — مبنية بقوة المجتمع والذكاء الاصطناعي.
Hydro Plus+ ليس مجرد تطبيق لتتبع المياه — بل نظام تشغيل مدني للبنية التحتية المائية. كل مواطن يصبح مستشعر بشري، وكل بلدية تحصل على مركز قيادة ذكي، وكل ولاية تتحول إلى نسخة رقمية حية يمكن محاكاتها والتنبؤ بسلوكها.
"نحن نبني الجهاز العصبي للبنية التحتية للمياه، حيث المواطنون مستشعرات والذكاء الاصطناعي طبقة القرار."
- نموذج ذكاء اصطناعي يحلل البلاغات والأنماط الزمنية والجغرافية.
- يتنبأ باحتمالية الانقطاع خلال 24 / 72 ساعة.
- سرد ذكي طبيعي بثلاث لغات (عربي / فرنسي / إنجليزي).
- مدعوم بـ Lovable AI Gateway بدون مفاتيح API خارجية.
- محاكاة لحظية لشبكة المياه في كل ولاية وحي.
- مؤشر Health Index (0–100) يحسب من البلاغات الحية.
- حالات الضغط: منخفض / طبيعي / مرتفع / حرج.
- خط زمني مرئي للأحداث الستة الأخيرة.
- Realtime: متصل عبر مدير القنوات المركزي — يتحرك المؤشر فورياً مع كل بلاغ جديد.
- جدول
digital_twinsفي قاعدة البيانات للحفظ الدائم.
- يدمج رطوبة التربة، الحرارة السطحية، تقدير الخزانات، وخطر الجفاف.
- يقرأ من جدول
satellite_dataعند توفر بيانات حقيقية. - يستخدم خوارزمية تقدير حتمية كاحتياط عند غياب البيانات.
- جاهز لربط APIs خارجية (NASA SMAP, Copernicus, Sentinel).
- مقياس واحد (0–100) يلخص "صحة المياه" في المنطقة.
- Orb gauge بصري مع تأثيرات Glow متحركة وتوهج تدريجي.
- اتجاه أسبوعي: تحسّن / مستقر / تراجع.
- محسوب من نسبة البلاغات المستقرة + معامل التحقق المجتمعي.
- Realtime مرتبط بنفس قناة
water_reportsالمشتركة (لا قناة مكررة).
- جدول
emergency_zonesللأزمات النشطة. - عرض بصري قوي مع تدرج أحمر متموج وأيقونة Siren متذبذبة.
- 4 مستويات شدة: low / medium / high / critical.
- تعليمات نصية لكل منطقة + عدد السكان المتأثرين.
- Realtime instant banner: عند إدراج منطقة طوارئ جديدة، يظهر toast فوري لكل المستخدمين بدون reload.
- اشتراك مشترك مع SmartAlerts عبر
useSharedRealtime— قناة واحدة فقط.
- تنبيهات شخصية مرتبة حسب الأولوية (1=الأعلى).
- 4 أنواع: info / warning / critical / prediction.
- اشتراك Realtime: يظهر التنبيه فوراً دون إعادة تحميل.
- شريط تنبيه قابل للإغلاق مع تدرج لوني حسب النوع.
- طابور محلي
localStorageمع client_uuid مستقر لكل عنصر. - منع التكرار على مستوى قاعدة البيانات بفهرس فريد
(user_id, client_uuid). - ترتيب زمني: الأقدم أولاً للحفاظ على السببية.
- حماية من re-entrancy: لا يمكن تشغيل drain متوازي.
- معالجة Postgres
23505كنجاح + عدّاد مكررات. - Offline Sync Drawer — درج كامل في الهيدر يعرض:
- عدد العناصر المعلقة
- عدد المكررات المكتشفة
- إجمالي ما تمت مزامنته
- وقت آخر مزامنة
- زر Retry now يدوي
- قائمة الأحداث مع
client_uuidووقت الإنشاء وعدد المحاولات وآخر خطأ.
- جدول
organizationsيدعم: بلدية / ولاية / شركة مياه / منظمة. - مفتاح API تلقائي لكل مؤسسة (api_key مولّد).
- صفحة إدارة
/admin/multi-tenantمع: بحث، فلترة بالنوع، KPIs. - جميع العمليات (create / update / toggle / delete) تكتب تلقائياً في audit_logs.
- جدول
audit_logsيخزن كل عملية إدارية مع actor + target + metadata. - صفحة
/admin/auditتعرض السجل مع:- المنفذ (المسؤول)
- الوقت والتاريخ
- المنظمة المتأثرة
- تفاصيل المنظمة (الاسم، النوع، الولاية)
- RLS: قراءة للمشرفين فقط، إدراج فقط بـ
actor_id = auth.uid().
- 3 أوضاع: Markers / Heatmap / Risk zones.
- Marker Clustering ذاتي (بدون مكتبة خارجية) — يجمع البلاغات في خلايا حسب الـ zoom.
- Throttling: التحديث الواحد كل 200ms (طبيعي) أو 800ms (perf).
- Auto Performance Mode عند:
- الجهاز ضعيف (
hardwareConcurrency ≤ 4أوdeviceMemory ≤ 2) - الاتصال 2G/3G أو
Save-Dataمفعل - وضع Offline
- الجهاز ضعيف (
- Light tiles (Maps Styles JSON) في perf mode بدلاً من Vector Map ID — أسرع مرتين.
- زر toggle يدوي لتفعيل/إيقاف Performance Mode.
- بحث عن 58 ولاية + التركيز التلقائي.
- تحديث Realtime عند ورود بلاغات جديدة.
- نظام تصويت ⬆️⬇️ على البلاغات.
- شارات ثقة: جديد / نشط / موثوق.
- جدول
report_votesمع منع التصويت المكرر.
- 5 شارات قابلة للفتح: أول بلاغ، مبلّغ دقيق، حارس المجتمع، كاشف مبكر، قائد موثوق.
- شريط تقدم للشارة التالية.
- تاريخ مفصل لكل ولاية.
- Score (0–100) + اتجاه أسبوعي.
- عداد البلاغات المستقرة مقابل الانقطاعات.
- إحصائيات حية للنظام بأكمله.
- تصدير PDF احترافي للوزارات (
jspdf+jspdf-autotable). - جدول البلاغات الأخيرة مع التصفية.
- تسجيل بريد + كلمة مرور.
- Google OAuth + Apple OAuth (مُفعّل عبر Lovable Cloud Managed Social Login).
- استرجاع كلمة المرور عبر بريد إلكتروني + صفحة
/reset-password. - HIBP — حماية من كلمات المرور المسربة.
- RLS على جميع الجداول (12 جدولاً).
- نظام أدوار منفصل (
user_roles+has_role) لمنع تصعيد الامتيازات.
- زر الاتصال يفتح الهاتف فوراً عبر
tel:protocol. - زر الواتساب يفتح المحادثة عبر
wa.me/protocol. - اتصال فعلي حقيقي وليس واجهة فقط.
- React 18 + TypeScript 5 + Vite 5
- Tailwind CSS 3 مع نظام تصميم كامل (HSL semantic tokens)
- Framer Motion للحركات السائلة
- Zustand + persist لإدارة الحالة
- TanStack Query للتخزين المؤقت + Realtime invalidation
- React Router + Lazy loading لكل الصفحات + كل الـ widgets الثقيلة
src/lib/realtimeManager.ts— قناة واحدة مشتركة لكل جدول.- Reference-counted: تُفتح القناة عند أول مشترك، وتُغلق عند آخر إلغاء.
- يستخدمها:
DigitalTwin,WaterSignalIndex,EmergencyMode,SmartAlertEngine,useReportsRealtime. - بدون قنوات مكررة → بدون listeners مكررة → بدون invalidations مكررة.
- PostgreSQL + RLS كاملة على 12 جدولاً.
- Realtime subscriptions على:
water_reports,report_votes,digital_twins,emergency_zones,smart_alerts,water_signal_index,audit_logs. - Edge Functions بـ Deno:
water-ai-predict,grant-admin. - Storage buckets:
avatars,report-images. - Auth: email/password + recovery + Google + Apple.
- Lovable AI Gateway:
google/gemini-2.5-flashللتنبؤ.
- Glassmorphism متعدد المستويات (
.glass,.glass-card,.glass-strong,.glass-panel). - Liquid ripple على التفاعلات.
- Breathing UI — تنفس حي لطيف.
- Aurora mesh — خلفية تدرج متحركة.
- Scan line — خط مسح كمراكز التحكم.
- Pulse glow للأيقونات الحرجة.
- Tabular numerals (
.nums) للبيانات الكثيفة. - Fluid typography (
clamp()) للتصغير/التكبير حسب الشاشة. - Full RTL — flip للأيقونات +
unicode-bidi: isolateللأرقام والإيميل. - خط Cairo (عربي) + Inter (لاتيني) + JetBrains Mono (بيانات).
scripts/i18n-check.mjs— يفحص ar/fr/en تلقائياً.- يكتشف مفاتيح ناقصة عبر اللغات.
- يكتشف مفاتيح مكررة داخل اللغة.
- يُربط بـ
prebuildفيpackage.json→ يكسر البناء إذا فشل. - 253 مفتاح × 3 لغات = 759 ترجمة موزونة.
profiles → ملفات المستخدمين + ولاية/بلدية/حي + مستوى الثقة
water_reports → البلاغات (نوع، صور، إحداثيات، client_uuid للأوفلاين)
report_votes → نظام التصويت ⬆️⬇️
user_roles → الأدوار (admin / moderator / user)
audit_logs → سجل العمليات الإدارية الكامل
— الميزات المتقدمة —
organizations → Multi-tenant (بلديات + شركات + منظمات + API key)
digital_twins → نسخة رقمية لكل ولاية/بلدية + health score
water_signal_index → مؤشر WSI لكل ولاية مع تاريخ
emergency_zones → مناطق الطوارئ النشطة
smart_alerts → تنبيهات شخصية للمستخدمين
satellite_data → بيانات الأقمار الصناعية
offline_sync_queue → طابور المزامنة عبر الأجهزة
كل الجداول محمية بـ RLS — لا يستطيع أحد الكتابة في بيانات الآخرين.
audit_logs للقراءة بـ admin فقط.
water_reports بفهرس فريد (user_id, client_uuid) لمنع تكرار الأوفلاين.
npm install
npm run dev # http://localhost:8080
npm run i18n:check # فحص يدوي للترجمات
npm run build # يشغل i18n:check تلقائياً قبل البناء- Lazy loading لكل الصفحات + كل الـ widgets الثقيلة (DigitalTwin, WSI, Satellite, Emergency, Crisis Forecast).
- Suspense fallbacks بـ skeleton-shimmer.
- Realtime channel pooling — قناة واحدة لكل جدول مهما كان عدد المشتركين.
- Map clustering + throttling — استهلاك CPU ينخفض حتى 80% على الأجهزة الضعيفة.
- Light tiles offline — Maps Styles بدلاً من Vector tiles.
- TanStack Query caching + Realtime invalidation بدلاً من polling.
- جميع الميزات المذكورة أعلاه (16 ميزة)
- Realtime مركزي بدون قنوات مكررة
- Offline conflict-safe sync
- Audit trail كامل لكل العمليات الإدارية
- Map performance mode + clustering
- i18n checker يكسر البناء عند الأخطاء
- ربط فعلي بـ Sentinel-2 / NASA SMAP للأقمار الصناعية
- إشعارات Push عبر Service Worker
- IoT Gateway للاستشعار الذكي
- تطبيق سطح المكتب (Tauri)
- API عام B2B للحكومات والشركات
By Mehloul Achraf Framing by V Tech Club
Hydro Plus+ — حيث يلتقي المواطن بالذكاء الاصطناعي لإنقاذ كل قطرة.
┌──(achraf㉿kali)-[~/Desktop/2/hydro-pulse]
└─$ tree
.
├── admin-dashboard
│ ├── Dockerfile
│ ├── index.html
│ ├── package.json
│ ├── package-lock.json
│ ├── postcss.config.js
│ ├── src
│ │ ├── api
│ │ │ └── api.ts
│ │ ├── App.tsx
│ │ ├── components
│ │ │ ├── DataTable.tsx
│ │ │ ├── Sidebar.tsx
│ │ │ ├── StatsCard.tsx
│ │ │ └── StatusBadge.tsx
│ │ ├── contexts
│ │ │ └── AuthContext.tsx
│ │ ├── index.css
│ │ ├── layouts
│ │ │ └── AdminLayout.tsx
│ │ ├── main.tsx
│ │ ├── pages
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Login.tsx
│ │ │ ├── Reports.tsx
│ │ │ ├── Settings.tsx
│ │ │ ├── Users.tsx
│ │ │ └── WaterReadings.tsx
│ │ └── types
│ │ └── index.ts
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── vite.config.ts
├── backend
│ ├── app
│ │ ├── config.py
│ │ ├── core
│ │ │ ├── exceptions.py
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ └── security.cpython-313.pyc
│ │ │ └── security.py
│ │ ├── database
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── seed.cpython-312.pyc
│ │ │ │ ├── seed.cpython-313.pyc
│ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ └── session.cpython-313.pyc
│ │ │ ├── seed.py
│ │ │ └── session.py
│ │ ├── dependencies
│ │ │ ├── auth.py
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── auth.cpython-313.pyc
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── rls.cpython-312.pyc
│ │ │ │ └── rls.cpython-313.pyc
│ │ │ └── rls.py
│ │ ├── __init__.py
│ │ ├── main.py
│ │ ├── middleware
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── rate_limit.cpython-312.pyc
│ │ │ │ ├── rate_limit.cpython-313.pyc
│ │ │ │ ├── request_logger.cpython-312.pyc
│ │ │ │ ├── request_logger.cpython-313.pyc
│ │ │ │ ├── security_headers.cpython-312.pyc
│ │ │ │ ├── security_headers.cpython-313.pyc
│ │ │ │ ├── waf.cpython-312.pyc
│ │ │ │ └── waf.cpython-313.pyc
│ │ │ ├── rate_limit.py
│ │ │ ├── request_logger.py
│ │ │ ├── security_headers.py
│ │ │ └── waf.py
│ │ ├── models
│ │ │ ├── __init__.py
│ │ │ ├── notification.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── notification.cpython-312.pyc
│ │ │ │ ├── notification.cpython-313.pyc
│ │ │ │ ├── report.cpython-312.pyc
│ │ │ │ ├── report.cpython-313.pyc
│ │ │ │ ├── user.cpython-312.pyc
│ │ │ │ ├── user.cpython-313.pyc
│ │ │ │ ├── water_reading.cpython-312.pyc
│ │ │ │ └── water_reading.cpython-313.pyc
│ │ │ ├── report.py
│ │ │ ├── user.py
│ │ │ └── water_reading.py
│ │ ├── __pycache__
│ │ │ ├── config.cpython-312.pyc
│ │ │ ├── config.cpython-313.pyc
│ │ │ ├── __init__.cpython-312.pyc
│ │ │ ├── __init__.cpython-313.pyc
│ │ │ ├── main.cpython-312.pyc
│ │ │ └── main.cpython-313.pyc
│ │ ├── routers
│ │ │ ├── admin.py
│ │ │ ├── auth.py
│ │ │ ├── government.py
│ │ │ ├── __init__.py
│ │ │ ├── notifications.py
│ │ │ ├── __pycache__
│ │ │ │ ├── admin.cpython-312.pyc
│ │ │ │ ├── admin.cpython-313.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── auth.cpython-313.pyc
│ │ │ │ ├── government.cpython-312.pyc
│ │ │ │ ├── government.cpython-313.pyc
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── notifications.cpython-312.pyc
│ │ │ │ ├── notifications.cpython-313.pyc
│ │ │ │ ├── reports.cpython-312.pyc
│ │ │ │ ├── reports.cpython-313.pyc
│ │ │ │ ├── users.cpython-312.pyc
│ │ │ │ ├── users.cpython-313.pyc
│ │ │ │ ├── water.cpython-312.pyc
│ │ │ │ └── water.cpython-313.pyc
│ │ │ ├── reports.py
│ │ │ ├── users.py
│ │ │ └── water.py
│ │ ├── schemas
│ │ │ ├── auth.py
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── auth.cpython-313.pyc
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __init__.cpython-313.pyc
│ │ │ │ ├── report.cpython-312.pyc
│ │ │ │ ├── report.cpython-313.pyc
│ │ │ │ ├── user.cpython-312.pyc
│ │ │ │ └── user.cpython-313.pyc
│ │ │ ├── report.py
│ │ │ └── user.py
│ │ ├── services
│ │ │ ├── auth_service.py
│ │ │ ├── __init__.py
│ │ │ ├── notification_service.py
│ │ │ ├── report_service.py
│ │ │ └── water_service.py
│ │ └── utils
│ │ ├── crypto.py
│ │ ├── geo.py
│ │ ├── sanitizer.py
│ │ └── validators.py
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── nginx
│ │ ├── crs
│ │ │ └── rules.conf
│ │ ├── modsecurity.conf
│ │ └── nginx.conf
│ ├── requirements-dev.txt
│ ├── requirements.txt
│ ├── run.py
│ ├── uploads
│ │ └── avatars
│ └── water_app.db
├── docker-compose.prod.yml
├── docs
│ ├── API.md
│ ├── DEPLOYMENT.md
│ ├── SECURITY.md
│ └── THREAT_MODEL.md
├── frontend
│ ├── bun.lock
│ ├── bun.lockb
│ ├── components.json
│ ├── Dockerfile
│ ├── eslint.config.js
│ ├── index.html
│ ├── logs
│ │ └── security.log
│ ├── package.json
│ ├── package-lock.json
│ ├── postcss.config.js
│ ├── public
│ │ ├── favicon.ico
│ │ ├── logo.jpg
│ │ ├── manifest.json
│ │ ├── placeholder.svg
│ │ └── robots.txt
│ ├── README.md
│ ├── src
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── assets
│ │ │ └── logo.jpg
│ │ ├── components
│ │ │ ├── BottomNav.tsx
│ │ │ ├── EmptyState.tsx
│ │ │ ├── GoogleMap.tsx
│ │ │ ├── ImageUpload.tsx
│ │ │ ├── InstallPrompt.tsx
│ │ │ ├── LiveStatusBanner.tsx
│ │ │ ├── NavLink.tsx
│ │ │ ├── OfflineBanner.tsx
│ │ │ ├── ReportCard.tsx
│ │ │ ├── SkeletonCard.tsx
│ │ │ ├── TrustBadge.tsx
│ │ │ ├── ui
│ │ │ │ ├── accordion.tsx
│ │ │ │ ├── alert-dialog.tsx
│ │ │ │ ├── alert.tsx
│ │ │ │ ├── aspect-ratio.tsx
│ │ │ │ ├── avatar.tsx
│ │ │ │ ├── badge.tsx
│ │ │ │ ├── breadcrumb.tsx
│ │ │ │ ├── button.tsx
│ │ │ │ ├── calendar.tsx
│ │ │ │ ├── card.tsx
│ │ │ │ ├── carousel.tsx
│ │ │ │ ├── chart.tsx
│ │ │ │ ├── checkbox.tsx
│ │ │ │ ├── collapsible.tsx
│ │ │ │ ├── command.tsx
│ │ │ │ ├── context-menu.tsx
│ │ │ │ ├── dialog.tsx
│ │ │ │ ├── drawer.tsx
│ │ │ │ ├── dropdown-menu.tsx
│ │ │ │ ├── form.tsx
│ │ │ │ ├── hover-card.tsx
│ │ │ │ ├── input-otp.tsx
│ │ │ │ ├── input.tsx
│ │ │ │ ├── label.tsx
│ │ │ │ ├── menubar.tsx
│ │ │ │ ├── navigation-menu.tsx
│ │ │ │ ├── pagination.tsx
│ │ │ │ ├── popover.tsx
│ │ │ │ ├── progress.tsx
│ │ │ │ ├── radio-group.tsx
│ │ │ │ ├── resizable.tsx
│ │ │ │ ├── scroll-area.tsx
│ │ │ │ ├── select.tsx
│ │ │ │ ├── separator.tsx
│ │ │ │ ├── sheet.tsx
│ │ │ │ ├── sidebar.tsx
│ │ │ │ ├── skeleton.tsx
│ │ │ │ ├── slider.tsx
│ │ │ │ ├── sonner.tsx
│ │ │ │ ├── switch.tsx
│ │ │ │ ├── table.tsx
│ │ │ │ ├── tabs.tsx
│ │ │ │ ├── textarea.tsx
│ │ │ │ ├── toaster.tsx
│ │ │ │ ├── toast.tsx
│ │ │ │ ├── toggle-group.tsx
│ │ │ │ ├── toggle.tsx
│ │ │ │ ├── tooltip.tsx
│ │ │ │ └── use-toast.ts
│ │ │ └── WaterInsights.tsx
│ │ ├── data
│ │ │ └── wilayas.ts
│ │ ├── hooks
│ │ │ ├── use-mobile.tsx
│ │ │ ├── useOffline.ts
│ │ │ ├── use-toast.ts
│ │ │ └── useTranslation.ts
│ │ ├── i18n
│ │ │ └── translations.ts
│ │ ├── index.css
│ │ ├── lib
│ │ │ ├── api.ts
│ │ │ ├── sanitize.ts
│ │ │ └── utils.ts
│ │ ├── main.tsx
│ │ ├── pages
│ │ │ ├── CreateReport.tsx
│ │ │ ├── GovernmentMode.tsx
│ │ │ ├── Index.tsx
│ │ │ ├── Login.tsx
│ │ │ ├── MapPage.tsx
│ │ │ ├── NotFound.tsx
│ │ │ ├── Notifications.tsx
│ │ │ ├── Onboarding.tsx
│ │ │ ├── ProfileSetup.tsx
│ │ │ ├── Profile.tsx
│ │ │ ├── Settings.tsx
│ │ │ └── Signup.tsx
│ │ ├── stores
│ │ │ └── appStore.ts
│ │ ├── test
│ │ │ ├── example.test.ts
│ │ │ └── setup.ts
│ │ ├── types
│ │ │ └── google-maps.d.ts
│ │ └── vite-env.d.ts
│ ├── tailwind.config.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── vite.config.ts
│ └── vitest.config.ts
├── README.md
├── scripts
│ ├── backup_db.sh
│ ├── deploy.sh
│ ├── generate_jwt_secret.py
│ └── security_audit.sh
├── tests
│ ├── conftest.py
│ ├── e2e
│ │ ├── create_report.spec.ts
│ │ ├── government_mode.spec.ts
│ │ └── login.spec.ts
│ ├── integration
│ │ ├── test_auth_flow.py
│ │ ├── test_notifications.py
│ │ └── test_report_crud.py
│ ├── payloads
│ │ ├── jwt_attack_payloads.json
│ │ ├── path_traversal.txt
│ │ ├── sqli_payloads.txt
│ │ └── xss_payloads.txt
│ ├── reports
│ │ └── penetration_test_report.md
│ ├── requirements-test.txt
│ ├── security
│ │ ├── jwt_attacks.py
│ │ ├── rate_limit_bypass.py
│ │ ├── rls_tests.py
│ │ ├── sql_injection.py
│ │ └── xss_tests.py
│ └── unit
│ ├── test_rls.py
│ ├── test_sanitizer.py
│ ├── test_validators.py
│ └── test_waf.py
└── waf
├── cloudflare
│ └── rulesets.json
├── custom_waf
│ └── waf_middleware.py
└── nginx
├── crs
│ └── rules.conf
├── modsecurity.conf
└── nginx.conf
61 directories, 294 files