# moulendrabalaji/scrybe.io-text-and-video-analyzer architecture

> Architecture diagram of the GitHub repository moulendrabalaji/scrybe.io-text-and-video-analyzer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/moulendrabalaji/scrybe.io-text-and-video-analyzer
- Repository: https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer

## Overview

Scrybe is an AI speech and presentation evaluation platform. A user records or uploads an answer in the workspace; the API coordinates media processing, transcription, visual analysis, similarity scoring, and rubric feedback, then saves the evaluation for review. The product also supports question practice, progress and history views, invite-based candidate submissions, and account management. The README documents the evaluation capabilities and integrations; some subsystem wiring is represented at directory level because its implementation was not sampled.

Main entry points: [`Frontend/src/services/api.js`](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/services/api.js) (REST client), [`Backend/services/evaluation_service.py`](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/services/evaluation_service.py) (Evaluation service), [`Backend/pipeline/evaluator.py`](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/pipeline/evaluator.py) (Evaluation orchestrator), [`Backend/app.py`](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/app.py) (FastAPI routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Frontend experience"]
  node_workspace["Practice workspace<br/>[Workspace.jsx]"]
  node_candidate["Invite response"]
  node_history["History and progress<br/>[History.jsx]"]
  node_questions["Question library"]
  node_invites["Invite management<br/>[Invites.jsx]"]
  node_profile["Account profile<br/>[Profile.jsx]"]
  node_authstore["Session state<br/>[useAuthStore.js]"]
  node_api_client["REST client<br/>[api.js]"]
  node_socket_client["Realtime client<br/>[socket.js]"]
end

subgraph group_api["API and services"]
  node_backend["FastAPI routes<br/>[app.py]"]
  node_auth_service["Authentication<br/>[auth_service.py]"]
  node_eval_service["Evaluation service"]
end

subgraph group_evaluation["Evaluation pipeline"]
  node_evaluator["Evaluation orchestrator<br/>[evaluator.py]"]
  node_media["Media extraction"]
  node_transcription["Speech transcription<br/>[speech_to_text.py]"]
  node_similarity["Answer similarity"]
  node_visual["Visual analysis<br/>[frame_analyzer.py]"]
  node_feedback["Rubric and feedback"]
end

subgraph group_persistence["Persistence"]
  node_query_repo["Evaluation records"]
  node_question_repo["Question records"]
  node_invite_repo["Invite records"]
  node_user_repo["User records<br/>[user_repository.py]"]
  node_database[("Application database<br/>[setup.py]")]
end

subgraph group_external["AI integrations"]
  node_whisper{{"OpenAI Whisper"}}
  node_vision_llm{{"Gemini vision"}}
  node_feedback_llm{{"Feedback LLM"}}
end

node_user(("Learner or candidate"))

node_user -->|"records answer"| node_workspace
node_user -->|"submits response"| node_candidate
node_workspace -->|"uploads media"| node_api_client
node_candidate -->|"submits media"| node_api_client
node_history -->|"requests records"| node_api_client
node_questions -->|"requests prompts"| node_api_client
node_invites -->|"manages invites"| node_api_client
node_profile -->|"updates account"| node_api_client
node_authstore -->|"authenticates"| node_api_client
node_api_client -->|"sends requests"| node_backend
node_workspace -->|"opens live session"| node_socket_client
node_socket_client -->|"connects WebSocket"| node_backend
node_backend -->|"pushes updates"| node_socket_client
node_backend -->|"handles auth"| node_auth_service
node_auth_service -->|"reads and writes users"| node_user_repo
node_backend -->|"dispatches evaluation"| node_eval_service
node_eval_service -->|"evaluates media"| node_evaluator
node_evaluator -->|"extracts audio and frames"| node_media
node_evaluator -->|"transcribes audio"| node_transcription
node_transcription -.->|"transcribes speech"| node_whisper
node_evaluator -->|"scores answer match"| node_similarity
node_evaluator -->|"analyzes frames"| node_visual
node_visual -.->|"analyzes visuals"| node_vision_llm
node_evaluator -->|"builds rubric feedback"| node_feedback
node_feedback -.->|"generates feedback"| node_feedback_llm
node_eval_service -->|"saves evaluation"| node_query_repo
node_backend -->|"serves questions"| node_question_repo
node_eval_service -->|"manages questions"| node_question_repo
node_eval_service -->|"manages invites"| node_invite_repo
node_eval_service -->|"reads history and trends"| node_query_repo
node_query_repo -->|"reads and writes"| node_database
node_question_repo -->|"reads and writes"| node_database
node_invite_repo -->|"reads and writes"| node_database
node_user_repo -->|"reads and writes"| node_database

click node_workspace "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Workspace.jsx"
click node_candidate "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/CandidateInvite.jsx"
click node_history "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/History.jsx"
click node_questions "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/QuestionLibrary.jsx"
click node_invites "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Invites.jsx"
click node_profile "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Profile.jsx"
click node_authstore "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/stores/useAuthStore.js"
click node_api_client "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/services/api.js"
click node_socket_client "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/services/socket.js"
click node_backend "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/app.py"
click node_auth_service "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/services/auth_service.py"
click node_eval_service "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/services/evaluation_service.py"
click node_evaluator "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/pipeline/evaluator.py"
click node_media "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/tree/main/Backend/pipeline"
click node_transcription "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/pipeline/speech_to_text.py"
click node_similarity "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/models/similarity_model.py"
click node_visual "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/utils/frame_analyzer.py"
click node_feedback "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/tree/main/Backend/utils"
click node_query_repo "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/query_repository.py"
click node_question_repo "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/question_repository.py"
click node_invite_repo "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/invite_repository.py"
click node_user_repo "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/user_repository.py"
click node_database "https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/database/setup.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_workspace,node_candidate,node_history,node_questions,node_invites,node_profile,node_authstore,node_api_client,node_socket_client toneBlue
class node_backend,node_auth_service,node_eval_service toneAmber
class node_evaluator,node_media,node_transcription,node_similarity,node_visual,node_feedback toneMint
class node_query_repo,node_question_repo,node_invite_repo,node_user_repo,node_database toneRose
class node_whisper,node_vision_llm,node_feedback_llm,node_user toneIndigo
```

## Components

### Frontend experience

- [Practice workspace](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Workspace.jsx): `Frontend/src/pages/Workspace.jsx`
- [Invite response](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/CandidateInvite.jsx): `Frontend/src/pages/CandidateInvite.jsx`
- [History and progress](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/History.jsx): `Frontend/src/pages/History.jsx`
- [Question library](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/QuestionLibrary.jsx): `Frontend/src/pages/QuestionLibrary.jsx`
- [Invite management](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Invites.jsx): `Frontend/src/pages/Invites.jsx`
- [Account profile](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/pages/Profile.jsx): `Frontend/src/pages/Profile.jsx`
- [Session state](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/stores/useAuthStore.js): `Frontend/src/stores/useAuthStore.js`
- [REST client](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/services/api.js): `Frontend/src/services/api.js`
- [Realtime client](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Frontend/src/services/socket.js): `Frontend/src/services/socket.js`

### API and services

- [FastAPI routes](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/app.py): `Backend/app.py`
- [Authentication](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/services/auth_service.py): `Backend/services/auth_service.py`
- [Evaluation service](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/services/evaluation_service.py): `Backend/services/evaluation_service.py`

### Evaluation pipeline

- [Evaluation orchestrator](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/pipeline/evaluator.py): `Backend/pipeline/evaluator.py`
- [Media extraction](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/tree/main/Backend/pipeline): `Backend/pipeline`
- [Speech transcription](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/pipeline/speech_to_text.py): `Backend/pipeline/speech_to_text.py`
- [Answer similarity](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/models/similarity_model.py): `Backend/models/similarity_model.py`
- [Visual analysis](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/utils/frame_analyzer.py): `Backend/utils/frame_analyzer.py`
- [Rubric and feedback](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/tree/main/Backend/utils): `Backend/utils`

### Persistence

- [Evaluation records](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/query_repository.py): `Backend/repositories/query_repository.py`
- [Question records](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/question_repository.py): `Backend/repositories/question_repository.py`
- [Invite records](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/invite_repository.py): `Backend/repositories/invite_repository.py`
- [User records](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/repositories/user_repository.py): `Backend/repositories/user_repository.py`
- [Application database](https://github.com/moulendrabalaji/scrybe.io-text-and-video-analyzer/blob/main/Backend/database/setup.py): `Backend/database/setup.py`

### AI integrations

- **OpenAI Whisper**
- **Gemini vision**
- **Feedback LLM**

### Other components

- **Learner or candidate**

## Connections

- Learner or candidate → Practice workspace: records answer
- Learner or candidate → Invite response: submits response
- Practice workspace → REST client: uploads media
- Invite response → REST client: submits media
- History and progress → REST client: requests records
- Question library → REST client: requests prompts
- Invite management → REST client: manages invites
- Account profile → REST client: updates account
- Session state → REST client: authenticates
- REST client → FastAPI routes: sends requests
- Practice workspace → Realtime client: opens live session
- Realtime client → FastAPI routes: connects WebSocket
- FastAPI routes → Realtime client: pushes updates
- FastAPI routes → Authentication: handles auth
- Authentication → User records: reads and writes users
- FastAPI routes → Evaluation service: dispatches evaluation
- Evaluation service → Evaluation orchestrator: evaluates media
- Evaluation orchestrator → Media extraction: extracts audio and frames
- Evaluation orchestrator → Speech transcription: transcribes audio
- Speech transcription → OpenAI Whisper: transcribes speech
- Evaluation orchestrator → Answer similarity: scores answer match
- Evaluation orchestrator → Visual analysis: analyzes frames
- Visual analysis → Gemini vision: analyzes visuals
- Evaluation orchestrator → Rubric and feedback: builds rubric feedback
- Rubric and feedback → Feedback LLM: generates feedback
- Evaluation service → Evaluation records: saves evaluation
- FastAPI routes → Question records: serves questions
- Evaluation service → Question records: manages questions
- Evaluation service → Invite records: manages invites
- Evaluation service → Evaluation records: reads history and trends
- Evaluation records → Application database: reads and writes
- Question records → Application database: reads and writes
- Invite records → Application database: reads and writes
- User records → Application database: reads and writes
