Inara Consultancy Services, 2024 to 2025
Legacy modernisation, offline and download architecture
LexVid
An ageing legal-education video app, migrated onto a current Expo, data and offline architecture.
Modernisation of an existing app
LexVid was an existing product with a codebase that had become expensive to change. My job was not to rewrite the app, it was to modernise the parts of it that were making every change slow: the Expo version it was pinned to, how it held state, how it fetched data, and how it behaved without a connection.
I migrated data fetching onto React Query and then used the same client as the offline mechanism: the query cache is persisted to storage, so the library paints from cold storage on launch and reconciles in the background instead of showing a spinner on every cold start. Credits, certificates and playlists all reconcile the same way once a connection returns.
The most involved piece was video download. The viewers are lawyers watching accredited courses, frequently without a connection, so downloading a series and playing it back offline is the product rather than a convenience. Downloads are resumable, report real progress, and run through a queue with a concurrency cap rather than starting everything at once.
What it does
- Download a course or a whole series and watch it with no connection
- A library that renders immediately on launch, from cache, before the network answers
- Playback progress, credit tracking and certificates that reconcile after time offline
- Download progress, queueing and deletion managed from inside the app
Engineering notes
- Migrated to a current Expo release line, which is where most of the upgrade pain lived
- Replaced ad-hoc data fetching and state handling with React Query as the single server-state layer
- Offline built on the persisted query cache rather than a parallel storage layer, so there is one source of truth instead of two that disagree
- Resumable downloads with real progress reporting, backed by a queue with a concurrency cap
- Connection state drives the interface through NetInfo, so offline is a known state rather than a failed request
- Modernisation rather than a rewrite: the product kept shipping while the architecture moved underneath it





