Skip to content
Iradukunda Yobu

Kigali, Rwanda

Software developer, since 2021

Iradukunda Yobu

Full-Stack Developer, Web & Mobile Engineer, API & Systems Builder, SaaS Product Developer

I design and ship production web and mobile applications — from database schema to deployed UI. I care about clean code, clear architecture, and software that holds up once real users arrive.

Available for freelance & full-time

about me

How I work

I'm a full-stack developer based in Kigali. Since 2021 I've worked across incubators, an agritech company and a creative studio — shipping web apps, mobile apps and internal platforms that went on to carry real users and real data.

My range runs from database schema and API design through to the interface people actually touch. I've spent enough time on hosting, deployments and support tickets to build things that are calm to run, not just nice to demo.

I like problems where product thinking and engineering meet: the auction that needs to be provably fair, the registry that has to be trustworthy, the dashboard that turns a messy table into a decision.

working principles

  • Start with the data model

    schema first, screens second

  • Make it work, then make it clear

    readable beats clever

  • Tests are notes to future-me

    especially the boring ones

  • Ship small, ship often

    big-bang releases age badly

  • The boring solution usually wins

    novelty is a cost

skills & stack

The toolbox

Grouped by where they sit in the system. Everything here has been used on something that shipped.

Frontend

what the user touches
  • React
  • Next.js
  • TypeScript
  • JavaScript
  • Tailwind CSS
  • Livewire
  • Inertia.js
  • Bootstrap

Backend

the engine room
  • PHP (Laravel)
  • Node.js
  • Python
  • REST APIs
  • Auth & RBAC

Mobile

pocket-sized
  • React Native
  • Android Fundamentals
  • Expo

Databases

where state lives
  • PostgreSQL
  • MySQL
  • MongoDB
  • SQLite
  • Schema design

DevOps & Tools

ship & maintain
  • Git & CI/CD
  • Docker
  • Hosting & DNS
  • Software Testing
  • Linux servers

Design

before the code
  • Figma
  • Wireframing

services

What I build

01

Web Applications

from schema to deploy

Responsive, fast web apps built with modern frameworks — server-rendered where it matters, interactive where it counts.

  • Next.js / React
  • Laravel / Livewire
  • Design systems
02

Mobile Applications

one codebase, two stores

Cross-platform mobile apps that feel native, share logic with the web, and ship to iOS and Android from a single React Native codebase.

  • React Native
  • Offline-first
  • Push & deep links
03

APIs & Integrations

the part users never see

REST and webhook APIs with sensible contracts, auth, rate limiting and docs — plus third-party integrations for payments, mail and auth.

  • REST / JSON
  • Auth & RBAC
  • Payments, SMS, mail
04

Dashboards & Data

decisions need numbers

Admin panels and analytics dashboards that turn raw tables into something a team can actually read and act on.

  • Role-based views
  • Charts & reports
  • Exports & audit logs
05

SaaS Platforms

multi-tenant from day one

End-to-end SaaS builds: tenants, subscriptions, onboarding and billing — architected so adding the next customer is a config change, not a rewrite.

  • Multi-tenancy
  • Subscriptions
  • Onboarding flows
06

Deployment & DevOps

ship it, then sleep

CI/CD pipelines, server and domain setup, environment config and monitoring so releases are boring and rollbacks are one command.

  • CI/CD pipelines
  • Server & DNS setup
  • Monitoring & backups

featured work

Case studies

Case study/63-inc01 · 2026

63 Inc

A creative agency website showcasing innovative design and digital solutions for 63 Inc.

Case study/kina-creche02 · 2025

Kina Creche

A comprehensive digital platform for managing creche operations, enrollment, and parent communication.

Case study/mywidecareers03 · 2024

Mywidecareers

An all-in-one career platform connecting job seekers with opportunities.

Case study/agriinnox04 · 2025

Agriinnox

The all-in-one platform for livestock farmers and consumers.

Problem

Livestock trade runs on word of mouth. Farmers and buyers had no shared, trustworthy place to list animals, agree prices, or keep records — so deals were slow, informal, and hard to verify.

My role

Full-stack developer / consultant. Built the marketplace and listing flows, authentication and roles, and the farmer + admin dashboards.

Technologies

  • Laravel
  • Livewire
  • Tailwind CSS
  • MySQL
  • Laravel Cloud

Outcome

A single marketplace connecting farmers and consumers with structured listings and records.

Case study/igare05 · 2024

Igare.rw

A Rwanda-based digital security platform for bike ownership with smart security solutions.

Problem

Bike theft and ownership disputes were common because there was no digital registry linking a verified owner to a specific bike — recovery and resale checks relied on paper.

My role

Full-stack developer. Implemented the ownership registry, the verification workflow, and the admin tooling for handling claims.

Technologies

  • Next.js
  • React
  • Tailwind CSS
  • Node.js
  • PostgreSQL

Outcome

A verifiable ownership record that makes a stolen bike much harder to resell.

selected code

From the codebase

A few small, real patterns — the kind of thing that ends up copied between projects.

A hook I reach for constantly — fire once when an element scrolls in.
use-in-viewport.tsts
import { useEffect, useRef, useState } from 'react'// Resolves true the first time the node enters the viewport, then unobserves.export function useInViewport<T extends Element>(margin = '-15%') {  const ref = useRef<T>(null)  const [seen, setSeen] = useState(false)  useEffect(() => {    const node = ref.current    if (!node || seen) return    const io = new IntersectionObserver(      ([entry]) => {        if (entry.isIntersecting) {          setSeen(true)          io.disconnect()        }      },      { rootMargin: margin },    )    io.observe(node)    return () => io.disconnect()  }, [seen, margin])  return [ref, seen] as const}
Route handlers stay small: validate, do one thing, return a clear status.
app/api/subscribe/route.tsts
import { NextResponse } from 'next/server'import { z } from 'zod'const Body = z.object({  email: z.string().email(),  source: z.string().max(40).optional(),})export async function POST(req: Request) {  const parsed = Body.safeParse(await req.json())  if (!parsed.success) {    return NextResponse.json({ error: 'Invalid' }, { status: 422 })  }  const { email, source } = parsed.data  await db.subscriber.upsert({    where: { email },    update: { source },    create: { email, source },  })  return NextResponse.json({ ok: true }, { status: 201 })}
A release should be boring. Test, build, migrate, ship.
bash — deploysh
npm run test -- --runnpm run buildphp artisan migrate --forcersync -az --delete ./build/ web@server:/srv/app/sudo systemctl reload app.servicecurl -sf https://example.com/health && echo "deploy ok"

next page

Have something to build?

Freelance projects, full-time roles, or a quick question about an idea — the inbox is open.

Start a conversation