Agora Chrome Plugin
Build a Chrome plugin example powered by Agora Conversational AI.
Recipe prompt
Paste into Cursor, Claude Code, v0, or your coding agentYou are implementing the "Agora Chrome Plugin" recipe in this project.
Read the recipe markdown first:
https://raw.githubusercontent.com/anandwana001/Agora-Meditation-Plugin/main/README.md
Use the source repository for cross-reference:
https://github.com/anandwana001/Agora-Meditation-Plugin
Build this recipe into the user's app using the markdown as the implementation guide. Inspect related source files through the repository links when the recipe points to them. Ask before installing new dependencies.Recipe
Rendered from the configured recipe markdown.
Pause with Agora
A Chrome extension for short, voice-guided workday resets powered by Agora Conversational AI.
Instead of opening another tab, another app, or another long meditation library, Pause with Agora lives in the toolbar and gets you into a guided reset in a few clicks.
Pick:
2 / 5 / 10 minprivate / shared / publiccalm / refocus / breathe / reset
Then start a session and let Agora handle the real-time voice experience.
Demo
Watch the product demo here:
Screenshots
| Setup | Preparing |
|---|---|
| !Pause with Agora setup | !Pause with Agora preparing state |
| Active Session | Transcript |
|---|---|
| !Pause with Agora active session | !Pause with Agora transcript view |
| Completion |
|---|
| !Pause with Agora completion state |
Why This Exists
Most “wellness” products are built like destinations. This one is built like an interruption-friendly ritual.
The goal is simple:
- help someone reset during a workday
- start fast
- keep the tone grounded
- work inside the browser
- feel calm without feeling overly spiritual
What It Does
Pause with Agora is a Manifest V3 Chrome extension with a deployable REST API.
The extension:
- collects the user’s intention in a compact popup
- starts a short guided voice session
- shows live session state
- displays the latest guidance/transcript
- allows ending the session at any time
The API service:
- issues Agora RTC + RTM tokens
- starts and stops the Conversational AI agent
- keeps your Agora App Certificate out of the extension bundle
Product Feel
The current UI is designed around:
- warm, meditative surfaces
- softer wellness-app pacing
- an Agora-branded visual center
- short-session focus rather than “full meditation platform” complexity
Built On Agora
This MVP does not invent a brand new Agora integration.
It deliberately reuses the integration patterns from the local reference project at:
https://github.com/AgoraIO-Conversational-AI/agent-quickstart-nextjs
Reused From The Reference Project
- Agora token generation flow with
RtcTokenBuilder.buildTokenWithRtm - server-side agent lifecycle with
AgoraClient+Agent - RTC + RTM split for browser-side audio and transcript/state events
AgoraVoiceAIinitialization and subscription flow- transcript normalization and timestamp normalization
- token renewal pattern for RTC + RTM
- idempotent stop-agent handling
- session lifecycle shape:
- generate token
- invite agent
- log into RTM
- join RTC
- publish mic
- subscribe to transcript + agent events
Adapted For Chrome Extension Constraints
- The reference Next.js route pattern was turned into a standalone deployable
api-service/ - The popup hosts the live RTC/RTM client for this MVP
- The extension keeps the UI intentionally compact and session-first
- The agent prompt was rewritten for short workday reset behavior instead of general conversation
- The extension is configured to call a remote REST API instead of depending on a local dev server
Repo Map
Pause with Agora/
├── api-service/
│ ├── app/api/
│ ├── lib/
│ ├── types/
│ └── README.md
├── public/
│ ├── agora-logo.png
│ └── manifest.json
├── src/
│ ├── lib/
│ │ ├── api.ts
│ │ ├── conversation.ts
│ │ ├── session-manager.ts
│ │ └── types.ts
│ ├── popup/
│ │ ├── App.tsx
│ │ └── styles.css
│ └── main.tsx
├── .env.example
├── LICENSE
├── index.html
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
└── vite.config.tsArchitecture
flowchart LR
U["User"] --> E["Chrome Extension Popup"]
E --> B["Deployed REST API<br/>Next.js Route Handlers"]
B --> A["Agora Conversational AI"]
E --> R["Agora RTC + RTM"]
A --> R
R --> EThe popup owns the session UX, the deployed API owns secure token and agent orchestration, and Agora handles the live real-time voice path.
Quick Start
1. Install dependencies
pnpm install2. Deploy the API service
Deploy the standalone service in `api-service/` to your preferred host.
It reuses the route structure from the Agora quickstart and exposes the same session endpoints your extension needs:
GET /api/healthGET /api/generate-agora-tokenPOST /api/invite-agentPOST /api/stop-conversation
Example API env:
NEXT_PUBLIC_AGORA_APP_ID=your_agora_app_id
NEXT_AGORA_APP_CERTIFICATE=your_agora_app_certificate
NEXT_PUBLIC_AGENT_UID=123456
AGORA_AREA=US
ALLOWED_EXTENSION_ORIGINS=chrome-extension://your_extension_id3. Add extension environment variables
Copy .env.example to .env and point the extension at your deployed API origin.
VITE_API_BASE_URL=https://your-deployed-api.example.com
VITE_AGORA_APP_ID=your_agora_app_id
VITE_AGENT_UID=123456Important:
VITE_AGORA_APP_IDshould match the same Agora App ID used by the API serviceVITE_means the value is exposed to the frontend buildNEXT_AGORA_APP_CERTIFICATEstays server-side and must never go into the extension bundleALLOWED_EXTENSION_ORIGINSshould be set on the API service so only your published extension origin can call the protected endpoints
4. Build the extension
pnpm run build5. Load it into Chrome
- Open
chrome://extensions - Turn on
Developer mode - Click
Load unpacked - Select the
distfolder
How A Session Works
- The user opens the toolbar popup.
- They pick duration, environment, and need.
- The popup requests microphone permission.
- The API returns an Agora RTC + RTM token.
- The API starts an Agora conversational agent tuned to the user’s selected intent.
- The popup joins the channel, publishes mic audio, and subscribes to agent events.
- The UI shows active session state, countdown, and transcript updates.
- The user can interrupt the guide or end the session whenever they want.
sequenceDiagram
participant User
participant Popup as Chrome Popup
participant Backend as REST API
participant Agora as Agora AI + RTC/RTM
User->>Popup: Select time, environment, need
User->>Popup: Click "Start Session"
Popup->>Popup: Request microphone permission
Popup->>Backend: Request RTC + RTM token
Backend->>Agora: Generate token context
Backend-->>Popup: Return token + channel
Popup->>Backend: Invite agent
Backend->>Agora: Start conversational agent
Backend-->>Popup: Return agent_id
Popup->>Agora: Join RTC + login RTM
Agora-->>Popup: Transcript + agent state events
User->>Agora: Speak / interrupt
Popup->>Backend: Stop session on endCurrent UX Notes
- The countdown starts when the session is actually live, not while it is still preparing
- User interruption during agent speech is supported
- The popup uses a meditation-style branded animation while the session prepares
- The UI uses the Agora logo from
public/as part of the live visual system
UI State Flow
stateDiagram-v2
[*] --> Setup
Setup --> Preparing: Start Session
Preparing --> Active: Agora connected
Preparing --> Setup: Startup error
Active --> Active: Transcript / interruptions
Active --> Completion: Timer ends
Active --> Completion: User ends session
Completion --> Setup: Start another sessionError Handling
This MVP includes explicit handling for:
- missing frontend config
- missing API-side Agora credentials
- microphone permission failures
- REST API connectivity failures
- token renewal issues
- agent/session stop cleanup
- RTM/agent signaling-level errors surfaced into popup state
Security Notes
- No secrets should ever be committed to the repo;
.envis intentionally ignored - The deployed API now validates session input, applies basic rate limiting, and can restrict access by allowed origins
- For production, set
ALLOWED_EXTENSION_ORIGINS=chrome-extension://<your_published_extension_id> - If you temporarily use
chrome-extension://*during private testing, replace it with the real extension ID before wider release
Development Commands
pnpm run build
pnpm run typecheck
pnpm run api:dev
pnpm run api:build
pnpm run api:typecheckAssumptions
- You have an Agora project with Conversational AI enabled
- Agora-managed STT, LLM, and TTS defaults are acceptable for this MVP
- You are comfortable deploying a small Next.js API service for token and agent orchestration
- English guidance is enough for the current version
Known Limitations
- The popup must stay open during the live session
- This version does not yet move RTC/RTM into an offscreen document or background-driven architecture
- The transcript view is intentionally lightweight, not a full session journal
- The bundled client is still large because Agora browser SDK packages are heavy
What A Better v2 Looks Like
- session continuity after popup close
- analytics and usage instrumentation
- better device/output controls
- improved interruption tuning
- team/workflow integrations
- Chrome Web Store polish
If You’re Evaluating The Repo
The fastest way to understand the project is:
- read
api-service/app/api/invite-agent/route.ts - read
src/lib/session-manager.ts - open the extension popup and run one session
That gives you the whole story:
- how the agent starts
- how the browser joins
- how the session state flows
- how the product is meant to feel