ES
joseph
Say hi ↗
SEE • FEEL • RESPOND • SEE • FEEL • RESPOND •
case 03 / 05

Lumina Vision CRM 

Real-time facial analysis and customer sentiment tracking for physical retail.

Year
2024
Role
Serverless · Realtime UI
Status
Deployed on private retail networks
( architecture )

How it's built

Kinesis VideoAWS RekognitionLambdaDynamoDBAppSyncReact
videolive▭Store CamerasRTSP≡Kinesis VideostreamsλFrame Samplerλ lambda✦RekognitionemotionsλAggregatorλ lambda◉DynamoDBstreams◇AppSyncGraphQL WS▭React Dashboardclient
Hover a service to trace its connections
( the problem )

Store managers had sales numbers but no idea how customers felt while they were in the aisle, and data arrived a day late.

( the build )

Camera streams are sampled at the edge, analysed by Rekognition and pushed as anonymised sentiment events to a live React dashboard over AppSync subscriptions.

300ms
camera → dashboard
24
stores streaming live
100%
anonymised, no faces stored
( request flow )
  1. 01In-store cameras publish to Kinesis Video Streams.
  2. 02A sampler Lambda extracts frames and sends them to Rekognition.
  3. 03Emotions are aggregated per zone and written to DynamoDB, never the image.
  4. 04AppSync subscriptions stream every update to the React dashboard.
lumina.console● live
300ms
camera → dashboard
24
stores streaming live
100%
anonymised, no faces stored
handler.ts
1const faces = await rekognition.detectFaces({
2 Image: { Bytes: frame },
3 Attributes: ['EMOTIONS'],
4});
5publish(zone, aggregate(faces));
6▍
main ✓TypeScript · UTF-8 · Ln 6
Next case · 04
Velocity Oracle →