No description
  • Python 63%
  • TypeScript 31.1%
  • CSS 2.8%
  • Shell 2.4%
  • Makefile 0.4%
  • Other 0.2%
Find a file
Robert Goins 73334195c6
Some checks failed
CI / ci (push) Failing after 1m51s
CI / publish-image (push) Has been skipped
add more tests
2026-03-23 10:35:16 -07:00
.cursor add affine mcp support 2026-03-13 12:54:31 -07:00
.forgejo/workflows collapse the ci 2026-03-21 18:03:29 -07:00
docs start with infisical 2026-03-21 14:17:58 -07:00
momo add more tests 2026-03-23 10:35:16 -07:00
scripts remove more stuff 2026-03-21 22:19:48 -07:00
tests remove more stuff 2026-03-21 22:19:48 -07:00
.gitignore updates 2026-03-19 22:06:59 -07:00
.infisical.json start with infisical 2026-03-21 14:17:58 -07:00
activate_env.sh add face to web 2026-02-01 19:08:04 -08:00
agent_index.json add more tests 2026-03-23 10:35:16 -07:00
AGENTS.md update docs 2026-03-21 22:32:49 -07:00
docker-compose-affine.yml add affine mcp support 2026-03-13 12:54:31 -07:00
docker-compose.appliance.yml fix compose 2026-03-22 12:32:27 -07:00
docker-compose.infisical.appliance.yml start with infisical 2026-03-21 14:17:58 -07:00
docker-compose.infisical.yml start with infisical 2026-03-21 14:17:58 -07:00
docker-compose.yml fix compose 2026-03-22 12:32:27 -07:00
Dockerfile remove more stuff 2026-03-21 22:19:48 -07:00
face_engine_spec.md pretty cool implementation 2026-01-28 20:13:55 -08:00
face_molt_integration_spec.md pretty cool implementation 2026-01-28 20:13:55 -08:00
get-docker.sh kiosk mode code 2026-02-25 19:15:01 -08:00
Makefile start with infisical 2026-03-21 14:17:58 -07:00
molt_voice_tts_spec.md pretty cool implementation 2026-01-28 20:13:55 -08:00
momo_agent_enablement_spec.md Add live TypeScript watcher for Docker dev 2026-03-18 20:34:37 -07:00
momo_agent_harness_design_doc.md harness refactor 2026-03-21 19:56:32 -07:00
momo_always_on_memory_spec.md hardcode audio device selection 2026-03-12 08:58:03 -07:00
momo_chart_engine_v1_spec.md starting knowledge base 2026-02-22 15:17:14 -08:00
momo_combined_market_evening_brief_spec.md update briefs 2026-02-08 20:57:17 -08:00
momo_daily_brief_web_spec.md add scheduling and daily brief 2026-02-04 18:32:54 -08:00
momo_finance_step1_spec.md finance helper 2026-02-09 13:39:19 -08:00
momo_google_calendar_spec.md new features and preparing to deploy 2026-01-29 20:40:14 -08:00
momo_home_assistant_tool_spec.md home assistant integration 2026-01-31 17:50:10 -08:00
momo_household_shared_multiuser_spec.md web server and deployment 2026-01-31 15:26:56 -08:00
momo_hue_v2_spec.md new features and preparing to deploy 2026-01-29 20:40:14 -08:00
momo_knowledge_step1_foundation_spec.md starting knowledge base 2026-02-22 15:17:14 -08:00
momo_knowledge_step2_vault_layer_spec.md starting knowledge base 2026-02-22 15:17:14 -08:00
momo_knowledge_step3_live_layer_spec.md add the third level of knowledge 2026-02-22 15:41:50 -08:00
momo_local_image_generation_v1_spec.md moving to docker containers and adding image generation... porbably too muchf or one commit but oh well 2026-02-21 20:38:52 -08:00
momo_next_features.md next wave of features 2026-03-21 20:39:11 -07:00
momo_organizer_assistant_spec.md updating assistant capabilities 2026-03-17 11:29:14 -07:00
momo_organizer_phase1_implementation_plan.md updating assistant capabilities 2026-03-17 11:29:14 -07:00
momo_profile_vault_spec.md new features and preparing to deploy 2026-01-29 20:40:14 -08:00
momo_supermemory_spec.md add supermemory 2026-02-02 08:44:26 -08:00
momo_ui_framework_migration_checklist.md updates 2026-03-19 22:06:59 -07:00
momo_ui_framework_migration_spec.md updates 2026-03-19 22:06:59 -07:00
momo_weather_tool_spec.md weather tool 2026-02-02 10:34:55 -08:00
package-lock.json updates 2026-03-19 22:06:59 -07:00
package.json remove more stuff 2026-03-21 22:19:48 -07:00
playwright.config.ts updates 2026-03-19 22:06:59 -07:00
pyproject.toml remove ai hub 2026-03-21 16:19:42 -07:00
README.md update docs 2026-03-21 22:32:49 -07:00
requirements-dev.lock resolve conflicts 2026-02-08 16:09:19 -08:00
requirements.lock add the third level of knowledge 2026-02-22 15:41:50 -08:00
requirements.txt hardcode audio device selection 2026-03-12 08:58:03 -07:00
roboeyes_style_pack_spec.md pretty cool implementation 2026-01-28 20:13:55 -08:00
spec.md Add the spec 2026-01-28 13:51:33 -08:00
start_momo_headless.sh update start script 2026-02-06 15:28:43 -08:00
stylelint.config.js Add CSS linting for dedicated web styles 2026-03-18 23:07:53 -07:00
test_extractor.py hardcode audio device selection 2026-03-12 08:58:03 -07:00
test_routes.py kiosk mode code 2026-02-25 19:15:01 -08:00
TESTING_GUIDELINES.md updates 2026-03-19 22:06:59 -07:00

Momo

Momo is a local-first personal assistant with:

  • A CLI (momo ...)
  • A FastAPI backend + web UI
  • Tool execution with approvals
  • Memory extraction/retrieval and daily briefing generation

Quickstart

  1. Server Deployment (Docker Recommended) Use Docker Compose to run the main Momo app stack:
docker compose up -d

This starts:

  • momo-server: the FastAPI app and web frontend
  • momo-face: the face daemon process
  • momo-dozzle: optional container log viewer

The stack uses a single repo Dockerfile, and Compose reuses that one image for both momo-server and momo-face.

The server will be listening on http://localhost:8000. Dozzle is also included for container logs on the Momo host at http://127.0.0.1:9999 by default.

  1. CLI Usage (Local installation) If you want to use the momo command-line tools, create a virtualenv and install the package locally:
source activate_env.sh
pip install -e .

Then run CLI chat:

momo chat

Raspberry Pi Zero Client (Whisplay Display)

This project runs natively on a Raspberry Pi 5 serving a Chromium Web Kiosk.

Architecture

  • momo/main.py: Typer CLI entrypoint
  • momo/api/: FastAPI server and routes
  • momo/face/: face daemon backend and face controller runtime
  • momo/agent/: Agent runtime + LLM orchestration
  • momo/tools/: Tool registry and tool handlers
  • momo/connectors/: Integrations (weather, Hue, Google Calendar, Home Assistant)
  • momo/memory/: Memory journal, extraction, retrieval, OpenMemory backend
  • momo/briefing/: Daily brief generation, storage, scheduler
  • momo/web_app/: React/Vite frontend, public assets, and generated web files

Configuration

Config is loaded from profile storage and mapped into typed models in momo/config.py.

Common overrides include:

  • db_path
  • model_provider
  • model
  • voice.*
  • stt.*
  • face.*
  • home_assistant.*
  • weather.*
  • briefing.*
  • ai_hub.*

Docker / observability overrides:

  • MOMO_DOZZLE_PORT changes the published Dozzle port for the Momo host stack
  • MOMO_DOZZLE_BIND_HOST changes the bind address for Dozzle and defaults to 127.0.0.1

For appliance deployments, the same variables apply to docker-compose.appliance.yml. Set MOMO_DOZZLE_BIND_HOST=0.0.0.0 only if you intentionally want Dozzle reachable from other machines on your LAN.

The AI hub now lives in the separate momo-ai-hub repository and is expected to run as an external service configured through ai_hub.*. The current HTTP contract between the two lives in momo-ai-hub/CONTRACT.md.

Development

Preferred agent/developer setup:

make setup

This creates .venv, installs the full supported runtime extras (dev,knowledge,memory,voice), and installs web tooling when npm is available. Use Python 3.11 or 3.12 for the full runtime stack when possible. Some voice/ML dependencies do not yet install cleanly on Python 3.13.

If the full runtime dependency graph is not available on your machine, use the lean verification toolchain:

make setup-toolchain

This installs only the Python packages needed for linting, typing, migrations, and Python tests. This installs only the Python packages needed for linting, typing, migrations, and Python tests.

Primary verification commands:

make lint
make typecheck
make test-fast
make test-smoke

CI now enforces make lint-python, make typecheck, make test-fast, and make test-web.

Focused verification commands:

make typecheck-auth
make typecheck-organizer
make typecheck-email
make typecheck-knowledge
make typecheck-connectors
make typecheck-finance
make test-auth
make test-organizer
make test-email
make test-knowledge
make test-connectors
make test-finance

Manual equivalents:

pip install -e ".[dev]"

Frontend unit tests use Vitest and Playwright. You need Node 20+ available for the current web tooling and browser lane.

Frontend TypeScript Build Flow

  • Frontend source lives under momo/web_app/src/.
  • Shared public assets live under momo/web_app/public/.
  • Built bundles are emitted into momo/web_app/dist/.
  • Generated image/chart files served at /generated/ live under momo/web_app/generated/.
  • npm run build:web:app builds the Vite app under momo/web_app/.
  • npm run build:web is the production web build entrypoint used by Docker.
  • npm run lint:web runs frontend type checks plus CSS linting for the app public assets.

Docker behavior:

  • The image build runs npm ci and npm run build:web, so built web assets are present in the image automatically.
  • Compose uses one shared repo image for both momo-server and momo-face.
  • docker compose startup for momo-server does one initial npm run build:web, then starts a live Vite build watcher alongside the Python server.
  • Frontend edits inside the bind-mounted repo should rebuild momo/web_app/dist/ automatically without restarting the container.
  • Generated user-visible files persist through the bind mount at momo/web_app/generated/.

UI Regression and Browser Testing

  • npm run test:web:app runs Vitest for the web app under momo/web_app/.
  • npm run test:web:e2e runs Playwright browser tests under tests/e2e/.
  • make test-web runs the frontend unit lane.
  • make test-web-e2e runs the browser smoke lane.

Current browser smoke coverage starts with the login page so the E2E stack can be validated before the new /home route lands.

UI Debug Mode Direction

The new app scaffold includes a debug-mode seam intended for agent-assisted diagnosis. The long-term contract is:

  • stable data-testid or data-ui selectors for critical regions
  • explicit data-state markers for loading, ready, empty, and error UI
  • structured client logging for route and API failures

The login route keeps stable selectors so Playwright can smoke-test the browser stack quickly.

Email OAuth Setup

Gmail OAuth:

  • Provide a Google web OAuth client in the Momo Google config directory as credentials.json
  • Register this callback URI in Google Cloud:
    • https://momo.goinsfamily.org/v1/email/oauth/callback
  • Optional env override:
    • MOMO_EMAIL_GOOGLE_REDIRECT_URI=https://momo.goinsfamily.org/v1/email/oauth/callback

Outlook OAuth:

  • Set these env vars for momo-server:
    • MOMO_MS_EMAIL_CLIENT_ID
    • MOMO_MS_EMAIL_CLIENT_SECRET
    • optional MOMO_MS_EMAIL_TENANT (defaults to common)
    • recommended MOMO_MS_EMAIL_REDIRECT_URI=https://momo.goinsfamily.org/v1/email/oauth/callback
  • Register the same callback URI in Azure / Microsoft Entra.

Run lint and type checks manually:

npm run lint:web
ruff check momo tests scripts
mypy momo

Run all linting:

npm run lint

Run Python tests:

pytest

Run the focused smoke lane:

make test-smoke

Run web UI unit tests:

npm run test:web

Run browser smoke tests:

npm run test:web:e2e

Run both:

npm test

Forgejo Actions runs lint, type checks, a focused smoke lane, and the full Python suite (see .forgejo/workflows/ci.yml). When a push to main passes all CI jobs, Forgejo also builds and publishes the Momo container image to registry.goinsfamily.org/<owner>/<repo> with :latest, :<version>, :<version>-build.<run_number>, and :sha-<commit> tags.

Debug and repro scripts (e.g. debug_display.py, repro_latency.py) live in scripts/. Run them from the repo root, e.g. python scripts/debug_stt.py or python scripts/repro_latency.py (with the project installed: pip install -e .).

Memory Migration

Legacy local SQLite memory rows can be migrated into OpenMemory:

Dry-run:

python scripts/migrate_memory_to_openmemory.py

Apply migration:

python scripts/migrate_memory_to_openmemory.py --apply

Optional flags:

  • --db-path /path/to/momo_memory.sqlite3
  • --limit 500

Dependency Strategy

  • Core app dependencies live in pyproject.toml under [project.dependencies].
  • Optional feature stacks live under extras:
    • knowledge
    • memory
    • voice
  • Dev/test tooling lives in [project.optional-dependencies].dev.
  • Baseline pinned sets are included in requirements.lock and requirements-dev.lock.

TODO:

  • Files for Momo case need to be uploaded and then 3d printed