Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Meo

Meo is an internal record-and-replay testing platform:

  1. A Chrome extension records tester actions on the target site.
  2. The extension uploads actions as test cases to the backend.
  3. The backend replays those cases with Playwright on a schedule.
  4. A web console lets you inspect recorded steps and replay outcomes.
  5. Failures produce artifacts and alerts.

Repository Layout

  • apps/server: Fastify API + Playwright replay engine + scheduler.
  • apps/extension: Chrome MV3 extension (recorder + popup UI).
  • apps/web: React web console for case/run monitoring.
  • packages/shared: Shared protocol types between extension and server.
  • docs/business-plan-meo.md: Business plan.
  • docs/execution-freeze-v1.md: Locked product and engineering decisions.

Prerequisites

  • Node.js 20+
  • npm 10+

Quick Start

  1. Install dependencies:
    npm install
  2. Configure backend env:
    cp apps/server/.env.example apps/server/.env
  3. Generate Prisma client and initialize database:
    npm --workspace @meo/server run prisma:generate
    npm --workspace @meo/server run prisma:migrate
  4. Start backend:
    npm run dev:server
  5. Start web console:
    npm run dev:web
  6. Build extension:
    npm run build:extension
  7. Load extension from apps/extension/dist in Chrome.

API Summary

  • GET /api/cases: list cases with step/run summary
  • POST /api/cases: create test case
  • GET /api/cases/:caseId: query case with recorded steps
  • POST /api/cases/:caseId/actions: upload recorded actions
  • POST /api/cases/:caseId/schedule: create schedule
  • GET /api/projects: list projects
  • GET /api/projects/:projectId: query project summary
  • PUT /api/projects/:projectId/login-credentials: upsert encrypted login credentials
  • GET /api/runs: list replay runs
  • POST /api/runs: trigger replay run
  • GET /api/runs/:runId: query run result

All /api/* routes require:

  • Authorization: Bearer <MEO_BEARER_TOKEN>

Input Mapping Plugins

Recorder input mapping is pluggable. Extension-side plugins decide whether an input value is stored inline or as inputValueRef.

  • Default extension plugins: apps/extension/src/input-mapping/plugins.ts
  • Default server resolver plugins: apps/server/src/lib/mask.ts
  • Shared ref format helpers: packages/shared/src/input-binding.ts

Default behavior:

  • general mode (default): sensitive fields map to secret:input.<sanitized_field_hint>
  • login mode: maps login aliases to secret:login.username, secret:login.password, secret:login.otp
  • Non-sensitive fields keep inline values in both modes

Sensitive values are encrypted and stored at project scope in database (ProjectCredential), not in env.

Configure encryption key in apps/server/.env:

MEO_SECRET_ENCRYPTION_KEY=<64-char-hex>

You can save project login credentials from:

  • Web console: Case Detail -> Project Login Credentials panel
  • API: PUT /api/projects/:projectId/login-credentials

If a referenced value is missing, replay fails with INPUT_VALUE_MISSING:secret:<KEY>.

To extend behavior, add a plugin to pluginsForMode(...) in extension mapping or to defaultInputValueResolverPlugins on server.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages