Skip to main content

<DM />

Back to work

Mobile

Web

SaaS

AI

ThriveOn Digital Platform

Full Stack Engineer — Expo app, thriveon-api (Azure OpenAI wizards), Strapi/WordPress surfaces, shared packages

Health and wellness platform: Expo React Native client, Express thriveon-api with Azure OpenAI Assistants for purpose/goal/PSM wizards, Strapi 5 CMS, WordPress plugin, Revolut payments, and .NET Aspire orchestration.

ThriveOn Digital Platform preview

Overview

ThriveOn is a multi-surface wellness product from the Bullshark thriveon-digital-platform monorepo. Clients use an Expo Router app for coaching, courses, events, toolkit, account, and wizard journeys. A shared Express package (thriveon-api) handles auth, bookings, payments webhooks, growth plans, and AI-assisted wizards via Azure OpenAI (Assistants API threads/runs). Content is administered in Strapi 5; a WordPress plugin bridges marketing pages to Strapi. Aspire orchestrates local services.

Problem

Wellness journeys (purpose, goals, habits, coaching, courses, events) needed one mobile product plus CMS and website embedding—and guided wizards that could generate personalized coaching-style guidance, not static forms alone.

Solution

Shipped and extended the Expo client, thriveon-api Express services (including Azure OpenAI Assistants for Purpose, Goal, and PSM wizards), Strapi 5 content APIs, shared thriveon-data types, WordPress shortcode/PHP Strapi client, Revolut checkout/webhooks, and Aspire-hosted local delivery.

Frontend

Expo ~54 app with file-based Expo Router groups for auth, tabs, wizard flows, and WordPress WebView integration.

Expo 54

React Native

Expo Router

TypeScript

React Hook Form + Zod

Revolut Checkout

Reanimated

thriveon-data shared types

  • Tab surfaces: Home, Coaching, Courses, Events, Toolkit, Account, Thriveon Wizard (purpose / goals / habits / change actions)
  • Auth, public onboarding, and nested protected (inner) screens via route groups
  • (web-integration) WebView path for WordPress-hosted content
  • API client calls into thriveon-api for wizards, profile, courses, events, bookings, and payments
  • Payments via @revolut/checkout; media via expo-image / image-picker; markdown and HTML renderers for CMS content

Backend

Express thriveon-api with Azure OpenAI Assistants for wizard messaging, Strapi 5 CMS, WordPress PHP Strapi client, Revolut/Reach360 webhooks, Passport auth providers, Aspire orchestration.

Express (thriveon-api)

Azure OpenAI (openai SDK AzureOpenAI client)

Assistants API (threads / runs / messages)

Strapi 5.18

PostgreSQL / SQLite

Passport (incl. Azure AD OAuth paths)

Revolut webhooks

WordPress PHP plugin

.NET Aspire

  • Azure OpenAI client configured with AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_KEY, and deployment (e.g. gpt-4.1) via purposeWizardConfig / goalWizardConfig / psmWizardConfig
  • Wizard controllers create Assistants threads, post user context (focus area, values, passions, goals), poll runs, and return assistant message content to the app
  • Routes for purpose, goal, PSM, daily-habit, and change-action wizards plus growth plans and change-action reports
  • Auth routes with Passport strategies; profile, courses, events, books, groups, posts, perks, orders, transactions
  • SimplyBookMe booking integration; Revolut and Reach360 webhook handlers
  • Strapi content types + bootstrap for wellness domains; WordPress thriveon-strapi-client.php and exercise shortcodes for site parity
  • Aspire AppHost runs Strapi, DB, API, and related containers locally

Modules

AI wizards (Azure OpenAI)

Purpose, Goal, and PSM wizards using Azure OpenAI Assistants threads/runs for personalized guidance

Coaching & courses

Session booking/viewing and course library consumption

Events, toolkit & habits

Calendar registration, wellness toolkit, daily habit and change-action flows

CMS & WordPress bridge

Strapi 5 admin plus PHP shortcodes/client for marketing ↔ app content

API & integration highlights

  • POST purpose/goal/PSM wizard messages → Azure OpenAI Assistants thread + run polling
  • Save purpose/goal outcomes onto user profile via thriveon-data services
  • Auth sign-in callbacks (incl. Azure OAuth paths) with mobile deep-link exchange codes
  • Revolut checkout webhooks and SimplyBookMe booking routes
  • Strapi REST from WordPress via thriveon-strapi-client.php

Challenges

  • Reliable Azure OpenAI Assistants run polling and error envelopes for mobile wizards
  • Keeping Expo, thriveon-api, and Strapi models aligned across coaching, courses, events, and toolkit
  • WordPress plugin integration without forking the content pipeline
  • Aspire-local multi-service setup matching Strapi/Postgres/API parity

Impact

  • AI-assisted wellness wizards on Azure OpenAI inside the same product as courses and coaching

  • Single mobile surface for core wellness journeys

  • CMS-driven content ops in Strapi 5 with WordPress embedding

  • Shared thriveon-api / thriveon-data packages that shortened feature delivery

Architecture

Expo client (Expo Router)
Express thriveon-api
Azure OpenAI Assistants
Strapi 5 REST API
PostgreSQL / SQLite
WordPress plugin → Strapi
.NET Aspire orchestration

Tech

React Native

Expo

Expo Router

TypeScript

Express

Azure OpenAI

OpenAI Assistants API

Strapi 5

PostgreSQL

WordPress

PHP

Revolut Checkout

.NET Aspire

React Hook Form

Zod

Passport