AI-powered voice assistant platform with CrewAI agents, GraphQL, and PII anonymization. Distributed as a standalone Windows EXE.
- Complete Setup Guide - Full development environment setup
- Claude + GitHub Copilot - Use Claude AI for development
- Agent Customization - Custom AI development agents
- Contributing - Contribution guidelines
- Security Policy - Security and vulnerability reporting
- 🎤 Real-time Voice Streaming - Low-latency audio capture and processing
- 🤖 AI-Powered Conversations - LLM integration with CrewAI multi-agent system
- 🔒 PII Anonymization - Regex-based sensitive data scrubbing
- 📊 GraphQL + REST - Flexible API layer with subscriptions
- 🧪 Comprehensive Testing - Unit, integration, property-based, and E2E tests
- 🛠️ Modern Tooling - AI code review, OpenAPI docs, Warp workflows
- Python 3.12+
- Node.js 20+
- uv (Python package manager)
- Bun (Frontend package manager)
- Task (Task runner)
# Install all dependencies
task install
# Setup environment
cp .env.example .env.local
# Edit .env.local with your API keys
# Initialize database
task db:migrate# Start backend + frontend
task dev
# Or individually:
task dev:backend # Backend only (port 8000)
task dev:frontend # Frontend only (port 5173)Ekko now includes a built-in prompt registry with immutable prompt snapshots.
- Prompt sources are provisioned into version files under
backend/src/ekko/ai/prompts/versions/. - When
EKKO_PROMPT_AUTO_PROVISION=true, changing a source prompt creates a new version on next use. - Use
EKKO_PROMPT_VERSIONto pin the app to a specific prompt version (e.g.v2).
# Provision/update prompt versions from current prompt sources
task prompts:provision
# List available prompt versions
task prompts:list# Run all quality checks
task check
# Individual checks:
task lint # Linting (ruff, biome)
task typecheck # Type checking (mypy, tsc)
task test # Run tests
task format # Format codeVerify that your changes will pass CI before pushing. Use these workflows to catch issues early:
task verifyRuns essential checks that catch 95% of CI failures:
- Linting (ruff, biome, yaml)
- Type checking (ty, tsc)
- Unit tests
- Cyclomatic complexity (xenon)
- Pre-commit hooks
Windows Note: Uses uv run python -m <tool> pattern for cross-platform compatibility.
task ci:localMirrors the complete GitHub Actions pipeline:
- Lint & Format - Fast fail on code quality issues
- Security Scans - bandit, pip-audit, detect-secrets (parallel)
- Tests - Unit tests → Integration tests (sequential)
- Architecture - Clean Architecture boundary validation
- Build - Verify compilation and packaging
# Run all security checks (bandit + pip-audit + secrets)
task security:scan
# Or run individually:
task security:audit # Dependency audit only (pip-audit)
task lint:secrets # detect-secrets baseline scan
cd backend && uv run python -m bandit -c bandit.toml -r src/ekko # Python security
cd backend && uv run pip-audit # Dependency auditBaselines:
- Secret scanning:
.secrets.baseline - Bandit security:
backend/bandit.toml
Update baselines after reviewing and confirming false positives:
cd backend && uv run detect-secrets scan --update ../.secrets.baselineThe GitHub Actions pipeline runs in stages for optimal speed:
┌─────────────────────────────────────────────────────┐
│ Stage 1: Lint & Type Check (fast fail) │ → 3-5 min
│ - ruff lint + format │
│ - ty type check │
│ - pytest unit tests │
├─────────────────────────────────────────────────────┤
│ Stage 2: Security (parallel) │ → 3-5 min
│ - bandit (Python security) │
│ - pip-audit (dependency CVEs) │
│ - detect-secrets (credential leaks) │
├─────────────────────────────────────────────────────┤
│ Stage 3: Integration Tests (after Stage 1) │ → 5-10 min
│ - Database integration │
│ - API integration │
│ - External service mocks │
├─────────────────────────────────────────────────────┤
│ Stage 4: Architecture & Validation │ → 2-5 min
│ - Clean Architecture boundaries │
│ - Link checking (lychee) │
│ - ShellCheck │
│ - actionlint (workflow validation) │
└─────────────────────────────────────────────────────┘
Total CI time: ~15-25 minutes Local quick check: ~5 minutes (task verify) Local full mirror: ~15 minutes (task ci:local)
# Build standalone Windows EXE
task build:exe
# Build frontend only
task frontend:buildClean Architecture with strict dependency direction:
presentation/infrastructure → application → core
┌─────────────────────────────────────────────────────┐
│ Presentation (API routes, GraphQL, middleware) │ ← FastAPI, Strawberry
├─────────────────────────────────────────────────────┤
│ Application (use case orchestration, services) │ ← Business logic
├─────────────────────────────────────────────────────┤
│ Core (entities, value objects, domain rules) │ ← Pure domain
├─────────────────────────────────────────────────────┤
│ Infrastructure (DB, external clients, adapters) │ ← SQLAlchemy, OpenAI
├─────────────────────────────────────────────────────┤
│ AI (CrewAI agents, PII, chains, embeddings) │ ← AI pipeline
└─────────────────────────────────────────────────────┘
Backend:
- FastAPI, Uvicorn
- Strawberry GraphQL
- SQLAlchemy, Alembic, SQLite
- CrewAI, LangChain, OpenAI
- Pydantic v2, structlog
Frontend:
- React 19, TypeScript
- Vite 6 + SWC
- Tailwind CSS v4
- shadcn/ui (Radix)
- Zustand, TanStack Query
- Storybook
Testing:
- pytest, Hypothesis
- Vitest, React Testing Library, fast-check
- Playwright (E2E)
- factory-boy
Quality:
- ruff (Python linting/formatting)
- mypy (type checking)
- Biome (frontend linting/formatting)
- pre-commit hooks
AI Development Tools:
- GitHub Copilot with Claude 3.5 Sonnet
- CodeRabbit (AI code review)
- Custom VS Code agents
- Warp terminal workflows
- Complete Setup Guide - Full environment setup
- Architecture Overview - System design
- Contributing Guide - How to contribute
- Security Policy - Security guidelines
- Claude + GitHub Copilot Guide - Use Claude for coding
- Agent Customization - Custom AI agents
- Agent Instructions - Project-specific AI guidance
- Clean Architecture - Layer boundaries
- Python Conventions - Code standards
- Frontend Stack - React patterns
- Testing Conventions - Test strategy
- Naming Registry - Constant management
Automated AI-powered code reviews on pull requests.
# Validate configuration
task tools:coderabbit:validateConfiguration: .coderabbit.yaml
Generate OpenAPI specs and interactive documentation.
# Generate docs
task tools:openapi:generate
# View in browser
task tools:openapi:viewOutput: docs/api/
Modern terminal with AI features and workflows.
# Install project workflows
task tools:warp:installConfiguration: .warp/
Advanced Git workflow automation.
# Validate configuration
task tools:gitnexus:validateConfiguration: .gitnexus/config.json
# Check status of all tools
task tools:status# Run all tests
task test
# Specific test types
task test:unit # Unit tests
task test:integration # Integration tests
task test:property # Property-based tests (Hypothesis)
task test:performance # Performance benchmarks
task test:e2e # Backend end-to-end tests
task test:e2e:frontend # Frontend Playwright end-to-end tests
task test:frontend # Frontend tests (Vitest)
# Coverage
task test:coverage # With coverage report
# Direct frontend Playwright
cd frontend && bun run test:e2etests/
├── unit/ # Fast, isolated, no I/O
├── integration/ # Database, API, external services
├── property/ # Hypothesis property-based tests
├── performance/ # Benchmark tests
├── e2e/ # End-to-end tests
├── fixtures/ # Shared test data
├── factories/ # factory-boy factories
└── mocks/ # Reusable mocks
- Backend integration and selected E2E API tests run against PostgreSQL via
testcontainers. - Docker must be available locally for these container-backed scenarios.
- If Docker is unavailable, those containerized tests are skipped automatically.
Backend API e2e quick commands:
# Repository-level containerized backend e2e
uv run --project backend python -m pytest tests/e2e -q
# Backend-local e2e
cd backend && uv run python -m pytest tests/e2e -qtask lint # All linters
task lint:python # Python (ruff)
task lint:frontend # Frontend (biome)
task lint:yaml # YAML files
task lint:markdown # Markdown files
task lint:secrets # Secret scanningtask format # Format all codetask typecheck # Python (mypy) + Frontend (tsc)task xenon # Cyclomatic complexity check# Run all pre-commit hooks
task pre-commit
# Install hooks (automatic with task install)
cd backend && uv run pre-commit install# Run pending migrations
task db:migrate
# Create new migration
cd backend
uv run alembic revision --autogenerate -m "description"
# Rollback
task db:downgrade
# Reset database
task db:reset# Build with PyInstaller
task build:exe
# Output: dist/ekko/ekko.exe# Build optimized frontend
cd frontend && bun run build
# Preview production build
cd frontend && bun run preview# Scan for secrets
task lint:secrets
# Update baseline
cd backend && uv run detect-secrets scan --update .secrets.baseline# Audit Python dependencies
task security:auditAutomatic security checks:
- detect-secrets
- gitleaks
- bandit (Python security)
Open in VS Code and choose "Reopen in Container".
Features:
- Pre-configured Python + Node environment
- All tools installed
- VS Code extensions pre-installed
- Ready to code immediately
Ekko includes a local container stack for backend runtime plus optional HTTPS reverse proxy.
# Backend container only
docker compose -f docker/compose.yaml -f docker/compose.override.yaml up --build
# Backend + local HTTPS reverse proxy (Caddy)
docker compose -f docker/compose.yaml -f docker/compose.override.yaml --profile caddy up --buildKey files:
docker/Containerfiledocker/compose.yamldocker/compose.override.yamlcaddy/Caddyfile
See CONTRIBUTING.md for detailed guidelines.
Quick overview:
- Fork the repository
- Create feature branch (
feature/your-feature) - Follow coding conventions
- Write tests
- Run
task check - Submit pull request
This project is licensed under the MIT License - see LICENSE file.
- FastAPI for the excellent web framework
- CrewAI for multi-agent orchestration
- React team for React 19
- shadcn for the beautiful UI components
- All open source contributors
- GitHub Issues: Bug reports and feature requests
- GitHub Discussions: Questions and general discussion
- Email: lfr@tik-ai.dk
Made with ❤️ using Clean Architecture principles