{"record":{"id":"e420f837f6bc777e","repo":"tinyhumansai/openhuman","slug":"voice-not-compiled","errorCode":"voice_not_compiled","errorMessage":"Voice transcription is unavailable in this build — the voice module was not compiled into the app. Update OpenHuman to the latest version; restarting will not help.","messagePattern":"Voice transcription is unavailable in this build — the voice module was not compiled into the app\\. Update OpenHuman to the latest version; restarting will not help\\.","errorType":"exception","errorClass":"VoiceNotCompiledError","httpStatus":null,"severity":"error","filePath":"app/src/features/human/voice/sttClient.ts","lineNumber":122,"sourceCode":"\n  const rpcStart = Date.now();\n  let result: CloudTranscribeResult;\n  try {\n    result = await callCoreRpc<CloudTranscribeResult>({\n      method: 'openhuman.voice_cloud_transcribe',\n      params,\n    });\n  } catch (err) {\n    // An \"unknown method\" error means the core serving this app was built\n    // without the `voice` Cargo feature, so the `openhuman.voice_*`\n    // controllers were never registered (#4901). This is a compile-time\n    // property of the binary — restarting cannot change it, which is why the\n    // old #1289-era \"restart to pick up the latest core sidecar\" copy was\n    // unactionable (and the sidecar itself is gone since #1061).\n    const msg = err instanceof Error ? err.message : String(err);\n    if (msg.includes('unknown method')) {\n      sttLog('[voice-stt] transcribe rpc: voice domain absent from core build: %s', msg);\n      throw new VoiceNotCompiledError();\n    }\n    sttLog('transcribe rpc failed (passthrough): %O', err);\n    throw err;\n  }\n  const text = result?.text?.trim() ?? '';\n  sttLog('transcribed chars=%d rpc_ms=%d', text.length, Math.round(Date.now() - rpcStart));\n  return text;\n}\n\ninterface FactoryTranscribeOptions {\n  /** BCP-47 language hint, e.g. `'en'`. */\n  language?: string;\n  /** Override the server-side provider resolution: `'cloud'` for the backend\n   *  proxy, or a `voice_providers` slug. When unset the core resolves\n   *  `voice_server.stt_engine`. */\n  provider?: string;\n  /** Model id for the selected engine (e.g. `'whisper-1'`, `'scribe_v1'`). */\n  model?: string;","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/features/human/voice/sttClient.ts#L104-L140","documentation":"VoiceNotCompiledError (code 'voice_not_compiled') is thrown by transcribeCloud() when the JSON-RPC call to openhuman.voice_transcribe (or sibling voice_* method) fails with an 'unknown method' error. That response means the running core binary was compiled without the `voice` Cargo feature, so the voice controllers were never registered. As the comment explains, this is a compile-time property of the binary — restarting cannot fix it (the historical case: voice shipped missing from v0.58.19 to v0.61.x, issue #4901).","triggerScenarios":"The renderer calls callCoreRpc({method:'openhuman.voice_stt_transcribe'...}) against a core whose DomainSet/feature set omitted voice — e.g. a custom --no-default-features build, a distro/CI build missing the voice feature flag, or a version range where voice was accidentally not forwarded to the desktop shell (the #4901 regression).","commonSituations":"Users on app versions v0.58.19–v0.61.x where the voice gate was not forwarded to the shell; developers building openhuman-core manually without the voice feature; a slim/embedded core profile (DomainSet without voice) being reused by the full desktop renderer.","solutions":["End user: update OpenHuman to the latest version — the fixed builds forward the voice feature again; restarting the current version will not help.","Developer building the core: ensure the voice feature is enabled (product-features set) — check `scripts/ci/product-features.txt` forwarding and the Feature Forwarding Gate.","Renderer: catch VoiceNotCompiledError (code 'voice_not_compiled') and hide/disable the voice UI with the 'update required' message instead of surfacing a raw failure.","Verify with GET /schema on the core's RPC port that voice.* namespaces are listed before enabling voice features."],"exampleFix":"// before\nconst text = await transcribeCloud(blob);\n\n// after\ntry {\n  const text = await transcribeCloud(blob);\n} catch (err) {\n  if (err instanceof VoiceNotCompiledError) {\n    renderVoiceDisabledNotice(); // 'Update OpenHuman' UI\n    return;\n  }\n  throw err;\n}","handlingStrategy":"try-catch","validationCode":"import { callCoreRpc } from '../services/coreRpcClient';\n\n// probe once at startup: does the core expose voice methods?\nconst voiceAvailable = await callCoreRpc<{ methods: string[] }>({ method: 'openhuman.schema' })\n  .then((s) => s.methods.some((m) => m.startsWith('openhuman.voice_')))\n  .catch(() => false);","typeGuard":"function isVoiceNotCompiledError(e: unknown): boolean {\n  return e instanceof Error && (e as { code?: string }).code === 'voice_not_compiled';\n}","tryCatchPattern":"try {\n  text = await transcribeCloud(blob);\n} catch (err) {\n  if (isVoiceNotCompiledError(err)) {\n    renderVoiceDisabledNotice(); // 'Update OpenHuman' — restart won't help\n    return;\n  }\n  throw err;\n}","preventionTips":["Feature-detect voice_* methods via /schema at startup and disable voice UI proactively.","Keep core and renderer versions in lockstep (no partial updates).","If building the core yourself, always run the Feature Forwarding Gate before shipping."],"tags":["voice","stt","feature-gate","compile-time","unknown-method","rpc"],"backgroundTag":"feature-not-compiled-in","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}