My Hustle
Talent marketplace connecting elite African freelancers with global clients
I built MyHustle because many African freelancers and clients face significant friction when trying to use global platforms like Fiverr or Upwork. Beyond general payment barriers, the pricing structures on those platforms are often unsuitable for the local market, and forcing clients to transact in US dollars instead of their local currency creates massive hurdles. I wanted to create a platform that felt native to them.
As the founder and creator of this tailored freelance marketplace, I encountered early challenges with core user experience issues.
The initial dashboard had been built as a traditional website where every click triggered a full browser reload, meaning that whenever a user moved between tabs, their live chat connection would abruptly drop, unsaved proposal forms would get wiped out, and screen flashes made the platform feel clunky. On a marketplace where people's livelihoods depend on fast communication and safe payouts, my objective was to re-architect the platform to make the experience smooth, instantaneous, and completely reliable.
Here is an overview of the technical challenges I tackled to scale the platform, how I solved them, and the results we achieved.
§1. Uninterrupted Live Chat and Instant Page Transitions
Originally, navigating between order pages or checking notifications caused full browser refreshes. This constantly severed the live messaging connection, causing missed messages, delayed responses, and frustration during active project negotiations.
To make communication seamless:
- ›I rebuilt the dashboard into a modern, responsive web application that transitions between pages instantly without ever reloading the browser.
- ›I maintained an active, persistent messaging connection in the background so clients and freelancers can chat, share files, and update orders without interruption while moving around the site.
- ›I added instant screen updates so typed messages and status changes appear immediately without waiting on slow network round-trips.
Because of this overhaul, live chat stays connected 100% of the time, page switches feel instant, and negotiation drop-offs dropped significantly.
§2. Crash-Proof Freelancer Onboarding with Auto-Save
Signing up as a skilled freelancer requires filling out detailed information: personal background, language fluency, specialized skills, and previous work history. In early versions, if an applicant accidentally closed their tab, refreshed the page, or lost internet for a second, everything they had typed was lost, leading many talented freelancers to abandon sign-up halfway through.
To make onboarding stress-free and reliable:
- ›I redesigned the registration flow to automatically save drafts to the database in real time as the user types, allowing freelancers to refresh, close the tab, or switch devices and pick up right where they left off.
- ›I introduced an automatic resume reader that extracts work experience and key skills from uploaded PDF resumes, filling in the forms automatically to save users time.
- ›I enforced sequential step validation so nobody can accidentally submit an incomplete profile that would fail client searches.
This completely eliminated lost progress during sign-up, boosted onboarding completion rates, and ensured every published profile has complete, verified information. It also gave us precise tracking of exactly which step freelancers struggle with or abandon, so we can keep improving the funnel over time.
§3. Centralized Marketplace Permissions
On a two-sided freelance platform, keeping data private between parties is vital: clients must only see their own job postings, freelancers must only access contracts assigned to them, and administrators need high-level oversight. When permission checks were written by hand across dozens of individual pages, it was too easy for someone to forget a check and accidentally expose sensitive project details.
To ensure airtight data access:
- ›I built a centralized permission system that automatically verifies user roles and project ownership before any page or action is allowed to run.
- ›I created clear, reusable access checks so that freelancers and clients only ever see the files, invoices, and milestones that belong to their active contracts.
- ›I applied the same rules directly inside database queries and to live chat channels, so users can only fetch records they are allowed to see and only authorized parties can ever join a contract's conversation.
- ›I added security alerts that flag any unauthorized access attempts before they can cause issues.
This eliminated security oversights and gave both clients and freelancers total confidence that their project briefs, private chats, and agreements remain strictly confidential.
§4. Bulletproof Milestone Escrow Payments
The core of marketplace trust is escrow: a client deposits money when starting a job, and the funds are held securely until they approve the completed work. Early versions had subtle timing issues where a double-tap on the release button or a flaky mobile connection could attempt to release funds multiple times or create conflicting accounting records.
To make milestone payouts dependable:
- ›I redesigned the escrow state machine to use strict idempotency keys, ensuring that every milestone deposit, release, and refund happens exactly once, no matter how many times a button is pressed or retried.
- ›I linked financial releases directly to an immutable ledger that tracks every transfer with precise audit timestamps.
This ensured 100% financial accuracy across thousands of milestone payouts, eliminating payment disputes and giving both clients and freelancers complete peace of mind.
§5. Speed Optimization and Code Splitting
As new marketplace features were added, the application code grew heavy, slowing down initial load times for users visiting on slower mobile connections.
To keep the platform fast for everyone:
- ›I split the application code into lightweight, focused chunks so that freelancers, clients, and admins only download the specific screens they actually use.
- ›I added smart image optimization and lazy-loading for portfolio showcases, ensuring freelancer profiles load in under a second even with high-resolution artwork.
Now, the entire marketplace feels snappy and responsive, keeping bounce rates low and allowing clients to browse talent and place orders effortlessly.
§6. Making Cloud Storage Flexible Without Any Downtime
File uploads—resumes, portfolios, and contract attachments—were originally wired directly to one storage provider's software. As uploads grew, our bandwidth costs climbed, but the codebase was so tightly coupled to that single provider that switching felt impossible without breaking every existing link.
To free the platform from vendor lock-in:
- ›I built an abstraction layer that gives the whole application one consistent interface for uploading, reading, and deleting files, hiding provider-specific code from the rest of the app.
- ›I created pluggable storage connectors so we can point the app at different cloud providers by changing configuration instead of rewriting code.
- ›I ran a careful, two-phase background migration that copied every existing file to the new provider with fallback reads, verifying each file before switching traffic over.
As a result, we moved all platform files to a lower-cost provider with zero downtime and no broken links, slashed our monthly storage and bandwidth expenses, and can switch or add providers in the future without touching application code.
§7. Making the Platform Usable and Accessible to Everyone
On a marketplace where people are trying to find work, accessibility is part of the product working at all—yet the interface had elements that screen readers could not interpret, controls that were not recognizable as buttons or links, and markup structure that tripped up assistive tools.
To make the product work for everyone:
- ›I did a full accessibility pass across the interface, fixing screen-reader interpretation, making every interactive element properly recognizable, and cleaning up the page structure that was causing accessibility tools to flag errors.
- ›I made user input harder to get wrong by adding smart validation, like phone number fields that check international formats as you type, so bad data never reaches the server in the first place.
- ›I fully localized currency and formatting for our target market, so the product feels native and local rather than translated.
Now everyone can use the platform regardless of how they navigate the web, bad data is stopped at the source, and the marketplace feels genuinely local to the people who depend on it.
§8. Rewarding Milestones Without Slowing Down the Core Product
Gamification keeps freelancers and clients engaged, but bolting reward logic directly onto the core order flow is a common way to accidentally slow down the transaction people actually care about.
To add engagement without the cost:
- ›I built the rewards system as a separate, event-driven layer that listens for milestones on the backend instead of living inside the main order and payment flow.
- ›I paired it with a lightweight, modular celebration system on the frontend that triggers small animated rewards, like confetti and visual "wins," designed to run smoothly without ever weighing down the page.
This gave users a genuinely enjoyable experience when they hit milestones, while placing an order stayed just as fast as before, completely unaffected by the extra layer running alongside it.
§9. Securing Credentials and Protecting the Backend by Default
MyHustle handles real financial transactions and personal data, so security cannot depend on every engineer remembering to validate each request. Sensitive credentials were also the kind of thing that could end up scattered across environment files where they are easy to expose by accident.
To make security the default rather than an afterthought:
- ›I centralized secrets management so all sensitive credentials live in one secure, access-controlled place instead of scattered across the codebase.
- ›I built secure login and password-reset flows from the start, so account access never relied on weak or plaintext handling.
- ›I made every incoming request automatically stripped of potentially malicious content before it reaches business logic, closing off common web attacks like cross-site scripting at the door instead of trusting each endpoint to defend itself.
- ›I made list and search endpoints behave consistently so the frontend never has to guess how pagination works, and made caching failures degrade gracefully instead of crashing a request.
This gave us a security posture solid enough to pass internal review, guaranteed separation between every user's data, and one less class of attacks to worry about with every new feature.
§10. Making Safe Shipping the Easy Default
A growing team ships confidently only when the safe way to release is also the easy way. Without guardrails, formatting issues and basic mistakes waste reviewers' time, and manual deployment steps are easy to get wrong.
To build release habits that hold up as the team grows:
- ›I set up automated deployment pipelines so code that passes review and testing gets built and deployed consistently, without fragile manual steps.
- ›I enforced code style and pre-commit checks so formatting and basic quality issues are caught before a human reviewer ever has to comment on them, and added a standard pull request template so every change is reviewed against the same checklist.
- ›I built a real testing culture with coverage on the parts of the system where a bug would actually hurt—onboarding events, real-time messaging, the gamification backend, and the complex interactive form logic on the frontend, including how the UI recovers gracefully if something goes wrong mid-edit.
None of this is about individual heroics; it is about making the safe way of doing things also the easy way, so quality and reliability hold up even as more people touch the codebase.