refactor: extract shared StenoCore, add iOS app (monorepo)#5
Merged
Conversation
Restructure into mac/ (existing macOS app), mobile/ (new iOS app), and Core/ (StenoCore, a shared SwiftPM library). Core holds the platform-agnostic engine — Transcriber (SpeechAnalyzer), SpeakerSegmenter (Sortformer/FluidAudio), and BufferConverter — made public with an injectable log sink so the macOS app keeps routing engine logs to steno.log. Capture, writer, UI, and transport stay per-app to avoid #if os spaghetti. Both apps depend on Core via a local package (SwiftPM path dep for mac, xcodegen local package for mobile). Verified: mac `swift build` and mobile simulator build both succeed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CI now builds mac (swift build, covering Core) and mobile (xcodegen + simulator build) separately. DEVELOPMENT_TEAM is blanked in the tracked project.yml so a personal, account-linked team id doesn't live in a public repo; set it locally for device signing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Retitle to steno (iOS), reference the shared StenoCore (../Core) and macOS app (../mac) instead of framing mobile as a separate sibling repo, and fix the LICENSE link to point at the repo-root license (../LICENSE). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Restructure the repo into a monorepo so the macOS and a new iOS app can share one engine, ahead of bringing speaker-turn segmentation to iOS.
Layout
mac/mobile/Core/StenoCore, a shared SwiftPM libraryWhat moved into Core
Only the platform-agnostic engine —
Transcriber(SpeechAnalyzer),SpeakerSegmenter(Sortformer/FluidAudio),BufferConverter— madepublicwith an injectable log sink so the macOS app keeps routing engine logs tosteno.log. Capture, writer, UI, and transport stay per-app to avoid#if osspaghetti. SharingSpeakerSegmenteris the main driver: it's the piece we don't want two drifting copies of once iOS gets diarization too.Both apps depend on Core via a local package (SwiftPM path dep for mac, xcodegen local package for mobile).
iOS app
Mic (AVAudioEngine) → SpeechAnalyzer (ja_JP) → local jsonl (SSOT, append-only) → cursor-based shipper that POSTs each record with at-least-once delivery and a persisted cursor. Capture and network are decoupled, so an unreachable endpoint never drops data and drains on recovery. Background audio mode for continuous capture; ATS scoped to
*.ts.net. Includes a zero-dep reference/ingestreceiver undermobile/example-server/.Verification
mac/swift buildsucceeds (links Core + FluidAudio)mobile/simulator build succeedsDEVELOPMENT_TEAMis blanked in the trackedproject.yml; set it locally for device signing.🤖 Generated with Claude Code