troubleshooting
Cross-cutting troubleshooting guide for common issues across the entire owlette system.
agent won't connect to cloud
Symptoms: Machine shows offline in dashboard, agent logs show connection errors.
Check:
- Verify internet connectivity on the agent machine
- Check firewall rules — outbound HTTPS (port 443) must be allowed to
owlette.app,dev.owlette.app,*.googleapis.com,*.firebaseio.com, and the Cloudflare R2 endpoint used for roost chunks (usually*.r2.cloudflarestorage.com) - Check
C:\ProgramData\Owlette\logs\service.logfor specific errors - Verify
firebase.enabledistruein config.json - Verify
firebase.site_idmatches a site that exists in Firestore
Common errors:
| log message | cause | fix |
|---|---|---|
| "Agent not authenticated" | Missing or corrupt tokens | Re-register with a new code |
| "HTTP error 403" | Firestore rules blocking access | Verify security rules are deployed |
| "Token expired" | Refresh failed | Check refresh token in logs, re-register if needed |
| "Connection refused" | Firewall or proxy | Allow outbound HTTPS |
dashboard shows machine offline
Symptoms: Agent is running but dashboard shows offline.
- Check heartbeat age — If last seen was recently, the machine may be experiencing intermittent connectivity
- Check agent service:
sc query OwletteService(should show RUNNING) - Check ConnectionManager state in logs — look for BACKOFF or DISCONNECTED
- Verify site_id — Agent and dashboard must be looking at the same site
- Check Firestore directly — Go to Firebase Console → Firestore →
sites/{siteId}/machines/{machineId}→ check the machine document fieldsonline,lastHeartbeat,agent_version, andmetrics
processes not auto-restarting
- Verify
launch_modeisalways, orscheduledwith the current time inside a configured schedule window - Check if
relaunch_attemptslimit was reached (reboot prompt should appear) - Verify
exe_pathexists on the machine (INACTIVEstate means file not found) - Check agent logs for launch errors
- Verify the service is running and the main loop is executing (look for periodic log entries)
process won't launch after an app upgrade
Symptoms: A managed process shows INACTIVE, or the dashboard shows an executable-missing toast after software was upgraded or installed side-by-side.
- Open the dashboard toast or activity log entry with action
exe_missing. - Review the suggested paths. The agent scans nearby sibling directories for executables with the same filename.
- Use the toast's use path action, or open the process edit dialog manually and update executable path.
- Save the process. If launch mode is
always, the agent should launch it on the next monitoring pass. If launch mode isscheduled, it launches when the next matching schedule window opens. - If no suggestion appears, browse the machine for the new executable path and update the process manually.
oauth token issues
"agent not authenticated - no refresh token found"
The encrypted token file is missing or unreadable.
Fix: Re-pair the agent:
- Delete the token file:
del C:\ProgramData\Owlette\.tokens.enc - Run the pairing flow:
C:\ProgramData\Owlette\python\python.exe C:\ProgramData\Owlette\agent\src\configure_site.py - The console prints a 3-word pairing phrase and the authorization link for the server this machine is bound to, then starts polling. Open that link from any device and enter the phrase — nothing opens a browser here on its own. The running service picks the new credentials up on its own; no restart is needed.
token refresh failing
Check service.log for refresh errors. Common causes:
- Machine ID mismatch — The machine was renamed since registration
- Token revoked — An admin revoked the token from the dashboard
- Network issue — Can't reach the refresh endpoint
deployment stuck
Symptoms: Deployment shows "downloading" or "installing" indefinitely.
- Check agent logs for download/install progress
- Verify the installer URL is accessible from the agent machine (test in browser)
- Check if the installation timed out (default: 40 minutes)
- For large installers on slow connections, the download may simply be slow
- Try cancelling and re-deploying
roost sync failed
- R2 configuration failed — Check web runtime logs for missing
R2_S3_ENDPOINT,R2_S3_ACCESS_KEY_ID, orR2_S3_SECRET_ACCESS_KEY. The endpoint should be reachable from the web app and agents over HTTPS. - Chunk upload or verification failed — Retry the upload from the roost page and confirm the agent machine can reach signed R2 URLs. A publish can fail if the version references chunks that were not uploaded or were rejected after hash verification.
- Target fanout stalled — Check
sites/{siteId}/roosts/{roostId}/target_state/{machineId}. Current target states includepending,downloading,assembling,committed,failed, andcancelled. sync_pullstuck or failed — Checkservice.logon the target machine forsync_pullerrors. If no target-state document appears, confirm the machine is online and has a pending command insites/{siteId}/machines/{machineId}/commands/pending.- Permission denied — The configured extract root may not be writable or may be outside the agent's allowed extract roots.
2fa issues
lost authenticator
If you also have a passkey on the account, sign in with it — a passkey clears 2FA on its own, no code needed.
Otherwise use one of your backup codes at the 2FA prompt. Each code can only be used once.
no backup codes
Ask a superadmin to run reset 2FA on your account from the admin users page (POST /api/users/{uid}/mfa-reset). It removes every second factor — authenticator app, passkeys, and the backup codes — re-arms mandatory 2FA setup, and revokes the account's trusted devices, so the next sign-in starts enrollment from scratch.
Two things it deliberately does not do: it does not revoke Firebase refresh tokens, so a session the user already holds elsewhere stays signed in until it expires on its own; and superadmins cannot reset themselves, so a locked-out superadmin needs a different superadmin to do it.
Because a reset hands the account to whoever signs in next, confirm who you're talking to before running one.
code not working
- Ensure your device's clock is synchronized (TOTP is time-based)
- Codes expire every 30 seconds — enter the current one
- Verify you're using the correct account in your authenticator app
"verify a factor you already have" when adding one
Adding a second factor to an account that already holds one requires the current session to have cleared a 2FA challenge — the route answers 403 with mfa_challenge_required otherwise. Verify with your existing passkey, or take the use a code instead link to /verify-2fa, then add the new factor.
can't regenerate backup codes
Regeneration needs live proof in the same request: a current 6-digit code, an unused backup code, or your passkey. Being signed in is not enough — a fresh sheet of recovery codes could otherwise be used to turn 2FA off entirely. If you have none of the three, that's the superadmin reset above.
asked to set up 2fa again
You removed your last second factor. That's allowed, but the account immediately re-arms 2FA setup, so the dashboard sends you to /setup-2fa to enroll a new factor — a passkey or an authenticator app — before you can use it again. Trusted devices are revoked at the same time.
hoot not responding
- No LLM key configured — Check hoot settings for API key
- Invalid API key — Verify the key is correct and has credits
- Machine offline — hoot checks machine status before executing tools
- A tool is stuck — A turn keeps running even if you reload the page (the chat reattaches to it), so you rarely lose work. If a tool call is taking too long, use the cancel control on its tool card to kill it, or stop the whole turn from the chat.
- Rate limited — The API may be rate-limiting requests
email alerts not working
- Verify
RESEND_API_KEYenvironment variable is set in Railway - Check that the Resend API key is valid
- Verify
CRON_SECRETis configured for health check cron - Check the cron-job.org schedule is set:
*/5 * * * * - Send a test email from Admin Panel → Email Test
- Check spam/junk folders
dashboard performance issues
slow loading
- Cold starts (Railway Hobby plan) — Upgrade to Pro for no cold starts
- Large dataset — Many machines/processes increase Firestore reads
- Bundle size — Check
.next/staticoutput during build
real-time updates not working
- Check browser console for Firestore listener errors
- Verify Firebase config is correct
- Try hard refresh (Ctrl+Shift+R)
- Check if the Firestore quota has been exceeded
log locations
agent logs
| log | path |
|---|---|
| Service | C:\ProgramData\Owlette\logs\service.log |
| Desktop app | %LOCALAPPDATA%\app.owlette.desktop\logs\owlette-desktop.log (per-user, not under ProgramData) |
| hoot | C:\ProgramData\Owlette\logs\cortex.log |
| Pairing | C:\ProgramData\Owlette\logs\pairing_debug.log |
| Self-update installer | C:\ProgramData\Owlette\logs\installer_update.log |
| Interactive installer | Only where Inno Setup is launched with /LOG=<path>; use /LOG="C:\ProgramData\Owlette\logs\setup.log" to write a setup log there |
The full inventory, including what each file is good for, is in agent troubleshooting.
dashboard logs
| log | location |
|---|---|
| Build logs | Railway → Deployments → [deployment] → Logs |
| Runtime logs | Railway → Deployments → [latest] → Logs |
| Client errors | Browser → F12 → Console |
firestore logs
| log | location |
|---|---|
| Rule evaluations | Firebase Console → Firestore → Rules → Monitoring |
| Usage metrics | Firebase Console → Firestore → Usage |
| Auth events | Firebase Console → Authentication → Users |
debug mode
Run the agent in debug mode for detailed console output:
cd C:\ProgramData\Owlette\agent\src
python owlette_service.py debugRequires an elevated (Administrator) command prompt. Shows real-time logging of all service operations.
getting help
- Check the relevant section of this documentation
- Review agent logs and browser console for specific error messages
- Check the Firestore Data Model to verify data structure
- Open an issue on GitHub
- Email us at support@owlette.app
architecture
owlette uses a split control, state, and data plane. Cloud Firestore is the real-time state store and command queue, Next.js API routes handle authenticated control actions, and object storage carries large binaries plus roost chunks and version bodies. Agents and the dashboard do not maintain a direct persistent connection to each other; they coordinate through API routes, Firestore state, and signed storage URLs.
changelog
All notable changes to owlette are documented here. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.