Open to remote roles, or mostly-remote ones

Senior iOS Engineer

Amissan Amoussou-G.

Currently an iOS engineer at Instant System, where mobile ticketing is my area of expertise.

I have been lucky enough to work in companies of every size since the start of my career: a startup of under ten people, a mid-sized company with Instant System, and a CAC 40 group with Orange, through Inetum. I am versatile and I settle quickly into a new environment and a new way of working. What does not change, whatever the context, is the rigour and the commitment I bring to my team and to the life of the company.

For a full year I carried Instant System's iOS mobile ticketing on my own. I designed features there that secure our m-ticket applications today.

  • French Riviera, France
  • Fully or mostly remote
  • French · professional English (TOEIC 840)
KCalories' main screen: the day's food diary.KCalories

~5 M

That is how many people use apps I have contributed to, today.

6 yrs

Six years of professional iOS development, one of them as an apprentice.

> 99.9 %

That is KCalories' crash-free session rate, and the measure of the care I put into what I ship.

01 · Problems solved

From the problem on the table to production

Two very different settings: the ticketing embedded in thirty-three transport apps, and an application I carried end to end on my own.

Mobile ticketing for transport networks

Instant System · since May 2023 · in production

I joined a team with no mobile developer at all, alone on the ticketing scope of the whole portfolio — for a year. Here are five workstreams, each with the problem that triggered it and what it produced.

01Authentication that logged people out for no reasonInherited code nobody wanted to touch — rebuilt on actors

Problem

When several requests received an unauthorised response at the same time, each one fired its own token refresh. The concurrent refreshes invalidated one another, and the user ended up signed out for no apparent reason. The authentication code dated back to 2019 and nobody wanted to touch it.

Decision

I took the initiative on the rebuild, moving to async/await with an actor holding the authentication state.

Why an actor rather than a lock: a lock protects state provided you remember to take it everywhere — nothing checks that, and a lock held across an await is a deadlock waiting to happen. With an actor, isolation becomes a property of the type: every access from outside is necessarily serialised, and forgetting is no longer possible.

The heart of the fix: the in-flight refresh task is remembered. Concurrent requests do not start a new one, they await the same one. A single refresh, however many simultaneous calls — plus a guard against retry loops on the same call.

Result

Authentication on TCL became markedly more stable. No more unexplained sign-outs — the kind you never reproduce in testing and only ever see in production.

actorasync/awaitTaskSendable
02QR code fraudAn innovation-sprint initiative that became a paid feature

Problem

A digital ticket is displayed as a QR code. Fraudsters would take a screenshot and pass it on — and at inspection, nothing told the copy apart from the original.

Decision

During an innovation sprint, I took the initiative of designing an internal library that masks the screen content as soon as a capture or a recording is under way. The ticket stays readable to its holder, and disappears from anything that could be shared.

Result

Rolled out across every app, then adopted on the new platform. Clients are pleased with it — to the point that it became a feature they pay for. A sprint idea turned into a line of revenue.

03Card top-up on the Lyon networkFrom proof of concept to production, built almost single-handedly

Problem

The Lyon network had been waiting to let riders top up a transport card from their phone. On iOS, everything was still to be done: the ticketing vendor's SDK had never been integrated.

Decision

I first proved the integration with a POC — a POC should not show that it works, it should show what will break in production. Then I built almost the entire feature on iOS single-handedly, through to release.

Result

Shipped. I am now one of the technical leads on the TCL app, which I know inside out, and I am driving the m-ticket launch on it.

04Carrying clean architecture all the wayThe product owns the default, the vendor overrides only its difference

Problem

The per-vendor ticketing abstraction had been laid down by the tech lead. But implementations that were entirely vendor-independent still lived inside the vendor modules — duplicated once per supplier.

Decision

I created the module for a new vendor even though it had few specifics: keeping it outside would have been quicker, but would have left a hole in the architecture. End-to-end consistency was worth the extra code.

And I argued for — and obtained — lifting vendor-independent implementations up to the product. Vendors now override only what they actually mean to change.

Result

Less duplication between suppliers, and a clear rule that holds without arbitration: the product owns the default behaviour, the vendor overrides only its difference.

05Launching the new platformOùra and Tuscany, across every functional area

Problem

The new product platform, in clean architecture with dependency injection, had to carry the whole of ticketing — with no regression against a platform proven over years.

Decision

I worked across every functional area: purchase catalogue, cart, parameterised products, purchase history, beneficiary management, buying on someone's behalf. And I wrote the internal QR code generation library from an encoded payload — the building block behind ticket validation and inspection.

Result

Platform launched on Oùra (Auvergne-Rhône-Alpes) and in Tuscany. That is where I learned SwiftUI, dependency injection and this architecture — in production, on a shipped product.

SwiftSwiftUIUIKitSwift ConcurrencyActorsClean ArchitectureSPM modulesDependency injectionXcodeGenJenkinsfastlane · match

KCalories, the nutrition companion

Personal project · four stacks, alone, in five months

App Store

Problem

I paid for three nutrition tracking apps. Price was never the obstacle — none of them had everything: fasting, calorie tracking, keto tracking by net carbs, and an interface you do not have to put up with.

I also wanted to find out whether I could carry a whole product, not just an iOS layer.

Decisions & delivery

  • Build all four stacks myself rather than assembling services: iOS app, backend, admin back-office, marketing page. Carrying the product end to end was the point, not the means.
  • Strict architecture and SPM modules from day one, when nothing yet demanded it — boundaries get drawn before there is anything to put behind them, or they never get drawn at all.
  • Feature flags and continuous integration from week one, to ship without blocking and without manual ritual.

Results

  • Published on the App Store five months after the first line of code.
  • Over 99.9% crash-free sessions, taken from App Store Connect — above what you expect of a mobile app that runs well.
  • Version 2.0 twenty days after 1.0: the delivery pipeline held.
  • Available in French and English, with two complete themes.
SwiftUISwiftDataClean ArchitectureSPM modulesFeature flagsBackendBack-officeCI/CDFR · EN
02 · Apps in production

33 transport apps I have worked on

At Instant System, transport apps are built white-label on a shared platform. The ticketing layer I build and maintain ships inside every one of these — from Lyon to Tuscany, all the way to French Polynesia.

Apps published by transport authorities and their operators. My contribution covers the mobile ticketing layer — purchase, usage, validation and inspection — and its integration into each app.

03 · Key skills

A few key skills, and concrete examples of them in use

Concurrency and shared state

Session tokens, their renewal and error paths are where concurrent access produces the bugs you can never reproduce. Actors, async/await, isolation: what the compiler guarantees on my behalf beats what I promise to check.

Boundaries and modularisation

Clean Architecture in separate modules rather than folders, and modules that depend on a contract, never on an implementation. A boundary the compiler does not refuse is not a boundary — it is a convention that eventually gets forgotten.

From code to shipped product

Project generation from a spec rather than a binary file, signing handled by fastlane and match, pipelines per product and per module, feature flags to decouple shipping from releasing. Whatever is not automated ends up not being done.

04 · Experience

Where I have worked, and what I did there

iOS Engineer

Instant System · Sophia AntipolisMay 2023 → today
Technical lead, ticketingScrum Master · since February 2025AI ambassadorMentor
  • Sole mobile developer on the ticketing scope for a year, across the whole portfolio: stabilising production and building features.
  • Built transport card top-up almost single-handedly on the TCL app, where I am now one of the technical leads.
  • Two internal libraries designed and shipped: on-screen anti-fraud protection for tickets, and validation QR code generation.
  • Created the module for a new ticketing vendor, and lifted vendor-independent implementations up to the product — argued for, then obtained.
  • Complete rebuild of session handling — tokens, renewal, retry, sign-out — on actors and async/await.
  • Onboarded every mobile developer who joined after me, iOS and Android; official mentor to an iOS developer.
  • Architecture workshops with the CTO and the architects; client demos; conducting hiring interviews.
  • Scrum Master of my team without stepping away from development — and still one of its main technical contributors.

Swift · SwiftUI · UIKit · Swift Concurrency, actors, async/await · Combine · Clean Architecture, 3 then 4 layers · dependency injection · SPM, XCFrameworks, CocoaPods · XcodeGen and YAML specs · Jenkins · fastlane · match · Bitbucket · SAFe

iOS Engineer

Mail Orange — Orange, via Inetum · MouginsJan. 2022 → Apr. 2023
  • Features and fixes on a mail app with around one million users, in a team of three iOS developers.
  • Topics owned end to end from the first weeks: drafts, attachment handling.
  • Maintained compatibility across iOS versions and the iPad layout, on a codebase heavily used on tablets.
  • Worked on a heterogeneous codebase — VIPER in the composer, MVP elsewhere.
  • Took part in refinements and technical decisions; worked with third-party teams on integrated services.

Swift · Objective-C · Programmatic UIKit, xib, storyboards, Auto Layout · MVP · VIPER · Delegate, Observer · UIDocumentPicker · app extensions · CocoaPods · SAFe

iOS Engineer — apprenticeship

STIILT · NiceOct. 2020 → Oct. 2021
  • Full migration from Objective-C to Swift of a premium car-sharing app already live on the App Store — the codebase went from 30% to over 92% Swift in one year.
  • Migration carried out alongside a colleague's feature releases on the same codebase, without interrupting production. The strategy was mine.
  • Rebuilt the networking layer, profiling and optimisation.

Objective-C → Swift · UIKit · MVC · storyboards, xib · CocoaPods · incremental migration on a live app

Education

2020 — 2021Master's degree in Software EngineeringUniversité Côte d'Azur — Nice
2019 — 2021Engineering degree in Computer SciencePolytech Nice Sophia Antipolis — Ambient & Mobile Intelligence track
2016 — 2019Bachelor of Engineering in Computer ScienceInstitut Africain d'Informatique — Lomé

Certifications

November 2025Professional Scrum Master IScrum.orgVerify certificate
2025Certified SAFe 6 PractitionerScaled AgileVerify certificate

Open projects

Advanced CalendarSwiftUI calendar component, bridged over UIKit to move past the limits of UICalendarView. Written because the framework was not enough.
News AppMVVM news feed, live parsing, signing handled by fastlane and match. Written for the Instant System technical interview.Source code

Languages

SwiftObjective-C

Interface

SwiftUIUIKitAuto LayoutDynamic TypeiPadApp extensions

Concurrency

async/awaitActorsSwift ConcurrencyCombineGCD

Architecture

Clean ArchitectureMVVMMVPVIPERDependency injectionSPM modulesFeature flags

Tooling & CI/CD

XcodeXcodeGenSPMCocoaPodsXCFrameworksfastlanematchJenkinsGitBitbucket

Collaboration & delivery tooling

Jira — administration, JQL, kanban boardsConfluenceGoogle Workspace — shared calendars, rooms, meetings

Practice

SAFeScrumCode reviewUnit testingRefinementMentoring
Away from the code

Who I am

Mister Good MoodVoted for by the whole company, in 2024.

Class representative, president of the student committee, team captain. It started early and never really stopped: today I am Scrum Master and coach of my team, and I wear the armband for the company football side.

The subjects nobody wants, I take. The anti-fraud library came out of an innovation sprint where I had a free hand. Authentication had not moved since 2019 and everyone worked around it — I took it back. And being the only one on a whole scope does not scare me: I did it for a year.

Outside of that, it is the gym and the pitch. Nutrition and the mechanics of the body fascinate me — enough that I built an app out of it.

What keeps me busy elsewhere

  • Strength training
  • Nutrition
  • Football
  • Landscape photography
  • Travel

Let's work together.

I am happy in my current role at Instant System, where I hold a central place. I remain open to interesting opportunities all the same — the ones where I can add something that matters. Email is the best way to reach me.

amissan.ag@outlook.fr