This guide is for developers who want to contribute to Mycelia or run it in development mode with hot reload.
The fastest way to get a development environment with hot reload:
# Clone and setup
echo "FRONTEND_MODE=dev" >> .env
docker compose build frontend
docker compose up -dNote: If you've made changes to the Dockerfile or package.json/deno.json dependencies, you might still need to run docker compose build again
Ports can be customized via environment variables (in .env or inline):
| Service | Variable | Default |
|---|---|---|
| Nginx (Proxy) | NGINX_PORT |
4433 |
| Nginx (HTTP) | NGINX_HTTP_PORT |
80 |
| Nginx (HTTPS) | NGINX_HTTPS_PORT |
443 |
| Frontend | FRONTEND_PORT |
8080 |
| Backend | BACKEND_PORT |
5173 |
| Worker | PYTHON_WORKER_PORT |
8000 |
| Database | MONGO_PORT |
27017 |
Example:
NGINX_PORT=5000 FRONTEND_PORT=3000 BACKEND_PORT=4000 docker compose up -dFor more details on networking and SSL setup, see NETWORKING.md.
cd frontend
# Start development server
deno task dev
# Run tests
deno task test
# Type checking
deno task type-check
# Linting
deno lint
# Build for production
deno task build
# Preview production build
deno task preview- Deno runtime with npm compatibility
- React 18 + TypeScript
- Vite for build tooling
- Zustand for state management
- D3.js for timeline visualization
- Tailwind CSS v4 for styling
- Radix UI for accessible components
Use @/ alias for all imports (configured in deno.json):
import { Component } from '@/components/Component'
import { useTimeline } from '@/hooks/useTimeline'
import type { TimelineItem } from '@/types/timeline'cd backend
# Start development server
deno task dev
# Create an API token
deno run -A server.ts token-createThe Python services handle audio import, STT, and conversation extraction.
cd python
uv run daemon.pyThe daemon auto-detects:
- Apple Voice Memos (if
CloudRecordings.dbexists) - Google Drive Easy Voice Recorder
- Local audio folder (
~/Library/mycelia/audio)
Environment variables (optional, set in .env):
MYCELIA_APPLE_VOICEMEMOS_ROOT- Apple Voice Memos pathMYCELIA_GOOGLE_DRIVE_ROOT- Google Drive pathMYCELIA_LOCAL_AUDIO_ROOT- Local audio folderMYCELIA_GOOGLE_TZ/MYCELIA_LOCAL_TZ- Timezones (default: UTC)
Logging: ~/Library/mycelia/logs/daemon.log
cd python
# Transcribe queued audio
uv run stt.py [--server https://your-stt-server.com/]
# Check backlog without processing
uv run stt.py --countSee backend/README.md for Whisper server setup.
cd python
uv run python -m convos.cli \
--limit 5 \
--model smallFlags:
--limit <n>- Max conversation chunks to process--not-later-than <unix_ts>- Only process transcripts before this time--model <small|medium|large>- LLM size (default: small)
Logging: ~/Library/mycelia/logs/convos.log
For local GPU inference:
cd gpu
docker compose up -d --buildSee docs/LLM_DEVELOPER_GUIDE.md for hardware recommendations and model setup.
- Check
~/Library/mycelia/logs/daemon.logfor details - Common causes:
- Corrupted audio file
- Unsupported codec
- File permission issues (grant Full Disk Access)
- Failed files auto-retry after 2 hours
Required for accessing Voice Memos:
- System Settings → Privacy & Security → Full Disk Access
- Add your terminal app (Terminal, iTerm, VS Code, etc.)
- Restart the terminal
mycelia/
├── frontend/ # React SPA (Deno + Vite)
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Route page components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── stores/ # Zustand state stores
│ │ ├── lib/ # Utilities (API client, auth)
│ │ ├── modules/ # Feature modules
│ │ └── types/ # TypeScript definitions
│ ├── Dockerfile.dev # Dev server with hot reload
│ └── Dockerfile.prod # Production nginx build
├── backend/ # Deno API server
├── python/ # Audio import, STT, conversation extraction
├── gpu/ # GPU inference stack
├── myceliasdk/ # Shared TypeScript myceliasdk
└── docs/ # Additional documentation
- Fork the repo
- Create a feature branch
- Make your changes with tests
- Run linting and type checks
- Submit a PR
Join the Discord for discussions.