mogo-robot-main
mogo-robot-main is a multi-target Mogo project for developers working on its web application, Android host, device-side firmware, or the separate Shutter Experience OS runtime. The primary web application uses React 19, React Router, and Vinext on Cloudflare Workers.
Orientation
Choose the target that matches the boundary you plan to change. The Expo configuration names the Android app “Mogo Robot” with package com.mogorobot.app; device firmware and Shutter are separate runtime targets. Their presence in the project does not establish that they are installed, deployed, connected, or launched together.
The app has distinct browser, server, worker, and Expo compositions. Useful landmarks include mogo-src/main.tsx and mogo-src/app/App.tsx for one browser root, worker/index.ts for the worker request boundary, and Mogo Robot/app/_layout.tsx for Expo composition. Check the target workspace and build entrypoint before attributing behavior to a particular target.
Local web setup
For web development, use Node.js >=22.13.0, npm, and a Linux-compatible shell. The repository pins Node 22.13.0 in .nvmrc.
From the repository root:
npm ci
npm run dev
The dev script sets WRANGLER_LOG_PATH=.wrangler/wrangler.log and invokes Vite.
Before relying on voice chat locally, check whether .dev.vars exists and configure the server-only GEMINI_API_KEY; .dev.vars.example is a template, not proof that the local file is present. The documented chat flow also checks access conditions, including voice-AI consent and, in some cases, child-data-policy confirmation.
Core flows
Activity discovery: In the web app, the creative showcase and tablet launcher use the featured-program subset. Filtering requires both a matching category (or the all category, الكل) and an empty search or a match in the item’s name or description. Catalog routes passed to navigation are handoffs, not proof that destinations are registered.
Accounts and child access: Authentication establishes a session role. Child credentials add an ownership check: the child record must belong to the authenticated user. A role alone does not establish ownership.
Conversation: The chat handler authenticates the request, validates the child and message, checks access, and assembles child-specific context before calling the Gemini conversation generator. Memory is queried only with long-term-memory consent and is limited to approved, non-sensitive, unexpired records. The source-defined flow does not guarantee that a deployed request reaches Gemini or succeeds.
Robot motion: The movement panel sends requests through robotBridge to the native WebView and then to RobotController. A request requires connected state and passes controller checks before dispatch. Source-defined dispatch does not confirm physical movement; verify the connected device when testing motion.
First contribution
Start with one focused assertion in an existing test case. For example, tests/reminder-time.test.mjs contains clock-normalization checks. Add an assertion whose expected result follows from the change’s acceptance criteria.
From the repository directory containing package.json, the testing guidance requires all three commands before merge:
npm run test:source
npm test
npm run lint:baseline
npm test runs the build first and then the test runner. To verify a regression assertion, run the relevant test command against the unchanged behavior and confirm it fails; make the correction, rerun the command, and confirm it passes.
Documentation map
- Start Here › Choose Your Runtime
- Start Here › Local Web Readiness
- Runtime Architecture › Application Composition
- Learning and Family › Learning Journey › Activity Discovery
- Learning and Family › Family State › Accounts and Child Access
- Companion Intelligence › Conversation Access › Conversation Flow
- Control and Administration › Capability Lifecycle › Capability Definition
- Robot Integration › Local Robot Control › Motion Command Flow
- Change and Deliver › First Regression Contribution