Robosport
An IoT mobile app that controls Robosport's robotic batting tee
A batter sets up at the plate. A ball waits on the end of a telescopic arm, at the exact height they dialed in a moment earlier. They swing, connect, and the arm resets. Nothing on the machine needs touching once a drill is running. It all works from a phone over Bluetooth, and that phone app is the part we built.

The Client

Robosport Technologies builds training hardware for baseball. Its core product is a robotic batting tee that repositions the ball after every hit, so a batter can't settle into one groove and has to read the strike zone each time.

The physical trainer is a heavy, tripod-style stand with a telescoping arm, a mounted ball, motors, and an onboard control unit that has a small display. That hardware was built by EnCata, a team we've worked with before, and it runs its own firmware.

Our part was the software that drives it, the mobile app a batter uses to set up and run a session. Because we already knew the EnCata team, questions between the two sides got settled on a call instead of over weeks.

The Challenge

Our brief was simple. Make the tee controllable from a phone, and prove the whole loop works end to end, from connecting to the station through running a drill and seeing the result.

What We Built

We built a proof of concept and kept the scope tight. You open the app and connect to the station over Bluetooth. Once it's paired, the app shows its state, including battery level and device name. Open the settings and you configure the drill:
  • Manual mode holds the ball at one height; automatic mode moves it after each successful hit.
  • You set the height and the range it travels within, apply it, and press start.
  • A countdown runs, then a timer, then a live count of the hits that land.
  • When you're done, you finish the session and the results are saved.
No backend runs behind any of this yet. Everything the app needs sits locally on the phone, session results included. For a proof of concept that was the whole idea, showing that a phone can reliably drive the hardware before any infrastructure gets built around it. Account registration was scoped as the next step, and that's where a backend starts to matter.

Outcome

We delivered two builds around the New Year. The client tested them and got on a call to say it was the first time this had worked the way he'd pictured it. He called it a New Year's gift.

The work was small in hours, done in two short stints over roughly six to seven weeks. The next phase is planned and not yet started. It adds a real backend, registration with detailed player profiles covering handedness, preferred hit types, skill level and more to feed analytics over time, and sessions shared by several players on one station.

That last part runs on NFC. A trainer brings a few trainees, each with their own tag, and a tap at the station identifies who's hitting so the results land in the right account. It lets a group share one machine rather than buying one each. For now the project is paused on the client's side while they line up their next round of funding.

Tech Stack

Platform: Kotlin Multiplatform, with business logic, UI, BLE, and storage shared across Android and iOS | UI: Compose Multiplatform and Material 3; Jetpack Compose with AndroidX on Android; a SwiftUI shell embedding the shared Kotlin/Compose UI on iOS | Async: Kotlin Coroutines, Flow, StateFlow | BLE: Kable (scanning, connection, read/write, GATT subscriptions) | Storage: Room Multiplatform (SQLite), DataStore Preferences | DI: Koin | Build: Gradle Kotlin DSL, KSP | Backend: none at this stage, data stored locally on the device

Feel like your project would win from our work? Let's talk!
sales@smartificial-ai.com
Made on
Tilda