{"record":{"id":"d29500a95794fabb","repo":"xpipe-io/xpipe","slug":"required-local-xpipe-installation-was-not-found-bu","errorCode":null,"errorMessage":"Required local XPipe installation was not found but is required for development. See https://github.com/xpipe-io/xpipe/blob/master/CONTRIBUTING.md#development-setup","messagePattern":"Required local XPipe installation was not found but is required for development\\. See https://github\\.com/xpipe-io/xpipe/blob/master/CONTRIBUTING\\.md#development-setup","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"critical","filePath":"app/src/main/java/io/xpipe/app/core/AppExtensionManager.java","lineNumber":130,"sourceCode":"                    extendedLayer.findModule(AppNames.extModuleName(\"proc\")).orElseThrow());\n        }\n    }\n\n    private Optional<Module> findAndParseExtension(String name, ModuleLayer parent) {\n        var inModulePath = ModuleLayer.boot().findModule(AppNames.extModuleName(name));\n        if (inModulePath.isPresent()) {\n            TrackEvent.info(\"Loaded extension \" + name + \" from boot module path\");\n            return inModulePath;\n        }\n\n        if (!AppProperties.get().isFullVersion()) {\n            try {\n                if (externalModuleFileSystem == null) {\n                    var localInstallation =\n                            AppInstallation.ofDefault(AppProperties.get().isLocatePtb());\n                    Path p = localInstallation.getBaseInstallationPath();\n                    if (!Files.exists(p)) {\n                        throw new IllegalStateException(\n                                \"Required local \" + AppNames.ofCurrent().getName()\n                                        + \" installation was not found but is required for development. See https://github\"\n                                        + \".com/xpipe-io/xpipe/blob/master/CONTRIBUTING.md#development-setup\");\n                    }\n\n                    if (AppProperties.get().isLocatorVersionCheck()) {\n                        var iv = getLocalInstallVersion(localInstallation);\n                        var installVersion = AppVersion.parse(iv)\n                                .orElseThrow(() -> new IllegalArgumentException(\"Invalid installation version: \" + iv));\n                        var sv = !AppProperties.get().isImage()\n                                ? Files.readString(Path.of(\"version\")).strip()\n                                : AppProperties.get().getVersion();\n                        var sourceVersion = AppVersion.parse(sv)\n                                .orElseThrow(() -> new IllegalArgumentException(\"Invalid source version: \" + sv));\n                        if (!installVersion.equals(sourceVersion)) {\n                            throw new IllegalStateException(\"Incompatible development version. Source: \" + sv\n                                    + \", Installation: \"\n                                    + iv","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/xpipe-io/xpipe/blob/d85ca821baa46092a320ebb13546d7240adb74f8/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java#L112-L148","documentation":"During extension discovery in development mode, XPipe requires a locally installed XPipe build to supply external modules. If AppInstallation.ofDefault() points to a non-existent base path, findAndParseExtension aborts with an IllegalStateException linking the contributing guide.","triggerScenarios":"Running the XPipe application from source in a development environment without a local XPipe installation present at the default installation location.","commonSituations":"Fresh clone of the repo without ever installing the XPipe desktop app, custom install location not detected, or PTB/locator settings changing which install path is resolved.","solutions":["Install the XPipe desktop application locally (see CONTRIBUTING.md development setup)","Ensure the installation is at the default location AppInstallation.ofDefault() resolves to","Check AppProperties locator/PTB flags are not pointing at a missing variant","Re-run the app after installation so externalModuleFileSystem can be populated"],"exampleFix":"// before\n./gradlew run // fails: no local installation\n// after\n// install XPipe first, e.g. via package manager or installer script, then\n./gradlew run","handlingStrategy":"validation","validationCode":"const fs = require('fs');\nfunction assertLocalXpipeInstalled(installPath) {\n  if (!fs.existsSync(installPath)) {\n    throw new Error(`Local XPipe installation missing at ${installPath}; install it before running dev mode`);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  app.bootstrap(); // triggers extension discovery\n} catch (e) {\n  if (String(e.message).includes('Required local')) {\n    console.error('Install the XPipe desktop app per CONTRIBUTING.md, then re-run.');\n    process.exit(1);\n  }\n  throw e;\n}","preventionTips":["Install the XPipe desktop app before running from source","Keep the installation at the default detected location","Review CONTRIBUTING.md development setup after cloning","Verify locator/PTB flags match the installed variant"],"tags":["development","setup","installation"],"backgroundTag":"missing-dependency","analyzedSha":"d85ca821baa46092a320ebb13546d7240adb74f8","analyzedAt":"2026-09-06T14:30:08.251Z","contentChangedAt":"2026-09-06T14:30:08.251Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}