About this software
About Adala
Adala is a .NET 10 API with SQL Server, a Razor Pages admin panel, and a Flutter app for Android and iOS in English and Arabic. Clients find firms, book consultations, upload documents and pay by card through Stripe. Admins manage firms, bookings, payments, branding and reports. Law firms see only their own bookings and prices. Everything—name, logo, colours, VAT, currency, email, card payments—is set in the admin panel without code.
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.