{"record":{"id":"ab99902075b46697","repo":"videojs/video.js","slug":"no-tech-named-titletechname-exists-titlet","errorCode":null,"errorMessage":"No Tech named '${titleTechName}' exists! '${titleTechName}' should be registered using videojs.registerTech()'","messagePattern":"No Tech named '(.+?)' exists! '(.+?)' should be registered using videojs\\.registerTech\\(\\)'","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/js/player.js","lineNumber":1255,"sourceCode":"    });\n\n    Object.assign(techOptions, this.options_[titleTechName]);\n    Object.assign(techOptions, this.options_[camelTechName]);\n    Object.assign(techOptions, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source && source.src === this.cache_.src && this.cache_.currentTime > 0) {\n      techOptions.startTime = this.cache_.currentTime;\n    }\n\n    // Initialize tech instance\n    const TechClass = Tech.getTech(techName);\n\n    if (!TechClass) {\n      throw new Error(`No Tech named '${titleTechName}' exists! '${titleTechName}' should be registered using videojs.registerTech()'`);\n    }\n\n    this.tech_ = new TechClass(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(Fn.bind_(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    TECH_EVENTS_RETRIGGER.forEach((event) => {\n      this.on(this.tech_, event, (e) => this[`handleTech${toTitleCase(event)}_`](e));\n    });\n\n    Object.keys(TECH_EVENTS_QUEUE).forEach((event) => {\n      this.on(this.tech_, event, (eventObj) => {\n        if (this.tech_.playbackRate() === 0 && this.tech_.seeking()) {\n          this.queuedCallbacks_.push({","sourceCodeStart":1237,"sourceCodeEnd":1273,"githubUrl":"https://github.com/videojs/video.js/blob/c3a7e0e6d20cf5400c9afbee29965fe4dff393c2/src/js/player.js#L1237-L1273","documentation":"When the player resolves a source to a tech name (defaulting to the source type, e.g. 'Html5'), it must find a registered Tech class via Tech.getTech(techName). If none is registered under that name (TitleCased or lowercased), playback cannot proceed and the error names the missing tech and the correct registration API.","triggerScenarios":"Loading a source whose type maps to a tech that was not registered (e.g. HLS source without videojs-http-streaming); calling player.loadTech('MyTech') without registerTech; custom build that omits Html5; tech name case mismatch.","commonSituations":"Forgetting to include the HLS/DASH tech plugin; bundler tree-shaking the tech's side-effect import; renaming a tech; using a Flash tech in builds where it was removed (v8).","solutions":["Register the tech before playback: videojs.registerTech('MyTech', MyTech).","For HLS/DASH, import the tech so it self-registers: import 'videojs-contrib-hls' / import '@videojs/http-streaming'.","Ensure Html5 is included in custom builds (it is the base tech).","Check the source.type spelling matches what the tech advertises."],"exampleFix":"// before\nplayer.src({ src: 'm.m3u8', type: 'application/x-mpegURL' }); // no HLS tech\n// after\nimport 'videojs-http-streaming'; // registers itself\nplayer.src({ src: 'm.m3u8', type: 'application/x-mpegURL' });","handlingStrategy":"validation","validationCode":"function safeLoadTech(player, name, options) {\n  if (!videojs.getTech(name) && !videojs.getTech(name.charAt(0).toUpperCase() + name.slice(1))) {\n    throw new Error(`Tech '${name}' is not registered`);\n  }\n  return player.tech_.loadTech_(name, options);\n}","typeGuard":"const isRegisteredTech = (name) =>\n  Boolean(videojs.getTech(name));","tryCatchPattern":"try {\n  player.src(source);\n} catch (e) {\n  if (/No Tech named/.test(e.message)) { showTechMissingUI(source); }\n  else throw e;\n}","preventionTips":["Side-effect-import required techs (HLS/DASH) before player.src().","In custom builds, keep Html5 in the bundle.","Validate source.type against registered techs in your source loader."],"tags":["player","tech","registry","playback"],"backgroundTag":null,"analyzedSha":"c3a7e0e6d20cf5400c9afbee29965fe4dff393c2","analyzedAt":"2026-08-13T04:20:15.471Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}