{"id":50120168,"url":"https://github.com/sauravpanda/stepback","last_synced_at":"2026-05-23T18:05:30.265Z","repository":{"id":352936685,"uuid":"1217286950","full_name":"sauravpanda/stepback","owner":"sauravpanda","description":"iOS practice tool for learning dance from your own video library. Slow-mo without pitch-shift, loop hard sections, frame-step, and beat-locked step timing. SwiftUI + SwiftData, iOS 17+, zero dependencies.","archived":false,"fork":false,"pushed_at":"2026-05-15T00:16:36.000Z","size":157,"stargazers_count":1,"open_issues_count":13,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T02:32:25.482Z","etag":null,"topics":["avfoundation","beat-detection","dance","ios","practice-tool","swiftdata","swiftui","video-playback","west-coast-swing"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sauravpanda.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T18:27:26.000Z","updated_at":"2026-05-15T00:16:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sauravpanda/stepback","commit_stats":null,"previous_names":["sauravpanda/stepback"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sauravpanda/stepback","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sauravpanda%2Fstepback","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sauravpanda%2Fstepback/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sauravpanda%2Fstepback/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sauravpanda%2Fstepback/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sauravpanda","download_url":"https://codeload.github.com/sauravpanda/stepback/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sauravpanda%2Fstepback/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33406513,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avfoundation","beat-detection","dance","ios","practice-tool","swiftdata","swiftui","video-playback","west-coast-swing"],"created_at":"2026-05-23T18:05:05.763Z","updated_at":"2026-05-23T18:05:30.243Z","avatar_url":"https://github.com/sauravpanda.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# StepBack\n\nA practice tool for learning dance from your own video library. iOS only, SwiftUI.\n\nSlow footage down without pitch-shifting the audio, loop hard sections, frame-step through tricky moves, tag clips by event, compare yourself against the instructor side-by-side, and — critically — check whether your stepping actually lands on the beat.\n\n\u003e Primary user: the author. Daily-use quality, not App-Store-polish. No accounts, no backend, no cloud sync in v1.\n\n## Why this exists\n\nApple's stock Photos/Videos tools can't do tight A/B loops, pitch-preserved slow-mo, or beat-locked step timing. Existing dance apps either don't combine these or lock them behind subscriptions and sync. StepBack does the one specific thing it needs to do, on-device, with nothing but Apple's SDKs.\n\n## Features\n\n**v1 — core practice loop**\n- Import videos from Photos (multi-select, no copies — references `PHAsset` identifiers)\n- Auto-group clips into events by creation date (24h gap = new event)\n- Variable-speed playback (0.25×–1.5×) with pitch preservation\n- A/B loop with draggable region, saved as named markers with preferred speed\n- True frame-by-frame stepping (`AVPlayerItem.step(byCount:)`)\n- Mirror mode\n- Side-by-side compare view with synced playback\n\n**v1.5 — beat detection**\n- On-device BPM detection via STFT + autocorrelation (Accelerate / vDSP)\n- Beat ticks on the scrubber, live count-in-measure indicator\n- User-driven downbeat anchoring (\"tap on beat 1\"), persisted per clip\n- Step-timing mode: tap every step, see ms-precise offset from nearest beat as a colored histogram\n\n**v2 — later**\nPose tracking overlay (Vision), speed ramps, ghost overlay recording, iCloud sync. See the [roadmap](https://github.com/sauravpanda/stepback/issues).\n\n## Tech\n\n- SwiftUI + SwiftData (iOS 17+)\n- AVKit / AVFoundation for playback and frame stepping\n- PhotoKit for library access (no video copies)\n- Vision for pose tracking (v2)\n- Accelerate (vDSP) for FFT-based beat detection\n- **Zero third-party dependencies.**\n\n## Project structure\n\n```\nStepBack/\n  StepBackApp.swift              @main, SwiftData container\n  Models/Models.swift            DanceClip, Tag, LoopMarker\n  Views/\n    LibraryView.swift            Grid of clips, tag filter, import\n    PracticeView.swift           The core player screen\n    CompareView.swift            Side-by-side synced playback\n  Services/\n    PhotosService.swift          PHAsset -\u003e AVURLAsset, thumbnails\n    AutoTagService.swift         Cluster clips by time -\u003e events\n    PracticePlayerViewModel.swift Playback state, loop, speed, step timing\n    BeatDetector.swift           Onset envelope + tempo autocorrelation\n    AIServices.swift             Pose tracking stubs (v2)\n  Utilities/Theme.swift          Colors, design tokens\n```\n\n## Building\n\n1. Open `StepBack.xcodeproj` in Xcode 15+\n2. Signing \u0026 Capabilities → pick your Apple ID team\n3. Cmd+R with your iPhone plugged in\n\nFree Apple ID signing: sideloaded apps expire in 7 days; re-run from Xcode to refresh.\n\nSee [BUILD.md](docs/BUILD.md) for details.\n\n## Design tokens\n\nDark UI, hot-pink accent. No generic AI-gray look.\n\n- `bg #0A0A0F` · `surface #171720` · `surfaceElevated #22222C`\n- `accent #FF3B7F` · `accentSoft` = accent @ 15% alpha\n- Speed pill colors: cyan \u003c0.5×, green \u003c1×, white =1×, orange \u003e1×\n- SF Rounded for display, SF Pro for body, SF Mono for timestamps\n\n## Status\n\nPre-v1. Tracking progress via [issues](https://github.com/sauravpanda/stepback/issues) and [milestones](https://github.com/sauravpanda/stepback/milestones).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsauravpanda%2Fstepback","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsauravpanda%2Fstepback","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsauravpanda%2Fstepback/lists"}