Shibil Mohammed · designs and builds

I design interfaces,
then I build them
and find out I was wrong.

Decision support, collections queues, operational software. Screens where someone works under time pressure and a wrong call costs money. The prototype below is live on this page. Pick an action, commit, and watch what happens.

Available immediately Bangalore · open to relocation B2B · fintech · AI interfaces
Calibration Copilot · the reveal sequence, running
Case
Priya Venkataraman
CG-317082 · Revolving Credit
₹54,200
Your decision
Recorded before the suggestion is shown.
Both calls stay in the audit history.
Decision support
LOCKED

Commit to reveal

Your call is logged first so the comparison stays honest. The model can't anchor you, and you can't anchor to it.

querying model
Built in vanilla JS. The reveal is a 6-step stagger at 70ms intervals on a custom ease, sequenced so the answer lands before the evidence and the verdict lands last. Motion here is doing a job: it enforces the reading order the product depends on.
Open the full prototype ↗

Work

05 projects
01 A recommendation engine honest enough to say it isn't sure Live · AI decision support
Suggestion
Convert to EMI
47 DPD, within band
Hardship documented
§4.2 Hardship restructure
Insufficient data
No suggestion
Last contactNot recorded
Promise historyNot recorded
Routes to team lead
Audit trail
11:42:51Committed
11:42:56Suggestion
11:43:19Disputed
The 5-second gap is the product

The agent commits before the model's recommendation exists on screen. Seeing it first turns review into rubber-stamping. When the file is too thin the model declines, names the missing fields, and routes to a lead. A system that is always sure is one you eventually stop checking.

Live prototype ↗Local LLM, not mocked Commit-first reveal-afterInsufficient-data + outage states
02 The operational product I owned end to end Experience · EdTech SaaS
Verification flow
Documents3 of 6
Validationon entry
44 steps, grouped and paced
Rejection, reviewer side
Reasonrequired
Free textmin 40 chars
Written into the student's view verbatim
System foundation
BaseHoverActive DisabledError
First component set, three products

Sole designer for five months at a seed-stage EdTech SaaS. Around 300 screens across a two-sided marketplace, an employer console and an internal ops tool, working directly with engineering. The rejection screen is the decision I'd defend hardest: the reason field was optional free text, so students received "not suitable" and nothing else. Making it required and writing it into the student's view cost reviewers two seconds each, and they pushed back.

Figma components, variants, auto-layoutDeveloper handoff Designed and specified; did not reach production before I left
03 A dashboard for agents who can't afford to do the same work twice Take-home · Fintech
Filtered queue
Bucket 230–90 DPDAll
Showing47
Of total1,204
47 selected · this pageUndo 8s
Excluded from bulk
Active promise-to-pay6 held
Missed PTPoverride
Business rule, not a UI restriction
Counts reconcile
Chip47
Table47
Action bar47
If these disagree once, trust is gone

Bulk actions are dangerous, and the danger isn't the button, it's the operator not knowing what set it applies to. Select-all is page-scoped, not result-set-scoped, the count travels with the action bar, and confirmation dialogs were replaced with undo. Agents dismiss a hundred dialogs a shift and stop reading them.

~1,200 seeded recordsLive faceted filtering A Credgenics designer corrected the PTP rule: missed PTP needs an override
04 A budget that refuses to pretend the maths works Live · Consumer fintech
Refusal
Essentials are ₹48,500 against ₹48,000 coming in. There is no honest budget to show you.
Sliderdisabled
Committed vs moving
Rentgone day 1
Savingsmoved out
Lifestyletracked
Only what moves gets a progress bar
Safe to spend
₹12,900
31 days · about ₹416/day

Enter a rent that leaves nothing to split and the app disables the controls and says so, instead of drawing a pie chart and suggesting you cut back on coffee. Naming a rent problem as a rent problem is more useful than dressing it up as a spending problem.

Live prototype ↗Two inputs to a working budget Overspend carries as a visible lineBank-consent failure designed
05 Rebuilding a government flow around what a citizen needs to do next Concept · GovTech

The original validates on submit, so a citizen learns about an error after committing to it. Moving validation to the point of entry and sequencing around the documents someone actually has to hand turns a rejected application into a corrected field.

Multi-step formError prevention over error messaging

How it's built

what I actually wrote

I prototype in the browser when the question is about behaviour. How a table reacts to a filter, what a bulk action does at scale, what an interface should do when a model returns nonsense. A click-through can't answer any of those, so I stopped pretending it could.

Everything derives from one state object. Nothing is stored twice, so a count can't disagree with itself, which is the entire trust argument of the collections console.

The Copilot posts to a local model with a strict JSON contract. The schema is the design decision: the model is allowed to return no recommendation, and has to name what's missing when it does. Most of the product falls out of that one shape.

Vanilla JS and no build step for throwaway prototypes, because the tooling costs more than it returns at this size. For anything with a second contributor or a real component library I'd reach for React and typed props, and I'd expect to be slower for a fortnight.

// the contract that lets the model decline
{
  "recommendation": "convert_to_emi" | null,
  "confidence":     "high" | "low",
  "evidence": ["dpd_47_in_band", …],
  "missing":   ["last_contact", …],
  "policy":    "4.2"
}

// null is a first-class answer, not an error
if (!r.recommendation) render('insufficient', r.missing);
The whole low-confidence state exists because recommendation is nullable. Design decisions live in the schema before they reach a screen.
// one source of truth, everything derived
const visible = rows.filter(matches(filters));
const selected = sel.size;         // page-scoped
bar.textContent = `${selected} selected · this page`;
Chip, table and action bar all read the same derived value, so they cannot fall out of sync.
InterfaceHTML · CSS · vanilla JS
Statesingle object, derived render
Modellocal LLM over HTTP, JSON schema
MotionCSS keyframes, staggered delays
DesignFigma: components, variants, auto-layout
Deploystatic, GitHub Pages

Where AI ends and I begin

asked, so: precisely
AI did
  • HTML scaffolding and boilerplate
  • CSS I could have written but slower
  • Debugging help when I was stuck
  • Adversarial review of my own work, which found seven numeric contradictions in a case study I'd read twenty times
I did
  • The commit-first, reveal-after architecture
  • The system prompt and the JSON schema, including making the recommendation nullable
  • Every failure state: insufficient data, model unreachable, partial connection, dispute routing
  • The motion timing and reading order
  • The visual system and every product decision on this page
  • Testing it against a model that was sometimes wrong
I can walk through any line of it, including the parts I'd write differently now. If that boundary matters to you, ask me about it in the first ten minutes rather than the last.

About

short version

I studied accounting and finance. I got interested in the screens people use to do the actual work: the reconciliation view, the approval queue, the collections list. Never stopped.

Most of what I design has too much information in it, not too little. The job is making dense things readable, not making them smaller. Empty a product out far enough and you've moved the complexity onto the person using it.

Five months as the sole designer at a seed-stage EdTech SaaS, working directly with engineering across three products. Since then, designing and building operational interfaces for fintech and enterprise problems, mostly on my own time.

The commerce background still shapes how I work. When I designed a collections console I already knew what a promise-to-pay is, and why sending a legal notice to someone who has one costs you both the recovery and the relationship. A designer who works that surface professionally later told me I had it half right, which is in the case study, because that's the more useful version of the story.

Operational & workflow interfaces
Decision-support and AI-assisted UI
Information architecture
Interaction design, states, edge cases
Data-dense tables, filters, bulk actions
Design systems & component libraries
Coded prototyping, HTML/CSS/JS
Developer handoff