Skip to content

docs: add macOS setup gotchas (npm prefix, ffmpeg, Groq key format)#45

Open
impactworks-dev wants to merge 7 commits intoearlyaidopters:mainfrom
impactworks-dev:main
Open

docs: add macOS setup gotchas (npm prefix, ffmpeg, Groq key format)#45
impactworks-dev wants to merge 7 commits intoearlyaidopters:mainfrom
impactworks-dev:main

Conversation

@impactworks-dev
Copy link
Copy Markdown

Summary

Adds a short "macOS setup notes" subsection in Step 1 of the README capturing the real issues a fresh Mac setup hits that aren't obvious from the current docs.

What's documented

  • npm i -g fails with EACCES on /usr/local/... — macOS ships an npm prefix owned by root. Docs the user-writable $HOME/.npm-global workaround so @anthropic-ai/claude-code installs without sudo.
  • Local voice output needs ffmpeg — the say + ffmpeg TTS fallback silently falls back to text without it. Adds brew install ffmpeg.
  • Groq API key format — only gsk_... values work; an org_... identifier returns HTTP 401 invalid_api_key.
  • Secrets belong in .env, not the shell — pasting a key at the zsh prompt produces command not found, easy to misread as a setup failure.
  • launchd PATH must include the Claude CLI dir — otherwise the bot starts but can't spawn Claude Code subprocesses (common when claude lives in $HOME/.npm-global/bin).

Also refreshes package-lock.json to match a current npm install.

Why

These were encountered during a real end-to-end setup on a clean Mac. Writing them in Step 1 up front saves newcomers from the same debug loop.

Testing

  • Ran npm install, npm run build, npm run setup equivalent config generation, launchd install, and npm run status — reports "All systems go."
  • Verified Groq STT end-to-end via transcribeAudio() in src/voice.ts (HTTP 200, correct transcript).
  • Verified local TTS end-to-end via synthesizeSpeech() (produces a valid OGG Opus buffer; round-trips back to text through Groq).

Conversation

Generated with assistance from Warp (conversation: https://app.warp.dev/conversation/7f78a63a-b2fe-461c-b0e0-794ba9f23ae3)

impactworks and others added 7 commits April 20, 2026 08:35
Captures real issues encountered during a fresh macOS setup walkthrough:
- npm -g EACCES workaround via user-writable prefix
- brew install ffmpeg required for local say + ffmpeg TTS fallback
- Groq API keys are gsk_* (not org_*) to avoid 401 invalid_api_key
- Clarify secrets live in .env, not the shell
- launchd PATH must include Claude CLI dir to spawn subprocesses

Also refreshes package-lock.json to match npm install.

Co-Authored-By: Oz <oz-agent@warp.dev>
Document the one-time local setup for:
- Obsidian Brain vault integration (path, registry, cleanup)
- GitHub SSH ed25519 key with Keychain-backed auto-load
- kepano/obsidian-skills install layout and user-level symlinks
- Agent template vault configuration
- launchd PATH requirements for npm-global binaries

No secrets are recorded; machine-specific values stay in .env.

Co-Authored-By: Oz <oz-agent@warp.dev>
Add a new chat_settings table to store per-chat preferences keyed by
chat_id and key. Use it to persist the voice-reply toggle so the bot
remembers each chat's voice mode across restarts.

Changes:
- db.ts: add chat_settings table and get/set/delete/getAllByKey helpers
- bot.ts: load voice-enabled chats on startup; persist /voice toggle
- index.ts: invoke loadVoiceEnabledChats() at startup and log result

Co-Authored-By: Oz <oz-agent@warp.dev>
Add .gitignore entries for files that are either machine-specific or
managed by tooling:
- .agents/ and matching .claude/skills/* symlinks (managed by `skills`)
- cli/ (third-party repo cloned for reference)
- memory/ (personal knowledge base)
- dashboard.html (generated from src/dashboard-html.ts)
- TASKS.md (personal task tracker)
- launchd/com.claudeclaw.tunnel.plist (absolute home paths)

Also track skills-lock.json so the skill install set is reproducible.

Co-Authored-By: Oz <oz-agent@warp.dev>
Introduces the warroom/ Python package: a WebSocket voice server that
bridges browser audio to ClaudeClaw agents via either Gemini Live
(default) or Deepgram STT + Cartesia TTS.

Built against pipecat-ai 1.0.0:
- WebsocketServerTransport owns the WebSocket server (host/port).
- SileroVADAnalyzer is attached via WebsocketServerParams.vad_analyzer.
- PipelineTask accepts params as a keyword-only argument.
- LLMContext + LLMContextAggregatorPair replace the old OpenAILLMContext
  + llm.create_context_aggregator() pattern.
- GeminiLiveLLMService replaces GeminiMultimodalLiveLLMService.
- Cartesia/Deepgram service imports use their .tts / .stt submodules.
- CartesiaTTSService uses Settings(voice=...) instead of deprecated
  voice_id kwarg.

Also ignores warroom/.venv/ and warroom/__pycache__/ from VCS.

Co-Authored-By: Oz <oz-agent@warp.dev>
The test 'truncates last_result to 500 chars' asserted
toHaveLength(500) against a 1000-char input, but updateTaskAfterRun
in src/db.ts truncates via result.slice(0, 4000). The input was
therefore never truncated and the length check was unreachable.

Align the test with the current runtime behavior: feed 5000 chars and
assert the stored value is exactly 4000.

Co-Authored-By: Oz <oz-agent@warp.dev>
Add War Room voice server on pipecat 1.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant