Cerkya Remote. Your Philips TV, from your iPhone.
It finds the TV on your Wi-Fi and sends each key straight to it, with no account and no cloud. Scan a sample network below and see the request every tap would send.
Try it: a remote that talks to the TV
Scan the Wi-Fi for a Philips TV.
What the platform did
- scanScanned 253 addresses, 32 at a time, each with GET :1925/6/system and a one-second timeout.
- tv192.0.2.24 answered with api_version 6.1: a Philips TV the app can drive.
- other192.0.2.31 looks like an Android TV. Listed as not supported yet, with a support request instead.
- keyEvery key is one POST to /6/input/key, like {"key":"CursorRight"}.
- keyVolume keys read the level back with GET /6/audio/volume.
- dialNetflix and YouTube open through DIAL on port 56789, because JointSpace app launch is blocked on this TV.
Tap a part of the app
Highlighted wires show what it talks to.
iPhone app
Talking to the TV
Support
TV picker, remote, settings and the support form, on iPhone with iOS 17+.
Why: Views depend on view models and the TVControlling protocol, so the real TV, DemoTV and test doubles are interchangeable.
AppModel owns saved TVs, scan results and reachability; RemoteViewModel sends the presses.
Why: One place owns the app state, so the screens stay thin.
Probes the subnet on port 1925, 32 addresses at a time, and keeps what answers /6/system like JointSpace.
Why: Networks larger than a /22 are clamped to the /22 around the phone to keep scans fast.
JointSpace v6 over plain HTTP on port 1925: keys, volume, power and system info.
Why: Philips Saphi TVs with no pairing accept it directly, so no account or cloud is needed.
Opens Netflix and YouTube through DIAL on port 56789.
Why: JointSpace app launching is forbidden on this TV model, and a cold start can take several seconds.
An in-memory TV that simulates volume, mute and power and never uses the network.
Why: It ships in Release builds so App Review can try the app without a TV.
Receives support requests at support.cerkya.com and stores them in D1, five per ten minutes per IP.
Why: There is no automatic telemetry: users send a request themselves, with email as the fallback.
Stack
- App
- Swift
- SwiftUI
- Swift Testing
- XcodeGen
- Protocols
- JointSpace v6
- DIAL
- HTTP
- Support
- Cloudflare Workers
- D1
- TypeScript
- Vitest
- Wrangler
- Type
- Independent hobby app
- Platform
- iPhone, iOS 17+
- Dependencies
- No third-party packages
- Languages
- English and Spanish
- Officially supported
- Philips 55PUT6794
- Privacy
- No analytics or tracking