← Opera№ IV of VII
Production platform · Web + iOS

JADS

The digital side of a national student association: two platforms, a native app on the App Store, and a conference system that runs the day itself. Real members use it.

Client
Jordanian Association for Dental Students
Role
Lead full-stack & mobile engineer
Years
2025 – 2026
Stack
Laravel 12 · React 19 · Flutter
i
The scope

Not a website. An operating system for an association.

JADS runs events, committees, volunteer missions, a store, a library, a forum and a national conference, and its members are on their phones. I built the whole thing as two Laravel systems that share an engineering style, with a Flutter app in front of the members' side.

i
Member platform

Web + iOS app

The year-round home for members: events, committees, forum, store, library, volunteer missions, news and push notifications. It's managed from a web admin and from an admin console inside the app.

ii
Conference system

The event engine

Runs the annual conference: tickets, live check-in, workshops, buses, hotel rooms, certificates, galleries and bulk email. It runs in Docker with Redis queues behind it.

ii
Server-driven app

The app is configured, not just coded.

An association changes its mind weekly, and App Store review takes days. So the app's home layout, navigation, appearance and features all come from the server: MobileHomeConfig, MobileNavigationConfig, MobileAppAppearance and FeatureFlag. An admin can turn a section on and every member's app updates, with no release needed.

Try it · admin consoleToggle a flag →
Eventsfeature_flags.events
Conferencefeature_flags.conferences
Storefeature_flags.store
Forumfeature_flags.forum
Volunteer missionsfeature_flags.jvm
Libraryfeature_flags.library
Good morningWelcome back

Then I gave the admins the same console in their pocket: the mobile admin API has full parity with the web admin.

iii
The modules

Fifty-one data models, one coherent product.

MEMBERSEventsListings and member registrations
MEMBERSCommitteesTeams and the work they publish
MEMBERSForumPosts and comment threads
MEMBERSStoreProducts, orders and order items
MEMBERSLibraryStudy resources for members
MEMBERSMissionsVolunteer missions with sign-ups
MEMBERSPushFCM device registry and campaigns
MEMBERSMediaAny storage disk, Cloudflare R2 in production
CONFERENCETicketsDay 1 and Day 1+2 passes, orders
CONFERENCECheck-inReal-time check-in and check-out by QR
CONFERENCELogisticsWorkshops, bus and hotel bookings
CONFERENCECertificatesBatch generation for every attendee
CONFERENCECampaignsLists, templates and bulk email
CONFERENCEGalleriesAlbums pulled from Google Drive
CONFERENCEImportsBulk CSV import for every entity
CONFERENCEInsightsRegistration trends and university mix
iv
Conference day

From sign-up to certificate, without a spreadsheet.

01

Register

Attendees pick a pass. Organisers bulk-import the rest from CSV.

02

Ticket

A QR ticket in the app (qr_flutter), with biometric unlock.

03

Check in

Staff scan with mobile_scanner, and the dashboard updates live.

04

Certify

Certificate batches go out to everyone who attended.

Under the hood

Mobile

Flutter, done properly

  • Riverpod with code generation, go_router
  • Dio + Retrofit, Sanctum token in secure storage
  • Face ID / Touch ID via local_auth
  • Firebase Cloud Messaging, full i18n
Backend

Laravel, built to operate

  • Inertia + React 19 + Tailwind v4 admin
  • MySQL 8, Redis 7 queues, Docker Compose
  • Google Cloud Storage and Cloudflare R2
  • GitHub Actions CI with Docker build and push