Dek
Koder Dek — Audio Recorder with AI Transcription
- *rea:*Workspace
- *ath:*
products/horizontal/dek/app - *ersion:*1.9.52
- *tatus:*Active
- *ind:*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 chatbubble segments per speaker with an AIgenerated 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 (.apk/Google Play), Linux (.deb via Koder Hub, x8664), Windows (.msi planned), iOS, and macOS. The recording engine wraps platform-specific audio APIs via the record package; playback uses `justaudio + media_kit` on desktop.
Core capabilities
- *ecording*— AAC
LC, realtime amplitude waveform (Samsung-style), pause/resume, bookmarks - *layback*— scrubbable waveform, skip ±5s, speaker-colored transcript bubbles
- *I transcription*— multipart upload to
ai/voice, Whisper model selection (tiny…large-v3), bearer-token auth - *anage recordings*— categories, tags, trash (soft
delete + autopurge), search, sort, bulk edit - *eport 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. - *ettings*— LLM provider picker (Koder AI / OpenAI / Anthropic / Google), endpoint + token override
- *elf-update*— checks
hub.koder.devviaengines/sdk/storeon launch - *loud sync*— bidirectional sync to Google Drive and Koder Drive with per-recording badge, sync history, completion notifications, and conflict policies
- *atch export*— multi-select audio share or ZIP transcript export
- *ndroid widget*— 1×1 home
screen quickrecord widget - *ersistent playback speed*— preferred speed saved across sessions
- *oder ID login*— dedicated "Conta Koder" section in Settings; OIDC PKCE sign
in viasurface — AndroidiOS custom scheme, desktop loopback, web redirect to `dek.koder.devauth/callback`); displays user name + email; sign-out revokes local tokenskoder_kit'sKoderAuth(cross - *18n*— runtime locale switcher (
KoderLanguagePickerin Settings § Aparência), Wave 1 baseline enUS + ptBR viaKoderL10nperspecs/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 |
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.debvia Koder Hub — v1.9.30, GTK3, ALSA/PipeWire, media_kit, binarykdek - Web: *ive at
https://dek.koder.dev/*(deployed 20260517, #094 Fase 3). Flutter Web app at root; landing at/about/; OAuth callback/auth/callback(SPA fallback). Vhostdek.koder.devininfra/net/jet/sites.tomlwithspa=true; TLS viaservices/foundation/certs(DNS01 ClouDNS, valid Apr 21 → Jul 20 2026). Selfhosted Inter + JetBrains Mono fonts; zero third-party origin requests verified. - Windows:
.msiplanned - iOS / macOS: planned
Status
*1.9.38*— production. #085 P3 — SyncClient shipped at lib/core/sync/. Talks to services/foundation/sync over REST + WebSocket per RFC001. 13 unit tests green against mock HTTP/WS. Not yet wired into up).MetadataSyncService (P3.1 follow
*1.9.37*— *18n mass migration (#095) closed* Wave 9 bulkmigrated 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 userfacing strings translatable; 132 keys registered across enUS + ptBR (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 enUS produces a recognizable English surface endtoend. All 10 i18n regression tests green (cases #540#542 + #553-#559). Ticket moved to done/.
*1.9.36*— i18n Wave 8 (#095): longtail dialogs + report widgets migrated — saverecordingdialog, audioeditorscreen, interpreterscreen, generatereportmodal, reporttemplate_editor. 13 call sites, 7 new keys. 135 userfacing strings translatable; 131 keys registered across enUS + ptBR (Waves 1–8). All 9 i18n regression tests green. The Dek UI outside settings_screen long tail is now substantially translatable — switching to en-US produces a recognizable English surface across every visible screen, dialog, modal, and shared widget.
*1.9.35*— i18n Wave 7 (#095): 4 mostreused shared widgets (folder pickers Drive+KDrive, sync history, categories drawer) migrated — 20 call sites, 8 new keys. 122 userfacing strings translatable; 124 keys registered across enUS + ptBR (Waves 1–7). All 8 i18n regression tests green. The crosscutting UI is now broad enough that switching to enUS produces a recognizable English surface across recording, playback, reports, tags, settings, folderpicking, and synchistory flows. Long tail of remaining strings (~30) in dialogs (saverecordingdialog, audioeditorscreen) + report widgets (generatereportmodal, reporttemplateeditor) tracked as Wave 8+.
*1.9.34*— i18n Wave 6 (#095): reports flow (templates list, generated reports, singlereport viewer) + tags management screen migrated — 23 call sites with 13 new keys. 102 userfacing strings translatable; 116 keys registered across enUS + ptBR (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).
*1.9.33*— i18n Wave 5 (#095): playback_screen.dart substantially migrated — 32 call sites covering 13 PopupMenuItem actions, 3 longrunning snackbar pairs, summary section, edittranscript dialog, rename dialog, and Velocidade labels. 79 userfacing strings translatable; 103 keys registered across enUS + ptBR (Waves 1–5). Structural regression test #555 added. The two toptraffic screens (settings_screen.dart + recordings_screen.dart + playback_screen.dart) now all have majority i18n coverage; remaining work is the long tail (reportstagswidgets).
*1.9.32*— i18n Wave 4 (#095): recordings_screen.dart substantially migrated — 19 call sites now route through KoderL10n covering the recordingmode bottomsheet, 5 PopupMenuItem actions, 3 dialog titles + buttons, 5 snackbar messages, and the ZIPcreation progress dialog. 47 userfacing strings translatable; 77 keys registered across enUS + ptBR (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).
*1.9.31*— Web variant Fase 3 deploy complete (#094) — dek.koder.dev serves the Flutter app at / with the branded shell (Verge #3584E4 accent + selfhosted InterJetBrains Mono fonts + OGTwitter meta image at `aboutogimage.png); landing at about; SPA fallback wired for authcallback handing the OIDC code to Flutter Router. Jet vhost config drift fixed (container jet:etckoderjet/sites.tomlbacked impl; was missing spa=true while repo had it). Flutter web build unblocked via conditional export pattern for whisperlocalservice.dart (_io.dart` keeps the FFI_web.dart stub throws UnsupportedError; barrel if (dart.library.js_interop)). i18n Wave 3 (#095) migrates 5 SnackBars + 3 connectionstatus labels + 6 dialog elements + reusable Cancel/Save in facing strings now route through settings_screen.dart (28 userKoderL10n); structural regression test landed (registry case #553). RFC001 crossdevice metadata sync drafted at dek/app/docs/rfcs/RFC-001-cross-device-metadata-sync.kmd (#085) recommending a new services/foundation/sync push service backed by kdb + WebSocket fanout (Path B over polling stopgap Path A). Tsuite (T1T8+N1N4 per specs/auth/oauth-flow-test-template.kmd) remains blocked by G1 stub Koder ID infra; #095 Wave 4+ (~150 hardcoded strings remaining in playbackrecordingsreports) and #092 captureengine migration (blocked by MCAP003/004) tracked as follow-ups.
*1.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 crossplatform (drops US + pt-BR via flutter_appauth + flutter_secure_storage custom stack), i18n scaffold (Wave 1 enKoderL10n, KoderLanguagePicker in Settings).
*1.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).
*1.9.24*— Adds the reporttemplates feature: users can define AI report templates attached to recording tags (e.g. tag templates.jsonTherapy → 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, dekreports.json`). Includes a Tags Inventory for crossrecording tag management and a Reports screen with viewer.
*1.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.