Conference replay, powered by the AT Protocol.
HughLou is an open-source conference video replay app. It pulls talk recordings from Streamplace VOD via the AT Protocol, threads in Bluesky discussion as comments, and gives every talk a permanent, shareable URL.
Currently serving ATmosphereConf 2026 — three days of talks on decentralized identity, social networking, data sovereignty, and the open web from Vancouver, BC.
Built for the Streamplace VOD JAM.
- Event archive structure —
/events/atmosphereconf2026/with room for future events - Browse and search all conference talks by title, speaker, or Bluesky handle
- Typeahead search — instant search-as-you-type dropdown on both event listing and watch pages
- Sort toggle — switch between newest-first and earliest-first ordering
- HLS video playback via Video.js v10 + hls.js with native Safari fallback
- Quality selector — choose video bitrate/resolution, with preference persisted across sessions
- Memory-optimized video: capped HLS buffers (30 MB), back-buffer eviction, lazy-loaded thumbnails
- Thumbnails from livestream records with async canvas-capture fallback, cached in localStorage
- Bluesky comment threads — replies to the stream post and mentions of the talk URL appear as comments
- Speaker handles auto-linked to Bluesky profiles
- Share modal — share to Bluesky, Threads, Mastodon, Reddit, LinkedIn, Facebook, WhatsApp, SMS, or via Web Share API. Includes optional timestamp sharing (
?t=parameter) - Watch Later queue — save talks for later (stored locally, no account needed)
- Live transcription — experimental browser-based transcription using the Web Speech API (see below)
- YouTube-style keyboard controls — space/k to play/pause, arrow keys to seek, m to mute, f for fullscreen, Shift+N/P for next/previous talk
- Prev/next talk navigation with breadcrumb trail
- OpenGraph and Twitter card metadata for every talk
- Brand assets page —
/brandwith downloadable logotype and icon in SVG/PNG across four variants - WCAG-compliant: skip links, focus-visible outlines, proper contrast ratios, ARIA labels, reduced-motion support
- Self-hosted fonts via
next/font— zero external font requests, no layout shift - Fully responsive with a slate-toned dark theme
- No tracking, analytics, or cookies — zero third-party scripts
HughLou has no login system or server-side user state. Everything personal is stored in your browser's localStorage:
- Watch Later queue — saved talks persist across sessions in the same browser
- Thumbnail cache — captured video frames are stored locally to avoid re-fetching
- Transcripts — generated transcripts are cached so you only need to run them once
Clear your browser data to reset everything.
The transcript feature uses the Web Speech API, a browser-native speech recognition service. It listens to your device's audio output while a talk plays and generates a time-stamped transcript in real time.
Important caveats:
- Browser support varies — works best in Chrome/Edge, limited in Firefox, not available in all browsers
- Accuracy depends on audio quality, speaker clarity, and ambient noise
- The browser may request microphone permission even though it's listening to playback audio
- Transcripts are cached locally after generation
- This is not a server-side transcription service — no audio leaves your device
- Fetches
place.stream.videorecords from the AT Protocol PDS viacom.atproto.repo.listRecords - Resolves livestream metadata (speaker names, handles, thumbnails) from linked
place.stream.livestreamrecords - Plays HLS video streams directly from the Streamplace VOD server (
vod-beta.stream.place) — no video bytes are proxied through the app - Pulls Bluesky post threads via
app.bsky.feed.getPostThreadto populate discussion
Note: Streamplace VOD is in beta. The VOD endpoint URL, XRPC method names, and response formats may change as encoding and infrastructure evolve on the stream.place side. If video playback breaks after an upstream change, check VOD_PLAYBACK_URL in src/lib/api.ts. Video AT URIs (at:// identifiers) are stable — only the playback delivery layer is subject to change.
git clone https://github.com/shellen/hughlou.git
cd hughlou
npm install
npm run devOpen http://localhost:3000 to browse and watch talks.
No environment variables or API keys required — all data is fetched from public AT Protocol endpoints.
HughLou is a standard Next.js 16 app. Deploy to any platform that supports it.
npm i -g vercel
vercelOr connect your GitHub repo at vercel.com/new for automatic deploys on push.
The repo includes a netlify.toml config. Connect your GitHub repo at app.netlify.com or deploy via CLI:
npm i -g netlify-cli
netlify deploy --build --prodnpm run build
npx wrangler pages deploy .next --project-name hughlouOr connect your GitHub repo in the Cloudflare dashboard with:
- Build command:
npm run build - Build output directory:
.next - Node.js version: 20+
You may need the @cloudflare/next-on-pages adapter for full Next.js compatibility.
npm run build
npm startRuns on port 3000 by default. Put behind nginx, Caddy, or any reverse proxy.
- Next.js 16 with App Router and Turbopack
- TypeScript in strict mode
- Tailwind CSS v4 for styling (slate dark theme)
- Video.js v10 + hls.js for HLS video playback with quality selection
- Fuse.js for client-side fuzzy search
- AT Protocol for data (via XRPC — no SDK required)
- Bluesky API for threaded comments
- Web Speech API for experimental transcription
- Font Awesome for share modal icons
src/
app/
layout.tsx # Shell: header, footer, skip links, self-hosted fonts
page.tsx # Redirect to current event
globals.css # Tailwind + custom props + a11y styles
opengraph-image.tsx # Dynamic OG image generation
events/atmosphereconf2026/
layout.tsx # Event SEO metadata
page.tsx # Event listing: talk grid, search, sort, day grouping
api/
bsky/route.ts # Proxy for Bluesky public API (getPostThread)
brand/
page.tsx # Brand assets page (server metadata)
BrandClient.tsx # Logotype, icon variants, download helpers
watch/[rkey]/
page.tsx # Server wrapper with generateMetadata
WatchClient.tsx # Watch: player, breadcrumb, actions, comments
components/
VideoCard.tsx # Talk card (grid + compact sidebar variants)
VideoPlayer.tsx # Video.js + hls.js player with quality selector
QualitySelector.tsx # Bitrate/resolution picker overlay
ShareModal.tsx # Multi-platform share dialog with timestamp support
HeaderSearch.tsx # Typeahead search dropdown
BlueskyComments.tsx # Threaded Bluesky discussion
TranscriptPanel.tsx # Experimental Web Speech API transcription
WatchLaterButton.tsx # Watch Later toggle
WatchLaterQueue.tsx # Sidebar queue of saved talks
hooks/
useWatchLater.ts # React hooks for Watch Later state
lib/
api.ts # AT Protocol data fetching, parsing, formatting
bluesky.ts # Bluesky thread + search comment aggregation
thumbnails.ts # Async canvas-based thumbnail capture + caching
transcription.ts # Web Speech API service
talks.ts # Fuse.js search over pre-built talk index
watchLater.ts # Watch Later localStorage management
gradients.ts # Deterministic gradient generation from titles
data/
talks.json # Pre-built static talks index (generated at build)
HughLou is built to replay Streamplace-powered conferences. To add a new event:
- Create a new route at
src/app/events/yourconf2027/ - Update
REPO_DIDinsrc/lib/api.tsto the DID of the Streamplace account that recorded the conference - Update
DAY_LABELSwith the conference dates - Update the redirect in
src/app/page.tsxto point to the new event - Update branding in
src/app/layout.tsx
Previous events remain accessible at their original URLs as archives.
Tangled is a git collaboration platform built on the AT Protocol. To mirror your repo there:
- Sign in at tangled.org with your AT Protocol identity (Bluesky handle works)
- Create a new repository
- Add Tangled as a remote and push:
git remote add tangled https://tangled.org/<your-handle>/hughlou.git git push tangled main
This project was built for the Streamplace VOD JAM.
- Public endpoint: hughlou.com
- Source: github.com/shellen/hughlou
- License: MIT
This project was built with the assistance of Claude (Anthropic) via Claude Code.
MIT — see LICENSE
A @shellen.com project. Powered by Streamplace.