Assaaliyah
Dart
Assaaliyah
app and web for daily islamic (dd)
Preview

A representative UI concept for this project — illustrative, not a screenshot of the running app. Explore the code and README below.
What this demonstrates
- Primary language: Dart (49%)
- Multi-language stack (8 languages)
- Last updated 5 months ago
Tech stack
Overview
Assaaliyah is a cross-platform mobile application. It is built primarily with Dart, TypeScript, CSS. app and web for daily islamic (dd).
Project README
As-Saaliyah
An Islamic companion — Quran, Hadith, Hifz, Salah & Siam (sahri/iftaar) timing, a trilingual (Bangla / English / Arabic) calendar, daily Islamic activities, and AI-guided learning. Delivered as a cross-platform app and a website.
First milestone (built): the Daily Islamic Activities module — preset + custom activities, recurrence (daily / weekly / monthly / Ramadan), salah-, sahri-, iftaar-anchored scheduling, trilingual + RTL, offline-first.
Repository layout
Two independent projects. They communicate only over HTTP — the app is a pure client of the website's API.
As-Saaliyah/
├── app/ Flutter (Dart) — Android, iOS, Web. Clean architecture (archit).
└── website/ Next.js + Prisma + Neon Postgres — the site AND the backend API.
app/ | website/ | |
|---|---|---|
| Language | Dart (Flutter 3.41+) | TypeScript (Next.js 15, React 19) |
| Role | Cross-platform client | Public site + backend API |
| Data | Calls website API, caches offline | Prisma → Neon serverless Postgres |
| Architecture | Clean Arch per archit: core/ + features/<f>/{domain,data,presentation} | App Router; shared src/domain logic; app/api/* route handlers |
Why this split
- Flutter for the app → one codebase for Android/iOS/Web with first-class Arabic/Quran text rendering and strong offline support.
- Next.js on Vercel + Prisma + Neon for the website → SEO-friendly content, one place that owns the database, and serverless API the app consumes.
- The domain logic (activity model, recurrence/scheduling, i18n) lives in
website/src/domainand is mirrored in Dart underapp/lib/features/daily_activities/domainso both clients behave identically.
API contract (app ⇄ website)
All responses use the envelope { "data": ... } or { "error": "..." }.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/activities/presets | Curated preset catalogue (static, cached) |
| GET/POST | /api/activities/custom?userId= | A user's custom activities |
| GET/POST | /api/completions?userId=&date= | Per-day completion records |
Quick start
# 1. Backend + website
cd website
cp .env.example .env # add your Neon connection strings
pnpm install
pnpm db:push # create tables in Neon
pnpm dev # http://localhost:3000
# 2. App (in another terminal)
cd app
flutter pub get
flutter run --dart-define=API_BASE_URL=http://localhost:3000
# Android emulator reaches the host at http://10.0.2.2:3000 (the default)
See website/README.md and app/README.md
for details, and ONBOARDING.md for a guided tour.
Roadmap (next modules)
Prayer-time calculation (adhan), Hijri calendar, Quran/Hadith reading & hifz,
push reminders, accounts & sync, AI-guided Arabic learning, and micro-billing.