A livechat media viewer powered by yt-dlp and gallery-dl.
EnoughLinkEnough listens to a Kick (for now) chat, captures media links, resolves direct image/video URLs, and displays them in a focused viewer so you do not have to keep opening tabs.
- Kick chat connection with reconnect
- Image and video preview panel
- yt-dlp based video resolving
- gallery-dl based gallery and social media resolving
- Direct media, Open Graph, TikTok oEmbed, and Instagram oEmbed fallbacks
- Local NSFW risk warning based on thumbnail/image analysis
- Session and permanent sender block list
- Turkish and English UI
- Node.js 20 or newer
- npm
- Python 3.10 or newer
- gallery-dl available in PATH
yt-dlp is installed through the youtube-dl-exec npm package. gallery-dl is intentionally not vendored in this repository.
pipx install gallery-dlpython -m pip install --user gallery-dlnpm install
npm run devOpen http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Starts Next.js with Turbopack |
npm run dev:webpack |
Starts the webpack fallback dev server |
npm run lint |
Runs ESLint |
npm run typecheck |
Runs TypeScript without emit |
npm run build |
Creates a production build |
npm run start |
Starts the production server |
The dev server uses Turbopack by default. next.config.ts sets Turbopack's plugin runtime to workerThreads so Windows does not keep spawning separate node.exe child processes during plugin evaluation.
If a Next.js regression still appears on your machine, use:
npm run dev:webpack| Name | Description |
|---|---|
GALLERY_DL_PATH |
Custom gallery-dl executable path if it is not available as gallery-dl in PATH |
INSTAGRAM_OEMBED_TOKEN |
Enables Instagram oEmbed fallback |
NSFW_FLAG_THRESHOLD |
Default server-side risk threshold from 1 to 100 |
MEDIA_COMMAND_CONCURRENCY |
Maximum concurrent extractor commands |
YTDLP_COOKIES_PATH |
Optional yt-dlp cookies file path for hosts that require auth |
YTDLP_COOKIES_BASE64 |
Optional base64-encoded Netscape cookies file content for serverless hosts |
Browser cookie extraction is not supported on serverless hosts; use YTDLP_COOKIES_BASE64 instead.
src/
app/
api/media/route.ts HTTP route only
globals.css app styling
layout.tsx root layout and fonts
page.tsx client UI
lib/media/
commands.ts external command runner
config.ts extractor and cache configuration
proxy.ts media proxy token cache
resolver.ts resolver pipeline
settings.ts request option normalization
types.ts shared media types
url.ts URL, headers, and fetch helpers
extractors/
direct.ts
gallery.ts
oembed.ts
open-graph.ts
ytdlp.ts
i18n.ts translations
public/
logo.svg
Powered by yt-dlp and gallery-dl.
MIT