Work at the Imam Development Program. Handed off

The Imam Portal

IDP supports imams in 18 countries, and the Imam Portal is where they send in their work, things like a Jumuah topic, a community visit or a medical claim. Staff review it there, approve it and pay the stipend against it. I redesigned the portal on IDP’s design system. That meant designing a phone app from scratch, reskinning the existing web app without moving anything around, and writing a handoff the developers can build from when I’m not in the room.

Role
Sole designer at IDP
Worked with
Outside developers
Timeline
July to September 2026

The problem

Imams send in the work their stipend depends on through a web portal that wasn’t on IDP’s design system, and there was no phone app at all.

What I did

I designed the phone app from scratch, reskinned the web app without moving anything, and handed both to the developers as a Figma file with Dev Mode and a working slice in code.

The result

The developers are building it from the Figma file and the working slice. Testing it with imams and staff is the first thing I’d do before it ships.

The Imam Portal, working slice prototype

Skip the prototype
The imam’s Home: a greeting to Yusuf, a card for September 2026 with 2 of 5 done, and the five monthly items with their status

Both roles share the same data. If you send a topic as the imam and then switch to Staff, you’ll find it waiting in the queue. Approve or decline it, switch back, and the imam has his answer.

Try one of these

Open full screen

This is a working slice I built in code from my Figma file, using the same tokens, type and components. Only one form is built all the way through, the Jumuah topic. All the names and data are made up, and it resets every time you visit, so nothing you do is saved.

The problem

The staff dashboard of the web app after the reskin: a long left navigation with Dashboard active in IDP pink, a greeting, four totals with sparklines, applications over time, a hadith in Arabic and English, six status donuts and two bar charts
The web dashboard after the reskin. Every route is still where it was, and all the data in these screens is made up.

The portal is a web app that an outside team of developers built on Bootstrap 5, and it works. But it wasn’t on IDP’s design system, some of the theme’s template wording was still showing, and there was no phone app at all.

An imam’s stipend depends on three things he submits through the portal every month: his K+ test, his community engagement and his Pearls of Wisdom. The compliance report ties all three to what he gets paid, but the imam himself had no way to see where he stood. Staff had the opposite problem. Everything they needed to approve was already in the system, it just wasn’t shown to them as a list of things waiting.

The phone app matters because nobody who uses the portal sits at a desk for it. An imam should be able to send in everything he owes from the phone in his hand. Staff need to check how each imam is doing, his tests and his submissions, and eventually release his stipend from the same place. Later on, a donor will be able to fund an imam directly. For this phase I focused on imams first, plus whatever staff need while they’re out.

Two things shaped every decision I made. The developers are on Bootstrap 5, so whatever I designed had to arrive as a theme they could apply, because a rewrite was never on the table. And the portal already runs in English, Arabic, Swahili and Chichewa, so I couldn’t assume short English strings or a left to right layout anywhere.

What I did

I started by learning the product from the inside. I went through the whole portal on my own login, and wherever my login was refused, which turned out to be thirty five routes, I read the developers’ code and translation files to work out what each screen held. Any screen I designed from the code, without having seen it, says so right on the frame.

Then I redrew the web app without moving anything. Fifteen templates cover every route the portal has, and the routes, the features and their order are all exactly where they were. Apart from the look, the only thing I touched was wording and titles where the template text was showing. That way the developers can ship it as a theme.

The phone app is the new part, and it came to sixty eight screens in twelve sections. The Jumuah topic form and the eighteen other things an imam can send all share one shell, and the forty three report tables from the web turn into cards, one per row. Donors, inventory, stipend management, the LMS admin and the lookups stay on the web for now. I drew one design at 390 wide that doesn’t lean on iOS or Android, so it works whether the developers ship a native app or a web app you can install. There are two sets of five tabs, and the app picks the set based on who signs in.

All of it is built on the design system, which for the app means 28 component sets, 188 variants and 76 icons. Every value on every screen is a variable, so when a developer clicks a colour in Dev Mode they get a token name and never a hex code. The app’s tokens live next to the website’s under their own names, because the website’s stylesheet is generated from the shared pages and I can’t change anything on those.

I prototyped three paths in Figma. In the first, an imam submits a Jumuah topic from the welcome screen all the way to the confirmation, then opens one submission that’s still pending and one that came back declined. In the second, a staff member opens an imam, reviews his submission, and either approves it or writes a reason and declines it. The third is the Home screen in Arabic, laid out right to left. Altogether that’s 220 links, and I checked that none of them are broken.

A Figma prototype can show each path, but it can’t show the two sides sharing anything. So for this page I built one path as a real app, using the tokens and components from the file. An imam sends a Jumuah topic, it shows up in the staff queue, staff approve it or decline it with a reason, and the answer comes back to the imam. If you switch roles under the phone at the top of this page, both sides are looking at the same data. It’s a demo I built for this page, and it’s separate from what the developers are building.

The last piece was the handoff. It lives as panels inside the Figma file and also as a thirteen page document with the same content. It tells the developers where to start, what’s in the file, how to read a screen, which parts are new work, what I still need from them, and where I used stand-ins or left gaps. It also covers the tokens, how to map them onto Bootstrap 5 through either Sass or CSS variables, and the handful of components that need more than a colour swap.

The developers are an outside team of one or two, and I worked with one of them directly. They got the Figma file with Dev Mode and the working slice in code, so a screen can be read two ways: the measurements and tokens in the file, and how it behaves in the slice.

Key decisions

Reskin the web app, don’t redesign it

The optionsI could have reorganised the navigation and the tables while I was in there, or I could leave every route, feature and order where it was.

What I choseI left it all alone and changed only the theme and the wording.

Why

The developers are already on Bootstrap 5, so this way they get a theme to apply and they don’t have to change framework. Even the breakpoints stay the way Bootstrap ships them.

What it cost

The web app’s structure is exactly what it was before. Fixing that is a later project, and I’d want research behind it first.

The imam sees where he stands

The optionsI could redraw Home the way it is today, or add the thing that was missing.

What I choseI added one card to the imam’s Home that puts K+, Community Engagement and Pearls of Wisdom together and shows how many he’s done this month.

Why

The compliance report ties all three to the stipend, and until now an imam had no way to see where he stood.

What it cost

This is new work and the portal has nothing like it today, so I listed it separately in the handoff and the developers can price it separately.

Staff get a queue

The optionsStaff Home could open on totals and charts, or on the work that’s waiting for them.

What I choseI put “Needs review” first, with each submission type and the number waiting next to it.

Why

The data was already there, it just wasn’t shown this way. In the handoff I told the developers that of everything in the file, this is the piece that would save staff the most time.

What it cost

Like the imam’s card, this is new work, so it’s on the separate list for pricing too.

Rows wrap, they never get cut off

The optionsI could design for English and fix the other languages later, or design for the longest language from the start.

What I choseEvery row wraps onto a second line if it needs to. The type and the components also carry right to left variants, even though the app is English only for now.

Why

Swahili and Chichewa strings run about a third longer than English. I also asked the developers to use Bootstrap’s logical spacing utilities, so a right to left build later on doesn’t cost them anything extra.

What it cost

Rows end up taller and screens a bit longer in English.

Say what I could not see

The optionsI could draw every screen as if I was sure of it, or I could mark the ones where I was guessing.

What I choseI marked them, both on the frame and in the handoff. Two reports came back with no columns at all, so I had to infer those two screens, and the handoff says they’re the two I’m least confident about. The payslip stays marked "to confirm" because nothing I could read explains how a package turns into the amount that’s actually paid.

Why

I’d much rather a developer knows this on day one than finds out halfway through a build.

What it cost

Anyone who opens the file can see exactly where the gaps are.

Three tokens are banned in the app

The optionsI could fix the failing tokens at the source, or keep them and fence them off from the app.

What I choseI fenced them off. Three tokens fail WCAG AA, which are text/muted, the warning foreground on its own tint, and icon/muted at 2.2 to 1 on white. The handoff names each one and tells the developers what to use in its place.

Why

The website already uses these tokens and its stylesheet is generated from the shared pages, so the two systems have to stay in step for now.

What it cost

The failing values are still sitting in the shared system until the website itself changes.

The work

Here’s the web app first. It’s a dense product by nature, with a long navigation, tables that carry a status in every cell, and records that open beside their list.

The monthly compliance report: one row per imam and a column each for K+, Community Engagement, Pearls of Wisdom, Jumuah Topic and Jumuah Audio, every cell a Done, Pending or Not done badge, with month and date range filters above
This is the monthly report that decides the stipend. Every cell spells its status out as a word, so nobody has to rely on colour alone.
Imam profiles: a searchable list of imams on the left and the selected imam’s record on the right, with actions, a tab for every submission type and key value rows
An imam’s record opens beside the list, with his fourteen submission types as tabs.
Jumuah topics: a table with search, filters, sortable date, a status badge per row and edit and delete actions, with pagination
Most routes in the portal use this table template.

On the phone, the imam’s side comes first. The first thing Home tells him is where he stands this month, and the Submit tab holds every form the portal has, grouped by what each one is for.

Imam Home: a greeting, a card for September 2026 showing 2 of 5 done with each of the five monthly items and its status, the stipend with a payslip to acknowledge, latest submissions and a hadith
Home, with the new monthly card at the top.
Submit: my submissions at the top, then forms grouped under Every month, Support for you, Your community, and Learning and growth
Everything an imam can send, grouped by what it’s for.
The Jumuah topic form: topic, date, masjid, town, attendance count with a hint, an optional comment, an optional audio upload and a declaration, with Submit disabled until it is complete
One of the forms. The hints always sit under the fields, never inside them.
A pending submission: the answers, the audio attachment and a history timeline reading Sent, Waiting for review, Decision
After he sends it, he can see what he wrote and where it is now.

Staff use the same app with a different set of five tabs. They can review a submission and approve it, or decline it with a reason the imam can actually act on.

Staff Home: four totals, then Needs review listing Jumuah topics, Jumuah audio, Community engagement and Medical reimbursement with the number waiting for each, then applications per month
Staff Home opens on the queue.
A submission under review: the imam, his answers, the attachment, the history with Waiting for review marked With you now, and Decline and Approve fixed at the bottom
The review screen. The history tells staff it’s "With you now".
A sheet over the dimmed screen titled Decline this Jumuah topic, with a reason field that says Tell the imam what to change, and Cancel and Decline
When staff decline, the sheet asks them for a reason.
The declined submission as the imam sees it: Why it was declined, the staff member’s reason, a Fix and send again button, his answers and the history ending in Declined
What the imam gets back, with a button to fix it and send it again.

I drew the states once and reuse them everywhere. Offline, loading, empty, error and no access are five screens in their own section of the file. The Arabic Home screen is the pilot for right to left.

Offline state: No connection. You can still write, it will send when you are back online. You are offline, with Try again
Offline. He can still write, and it sends when he’s back online.
Error state: That did not load. Something went wrong on our side, not yours. Nothing you wrote has been lost. Try again, and Report a problem
The error screen tells him the problem is on our side and that nothing he wrote is lost.
Imam Home in Arabic, mirrored right to left: the logo on the right, chevrons pointing left, the tab bar reversed, and the same compliance card and stipend
Home in Arabic, right to left.

And this is the system underneath all of it.

The app colour page: five status pairs each with its token names and contrast ratio, the danger button and its pressed state, the scrim, field borders, icon colours, three chart series, four new colour values with their hex and variable names, and the shared tokens the app uses
The app’s colour tokens. I wrote the contrast ratio next to every pair, and the note at the top warns which shared token is too light to use for text.
The overlays component sheet: a calendar day, and three bottom sheets, the khutbah date picker, Approve this Jumuah topic and Decline this Jumuah topic, each drawn in English and again in Arabic mirrored right to left, then toasts in both languages and the scrim
Every overlay is drawn twice, once in English and once mirrored in Arabic. The right to left variants are already in the library even though the app ships in English first.
Anything in here you disagree with, tell me. I would much rather redraw a screen now than have you build around a guess of mine.
From my handoff to the developers, September 2026

Evidence

  • The file has 68 phone screens in twelve sections and 15 web templates.
  • The app library has 28 component sets, 188 variants and 76 icons.
  • The Figma prototype has 220 links and none of them are broken.
  • The tokens come in three layers (primitives, semantic and app). I exported them as CSS custom properties and as JSON, along with a Bootstrap 5 map that works through either Sass or CSS variables.
  • I named the 3 tokens that fail WCAG AA and gave a replacement for each. I also flagged 2 tap targets that sit under 44 pixels, with the tap area they need in code.
  • The handoff lists 6 pieces of new work so they can be priced separately, asks the developers 7 questions, and declares 4 stand-ins.
  • The working slice on this page passes 137 scripted checks, and an axe accessibility run across 35 screens and states found no violations. I ran both on my machine on 17 September 2026.
  • Every name, masjid, number and date in the designs is made up. No real imam appears anywhere.

There are no usage numbers or test results here, because it hasn’t been built yet and I haven’t tested it with imams.

Result

I designed and prototyped this from July 2026 and handed it to the developers in September 2026, and they’re building it now.

For tools, I used Figma variables, Dev Mode and Figma prototyping, and I exported the tokens as CSS and JSON with a Bootstrap 5 map.

How I used AI. I used AI to help me build the component sets and the foundations pages in Figma. The working slice at the top of this page was built in code with Claude Code, working from my Figma file.

What I'd change next

First I’d test the phone app with imams and staff before it gets built, starting with the two reports I had to infer. I’d also get an imam login and a staff login so I can check the thirty five closed routes against the real thing. The K+ test needs a choice row, and I want to add that to the design system properly. After all that, I’d come back to the web app’s structure, which I left alone on purpose.

Portfolio

Other projects