Troubleshooting Guide
Setup Wizard Issues
Wizard shows “No TTY detected” when using curl pipe
Problem: Runningcurl ... | bash without a terminal redirects stdin, so the interactive wizard cannot receive keyboard input.
Solution:
API key validation fails but key is correct
Problem: The wizard rejects an API key during live validation even though the key works. Solutions:- Check network connectivity — the wizard makes outbound HTTPS requests to api.anthropic.com, api.openai.com, api.telegram.org
- Use
--skip-validationto bypass live checks:pnpm wizard --skip-validation - Corporate proxies or firewalls may block API calls — configure
HTTPS_PROXYenv var before running wizard
”I have Claude Pro/Max subscription - can I use it for EchOS?”
Problem: Confusion about Anthropic subscription plans vs API access. Answer: ❌ No, subscription plans cannot be used for EchOS.- Claude Pro/Max subscriptions (200/month) are for using Claude through Anthropic’s web, desktop, and mobile apps only
- They do NOT provide API access for programmatic integration
- EchOS requires a separate Anthropic API account with pay-as-you-go billing
- API costs are typically much lower than subscriptions for automated use cases (often ~$5/month for typical personal use)
- Sign up for Anthropic API access at https://console.anthropic.com/
- Add credits or set up billing
- Generate an API key under Settings → API Keys
- Use that key in EchOS
.envfile
Wizard exits immediately in --non-interactive mode
Problem: Missing required env vars.
Required variables for non-interactive mode:
ANTHROPIC_API_KEYALLOWED_USER_IDS
.env file has wrong permissions
Problem: Other users on the system can read your API keys. Fix:0600 automatically, but if you created .env manually, set it yourself.
”No .env file found. Run: pnpm wizard” on startup
Problem:pnpm start exits immediately with this message.
Solution: Run the setup wizard:
Build and Installation Issues
Cannot find package ‘@echos/shared’ (or other @echos/* packages)
Problem: Workspace packages aren’t built or aren’t being resolved by tsx. Symptoms:-
Build all packages first:
-
If build fails, clean and rebuild:
-
Verify path mappings: The root
tsconfig.jsonincludes these mappings for tsx:
LanceDB Native Module Errors
Problem: LanceDB native bindings missing for your platform. Symptoms:-
Intel Macs (darwin-x64):
- The project is configured to use LanceDB
0.22.3(last version with Intel Mac support) - This is set in
packages/core/package.json - If you see this error, run:
pnpm install --force
- The project is configured to use LanceDB
-
Apple Silicon Macs (darwin-arm64):
- Should work with LanceDB
0.26.2+ - If issues persist, try:
pnpm install --force
- Should work with LanceDB
-
Linux/Windows:
- LanceDB should auto-install the correct native binding
- Run:
pnpm install --forceif needed
-
Check what’s installed:
Configuration Errors
Problem: Missing required environment variables. Symptoms:-
Copy the example file:
-
Edit
.envand fill in required values: -
Get your Telegram user ID:
- Message @userinfobot on Telegram
- Add your ID to
ALLOWED_USER_IDS
-
Verify the file loads (Node 20.6+):
Runtime Issues
Telegram Bot Conflicts
Problem: Multiple bot instances trying to poll Telegram simultaneously. Symptoms:- Local processes on your machine
- Remote deployments (VPS, cloud instances, etc.)
- Docker containers
- Another developer’s machine using the same bot token
Step 1: Check local processes
Step 2: Check Docker containers
Step 3: Check bot webhook status
Step 4: Clear webhook and pending updates
Step 5: Check remote deployments
If you deployed to a remote server, check there:Step 6: Wait for timeout
If another instance was recently stopped, Telegram may still have an active long-polling connection (30 second timeout). Wait 30-60 seconds then try again.Step 7: Stop all instances
If the conflict persists:.env:
packages/telegram/src/index.ts.
Redis Connection Errors
Problem: Cannot connect to Redis. Symptoms:-
Use the Redis management script (recommended):
-
Manual platform-specific start (if script fails):
-
Check Redis URL in
.env: -
Verify Redis is running:
ENABLE_SCHEDULER=true. For basic knowledge management, you can disable the scheduler.
Database/Storage Errors
Problem: SQLite or LanceDB initialization failures. Symptoms:-
Create data directories:
-
Check permissions:
-
Check paths in
.env: -
Clean state (CAUTION: deletes all data):
Development Issues
TypeScript Errors
Problem: Type errors when editing code. Solutions:-
Check all packages:
-
Rebuild after package changes:
-
Use watch mode during development:
Vitest Test Failures
Problem: Tests failing or hanging. Solutions:-
Run tests:
-
Run specific test file:
-
Watch mode:
Storage Sync Issues
Manually added/edited markdown file not appearing in search
Problem: You added a.md file directly to the knowledge/ directory (or edited one in an external editor), but the agent can’t find it via search.
How sync works:
- On startup, EchOS reconciles all markdown files with SQLite and LanceDB automatically
- While running, a file watcher picks up any
add,change, orunlinkevents in real time (debounced 500 ms)
-
Check the file has a valid
idin frontmatter — files without anidfield are silently skipped: -
If you added the file while the app was stopped — just restart. The startup reconciler will pick it up:
-
If you added the file while the app is running — the file watcher should index it within ~1 second. If it doesn’t appear after a few seconds, check the logs:
-
Enable debug logging to see all reconciler/watcher events:
Search results show stale content after editing a note externally
Problem: You edited a markdown file in VS Code or Obsidian, but the agent still returns the old content. The content hash prevents unnecessary re-indexing, so re-indexing only happens when the body text of the note changes (not just frontmatter). If the watcher picked up the change but content looks stale, wait a moment for the debounce window (500 ms) then retry. If the issue persists after restarting the app, check that the file has a validid in its frontmatter — files without an ID are skipped by both the reconciler and the watcher.
Memory Issues
Memory stored but not recalled after /reset
Problem: You told the agent to remember something, then after/reset it doesn’t know the fact.
How memory works:
remember_about_mestores facts permanently in SQLite (survives/reset)- On every new session, the top 15 memories by confidence are injected into the system prompt automatically
- Additional memories beyond the top 15 are searchable via
recall_knowledge
- It may be beyond position 15 — ask explicitly: “recall what you know about X” to trigger
recall_knowledge - The search uses keyword matching — use related terms: “recall what you know about my birthday” or “recall birth year”
- Increase confidence when storing important facts: the agent can be told “remember this with high confidence”
recall_knowledge to retrieve all entries.
Content Status Issues
Article shows up in knowledge search even though I haven’t read it:- Articles saved via
save_articlestart withstatus: saved(reading list), notstatus: read(knowledge) - If the agent is mixing them, remind it: “distinguish between saved articles and things I’ve actually read”
- You can filter: “show only what I’ve actually read about X”
- Ask: “show my reading list” — the agent calls
list_notes(status="saved") - Articles saved before this feature was introduced may have
status: null— they won’t appear in filtered lists; useupdate_noteormark_contentto set their status
- This is intentional: when you begin actively discussing a saved article, the agent auto-marks it
read - To prevent this, tell the agent you’re just asking about the topic in general, not discussing that specific article
save_conversation creates too much noise:
save_conversationis only called when you explicitly ask (“save this conversation” or “save what we discussed about X”)- It is never called automatically
CLI Issues (pnpm echos)
Empty response — agent runs but prints nothing
Most likely cause: The configured model is deprecated and the API returns an empty response. Check: Look for a deprecation warning in the output. If you seeThe model '...' is deprecated, update DEFAULT_MODEL in .env to a current model (e.g. claude-haiku-4-5-20251001).
Debug: Run with logging enabled to see what happens:
Startup logs cluttering the output
By default the CLI suppresses all logs belowwarn. If you’re seeing INFO logs:
- Check whether
LOG_LEVELis exported in your shell:echo $LOG_LEVEL - Unset it or set it to
warn:unset LOG_LEVEL
Shell parse errors (zsh: parse error near '\n')
Special characters (?, >, *, !, &) in arguments are interpreted by the shell before echos sees them. Always quote arguments:
History not persisting between sessions
The history file is~/.echos_history. If it doesn’t persist:
- Check write permissions:
ls -la ~/.echos_history - The file is created on the first clean exit (
exit/quit/ Ctrl+D). Kills viakill -9skip the save.
YouTube Transcript Issues
”Unable to save this video” / YouTube transcript fails
Problem: The YouTube plugin relies on a Python subprocess (youtube-transcript-api) to extract transcripts. If the Python package is missing, all YouTube saves fail silently and the agent reports inability to save.
Symptoms:
- Bot responds with something like “I was unable to save this video”
- Logs show:
Python process exited with code 1orModuleNotFoundError: No module named 'youtube_transcript_api'
-
Install the Python package (required on local machine):
On macOS with externally managed Python (PEP 668):
-
Verify installation:
- Docker: The Dockerfile already installs the package. No action needed for Docker deployments.
.env:
p.webshare.io:80.
Getting Help
If you’re still stuck:-
Check the logs: EchOS uses Pino for structured logging
-
Enable debug logging: Set
LOG_LEVEL=debugin.env -
Check system requirements:
- Node.js 20+ (
node --version) - pnpm 9+ (
pnpm --version) - Redis running (
redis-cli ping) - Enough disk space for embeddings/vectors
- Node.js 20+ (
- Review security docs: See Security
- Architecture overview: See Architecture