···8585 <div className="space-y-7 md:space-y-10" aria-busy={loading}>
8686 <header className="space-y-2">
8787 <h1 className="text-2xl font-semibold text-text">Streamplace VOD Browser</h1>
8888- <p className="text-sm text-muted">All discovered repos, newest first.</p>
8888+ <p className="text-sm text-muted">Browse every discovered Streamplace VOD, sorted newest first.</p>
8989 </header>
90909191 {loading ? (
···9898 {!loading && error ? (
9999 <ErrorPanel
100100 title="Unable to load talks"
101101- message="The app could not fetch records from discovered Streamplace repos. Check your connection and retry."
101101+ message="We couldn't load videos from Streamplace repos right now. Check your connection, then try again."
102102 onRetry={refresh}
103103 />
104104 ) : null}
···141141 </summary>
142142 <div className="mt-3 space-y-3">
143143 <p className="text-sm text-muted">
144144- {sourceRepos.length} repo{sourceRepos.length === 1 ? '' : 's'} with{' '}
144144+ Found {sourceRepos.length} repo{sourceRepos.length === 1 ? '' : 's'} publishing{' '}
145145 <code>place.stream.video</code> records.
146146 </p>
147147 <div className="flex flex-wrap gap-2">
···155155 ))}
156156 </div>
157157 <p className="text-xs text-muted">
158158- AtmosphereConf official repo contributes {atmosphereCount} video
158158+ The official AtmosphereConf repo currently contributes {atmosphereCount} video
159159 {atmosphereCount === 1 ? '' : 's'}.
160160 </p>
161161 </div>
+7-7
src/pages/search-page.tsx
···252252 type="search"
253253 value={query}
254254 onChange={onQueryChange}
255255- placeholder="Search by title, tags, or topics"
255255+ placeholder="Search titles, tags, and topics"
256256 className="h-11 w-full bg-transparent text-sm text-text outline-none placeholder:text-muted"
257257 autoComplete="off"
258258 />
···261261 {!loading && !error && trimmedQuery ? (
262262 <section className="rounded-lg border border-line/45 bg-surface/80 p-4 text-xs text-muted">
263263 <p>
264264- Search blends semantic ranking for all Streamplace VODs with richer AtmosphereConf tags/topics.
264264+ Results combine semantic ranking for all Streamplace VODs with richer AtmosphereConf metadata.
265265 </p>
266266- {remoteLoading ? <p className="mt-2">Ranking query...</p> : null}
266266+ {remoteLoading ? <p className="mt-2">Ranking results...</p> : null}
267267 {!remoteLoading && remoteMode ? (
268268 <p className="mt-2">
269269- Mode: {remoteMode === 'semantic' ? 'semantic embeddings' : 'lexical fallback'}
269269+ Search mode: {remoteMode === 'semantic' ? 'semantic embeddings' : 'keyword fallback'}
270270 </p>
271271 ) : null}
272272 {!remoteLoading && remoteNotice ? <p className="mt-2">{remoteNotice}</p> : null}
273273 {!remoteLoading && remoteGeneratedAt ? (
274274 <p className="mt-2">
275275- Index snapshot: {new Date(remoteGeneratedAt).toLocaleString()}
275275+ Index updated: {new Date(remoteGeneratedAt).toLocaleString()}
276276 {remoteIndexedCount !== null ? ` (${remoteIndexedCount} embedded videos)` : ''}
277277 </p>
278278 ) : null}
···305305 {!loading && error ? (
306306 <ErrorPanel
307307 title="Search unavailable"
308308- message="Talk metadata failed to load, so live filtering is temporarily unavailable."
308308+ message="We couldn't load video metadata, so search is temporarily unavailable. Please try again."
309309 onRetry={refresh}
310310 />
311311 ) : null}
···314314 <section className="rounded-lg border border-line/45 bg-surface/80 p-5">
315315 <h3 className="text-base font-semibold text-text">No results</h3>
316316 <p className="mt-2 text-sm leading-relaxed text-muted">
317317- Try a different keyword or remove filters to explore all talks.
317317+ Try a different search term, or clear your query to browse everything.
318318 </p>
319319 </section>
320320 ) : null}
+6-6
src/pages/tag-page.tsx
···1818 if (!tag) {
1919 return (
2020 <ErrorPanel
2121- title="Invalid tag"
2222- message="This tag route is not valid."
2323- onRetry={refresh}
2424- />
2121+ title="Invalid tag"
2222+ message="That tag link isn't valid. Go back to Search and pick a tag again."
2323+ onRetry={refresh}
2424+ />
2525 )
2626 }
2727···4747 {!loading && error ? (
4848 <ErrorPanel
4949 title="Tag view unavailable"
5050- message="Talk metadata failed to load, so tag filtering is temporarily unavailable."
5050+ message="We couldn't load video metadata, so tag filtering is temporarily unavailable."
5151 onRetry={refresh}
5252 />
5353 ) : null}
···5656 <section className="rounded-lg border border-line/45 bg-surface/80 p-5">
5757 <h2 className="text-base font-semibold text-text">No talks for this tag</h2>
5858 <p className="mt-2 text-sm leading-relaxed text-muted">
5959- Try a different tag from the search page.
5959+ Try another tag from Search.
6060 </p>
6161 </section>
6262 ) : null}
+11-9
src/pages/video-page.tsx
···208208 }, [resolvedUri, reloadToken])
209209210210 const onRetryPlayback = useCallback(() => {
211211+ hapticTap()
211212 setReloadToken((token) => token + 1)
212213 }, [])
213214···304305 const onTouchEnd = () => {
305306 const distance = latestY - startY
306307 if (distance > 120) {
308308+ hapticBack()
307309 navigate(-1)
308310 }
309311 }
···427429 return (
428430 <ErrorPanel
429431 title="Invalid video link"
430430- message="This link is missing a valid AT URI."
432432+ message="This video link is missing required information. Go back and open the video again."
431433 onRetry={() => navigate('/')}
432434 />
433435 )
···436438 if (!talk && (talksLoading || metadataLoading)) {
437439 return (
438440 <section className="rounded-lg border border-line/45 bg-surface/80 p-5">
439439- <p className="text-sm text-muted">Loading video metadata...</p>
441441+ <p className="text-sm text-muted">Loading video details...</p>
440442 </section>
441443 )
442444 }
···445447 return (
446448 <ErrorPanel
447449 title="Talk not found"
448448- message="This video could not be located in the conference catalog."
450450+ message="We couldn't find this video in the current catalog. It may have been removed or moved."
449451 onRetry={() => navigate('/')}
450452 />
451453 )
···487489 <div className="mt-4">
488490 <ErrorPanel
489491 title="Playback failed"
490490- message={error ?? 'The video playlist could not be loaded.'}
492492+ message={error ?? "We couldn't load this video's playlist."}
491493 onRetry={onRetryPlayback}
492494 />
493495 </div>
···499501 </p>
500502 ) : null}
501503502502- <div className="flex flex-wrap items-center gap-3 text-sm text-muted">
504504+ <div className="grid gap-3 text-sm text-muted sm:grid-cols-[auto,1fr,auto] sm:items-center">
503505 <Button variant="secondary" onClick={onTogglePlay}>
504506 Play / Pause
505507 </Button>
···507509 {playbackElapsed} / {playbackTotal}
508510 </p>
509511510510- <label className="flex min-h-11 min-w-[12rem] flex-1 items-center gap-2">
512512+ <label className="flex min-h-11 min-w-0 items-center gap-2 sm:col-span-3">
511513 <span className="sr-only">Seek timeline</span>
512514 <input
513515 type="range"
···521523 />
522524 </label>
523525524524- <label className="flex min-h-11 items-center gap-2">
526526+ <label className="flex min-h-11 items-center gap-2 sm:justify-self-end">
525527 <span>Speed</span>
526528 <select
527529 value={playbackRate}
···545547 className="inline-flex min-h-11 items-center gap-2 rounded-lg border border-line/60 bg-surface/80 px-3 text-sm text-text transition hover:bg-surface/90"
546548 >
547549 <ArrowDownToLine className="h-4 w-4" />
548548- Download HLS Playlist
550550+ Download playlist (.m3u8)
549551 </a>
550552 ) : null}
551553···556558 className="inline-flex min-h-11 items-center gap-2 rounded-lg border border-line/60 bg-surface/80 px-3 text-sm text-text transition hover:bg-surface/90"
557559 >
558560 <ArrowDownToLine className="h-4 w-4" />
559559- Download Source MP4
561561+ Download source MP4
560562 </a>
561563 ) : null}
562564 </div>