Ellie AI
The State-of-the-Art AI Video Analysis Agent
Upload any video, ask anything. Gemini 2.5 Flash + Whisper + React 19 + tRPC 11. Neural Noir design.
Why this exists · Capabilities · Architecture · Stack · Run Locally · Operations
Marketing landing page (built with Lovable, in the separate private repo Alexi5000/ellie-techtide): ellie-techtide.lovable.app
Why this exists
What it does. Ellie accepts a video upload (MP4, WebM, MOV, or AVI up to 100 MB), sends it to Gemini 2.5 Flash through a server-side provider gateway to produce timestamped summaries, scenes, frames, audio events, and emotions, persists those results with Drizzle and MySQL, and answers follow-up questions in a chat panel using the stored analysis as context. Voice input is transcribed with a Whisper-compatible endpoint. The browser talks to the server only through typed tRPC 11 procedures.
Who it serves. People who need to understand recorded media without scrubbing timelines by hand, and maintainers who want a small, typed React 19 + Express + tRPC reference application with environment validation, health and readiness probes, and Docker packaging already in place.
Why Alex built it. Alex Cinovoj, Founder & CTO of TechTide AI, created the repository on 2025-04-26. The first product under this name was "Ellie Voice Receptionist", an AI voice assistant for law firms (commit 1229a5d1, 2025-07-16). On 2026-02-18 the project was rebuilt as a video analysis agent (commit 306a265f, "Complete rebuild: Ellie AI Video Analysis Agent v2.0", moving from Express REST and Socket.io to tRPC 11, React 19, Vite 7, Gemini 2.5 Flash, and Whisper). The next day it was made a public, anonymous application with ephemeral browser-side chat state, rate limiting, and strict input validation (commit 12e32471, 2026-02-19). Pull request #1 (2026-05-17) hardened it for production review with readiness endpoints, environment validation, and Docker packaging. The design intent recorded in this README since that rewrite is deliberately Neural Noir: dark, cinematic, fast, and agentic without hiding the engineering underneath.
Real-world use case (2025-2026 evidence). Proposed use case. A content or training team uploads a recorded webinar, lets Ellie produce a timestamped outline, and asks "where does the presenter cover pricing?" to jump straight to the right segment. The repository contains the routes, schema, and validation for this flow and a Vitest suite that exercises input validation and the anonymous upload capability model; it does not contain recorded provider responses or golden-video fixtures, so a live Gemini run is required to confirm answer quality. Gemini 2.5 Flash became generally available in June 2025 with multimodal input and configurable thinking budgets.[^1] tRPC v11, the typed RPC layer between the browser and the Express server, shipped as stable in March 2025.[^2] The client runs on the React 19.2 line released in October 2025[^3] and is bundled with Vite 7, released in June 2025.[^4]
| Product Box | What It Does | Current Implementation |
|---|---|---|
| Video Intelligence | Converts media into summaries, scenes, frames, audio events, and emotions. | analysis.analyze calls Gemini 2.5 Flash through the LLM gateway. |
| Ask Anything Chat | Answers questions against video analysis with timestamp-aware responses. | chat.send uses browser-held history plus persisted analysis context. |
| Voice Input | Turns recorded audio into text before it enters the assistant surface. | voice.transcribe calls Whisper-compatible speech-to-text. |
| Typed Product Core | Keeps client and server contracts aligned as the agent surface evolves. | React 19 consumes an Express/tRPC 11 backend with shared TypeScript. |
| Deployment Baseline | Ships with validation scripts, Docker packaging, and health probes. | pnpm ci, Dockerfile, /api/health, /api/readiness, /api/ready. |
Capabilities
Ellie’s README is product-forward, but the repository is not a mockup. The core routes implement upload, multimodal analysis, chat, transcription, session helpers, and operational readiness endpoints.
| Surface | Route or Module | Limits and Behavior |
|---|---|---|
| Upload | video.upload |
Accepts MP4, WebM, MOV, and AVI as base64 payloads up to 100 MB. |
| Analyze | analysis.analyze |
Produces structured JSON results with type, timestamp, content, and confidence. |
| Retrieve Results | analysis.results |
Reads persisted analysis rows for a video from the Drizzle/MySQL data layer. |
| Chat | chat.send |
Answers against stored analysis context with ephemeral browser-side chat history. |
| Transcribe | voice.transcribe |
Accepts WebM, MP3, WAV, OGG, M4A, and MPEG audio up to 16 MB via Whisper. |
| System | system.* |
Exposes health and readiness signals for smoke tests and deployment probes. |
Architecture
Ellie currently uses a heavy-client, thin-orchestration backend model. The browser owns the immediate product feel and ephemeral conversation memory. The backend owns the safe boundary for uploads, storage, provider calls, persistence, rate limits, and readiness checks. This keeps the agent surface responsive while preserving a clean path to queue workers, durable conversations, and multi-tenant orchestration later.
graph LR
User["User"] --> Client["React 19 + Vite\nNeural Noir client"]
Client --> TRPC["tRPC 11\ntyped calls"]
TRPC --> Express["Express + Node\nthin orchestration"]
Express --> Storage["S3-compatible\nmedia storage"]
Express --> DB["Drizzle + MySQL\nvideo + analysis records"]
Express --> Gemini["Gemini 2.5 Flash\nmultimodal analysis + chat"]
Express --> Whisper["Whisper\nspeech-to-text"]
Express --> Ops["Health + readiness\nenv validation"]
| Boundary | Responsibility | Why It Exists |
|---|---|---|
| Client Agent UI | Upload flow, video workspace, chat state, visual feedback. | Preserves speed and keeps short-lived interaction state near the user. |
| tRPC Contract | Typed procedure calls between browser and server. | Reduces drift between frontend assumptions and backend behavior. |
| Express Runtime | Provider calls, storage writes, DB updates, rate limits, sessions. | Keeps secrets and operational state out of the browser. |
| Data Plane | Users, videos, analysis results, conversations, and messages. | Gives the product durable entities without overbuilding the first agent milestone. |
| Provider Gateway | Gemini 2.5 Flash chat/completions and Whisper transcription. | Centralizes AI access behind environment-managed credentials. |
| Operations Surface | Health, readiness, production validation, Docker packaging. | Makes the repository deployable and reviewable by maintainers. |
Stack
Ellie is TypeScript across the product boundary. The stack is modern, but intentionally familiar: React and Vite for the browser, Express and tRPC for the API, Drizzle and MySQL for persistence, and Forge-compatible provider helpers for Gemini and Whisper.
| Layer | Technology | Version or Track |
|---|---|---|
| Language | TypeScript | 5.9.3 |
| Frontend | React, React DOM, Vite | 19.3.x, 7.3.x |
| Design System | Tailwind CSS, Radix UI, framer-motion | 4.3.x, Radix primitives, 12.43.x |
| Routing + Data | wouter, TanStack Query, tRPC React Query | 3.7.1 (patched), 5.104.x, 11.19.x |
| Backend Runtime | Node.js, Express | Express 4.22.x |
| API Contract | tRPC server/client | 11.19.x |
| Database | Drizzle ORM, mysql2 | 0.45.x, 3.24.x |
| Validation | Zod | 4.6.x |
| AI + Voice | Gemini 2.5 Flash, Whisper-compatible STT | Provider-gateway configured |
| Testing + Quality | Vitest, Prettier, TypeScript compiler | 4.1.x, 3.9.x, 5.9.3 |
| Packaging | Docker, Docker Compose | Repository-defined |
| Package Manager | pnpm | 10.x (packageManager pins 10.4.1) |
Run Locally
The committed pnpm-lock.yaml is the canonical dependency graph; root npm installs are unsupported because they omit the required wouter patch. The default path is a single pnpm workflow from the repository root. Configure environment values first, install with the lockfile, then run the TypeScript server in development mode.
gh repo clone Alexi5000/Ellie
cd Ellie
pnpm install --frozen-lockfile
cp .env.example .env
pnpm validate:env
pnpm dev
| Command | Purpose |
|---|---|
pnpm dev |
Starts the development server with TypeScript watch. |
pnpm check |
Runs the TypeScript no-emit gate. |
pnpm test |
Runs the Vitest suite. |
pnpm build |
Builds the Vite client and bundles the server runtime. |
pnpm validate:env |
Checks required local environment configuration. |
pnpm validate:env:production |
Checks production-only environment requirements. |
pnpm ci |
Runs the repository validation sequence. |
pnpm start |
Runs the built production server from dist/. |
Environment
Ellie keeps secrets server-side. The browser calls typed routes; the backend talks to storage, the database, Gemini, and Whisper through environment-managed credentials.
| Variable | Required For | Notes |
|---|---|---|
DATABASE_URL |
Drizzle/MySQL persistence | MySQL-compatible connection string. |
JWT_SECRET |
Session and token signing | Must be strong in production. |
BUILT_IN_FORGE_API_URL |
Gemini and Whisper provider gateway | Base URL for chat/completions and audio transcription. |
BUILT_IN_FORGE_API_KEY |
Gemini and Whisper provider gateway | Server-side bearer credential. |
AWS_ACCESS_KEY_ID |
Optional S3-compatible storage | Used when object storage credentials are required. |
AWS_SECRET_ACCESS_KEY |
Optional S3-compatible storage | Used with the storage helper. |
AWS_REGION |
Optional S3-compatible storage | Region for the configured bucket. |
S3_BUCKET_NAME |
Optional S3-compatible storage | Target bucket for uploaded media and audio artifacts. |
Repository Map
The repository is small enough to navigate directly and structured enough to survive production hardening. The important split is simple: client/ is the experience, server/ is the orchestration boundary, shared/ is the contract surface, and drizzle/ is the data plane.
| Path | Box | What Lives There |
|---|---|---|
client/ |
Neural Noir Surface | React pages, UI components, routes, motion, and browser-side state. |
server/ |
Agent Runtime | Express server, tRPC router, LLM calls, voice transcription, storage. |
server/routers.ts |
Product API | Upload, analyze, chat, transcribe, auth, and system procedures. |
drizzle/ |
Relational Memory | Schema, migrations, and MySQL-compatible product entities. |
shared/ |
Cross-Boundary Contracts | Shared constants and typed primitives. |
scripts/ |
Release Gates | Environment validation and automation helpers. |
docs/ |
Operator Manual | Production readiness, CI/CD, testing, deployment, and standards notes. |
docs/templates/ |
Portfolio System | Reusable README template for the rest of the portfolio. |
Operations
Ellie is prepared for deployment review, not just local screenshots. The repository includes a root Dockerfile, Compose file, CI-compatible scripts, environment validation, and liveness/readiness endpoints. Some GitHub workflow checks depend on repository-level secrets and permissions, so local validation remains the authoritative green gate until those secrets are configured.
| Gate | Command or Endpoint | Expected Signal |
|---|---|---|
| Install | pnpm install --frozen-lockfile |
Lockfile-consistent dependency graph. |
| Environment | pnpm validate:env |
Required local variables are accounted for. |
| Production Env | pnpm validate:env:production |
Production-only variables are accounted for. |
| Types | pnpm check |
TypeScript passes without emitting files. |
| Tests | pnpm test |
Vitest suite completes. |
| Build | pnpm build |
Vite client and server bundle are generated. |
| Full Local Gate | pnpm ci |
Environment, types, tests, and build pass together. |
| Health | GET /api/health |
Runtime liveness response. |
| Readiness | GET /api/readiness or GET /api/ready |
Dependency-aware deployment probe. |
Product Roadmap
Ellie’s current shape is intentionally lean: strong browser experience, typed backend orchestration, persisted analysis, and real provider calls. The next step is deeper production orchestration.
| Track | Next Upgrade |
|---|---|
| Durable Conversations | Persist chat threads and add source-linked answer citations. |
| Processing Queue | Move long-running video analysis into workers with retry telemetry. |
| Signed Uploads | Replace base64 upload flow with direct-to-storage signed URLs. |
| Provider Observability | Track model, prompt version, latency, token usage, and failure mode. |
| Tenant Readiness | Add organizations, roles, audit logs, and retention policies. |
| Evaluation Harness | Add golden-video tests for scene, transcript, frame, and chat quality. |
Documentation
The root README is the front door. The rest of the documentation exists for maintainers who need setup, release, deployment, and testing detail without bloating the product narrative.
| Document | Use It For |
|---|---|
SETUP.md |
Local setup, Docker, environment, and runtime notes. |
docs/PRODUCTION_READINESS.md |
Release gates, operational status, and risk register. |
docs/README.md |
Documentation hub and source-of-truth map. |
RELEASES.md |
