Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
0f0971d
feat(adapters): add OakCameraStream reference adapter
styu12 Apr 9, 2026
e3210c8
feat(viewer): bundled desktop GUI (MuJoCo-style launch)
styu12 Apr 9, 2026
b01799b
feat(viewer): polish layout + chirp-enabled demo + screenshot harness
styu12 Apr 9, 2026
2f99ea8
feat(adapters): add OgloTactileStream SDK reference adapter
styu12 Apr 9, 2026
1e4621c
feat(discovery): add auto-discovery core — scan(), scan_and_add(), re…
styu12 Apr 9, 2026
6e3e98c
feat(tone): capture PortAudio DAC time via ChirpEmission
styu12 Apr 9, 2026
86b573c
feat(adapters): add discover() classmethods for auto-registration
styu12 Apr 9, 2026
d955a4a
feat(multihost): mDNS-based leader/follower session rendezvous
styu12 Apr 9, 2026
606380d
feat(orchestrator): leader/follower roles for multi-host sessions
styu12 Apr 9, 2026
9a116bf
feat(discovery): CLI + viewer discovery modal + serialized BLE scan
styu12 Apr 9, 2026
4016a76
feat(multihost): public exports + zeroconf extra + integration smoke …
styu12 Apr 9, 2026
4bca972
examples: iPhone + Mac webcam dual recording recipe
styu12 Apr 9, 2026
1289f53
examples(iphone_mac_webcam): shrink record.py to the core 3 calls
styu12 Apr 9, 2026
7aa3918
feat(streams): physical device dedup + SessionOrchestrator.remove
styu12 Apr 9, 2026
3702b53
docs(replay): design spec for sf.replay.launch() session viewer
styu12 Apr 9, 2026
884a38d
feat(viewer,uvc): explicit Connect button + live preview before Record
styu12 Apr 9, 2026
a2f79b6
docs(replay): implementation plan for sf.replay.launch() viewer
styu12 Apr 9, 2026
8e890fd
feat(replay): scaffold syncfield.replay package with dep guard
styu12 Apr 9, 2026
761f1da
style(replay): add descriptive suffix to pragma no cover comment
styu12 Apr 9, 2026
844276a
feat(replay): session folder loader with manifest + sync_report parsing
styu12 Apr 9, 2026
0a3257f
refactor(replay): rename to_dict() and drop unused data_path field
styu12 Apr 9, 2026
26a3be4
docs(replay): update plan task 4 to use to_dict() after loader rename
styu12 Apr 9, 2026
27a6e4d
feat(replay): path-traversal-safe file resolution helper
styu12 Apr 9, 2026
c3c92dc
feat(replay): Starlette server with /api/session, /api/sync-report, /…
styu12 Apr 9, 2026
b307afe
refactor(replay): zip-safe static dir, rename request_shutdown(), tig…
styu12 Apr 9, 2026
8c3a7ad
feat(replay): public sf.replay.launch() entry point + python -m wrapper
styu12 Apr 9, 2026
d08e867
build(replay): add [replay] extra and force-include static/ in wheel
styu12 Apr 10, 2026
0fe1d68
feat(replay): scaffold _web/ Vite+React+Tailwind project, build to st…
styu12 Apr 10, 2026
f579459
feat(replay/web): SessionManifest types + useReplaySession data hook
styu12 Apr 10, 2026
b33a107
feat(replay/web): useBeforeAfter hook with pure offset math + B shortcut
styu12 Apr 10, 2026
a03912b
feat(replay/web): SyncReportPanel with per-stream offset/confidence/q…
styu12 Apr 10, 2026
b9640d8
feat(replay/web): BeforeAfterToggle segmented control
styu12 Apr 10, 2026
c379b17
feat(replay/web): VideoArea with per-stream offset application
styu12 Apr 10, 2026
3bbc5eb
feat(replay/web): minimal multi-channel SensorChartPanel + SVG line c…
styu12 Apr 10, 2026
819fc4c
feat(replay/web): wire App.tsx — header, VideoArea, SensorChartPanel,…
styu12 Apr 10, 2026
8461e69
docs(replay): Makefile targets and README usage section
styu12 Apr 10, 2026
837d822
fix(replay): ReplayServer.url now reports the real bound port
styu12 Apr 10, 2026
125e50c
chore: update uv.lock for replay + httpx dev deps
styu12 Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.PHONY: replay-web-install replay-web-build replay-web-dev

replay-web-install:
cd src/syncfield/replay/_web && yarn install

replay-web-build:
cd src/syncfield/replay/_web && yarn build

replay-web-dev:
cd src/syncfield/replay/_web && yarn dev
29 changes: 29 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,35 @@ resp = requests.post("http://localhost:8080/api/v1/sync/upload", files=files, da
print(resp.json()) # {"job_id": "a1b2c3d4"}
```

## Replay a synced session

After you've recorded a session and run it through the SyncField sync
service, open the result in a local browser-based viewer:

```python
import syncfield as sf

sf.replay.launch("./data/session_2026-04-09T14-49")
```

This boots a small HTTP server on `127.0.0.1`, opens your default
browser, and shows:

- Synchronized multi-stream video playback
- A **Before / After** toggle (`B`) to compare raw vs. synced alignment
- A per-stream sync report (offset, confidence, quality)
- Minimal SVG charts for each sensor stream

Requires the `replay` extra:

```bash
pip install 'syncfield[replay]'
```

The viewer ships a pre-built React bundle, so end users do not need
Node.js or yarn — those are only needed if you want to hack on the
frontend itself (`make replay-web-dev`).

## Format Specification

This section defines the output format for implementors in other languages.
Expand Down
Loading
Loading