From a2328de4d3fd70362b4a97e46cb439089ba69252 Mon Sep 17 00:00:00 2001 From: Grant Gilliam Date: Mon, 8 Jun 2026 13:25:33 -0500 Subject: [PATCH] Surface "Your name" as its own top Settings section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The name field was the first row of the third "Transcription" section, below the fold — users couldn't find where to set their name (it's the setting that labels the mic channel and reserves the name so the LLM never assigns it to another speaker). Move it into a dedicated "Your name" section at the top of Settings, and show an orange nudge while it's still the placeholder "Me"/empty. --- Ten31Transcripts/UI/SettingsView.swift | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Ten31Transcripts/UI/SettingsView.swift b/Ten31Transcripts/UI/SettingsView.swift index 51bc5d0..be625e2 100644 --- a/Ten31Transcripts/UI/SettingsView.swift +++ b/Ten31Transcripts/UI/SettingsView.swift @@ -7,6 +7,21 @@ struct SettingsView: View { var body: some View { Form { + Section("Your name") { + TextField("Your name", text: $settings.selfName) + .textFieldStyle(.roundedBorder) + if isDefaultName { + Label("Still set to the default. Enter your real name so your own voice is labeled correctly — and so the AI never gives your name to someone else.", + systemImage: "exclamationmark.triangle.fill") + .font(.caption) + .foregroundStyle(.orange) + } else { + Text("Labels your microphone channel as you in every transcript, and reserves this name so it’s never assigned to another speaker.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + Section("SparkControl backend") { TextField("Base URL", text: $settings.backendBaseURL) .textFieldStyle(.roundedBorder) @@ -22,8 +37,6 @@ struct SettingsView: View { } Section("Transcription") { - TextField("Your name", text: $settings.selfName) - .textFieldStyle(.roundedBorder) Toggle("Auto-send recordings to backend", isOn: $settings.autoSendOnStop) Toggle("Reconcile speakers (merge splits + name from content)", isOn: $settings.reconcileSpeakers) Toggle("Build readable recap (topics + highlights)", isOn: $settings.recapEnabled) @@ -33,7 +46,7 @@ struct SettingsView: View { } Button("Manage…") { TemplatesWindow.shared.show(settings: settings) } } - Text("Your name labels your mic channel. Auto-send transcribes on stop; the recap writes transcript.md + recap.html. Templates define the takeaways categories per meeting type.") + Text("Auto-send transcribes on stop; the recap writes transcript.md + recap.html. Templates define the takeaways categories per meeting type.") .font(.caption) .foregroundStyle(.secondary) } @@ -63,6 +76,12 @@ struct SettingsView: View { .navigationTitle("Settings") } + /// True while the user still has the placeholder name — drives the inline nudge. + private var isDefaultName: Bool { + let n = settings.selfName.trimmingCharacters(in: .whitespacesAndNewlines) + return n.isEmpty || n.caseInsensitiveCompare("Me") == .orderedSame + } + private func binding(for key: String) -> Binding { Binding( get: { settings.adapterEnabled[key] ?? true },