Start with the symptom. Follow the checks in order. Randomly reinstalling everything can work, but so can hitting a television, and neither deserves to be called a diagnostic method.
Install Node.js and reopen the terminal:
node --version
npm --versionFind the process:
Get-NetTCPConnection -LocalPort 3000 | Select-Object OwningProcess
Get-Process -Id <PID>Stop the conflicting process or modify the server to accept a configurable port.
Remove-Item -Recurse -Force node_modules
npm ciUse npm install instead if intentionally updating the lockfile.
Run:
npm run lintRead the first error, not the last fifty consequences. Common causes:
- A provider enum changed in only one location.
- A component prop no longer matches its interface.
- A dependency removed or renamed an export.
- Path aliases are used outside Vite/esbuild-aware code.
npm run buildConfirm:
package-lock.jsonmatchespackage.json.- Node.js is current enough for Vite 8.
esbuildand Vite dependencies installed successfully.- Antivirus did not quarantine a native esbuild binary.
Use a complete public GitHub URL:
https://github.com/owner/repository
Application name is required. Repository URL is optional.
When the current draft differs from the original, press Forge a second time to confirm replacement.
Configure the selected provider in .env or the UI.
Auto mode chooses Mistral first, so a configured Gemini key will only be selected when no Mistral key exists.
Restart the development server after editing .env.
The vendor rate limit was reached.
- Wait for reset.
- Reduce draft count.
- Check provider quota.
- Use another configured provider.
- Add application-level throttling for shared deployments.
The provider reports insufficient credits. Add credits, change provider, or stop asking a remote model to produce five legal epics simultaneously.
Inspect the server terminal. Likely causes:
- Vendor model no longer exists.
- Provider returned an unexpected response.
- Network or DNS failure.
- OpenRouter exhausted all candidate models.
- Request content exceeded provider limits.
Test one draft with a shorter length and explicit provider.
- Confirm the repository exists and is public.
- Check the URL format.
- Add
GITHUB_TOKENfor higher rate limits. - Verify the token can read the repository.
- Test GitHub API reachability from the server host.
Web and Android targets can continue with manual app details when repository fetch fails.
Refinement always uses Gemini.
- Configure
GEMINI_API_KEYor a Gemini UI key. - Confirm the draft and instruction are non-empty.
- Reduce document size.
- Check the server log for model or quota errors.
Selecting Mistral for generation does not make Mistral the refiner. The code is stubbornly specific.
Check browser site data for void_editor_draft.
Drafts disappear when:
- Site data is cleared.
- The application origin changes.
- Private browsing closes.
- Another session overwrites the same origin's storage.
- The user selects the clear-draft control.
There is no server backup.
Verify:
- The token belongs to an internal integration.
- The parent page ID is 32 hexadecimal characters after removing hyphens.
- The integration is connected to the target page.
- The token has not been revoked.
- The document is not empty.
Large documents are truncated to 95 blocks. Copy and paste Markdown manually when richer formatting or more blocks are required.
The export is HTML labeled with a .docx extension. Microsoft Word generally opens it, but strict
Office Open XML validators may reject it. Implement a real DOCX library if native package fidelity
is required.
PDF export uses the browser print dialog.
- Choose Save as PDF.
- Enable background graphics if needed.
- Check print margins.
- Use desktop Chrome or Edge for the most predictable output.
$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"
Test-Path "$env:JAVA_HOME\bin\java.exe"Then rerun:
npm run android:apk$env:ANDROID_SDK_ROOT = "$env:LOCALAPPDATA\Android\Sdk"
$env:ANDROID_HOME = $env:ANDROID_SDK_ROOT
Test-Path "$env:ANDROID_SDK_ROOT\platform-tools"- Run
npm run build. - Confirm
dist/index.htmlexists. - Run
npm run cap:sync. - Rebuild the APK.
- Reinstall it with
adb install -r. - Inspect
adb logcatforchromium,Capacitor, andAndroidRuntime. - Verify
capacitor.config.tsuseswebDir: 'dist'.
- Confirm internet permission remains in the manifest.
- Confirm the API uses HTTPS.
- Open the API host from the device browser.
- Verify native API URL selection in
src/api.ts. - Verify the server allows
capacitor://localhost. - Rebuild after changing
VITE_API_BASE_URL.
Below 768px, both sidebars should begin closed and behave as mutually exclusive overlay drawers.
If stale behavior appears:
- Hard refresh the browser.
- Clear old deployed assets.
- Rebuild and resync Android.
- Confirm the installed APK contains the latest web bundle.
Collect:
- Exact command.
- Full first error.
- Node and npm versions.
npm run lintresult.npm run buildresult.- Relevant server log.
adb logcatexcerpt for Android.- Current commit SHA from
git rev-parse HEAD.
That evidence turns "it broke" into a solvable engineering problem, which is a dramatic improvement for only seven bullet points.