Skip to content
Suleiman Francis

Software Engineer · Frontend · Backend · Mobile · AI

Building production web, mobile, and AI-powered products.

I build reliable software across frontend, backend, mobile, and AI systems—from architecture and APIs to polished interfaces and production deployment.

Abuja, Nigeria · Available for opportunities

Experience
4+ years
Shipping production software since 2022
Web
React · Angular
Dashboards, forms, component libraries
Mobile
React Native
Live on Google Play
Backend
Node.js · Python
APIs, auth, realtime, risk scoring
AI / LLM
LLM evaluation
Rubrics, data annotation and RLHF
Production
Observed
Sentry, analytics, staged releases

Work

Selected work

Production software across mobile, web, backend, and AI. Each case study separates what I owned from what I collaborated on.

All 9 case studies →

01Whistler2025 — Present

Whistler Mobile

Cross-platform community app on Google Play: feeds, moments, realtime chat, events, leaderboards, and an offline interest classifier.

Role
Lead mobile engineer
Platform
iOS and Android from one codebase · published on Google Play
Category
Mobile · Realtime · On-device AI
Outcome
Published on Google Play, with JavaScript-only fixes shipped over the air through separate production and development channels.
  • React Native
  • Expo
  • TypeScript
  • Realtime
  • AI
Chats screen with All and Unread filters and a list of conversations. Names, avatars and previews are redacted.

MobileChats· 1 / 6

02SeamHealth Group2024 — Present

Clientshot

SeamHealth’s customer feedback platform: multi-step feedback flows, complaint handling, billing and an operator admin — 400+ of my commits across three Angular codebases.

Role
Frontend engineer
Platform
Web · SaaS · server-side rendered
Category
SaaS · Feedback & analytics
Outcome
416 commits across the customer app, the admin console and the v3 rebuild: form flows, complaints, billing, notifications and operator tooling.
  • Angular
  • TypeScript
  • RxJS
  • SaaS
  • Analytics
Clientshot Analytics at phone width: a menu button and notification bell in the top bar, a workspace selector, a full-width Filters button, then stacked cards for Total Complaints (35, all open), Average Rating (3.4 stars) and Commendations (57). The profile picture is replaced with a grey circle.

MobileAnalytics· 1 / 7

03WhistlerSep 2026 — Present · in active development

Whistler Web

Next.js web client for Whistler: 52 routes across feed, communities, moments, messages and settings, sharing the mobile app’s API, tokens and error handling.

Role
Sole engineer
Platform
Web · Next.js App Router
Category
Web application · Production infrastructure
Outcome
Every change passes format, lint, types, unit tests, a dependency audit, Playwright e2e and a Docker smoke test before an image is published.
  • Next.js
  • TypeScript
  • Playwright
  • Docker
  • CI/CD
Whistler Web home at phone width: an “Email Not Verified” banner with a verify link, a greeting, community filters (All communities, Hot & Trending, For You, Public), a Hot & Trending Communities carousel, a bottom tab bar, and Safari’s address bar below. The email address, community photos and URL are replaced with grey blocks.

MobileHome· 1 / 4

04SeamHealth GroupJul 2026 — Aug 2026

Device Intelligence

FastAPI service that fingerprints visitors, links probable identities across browsers and scores risk built to keep public voting fair, with tests and AWS deployment scaffolding.

Role
Lead backend engineer
Platform
Backend service · HTTP API
Category
Backend · Security & risk
Outcome
Initial implementation, production hardening and the AWS deployment path — 10 of 16 commits and 14 test files.
  • Python
  • FastAPI
  • PostgreSQL
  • Docker
  • AWS
  1. Client
    • Browser fingerprint + location report (Clientshot Pulse)
  2. API
    • FastAPI routes
    • Pydantic v2 validation
    • /health
  3. Application
    • Services
    • Risk engine
    • Device graph
  4. Workers
    • APScheduler: similarity, merging, risk updates, session expiry
  5. Storage
    • SQLAlchemy 2 + Alembic
    • SQLite locally → Postgres (RDS) in production

AI feature · Whistler Mobile

An AI classifier that runs entirely on-device

The classifier maps a post to one of 30 interest categories without a network request. Training happens offline in Python; the app ships only the exported weights and about 350 lines of TypeScript inference code.

Why this architecture

  • Offline: classification works with no connection.
  • Private: post text never leaves the device for this feature.
  • Cheap: no per-request API cost. Inference is a lookup, an average and a 30 × 50 matrix product.
  • Updatable: pure JavaScript, so a retrained model ships over the air.
  1. 01User textA post or bio as typed
  2. 02PreprocessingLowercase, strip punctuation, keep tokens of 2+ characters
  3. 03FastText embeddings9,989-word vocabulary × 50 dimensions, int8
  4. 04Feature vectorAverage of matched word vectors
  5. 05Softmax classifier30 × 50 output layer
  6. 0630 interest categoriesTop class if p ≥ 0.35, otherwise uncategorised
Fewer than two tokens, or no known words, returns “uncategorised” instead of guessing.

How well does it work?

The training script reported 99.0% precision@1 on held-out data. Re-running it showed why: each hand-written sentence was augmented into three near-copies before a random 85/15 split, so 2,199 of the 2,238 validation lines had a twin in training.

Splitting by sentence first gives 60–64% precision@1 across three random splits, against a 3.3% chance baseline. The data is 4,962 unique hand-written sentences across 30 categories. No real user posts have been evaluated yet.

Methodology and lessons in the case study →
Precision@1 on sentences never seen in training
60–64%Measured
Three random splits grouped by sentence. Chance is 3.3%.
Precision@1 as originally reported
99.0%Superseded
Inflated: near-copies of 98% of validation lines were in training.
Shipped model size
768 KBMeasured
int8 weights, down from ~5.5 MB in the first export format.

Capabilities

Engineering capabilities

Grouped by discipline, with where each one was used in shipped work.

Frontend

Whistler Web and the SeamHealth blog in Next.js; Whistler Admin and Clientshot Public in React 19; Clientshot in Angular; component libraries used across 3+ internal products.

  • React
  • Angular
  • Next.js
  • TypeScript
  • JavaScript
  • Tailwind CSS
  • Redux Toolkit
  • TanStack Query
  • Zustand
  • RxJS
  • Component architecture
  • Accessibility
  • Responsive systems

Backend

The Device Intelligence service in Python and FastAPI; REST API design and integration at SeamHealth; a signed webhook function for Whistler Admin; the Socket.IO realtime client in Whistler.

  • Node.js
  • Python
  • FastAPI
  • Express
  • REST APIs
  • JWT
  • RBAC
  • PostgreSQL
  • MongoDB
  • Caching
  • Validation
  • WebSockets
  • SQLAlchemy + Alembic
  • Docker
  • AWS (ECS, RDS)

Mobile

Whistler: a React Native + Expo app on Google Play with push, deep links, social sign-in and over-the-air releases.

  • React Native
  • Expo
  • Flutter
  • Offline-first architecture
  • Push notifications
  • Deep linking
  • Native integrations
  • Play Store / App Store deployment

AI / LLM

Two Whistler post classifiers: an on-device fastText model in the app, and sentence embeddings (all-MiniLM-L6-v2, ONNX Runtime Web) in the browser; LLM evaluation and RLHF at SeamHealth — prompt design, rubric-based review, data annotation and human feedback on model responses.

  • LLM evaluation
  • RLHF
  • OpenAI and Anthropic APIs
  • Prompt engineering
  • Response evaluation
  • Data annotation
  • RAG fundamentals
  • Hallucination detection
  • On-device classification (fastText, ONNX Runtime Web)
  • AI agents (elizaOS)
  • Model behaviour analysis

Engineering practice

GitHub Actions CI, Docker images, Playwright e2e, Vitest, Jest and pytest suites, Sentry, Mixpanel, Firebase Analytics, k6 load tests.

  • Git and GitHub
  • CI/CD (GitHub Actions)
  • Docker
  • Testing (Vitest, Jest, Playwright, pytest)
  • Cloudflare Workers
  • Jira
  • Code review
  • Documentation
  • Agile / Scrum
  • Observability
  • Product analytics

Approach

From requirement to evidence

The same loop on every project, whether it’s a form field or an ML feature.

  1. 01

    Understand

    Clarify requirements, constraints, users, data, and the business goal behind the request.

  2. 02

    Architect

    Choose boundaries, state ownership, API contracts, data structures and dependencies deliberately.

  3. 03

    Build

    Write modular, typed code with abstractions that earn their place.

  4. 04

    Test

    Check behaviour with unit, integration and regression tests — including realistic failure cases.

  5. 05

    Ship

    Automate builds and releases, and stage them through environments before production.

  6. 06

    Observe

    Use crash reporting, logs and analytics to see how the software behaves for real users.

  7. 07

    Improve

    Iterate on evidence. Measure before claiming, and say so when something hasn’t been measured.

Production engineering

From code to production

Only tools I’ve used on shipped work are listed.

  1. 01

    Code

    Typed code, with pre-commit hooks as the first gate.

    TypeScript · Husky + lint-staged

  2. 02

    Pull request

    Every change reviewed before merge.

    GitHub · Bitbucket

  3. 03

    Tests

    Unit and integration tests; end-to-end tests run against a mock API.

    Vitest · Jest · Playwright · pytest

  4. 04

    CI

    Lint, types, tests, dependency audit and build gate every pull request.

    GitHub Actions · Dependabot

  5. 05

    Build

    Reproducible web, container and native builds.

    Vite · Docker · Gradle · EAS

  6. 06

    Deploy

    Staged release channels; JS-only fixes over the air.

    Vercel · Cloudflare Workers · EAS Update · Google Play

  7. 07

    Monitor

    Crashes, errors and product usage in production.

    Sentry · Mixpanel · Firebase Analytics

  8. 08

    Iterate

    Load-test risky paths and feed findings into the next change.

    k6

Engineering

How I think about engineering

  • Frontend

    Designing resilient frontend architecture

    Most frontend bugs I’ve fixed trace back to one of three things: unclear ownership of state, validation in the wrong place, or an abstraction that was shared too early. The architecture work is mostly about preventing those.

  • Backend

    Building reliable realtime experiences

    Realtime features are easy to demo and hard to keep correct. The work is in what happens when the connection isn’t there — which, on mobile, is often.

  • Mobile

    Shipping cross-platform mobile software

    Writing the screens is the smaller part of mobile work. The larger part is integrations, releases and knowing what happened after a release went out.

  • AI / LLM

    Building practical AI features

    The useful question is rarely “which model is best?” It is “what is the smallest, cheapest, most predictable thing that solves this task — and how will I know if it works?”

Experience

Where I’ve shipped

  1. 2025 — Present

    Remote · Freelance

    Mobile & Frontend Engineer

    Whistler

    Lead engineer on the Whistler mobile app, web client and admin dashboard; sole engineer on the web client.

  2. 2023 — Present

    Abuja, Nigeria · Hybrid

    Frontend / Full-Stack Engineer

    SeamHealth Group

    Frontend engineer on the Clientshot platform; lead engineer on Clientshot Public; first author of the Device Intelligence backend and the SeamHealth blog.

  3. 2022 — 2023

    Abuja, Nigeria · Hybrid

    Software Developer

    Nigeria Civil Defence Corps HQ

    Built and maintained internal web applications.

Let’s build something useful.

Interested in working together, discussing an engineering problem, or exploring an opportunity?

Send an email

Francis.dev31@gmail.com