Why Adala
What makes it better
than the alternatives
- 01
Full bilingual support
English and Arabic with complete right-to-left layout in the Flutter app and admin panel
- 02
White-label ready
Brand name, logos, colours, fonts and themes set in the admin panel; app colours update without a new release
- 03
Stripe card payments with demo test-card form
Live payment sheet or a built-in test form with success and decline screens for demos
- 04
Role-based access
Admins see everything, law firms see only their own bookings and prices, clients see their own bookings
- 05
Docker deployment with SQL Server
One docker-compose.yml brings up the API and database; also runs on Windows IIS or Linux VPS
Client Mobile App (Flutter)
- Sign up with email verification or instant/admin approval; sign in; reset password with 6-digit code
- Home with offers
- practice areas
- top firms and news; search firms by name
- city and practice area
- Firm pages with photos
- details
- map
- website and services with Regular and Express prices
- Booking in two steps: service
- date and time
- documents (passport
- ID
- forms); coupon codes; VAT invoice
- Card payment with Stripe payment sheet or demo test-card form; pay at office option
- My bookings: status steps
- invoice
- documents
- history
- reschedule
- cancel
- pay later
- Alerts for booking updates
- profile
- language switch (EN/AR)
- support
- feedback
- account deletion
- Colours follow admin panel settings (Brand & settings → Appearance → Mobile app)
- including dark themes
Admin Panel (Razor Pages)
- Dashboard with charts
- bookings with status workflow
- notes and documents
- members and their details
- Law firms with one login per firm; firm users see only their own firm's bookings and prices
- Catalog: practice areas (tree)
- services
- per-firm prices; coupons
- banners
- news
- countries
- cities
- Reports with charts
- CSV and PDF download (MigraDoc with embedded Manrope font)
- Broadcast notifications
- contact messages and feedback
- Brand & settings: brand and logos
- Appearance (admin and app colours
- font
- ready-made themes
- live preview)
- Email (SMTP
- test email)
- Payments (Stripe with test connection)
- push notifications (Firebase)
- Notification rules
- booking and VAT
- sign-up mode (instant
- verify email
- admin approval)
- demo data clean-up
- Product tour and a landing page at /
Booking Management
- Status workflow: Pending → Confirmed → Completed or Cancelled; notes and history
- Document uploads from clients (passport
- ID
- forms); admins and firms see all documents
- Reschedule and cancel from the app; admins and firms can change status and add notes
- Invoice with service price
- VAT
- coupon discount; pay by card or at office
- Notifications for booking updates (new
- confirmed
- cancelled
- rescheduled)
- Firm users see only their own firm's bookings; admins see all bookings
Payments (Stripe)
- Card payment with Stripe payment sheet in the app; webhook for payment confirmation
- Demo test-card form with success and decline screens (no Stripe account needed for demos)
- Pay at office option; admins mark as paid manually
- Coupon codes with percentage or fixed discount; one-time or reusable
- VAT calculation from Brand & settings → Booking; invoice PDF download
- Payment history in booking details; admins see all payments in Payments screen
Catalog & Content
- Practice areas in a tree (e.g. Corporate Law → Mergers & Acquisitions); services under each area
- Per-firm prices: Regular and Express for each service; admins set prices per firm
- Banners on the app home screen; news articles with images
- Countries and cities for firm addresses and client profiles
- Coupons with code
- discount
- expiry and usage limit
Brand & Appearance
- Brand name
- tagline (EN/AR)
- logo
- icon
- primary and accent colours
- Appearance: admin panel colours
- font
- ready-made themes (Light
- Dark
- Midnight
- Warm
- Cool
- Contrast)
- live preview
- Mobile app colours (primary
- accent
- background
- text) set in the admin panel; app fetches them on launch
- Dark theme support in the app; colours follow the admin panel settings
- Email settings: SMTP host
- port
- SSL
- username
- password (encrypted)
- from address and name
- Test email button to verify SMTP settings
Notifications
- Broadcast notifications to all clients or a specific role
- Booking update notifications (new
- confirmed
- cancelled
- rescheduled) from notification rules
- Push notifications via Firebase (admin panel has the Firebase key; app needs google-services.json and GoogleService-Info.plist)
- Email notifications for booking updates
- password reset
- email verification
- Notification rules: enable/disable email and push for each event (new booking
- confirmed
- etc.)
- Alerts screen in the app with unread badge
Reports & Analytics
- Dashboard charts: bookings by status
- revenue by month
- top firms
- Reports screen with filters (date range
- firm
- status); CSV and PDF download
- PDF report with MigraDoc and embedded Manrope font; includes charts and tables
- Booking reports: total
- by status
- by firm
- by practice area
- Revenue reports: total
- by firm
- by month
REST API (Minimal API)
- JWT for the app (with refresh tokens); cookie sign-in for the admin panel
- Role policies: Admin
- Firm
- Member; rate limits on public endpoints (sign-in
- register
- forgot password)
- OpenAPI documentation; interactive reference at /scalar
- Endpoints: /api/auth (sign-in
- register
- verify email
- reset password)
- /api/me (profile
- change password
- upload picture
- feedback
- delete account)
- /api/bookings (create
- list
- details
- reschedule
- cancel
- pay)
- /api/firms (list
- details)
- /api/categories
- /api/banners
- /api/news
- /
api/admin/* for admin panel (bookings - firms
- catalog
- reports
- settings
- notifications)
- Stripe webhook at /
api/payments/webhookfor payment confirmation
Database & Deployment
- SQL Server 2019+ with Dapper (raw
- parameterised SQL; no EF)
- Numbered schema scripts run once each at startup (dbo.SchemaVersions); demo data scripts (only with Database:SeedDemoData)
- Docker deployment: docker-compose.yml with SQL Server and the API; volumes for keys and uploads
- Windows IIS deployment: publish profile
- web.config
- connection string in environment variable
- Linux VPS deployment: systemd service
- nginx reverse proxy
- connection string in environment variable
- First admin setup: creates the first admin account on first start (Setup__AdminEmail and Setup__AdminPassword)
- Data protection keys in App_Data/keys (encrypted with DPAPI on Windows); losing them means re-entering SMTP password and Firebase key
| Language | Version | Framework | Used for | Share of code |
|---|---|---|---|---|
| Dart | — | — | Mobile app | 40.2% |
| C# | — | — | Web, API, admin | 25.1% |
| C# (Razor) | — | — | Web pages | 11.7% |
| HTML | — | — | Front-end | 9.1% |
| SQL | — | — | Database | 6.5% |
| JavaScript | — | — | Front-end | 3.7% |
| CSS | — | — | Styling | 3.2% |
| Java | — | — | API | 0.3% |
| Swift | — | — | Mobile app | 0.1% |
| Kotlin | — | — | Mobile app | 0% |
- Primary language
- C# 13 / .NET 10
- Framework
- ASP.NET Core 10 (Minimal API + Razor Pages) + Flutter 3.x
- Database
- SQL Server 2019+
- Authentication
- JWT (app) + Cookie (admin panel)
- Licence
- Single-site
- Screens
- 47
- Database tables
- 22
- Supported languages
- English, Arabic (full RTL)
- Browser support
- Modern browsers (Chrome, Safari, Firefox, Edge)
| Minimum | Recommended | |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 GB RAM / 20 GB SSD | 8 GB RAM / 40 GB SSD |
| OS | Linux (Ubuntu 22.04+) or Windows Server 2019+ with .NET 10 runtime; SQL Server 2019+ | Linux (Ubuntu 22.04+) or Windows Server 2019+ with .NET 10 runtime; SQL Server 2019+ |
| Est. monthly hosting | $35 | $35 |
```bash cp .env.example .env # Edit .env: set SA_PASSWORD, JWT_SIGNING_KEY (32+ chars), SETUP_ADMIN_EMAIL, SETUP_ADMIN_PASSWORD docker compose up -d --build # Open http://localhost:8080/admin ```
```bash # Install .NET 10 runtime wget https://dot.net/v1/dotnet-install.sh chmod +x dotnet-install.sh ./dotnet-install.sh --channel 10.0 --runtime aspnetcore # Install SQL Server 2019+ or use a managed instance # Set connection string, JWT key and admin credentials as environment variables: export ConnectionStrings__Default="Server=localhost;Database=AdalaDb;User Id=adala;Password=YOUR-PASSWORD;TrustServerCertificate=True" export Jwt__SigningKey="YOUR-32-CHAR-KEY" export Setup__AdminEmail="admin@example.com" export Setup__AdminPassword="YOUR-PASSWORD" # Publish and run cd "NET Project" dotnet publish src/Adala.Api/Adala.Api.csproj -c Release -o /var/www/adala cd /var/www/adala dotnet Adala.Api.dll # Configure nginx/Caddy reverse proxy to port 8080 ```
```powershell # Install .NET 10 Hosting Bundle from https://dotnet.microsoft.com/download/dotnet/10.0 # Install SQL Server 2019+ # Publish: cd "NET Project" dotnet publish src\Adala.Api\Adala.Api.csproj -c Release -o C:\inetpub\adala # In IIS: create site, set app pool to "No Managed Code" # In web.config or environment variables, set: # ConnectionStrings__Default, Jwt__SigningKey, Setup__AdminEmail, Setup__AdminPassword # See HowToSetup.md for full IIS configuration ```
```bash # Start SQL Server in Docker docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong!Pass" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2022-latest # Set connection string export ConnectionStrings__Default="Server=localhost;Database=AdalaDb;User Id=sa;Password=YourStrong!Pass;TrustServerCertificate=True" export Database__MigrateOnStartup=true export Database__SeedDemoData=true # Run API cd "NET Project/src/Adala.Api" dotnet run # Open http://localhost:5022/admin (demo: admin@adala.example / Password@123) # Run Flutter app in another terminal cd "Flutter APP/mobile" flutter pub get flutter run # Uses http://10.0.2.2:5022 (Android emulator) or http://localhost:5022 ```
Quality report
Manually reviewedHow to read the quality report
What this is. Every project on Vibe96 goes through an automated audit of its source code before a reviewer in Dubai checks it by hand. The score is out of 100; 75 is the minimum to be listed, and any single failing check blocks a listing regardless of the score.
- Security
- No real credentials in the code, every data-changing route protected, admin areas role-gated, no SQL built from user input.
- Code structure
- A developer can navigate and extend it: clear module boundaries, no giant files, little copy-paste.
- Docs & completeness
- The setup guide, example config, schema and required files the builder committed to are actually in the archive.
- Dependency health
- Packages pinned, no known critical vulnerabilities, no abandoned libraries in production paths.
- Build & deploy
- A clean machine can restore, build and start it by following the shipped instructions.
Warnings are problems that didn't block the listing; they stay visible here until a later version clears them. The audit reads the code — it does not run it — so always try the live demo before you buy. Lines of code are counted from the same audited archive.
Reviewer notes (6 minor)
Dapper sql is parameterized and scoped; minor schema gaps (missing indexes on some fks); flutter dependencies outdated but no critical vulnerabilities found; weak default jwt signing key and demo passwords; no real credentials found; strong authentication and role checks; minor ownership gaps on read endpoints; build reproducible with minor setup gaps; missing .net sdk version pin and flutter version spec; moderate duplication and some oversized files; generally sound architecture with room for consolidation. None of these stop the software from working; the developer has been told and improvements come in a future update.
Versions & updates
No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.
What you get
- </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
- ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
- ↻One year of updatesEvery new version the builder publishes, free for 12 months.
- ♧30 days of supportInstallation and defect support through Vibe96 tickets.