You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# 🎤 Comic Companion
> **Geolocation-based matching for open-mic performers and comedy audiences.**
>
> Find your comedy match. Swipe on local talent. Attend live events near you.
---
## What Is This?
Comic Companion is a multi-platform app (think Tinder for comedy) that connects open-mic performers with their ideal audience using geolocation-based video matching. Artists upload short comedy clips; audiences swipe to discover local talent and attend live events.
Built as a **Turborepo monorepo** — one codebase, three platforms.
---
## 🗺 Architecture
```
comic-companion/
├── apps/
│ ├── web/ Next.js 14 — Marketing site + PWA (port 3000)
│ ├── mobile/ Expo 51 — iOS & Android native app
│ └── api/ Express — REST API backend (port 4000)
└── packages/
├── shared-types/ @comic-companion/types — All TypeScript interfaces
├── video-engine/ @comic-companion/video-engine — Sliding window video queue
└── ui/ @comic-companion/ui — Shared React components
```
---
## 🚀 Quick Start
### Prerequisites
- Node.js 18+
- npm 9+
### Install
```bash
git clone comic-companion
cd comic-companion
npm install
```
### Run (all apps)
```bash
npm run dev
```
### Run individually
```bash
# Web app (marketing + PWA)
npm run dev --workspace=apps/web
# → http://localhost:3000
# API server
npm run dev --workspace=apps/api
# → http://localhost:4000/health
# Mobile (requires Expo Go on your phone)
cd apps/mobile && npx expo start
```
---
## 📦 Package Reference
### `@comic-companion/types`
All shared TypeScript interfaces. Import in any app:
```ts
import type { User, VideoContent, Match, GeoPoint } from '@comic-companion/types';
```
**Core types:** `User`, `VideoContent`, `Match`, `GeoPoint`, `SwipeAction`, `Event`, `WaitlistEntry`, `ApiResponse`, `PaginatedResponse`
---
### `@comic-companion/video-engine`
Platform-agnostic sliding window video memory manager.
```ts
import { VideoQueueManager, MockVideoAdapter } from '@comic-companion/video-engine';
const manager = new VideoQueueManager({
maxBufferSize: 5, // Never more than 5 adapters in memory
prefetchAhead: 4, // Buffer 4 videos ahead of current
adapterFactory: (videoId, src) => new YourPlatformAdapter(videoId, src),
onEvict: (videoId) => console.log(`${videoId} freed from memory`),
onFetchMore: (fromIndex) => fetchNextPage(fromIndex),
});
manager.initialize(videoFeed);
manager.scrollToIndex(2); // → automatically evicts index 0
manager.dispose(); // → destroys ALL adapters on unmount
```
**Sliding window logic:**
| User at index | Buffer | Evicted |
|---|---|---|
| 0 | [0▶, 1, 2, 3, 4] | — |
| 1 | [0, 1▶, 2, 3, 4] | — |
| 2 | [1, 2▶, 3, 4, 5] | 0 ← |
| 3 | [2, 3▶, 4, 5, 6] | 1 ← |
**Platform adapters:**
- `Html5VideoAdapter` — Web (`
About
Geolocation-based matching app connecting open-mic comedians with local audiences — swipe to discover comedy talent and live events near you. Turborepo monorepo with Next.js web app, Expo mobile app, and Express REST API.