Koder Dek — Audio Recorder with AI Transcription

  • Area: Workspace
  • Path: products/horizontal/dek/app
  • Version: 1.9.52
  • Status: Active
  • Kind: Flutter app — mobile + desktop (Android, iOS, Windows, macOS, Linux, Web)

Role in the stack

Koder Dek is Koder's audio recorder flagship, built to match Samsung Voice Recorder (One UI 7) in UI fidelity while adding an AI-powered transcription and analysis layer unique to the Koder ecosystem.

Users record voice memos; Dek uploads them to ai/voice for transcription, speaker diarization, summarization, and tag extraction. The result is displayed as chat-bubble segments per speaker with an AI-generated summary at the top — a pattern familiar from Samsung's Transcript mode, extended with Koder's AI backend.

Dek ships as a native Flutter app for Android (.apkGoogle Play), Linux (.deb via Koder Hub, x86_64), Windows (.msi planned), iOS, and macOS. Audio capture prefers the canonical Stack capture engine (`enginesmediacapture) on **Linux** (PipeWire via kodercapturekitdart FFI), **Windows** (WASAPI via the same FFI), and **Android** (native kcap MediaCodec record-to-file through the KoderRecorder facade / kodercapturewidgetsdart); each path probes at runtime and falls back to the record` package (parecordALSA on Linux) when the per-platform cdylibAAR isn't bundled — so capture never regresses. iOSmacOS use the record package. Playback uses just_audio + media_kit on desktop.

Core capabilities

  • Recording — AAC-LC, real-time amplitude waveform (Samsung-style), pauseresume, bookmarks. On Linux, capture runs through `enginesmediacapture` (PipeWire backend + AACWAV encoder) with the full defensive-UX trio: a pre-flight acknowledge gate when a source is silenterror (R10), a live silent-source anomaly banner while recording (R8), and a forced post-record audit (R11) when a source went silentdisconnected
  • Playback — scrubbable waveform, skip ±5s, speaker-colored transcript bubbles
  • AI transcription — multipart upload to ai/voice, Whisper model selection (tinylarge-v3), bearer-token auth
  • Manage recordings — categories, tags, trash (soft-delete + auto-purge), search, sort, bulk edit
  • Report templates — user-defined AI report templates attached to tags (e.g. tag Therapy → templates "Clinical note", "Diagnosis", "Symptoms"). Each template has a title, an LLM prompt, and an enabled toggle. Generation modal: pick tags → pick enabled templates → generate. Reports persist locally and sync via KDrive.
  • Settings — LLM provider picker (Koder AI / OpenAI / Anthropic / Google), endpoint + token override
  • Self-update — checks hub.koder.dev via engines/sdk/store on launch
  • Cloud sync — bidirectional sync to Google Drive and Koder Drive with per-recording badge, sync history, completion notifications, and conflict policies
  • Batch export — multi-select audio share or ZIP transcript export
  • Android widget — 1×1 home-screen quick-record widget
  • Persistent playback speed — preferred speed saved across sessions
  • Koder ID login — dedicated "Conta Koder" section in Settings; OIDC PKCE sign-in via koder_kit's KoderAuth (cross-surface — AndroidiOS custom scheme, desktop loopback, web redirect to `dek.koder.devauth/callback`); displays user name + email; sign-out revokes local tokens
  • i18n — runtime locale switcher (KoderLanguagePicker in Settings § Aparência), Wave 1 baseline en-US + pt-BR via KoderL10n per specs/i18n/contract.kmd (mass migration of remaining hardcoded strings tracked at backlog #095)

Primary couplings

Dependency Relationship
ai/voice Transcription backend — multipart upload of audio, returns transcript + speaker segments + summary + tags. Also provides POST /v1/llm/complete (text-only LLM completion) consumed by the report-templates feature
engines/media/capture Cross-platform audio capture — koder_capture_kit_dart FFI over PipeWire (Linux) / WASAPI (Windows) + encoder; on Android the native MediaCodec record-to-file path via koder_capture_widgets_dart's KoderRecorder facade. koder_capture_widgets_dart also provides the R8R11 defensive-UX surfaces. Linux cdylib bundled into the .deb; the Android kcap AAR is cross-compiled (cargo-ndk, 3 ABIs) + assembled on ci-runner-android and bundled into the APK by dek-release.yml. The Android path is runtime-verified on the ci-runner-android emulator (API 35) by an on-device integration test (`integration_testrecorderbackenddevicetest.dart) asserting Recorder.usesCaptureEngine =true — the kcap path serves recording, not the record fallback (#126 DONE). Windows dll CI sourcing (k.win has no rustc to produce kcapc_api.dll) is tracked as #135; until then Windows ships the record` fallback
engines/sdk/store Self-update: checks Koder Hub for newer version on launch
ai/gateway Routes to third-party LLM providers (OpenAI, Anthropic, Google) when selected in settings
foundation/id Koder ID OIDC auth (account section + KDrive PKCE login)

Distribution

  • Android: Google Play / Koder Hub (dev.koder.dek) — current v1.9.30 (arm64 APK)
  • Linux: koder-dek-linux-x86_64.deb via Koder Hub — v1.9.30, GTK3, ALSA/PipeWire, media_kit, binary kdek
  • Web: live at https://dek.koder.dev/ (deployed 2026-05-17, #094 Fase 3). Flutter Web app at root; landing at /about/; OAuth callback /auth/callback (SPA fallback). Vhost dek.koder.dev in infra/net/jet/sites.toml with spa=true; TLS via services/foundation/certs (DNS-01 ClouDNS, valid Apr 21 → Jul 20 2026). Self-hosted Inter + JetBrains Mono fonts; zero third-party origin requests verified.
  • Windows: .msi planned
  • iOS / macOS: planned

Status

Unreleased (post-v1.9.44)k-go dek batch (#142#143/#144, 2026-06-04):

  • #143 — transcription error discrimination: a 401/403 from the voice

    backend now maps to a dedicated DEK-AUT-003 ("access restricted") code with an actionable message + HTML-gate sniffing, instead of the DEK-NET-001 "network failure" catch-all. (Endpoint repoint + Koder ID per-user token carried to #145, gated on voice#060/#061.)

  • #144 — transcription is shown in the spoken language (backend

    auto-detect via device-locale hint, voice#062 contract); transcription_view shows a detected-language chip and a non-destructive Translate toggle when the detected language differs from the user's locale. Translation reuses the deployed /v1/llm/complete path via the new TranslationService (interface stable for the services/ai/translate swap tracked in #146).

  • #142 — the 5 stale, non-LFS, ~90 MB committed Android/Linux artifacts

    (pre-#136 broken OAuth manifest) were git rm'd + gitignored; distribution relies on the Hub (koder-dek v1.9.44, published). koder-hub-coverage.md corrected v1.9.30 → v1.9.44.

  • Tests: 2 new structural regressions green (errors/002, dart/007); i18n

    parity 165 keys (en-US + pt-BR).

v1.9.38 — production. #085 P3 — SyncClient shipped at lib/core/sync/. Talks to services/foundation/sync over REST + WebSocket per RFC-001. 13 unit tests green against mock HTTP/WS. Not yet wired into MetadataSyncService (P3.1 follow-up).

v1.9.37i18n mass migration (#095) closed. Wave 9 bulk-migrated 40 call sites in settings_screen.dart via Python regex pass, finally wiring Wave 3 baseline keys into both the Google Drive + Koder Drive sections (which share labels). 175 user-facing strings translatable; 132 keys registered across en-US + pt-BR (Waves 1–9). Every visible string in the Dek UI across 18+ files routes through KoderL10n.t() — recording, playback, reports, tags, settings, folder pickers, sync history, categories drawer, dialogs, editor, interpreter, report widgets. Switching to en-US produces a recognizable English surface end-to-end. All 10 i18n regression tests green (cases #540-#542 + #553-#559). Ticket moved to done/.

v1.9.36 — i18n Wave 8 (#095): long-tail dialogs + report widgets migrated — saverecordingdialog, audioeditorscreen, interpreterscreen, generatereportmodal, reporttemplateeditor. 13 call sites, 7 new keys. 135 user-facing strings translatable; 131 keys registered across en-US + pt-BR (Waves 1–8). All 9 i18n regression tests green. The Dek UI outside settingsscreen long tail is now substantially translatable — switching to en-US produces a recognizable English surface across every visible screen, dialog, modal, and shared widget.

v1.9.35 — i18n Wave 7 (#095): 4 most-reused shared widgets (folder pickers Drive+KDrive, sync history, categories drawer) migrated — 20 call sites, 8 new keys. 122 user-facing strings translatable; 124 keys registered across en-US + pt-BR (Waves 1–7). All 8 i18n regression tests green. The cross-cutting UI is now broad enough that switching to en-US produces a recognizable English surface across recording, playback, reports, tags, settings, folder-picking, and sync-history flows. Long tail of remaining strings (~30) in dialogs (saverecordingdialog, audioeditorscreen) + report widgets (generatereportmodal, reporttemplateeditor) tracked as Wave 8+.

v1.9.34 — i18n Wave 6 (#095): reports flow (templates list, generated reports, single-report viewer) + tags management screen migrated — 23 call sites with 13 new keys. 102 user-facing strings translatable; 116 keys registered across en-US + pt-BR (Waves 1–6). Structural regression test #556 added; all 7 i18n tests green. Three top-traffic screens (settingsrecordingsplayback) + entire reports flow + tags screen now substantially translatable; long tail remains in dialogs/widgets (~50 strings, ~10 files).

v1.9.33 — i18n Wave 5 (#095): playback_screen.dart substantially migrated — 32 call sites covering 13 PopupMenuItem actions, 3 long-running snackbar pairs, summary section, edit-transcript dialog, rename dialog, and Velocidade labels. 79 user-facing strings translatable; 103 keys registered across en-US + pt-BR (Waves 1–5). Structural regression test #555 added. The two top-traffic screens (settings_screen.dart + recordings_screen.dart + playback_screen.dart) now all have majority i18n coverage; remaining work is the long tail (reportstagswidgets).

v1.9.32 — i18n Wave 4 (#095): recordings_screen.dart substantially migrated — 19 call sites now route through KoderL10n covering the recording-mode bottom-sheet, 5 PopupMenuItem actions, 3 dialog titles + buttons, 5 snackbar messages, and the ZIP-creation progress dialog. 47 user-facing strings translatable; 77 keys registered across en-US + pt-BR (Waves 1–4). Structural regression test #554 added. recordings_screen.dart is now the second screen (after settings_screen.dart) with majority i18n coverage; playback_screen.dart remains as the largest pending file (34 strings, Wave 5 target).

v1.9.31 — Web variant Fase 3 deploy complete (#094) — dek.koder.dev serves the Flutter app at / with the branded shell (Verge #3584E4 accent + self-hosted InterJetBrains Mono fonts + OGTwitter meta image at /about/og-image.png); landing at /about/; SPA fallback wired for /auth/callback handing the OIDC code to Flutter Router. Jet vhost config drift fixed (container jet:/etc/koder-jet/sites.toml was missing spa=true while repo had it). Flutter web build unblocked via conditional export pattern for whisper_local_service.dart (_io.dart keeps the FFI-backed impl; _web.dart stub throws UnsupportedError; barrel if (dart.library.js_interop)). i18n Wave 3 (#095) migrates 5 SnackBars + 3 connection-status labels + 6 dialog elements + reusable CancelSave in settings_screen.dart (28 user-facing strings now route through KoderL10n); structural regression test landed (registry case #553). RFC-001 cross-device metadata sync drafted at `dekappdocsrfcsRFC-001-cross-device-metadata-sync.kmd (#085) recommending a new servicesfoundationsync push service backed by kdb + WebSocket fan-out (Path B over polling stopgap Path A). T-suite (T1-T8+N1-N4 per specsauthoauth-flow-test-template.kmd`) remains blocked by G1 stub Koder ID infra; #095 Wave 4+ (~150 hardcoded strings remaining in playbackrecordingsreports) and #092 capture-engine migration (blocked by MCAP-003004) tracked as follow-ups.

v1.9.30 — Web variant productionization Fase 1246 scaffold — branded Flutter Web shell (Verge tokens + self-hosted Inter+JetBrains Mono + OGTwitter meta), Jet vhost declared for dek.koder.dev (deploy pending — closed in v1.9.31), OAuth Koder ID unified on koder_kit.KoderAuth cross-platform (drops flutter_appauth + flutter_secure_storage custom stack), i18n scaffold (Wave 1 en-US + pt-BR via KoderL10n, KoderLanguagePicker in Settings).

v1.9.29 — production. Adds Linux ALSA fallback recording (DEK-76): when parecordPulseAudio is unavailable but arecord + ffmpeg are present, Dek records via a direct arecord | ffmpeg subprocess pipeline (pauseresume + live amplitude not supported in this mode).

v1.9.24 — Adds the report-templates feature: users can define AI report templates attached to recording tags (e.g. tag Therapy → templates "Clinical note", "Diagnosis"). Generation modal picks enabled templates, calls ai/voice /v1/llm/complete, and saves reports to local storage with KDrive metadata sync (dek-templates.json, dek-reports.json). Includes a Tags Inventory for cross-recording tag management and a Reports screen with viewer.

v1.9.23 — restores the Android APK artifact in the Flow release and Koder Hub publication path, keeps the Linux .deb current, and defers the self-update prompt until the root navigator context is ready.