11eb82178f
- Add AGENTS.md (canonical) + CLAUDE.md symlink + ROADMAP.md - Move Apple Team ID from project.yml into a gitignored Config/Signing.xcconfig via configFiles; commit the .example template - Replace hardcoded backend host in AppSettings with a neutral placeholder + SPARK_BACKEND_URL env-var fallback - Scrub the Team ID, .local host, and raw LAN IP from README/docs - Ignore Config/Signing.xcconfig and .env
75 lines
3.1 KiB
Markdown
75 lines
3.1 KiB
Markdown
# Ten31 Transcripts
|
||
|
||
Native macOS menu-bar app that auto-detects conference calls, records local audio,
|
||
builds a visual-derived speaker timeline, and hands audio + timeline to the
|
||
SparkControl backend for naming/transcription. See `docs/` for the full spec.
|
||
|
||
This repo is at **Phase 0** (scaffold, permissions, backend health check).
|
||
|
||
## One-time setup
|
||
|
||
1. **Install Xcode** from the Mac App Store (free; ~40 GB). Open it once and
|
||
accept the license prompt.
|
||
2. **Install XcodeGen** (generates the Xcode project from `project.yml`):
|
||
```sh
|
||
brew install xcodegen
|
||
```
|
||
3. **Set your signing team.** The Apple Team ID is kept out of source in a
|
||
gitignored `Config/Signing.xcconfig`. Copy the template and set your team:
|
||
```sh
|
||
cp Config/Signing.xcconfig.example Config/Signing.xcconfig # then set DEVELOPMENT_TEAM
|
||
```
|
||
`xcodegen` wires it in via `configFiles`, so **Signing & Capabilities** shows the
|
||
team automatically — no manual selection. Keep the value stable so macOS
|
||
preserves the app's permission (TCC) grants across rebuilds. Edit the xcconfig,
|
||
not Xcode — `xcodegen generate` overwrites Xcode-side changes.
|
||
4. **Generate the project:**
|
||
```sh
|
||
xcodegen generate
|
||
```
|
||
This creates `Ten31Transcripts.xcodeproj` (git-ignored — regenerate any time).
|
||
5. **Open it:**
|
||
```sh
|
||
open Ten31Transcripts.xcodeproj
|
||
```
|
||
6. Press **Run** (⌘R).
|
||
|
||
> **Note:** after adding files in a new phase, re-run `xcodegen generate` and let
|
||
> Xcode reload the project. The signing team persists because it lives in
|
||
> `Config/Signing.xcconfig` (gitignored), so macOS permissions stay granted across
|
||
> rebuilds.
|
||
|
||
## What Phase 0 does
|
||
|
||
- Launches as a menu-bar-only app (no Dock icon).
|
||
- Menu panel shows live status for the three permissions it needs — **Microphone**,
|
||
**Screen Recording**, **Accessibility** — with Grant / Open Settings buttons.
|
||
- Shows a **backend health check** (`GET /api/status`) against the configured host.
|
||
- **Settings:** backend base URL, skip-TLS toggle (on by default for the
|
||
self-signed cert), output folder, and adapter toggles (inert this phase).
|
||
|
||
No audio capture, call detection, screen reading, or backend hand-off yet — those
|
||
arrive in Phases 1–6 (`docs/04_BUILD_PLAN.md`).
|
||
|
||
## Project layout
|
||
|
||
```
|
||
project.yml # XcodeGen recipe → generates the .xcodeproj
|
||
Ten31Transcripts/
|
||
App/ Ten31TranscriptsApp.swift, AppDelegate.swift
|
||
UI/ MenuBarView, SettingsView, PermissionRow
|
||
Permissions/PermissionsManager.swift
|
||
Backend/ SparkControlHealth.swift, InsecureTrustDelegate.swift
|
||
Settings/ AppSettings.swift
|
||
Support/ Info.plist, Ten31Transcripts.entitlements
|
||
Ten31TranscriptsTests/ # placeholder; real tests land in Phase 3
|
||
```
|
||
|
||
## Notes
|
||
|
||
- **App Sandbox is off** and **Hardened Runtime is off** — this is a personal,
|
||
LAN-only tool that must observe other apps. Revisit only if distributing.
|
||
- The backend host is a private LAN address — set it in **Settings**, or seed it
|
||
from the `SPARK_BACKEND_URL` env var; the committed default is only a neutral
|
||
placeholder (`https://your-spark-backend.local`).
|