Draft. Written against the spec, ahead of the code. The words are the intent; the software is not there yet.
The NativePHP app
The same UI as the menu bar app, in PHP, driving the same daemon over the same API. It exists to be lifted whole into Pteroprompter.
Pteroprompter is a NativePHP app. The plan is for it to record its own takes — camera, prompter screen, microphone, system audio, as separate files on one cue — and the cheapest way to get there is to build the Rheocles UI in NativePHP first, against the real daemon, and then lift it whole.
So php/ is a second front end with full parity to the menu bar
app: every stream with an arm toggle, preview on
demand, one Record button, the Also save a single file checkbox, Open in
Finder wherever a destination is shown, settings, the pairing code. It
bundles its own copy of rheocles-core as a sidecar and launches it on
demand, exactly as the Swift app does.
What it is not
It does not reimplement capture. AVFoundation and ScreenCaptureKit are not reachable from PHP, and nothing about recording happens in this app. “Feature complete” means the UI: everything you can click in the Swift popover you can click here, and both clicks become the same API call.
Open in Finder
The same button in the same four places as the menu bar app, making the same calls:
| beside | reveals | the call |
|---|---|---|
the outcome line after complete or incomplete |
that take’s folder | POST /takes/{id}/reveal {} |
| each recent take | that take’s folder | POST /takes/{id}/reveal {} |
the Single file · combined.mov line, once complete |
the file, selected in its folder | POST /takes/{id}/reveal { "path": "combined.mov" } |
| the output root, in settings | the root | POST /reveal {} |
NativePHP could open the Finder itself, and does not. The daemon reveals,
on its own Mac, for every front end — this app, the Swift app, and a
Pteroprompter page that cannot open the Finder at all — so there is one
implementation rather than three. Against a daemon older than the route
the button does nothing, because the daemon answers 404 not_found; see
Troubleshooting.
Also save a single file
The same checkbox as the menu bar app, in the take bar beside Record,
bound to the daemon’s settings.combine through PATCH /settings. Tick it
in this app and it is ticked in the menu bar app, because it is one
setting on one daemon.
Shown only while at most one video stream is armed, hidden — not
disabled — otherwise, and back when a video stream is disarmed. After
stop, a Single file · combined.mov line with a spinner while
combined.state is pending, its own Open in Finder when complete, the
reason when failed; and on a finished take with no combined file and at
most one video stream, a Combine now button that is
POST /takes/{id}/combine. A failed combine never changes the take’s own
outcome. What the file is — a passthrough mux, no re-encode, no mixdown —
is on Recording a
take.
One daemon
Launch the NativePHP app while the menu bar app is running and it finds the daemon already on 7447 and uses it. Launch it alone and it starts its own bundled copy. Two front ends, one engine, one set of armed streams — arm a camera in one and it is armed in the other, because there is only one place that state lives.
Pairing
Zero clicks. The app runs as you, reads
~/Library/Application Support/Rheocles/token, and is paired. A future
Pteroprompter does the same on the same machine; on another machine it waits
for v0.2’s approve-on-the-box pairing.