TypeType is a self-hostable video app for YouTube, NicoNico and BiliBili.
It is not only a web UI. This repository contains the TypeType web client and the deployment files for running the full stack: frontend, Kotlin API backend, PostgreSQL, Dragonfly, media proxying, token service, downloader service and Garage-backed download storage.
Install and start the stack with one command:
curl -fsSL https://raw.githubusercontent.com/Priveetee/TypeType/main/scripts/install-stack.sh | bashThe installer creates ~/typetype-stack, generates local downloader credentials, selects available ports when defaults are busy, starts the services, and bootstraps Garage.
After install:
cd ~/typetype-stack
docker compose ps
curl -fsS http://localhost:8080/healthOpen the web app:
http://localhost:8082
Default local endpoints:
| Service | URL |
|---|---|
| Web app | http://localhost:8082 |
| API backend | http://localhost:8080 |
| Token service | http://localhost:8081 |
| Garage S3 | http://localhost:3900 |
Download the stack files without starting Docker:
curl -fsSL https://raw.githubusercontent.com/Priveetee/TypeType/main/scripts/install-stack.sh | bash -s -- --download-only| YouTube | NicoNico | BiliBili |
|---|---|---|
![]() |
![]() |
| YouTube | NicoNico | BiliBili |
|---|---|---|
![]() |
![]() |
| Save to playlist | Download formats | NicoNico danmaku |
|---|---|---|
![]() |
![]() |
| Playlists | History | Import |
|---|---|---|
![]() |
![]() |
![]() |
| Channel | Settings |
|---|---|
![]() |
![]() |
Subscriptions:
Import and settings flow:
Mobile layout:
| Home | Search | Watch |
|---|---|---|
![]() |
![]() |
![]() |
- Plays YouTube, NicoNico and BiliBili videos from a self-hosted web app.
- Stores history, subscriptions, playlists, favorites, watch later, progress and settings on your own instance.
- Searches, loads trending feeds, shows comments and opens channel pages through the backend API.
- Proxies media when direct browser playback is unreliable or provider-specific headers are needed.
- Generates DASH manifests when separate audio/video streams are available.
- Imports YouTube Takeout data and PipePipe backup data.
- Runs download jobs through a separate downloader service.
- Not a hosted SaaS.
- Not a YouTube-only frontend clone.
- Not a fork of Piped, FreeTube, LibreTube, Invidious or NewPipe.
- Not a browser-side extractor. Extraction stays behind the HTTP API boundary.
- Not affiliated with YouTube, NicoNico, BiliBili or any upstream video platform.
| Role | Project |
|---|---|
| Web client | React, TypeScript, Vite, TanStack Router, TanStack Query, Tailwind CSS |
| API backend | Kotlin, Ktor, PipePipeExtractor |
| User data | PostgreSQL |
| Extraction cache | Dragonfly |
| Media proxy | TypeType-Server |
| Token service | TypeType-Token |
| Downloader | TypeType-Downloader |
| Download storage | Garage S3 |
| Deployment | Docker Compose |
Run these after the stack is up.
Health:
curl -fsS http://localhost:8080/healthYouTube search:
curl -fsS "http://localhost:8080/search?q=lofi&service=0"NicoNico suggestions:
curl -fsS "http://localhost:8080/suggestions?query=miku&service=6"BiliBili trending:
curl -fsS "http://localhost:8080/trending?service=5"YouTube stream extraction:
curl -fsS "http://localhost:8080/streams?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdQw4w9WgXcQ"NicoNico stream extraction:
curl -fsS "http://localhost:8080/streams?url=https%3A%2F%2Fwww.nicovideo.jp%2Fwatch%2Fsm9"Create a guest session for protected user-data endpoints:
curl -fsS -X POST http://localhost:8080/auth/guestUse the returned token as a bearer token, or let Python extract it:
TOKEN="$(curl -fsS -X POST http://localhost:8080/auth/guest | python3 -c 'import json,sys; print(json.load(sys.stdin)["token"])')"
curl -fsS http://localhost:8080/settings -H "Authorization: Bearer ${TOKEN}"Service IDs:
| Service | ID |
|---|---|
| YouTube | 0 |
| BiliBili | 5 |
| NicoNico | 6 |
The installer is recommended. If you want to run from a cloned repository instead:
git clone https://github.com/Priveetee/TypeType.git
cd TypeType
cp .env.example .env
./scripts/setup-stack.shManual Docker Compose flow:
cp .env.example .env
docker compose pull
docker compose up -d
./scripts/bootstrap-garage.sh
docker compose psIf you do the manual flow, edit .env before exposing the stack outside localhost. In particular, replace the downloader S3 access key and secret key values.
Update the whole stack:
cd ~/typetype-stack
docker compose pull
docker compose up -d --force-recreate
docker compose psUpdate only the web client:
cd ~/typetype-stack
docker compose pull typetype
docker compose up -d --force-recreate --no-deps typetypeInstall dependencies:
bun installCreate the frontend environment file:
cp apps/web/.env.example apps/web/.envSet the API URL:
VITE_API_URL=http://localhost:8080Run the dev server:
bun run devOpen:
http://localhost:5173
Checks:
bun run check
bun run build
bun run knip
bun run sherif- TypeType contains the web client and deployment stack.
- TypeType-Server is the Kotlin/Ktor API backend.
- TypeType-Downloader handles download jobs and artifacts.
- TypeType-Token provides YouTube PO tokens.
Clone the source repositories directly:
git clone https://github.com/Priveetee/TypeType.git
git clone https://github.com/Priveetee/TypeType-Server.git
git clone https://github.com/Priveetee/TypeType-Downloader.git
git clone https://github.com/Priveetee/TypeType-Token.gitTypeType is usable, but it is still young. Video providers change frequently, and provider-specific extraction, signed URLs, manifests, headers, range requests and cache TTLs can break over time.
The clean boundary is HTTP. The web client talks to the API; extraction stays in TypeType-Server.
TypeType is a clean rewrite, but its direction was shaped by existing open-source video clients and extractor projects.
- PipePipe and PipePipeExtractor for multi-service extraction behavior.
- Piped for UX and API pattern references.
- FreeTube for video player behavior references.
This repository is MIT licensed. See LICENSE.
TypeType-Server is GPLv3 because it uses PipePipeExtractor.




















