← All company stories02 / MY ENGINEERING JOURNEY

My work at Naistro.

I moved playlist scheduling and interruption logic from the frontend into backend services. From there, my work covered preparing audio, controlling players remotely, and recording what actually played. Each part had to work with the devices and connections already in the venues.

Naistro provides music and scheduled audio for physical venues. A venue can have several players, its own local time, and announcements that need to interrupt the music.

01 / Scheduling & interruptions

I moved the scheduling decisions into the backend.

A song can still be playing when an advert or prayer is due. The player needs to know what takes priority, where to stop, and where to resume. Station changes and the venue’s local time add more boundaries to that same day.

MY CONTRIBUTION

I moved playlist and interruption logic from the frontend to backend services and extended the scheduler. I worked on the day’s timeline, overlapping events, and saved track positions, along with the tools used to program and arrange the music.

THE IDEA, ILLUSTRATED

Interrupt, then resume in the right place

ONE TIMELINE · THREE PRIORITIES
3 / Prayer2 / Advert1 / Music
0s30s60s90s120s150s
Track A
Resume 35s
Resume 55s
Prayer
Playback offset is retained across the interruption.
Prayer takes priority. Music resumes after the interruptions.

Watch the music lane split around the scheduled interruptions. The second music segment continues from the saved position rather than starting the song again.

THE DECISION

Start on time without losing the song.

Giving an interruption priority solves only half the problem. I also had to preserve how much of the track had played, resolve conflicts between interruptions, and align what came next. Time-zone handling kept those decisions tied to the venue’s day.

WHAT CHANGED

Scheduling errors fell, and interrupted tracks could continue from their saved position. Operators gained more control over when content played and how it fit into the rest of the schedule.

Scheduling errors
−80%After moving playlist and interruption logic from the frontend into backend services.
Tools & engineeringTypeScript, AWS Lambda & Serverless · Event ordering & interval handling · SQL & time-zone handling

The skills behind the work

TypeScript, AWS Lambda & Serverless
Move scheduling decisions into backend services.
Event ordering & interval handling
Resolve overlaps and preserve the played portion of an interrupted track.
SQL & time-zone handling
Assemble the venue’s day from its schedule and local time.
More of my work in this area 4A venue’s day as one playback timelineTurn a daily plan into a coherent listening experience.Read the contribution →Music that resumes after an interruptionKeep playback coherent when schedules overlap.Read the contribution →Finding and rearranging scheduled tracksGive curators more control over their selections.Read the contribution →Scheduling messages across venuesMake audio campaigns easier to organize.Read the contribution →
02 / Audio preparation

I built the processing step between an upload and playback.

Uploaded audio still needed preparation: its format and loudness had to suit playback, and some messages needed silence around them. That work took time and depended on tools beyond the application runtime.

MY CONTRIBUTION

I built background audio processing with SQS and FFmpeg, stored the prepared files in S3, and packaged the required tools with Docker. I also worked on compatibility so newer processing could supply audio to existing players.

THE IDEA, ILLUSTRATED

Move media preparation into background work

QUEUE · ASYNCHRONOUS AUDIO PREPARATION
1Processing
2Queued job
3FFmpeg
4Ready asset
SOURCE AUDIO
Variable levels · Raw input
FFmpegNormalize → AAC
PLAYBACK ASSET
Normalized levels · AAC output
Consistent levelsPlayback-ready formatBackground processing
Uploaded audio waits in a queue while a worker prepares it for playback.

Uploading a file is only the first step. It waits for a worker, goes through audio preparation, and becomes available to play once processing finishes.

THE DECISION

Background work needs a visible outcome.

Moving processing into a queue let the request finish sooner, but the file was not ready yet. I handled processing and failure states and temporary-file cleanup. Compatibility work also had to refresh cached files and metadata so older players received the updated audio.

WHAT CHANGED

Audio preparation became an automated background operation. Content could be normalized and encoded without holding the original request open, with status available when processing failed.

Venues supported
3,000+Scale served by the automated track-processing pipeline.
Tools & engineeringAmazon SQS & NestJS · FFmpeg & Docker · S3 & cache invalidation

The skills behind the work

Amazon SQS & NestJS
Hand processing work to a consumer outside the original request.
FFmpeg & Docker
Normalize and encode audio in an environment containing the required media tools.
S3 & cache invalidation
Store prepared files and make updated audio available to existing players.
More of my work in this area 3Queued audio normalization and encodingPrepare audio without holding up the user experience.Read the contribution →Updated audio for existing playersHelp product improvements reach existing devices.Read the contribution →Package the tools the audio worker needsKeep media processing reproducible across environments.Read the contribution →
03 / Remote player control

I connected dashboard controls to the players in each venue.

An operator might need to pause several players or change a venue’s volume. Some devices could be connected while another was unavailable. A dashboard needed to make that situation understandable.

MY CONTRIBUTION

I built remote playback controls and worked on device connection state, heartbeats, and access to venue resources. I also added player notifications and editable product guides for the people using those controls.

THE IDEA, ILLUSTRATED

Connect a control with the receiving device

VENUE CONTROL · DIRECT WEBSOCKET FAN-OUT
DashboardConnected devicesWebSockets
Entrance65% volume
Main floor65% volume
Lounge65% volume
Adjust the volume. Available targeted devices receive the command.

Sending a command does not mean the player received it. Connection feedback shows when playback can be controlled and when the device is unreachable.

THE DECISION

A group command can have mixed results.

One unavailable device should not erase successful sends to the others. I returned per-operation delivery results and worked on aging connection state so a disconnected player would not look active indefinitely. A sent command still needed to be distinguished from observed playback.

WHAT CHANGED

Operators could control players remotely and see more useful information about their availability. The backend supported venue-level actions without treating the entire fleet as one device.

Inactive-device detection
20 secTime to detect inactive devices through real-time health monitoring.
Tools & engineeringWebSockets · DynamoDB & device heartbeats · Authentication & access control

The skills behind the work

WebSockets
Carry interactive controls between a dashboard and connected devices.
DynamoDB & device heartbeats
Keep track of observed device activity.
Authentication & access control
Keep venue and device operations within the appropriate account scope.
More of my work in this area 5Remote controls with per-device resultsGive operators clearer control over playback.Read the contribution →Device status that ages with the connectionHelp operators understand which devices are available.Read the contribution →The right notice for each playerDeliver useful guidance to the appropriate devices.Read the contribution →A venue view shaped by responsibilityShow users the operational information relevant to their role.Read the contribution →Product guides the team could maintainLet teams maintain guidance as the product changes.Read the contribution →
04 / Playback evidence & monitoring

I kept playback records from disappearing with the connection.

The schedule said what should play. Reporting needed to know what did play, including when a device lost its connection or a prayer interrupted a track. Sending each record immediately was not always possible.

MY CONTRIBUTION

I worked on actual playback-time accounting and a file-backed queue for unsent records. I also built monitoring for missed scheduled events, alert delivery, and reporting so the team could compare the plan with device evidence.

THE IDEA, ILLUSTRATED

Keep the record through a lost connection

OFFLINE RESILIENCE · LOCAL QUEUE
On the device3 pending
Playback 130s
Playback 230s
Playback 330s
Offline
Last batch received0Acknowledged records
Playback evidence can wait locally until the network returns.

Records stay on the device during an outage. When the connection returns, delivery resumes. A failed attempt keeps the records available for another try.

THE DECISION

Keep the record until delivery succeeds.

Removing a record when sending started could lose it on failure. I retained unsent records on the device and removed the sent batch after success. Monitoring had a related timing problem: it needed to allow for delayed evidence before treating an expected event as missing.

WHAT CHANGED

Unsent playback records could survive a restart and travel when connectivity returned. Monitoring made missed activity easier to investigate, with alert outcomes recorded separately from the detection itself.

Tools & engineeringPython & file-backed queues · Scheduled monitoring & AWS · SQL reporting

The skills behind the work

Python & file-backed queues
Count actual play time and retain unsent records across restarts.
Scheduled monitoring & AWS
Compare expected activity with device evidence and deliver operational alerts.
SQL reporting
Make playback and catalogue information usable for investigation and operations.
More of my work in this area 5Playback records that survive offline periodsPreserve useful playback evidence when connectivity is unreliable.Read the contribution →Finding scheduled events with no playback evidenceHelp operators notice when playback needs attention.Read the contribution →Operational alerts with recorded send outcomesGive operators enough context to act on an alert.Read the contribution →A searchable report of the active catalogueMake catalogue information easier to inspect.Read the contribution →Connect playback to advertising evidenceConnect delivery activity with useful reporting.Read the contribution →
05 / Release engineering

I made the release process repeatable.

The services needed to run in development and production with their dependencies in place. Audio processing made that especially concrete: code could be correct while the deployed container lacked a required media tool.

MY CONTRIBUTION

I owned CI/CD work using containers and AWS deployment services. I worked on the build and release steps so checked changes could follow a repeatable path into each environment.

THE IDEA, ILLUSTRATED

Move a change through checks to release

01 / CHANGEA new version
+ a product improvement+ a behavior check
02 / CHECKReady to test

Validate the change before releasing it.

03 / RELEASECurrent version stays

An unchecked change does not replace it.

Check the change before releasing it.

A change passes through checks before release. If a check fails, the current version stays in place while the issue is fixed.

THE DECISION

The runtime was part of the change.

A successful application build did not prove that the deployed worker had everything it needed. Container configuration and environment-specific settings had to travel through the release process alongside the code.

WHAT CHANGED

Deployment issues decreased. The team had automated release steps and a more consistent runtime for operating the backend.

Tools & engineeringDocker & Docker Compose · GitHub Actions & AWS ECS

The skills behind the work

Docker & Docker Compose
Package the runtime and coordinate development services.
GitHub Actions & AWS ECS
Automate builds and deploy the service into its target environment.
More of my work in this area 1Container builds and automated deploymentMake software delivery more repeatable.Read the contribution →
ACROSS THIS WORK

Naistro took my backend work all the way to the player. I worked on the schedule it received, the audio it used, the commands it followed, and the records it sent back when the connection returned.

Browse all 18 contributions at Naistro →
CONTINUE TO CREDPAL

My work at CredPal. →