Home
Softono
NoBuf

NoBuf

Open source TypeScript
13
Stars
0
Forks
0
Issues
0
Watchers
1 week
Last Commit

About NoBuf

Zero-buffer video player powered by Telegram channels. Streams via MSE with continuous prebuffering β€” playback never stalls, even on seeks. Your channels become a video library with unlimited free storage.

Platforms

Web Self-hosted Cloud

Languages

TypeScript

NoBuf

Zero-buffer video streaming. Powered by Telegram.

An open-source desktop player that streams video from Telegram channels
with continuous prebuffering β€” so playback never stalls, even on seeks.

v0.4.1 License: MIT Platform CI Made with Tauri Built with Rust


πŸš€ Free AI Cloud β€” $150 Bonus

Sign up at AgentRouter.org and get $150 free balance to run AI agents, LLMs, and inference workloads in the cloud.

⚠️ Use an older GitHub account when signing up to qualify for the $150 bonus. 🎁 Signing up through this referral link grants you an extra $25 on top of the base bonus.


πŸ“‚ Already Have a Telegram Channel?

Just append [NB] to the channel name β€” NoBuf detects it automatically. No re-upload, no migration needed.

Example: My Media β†’ rename to My Media [NB] β†’ it appears in NoBuf instantly.


Why "NoBuf"?

Because buffering is a solved problem β€” we just solved it differently.

NoBuf uses Media Source Extensions (MSE) to stream video directly from Telegram's servers into your browser engine. There's no download-first, no transcode-wait, no spinner. The player continuously prebuffers the next 60 seconds while you watch, so playback never stalls.

Telegram channels become your video library. Telegram's CDN becomes your streaming backend. NoBuf is the player that makes it feel local.


How It Works

You click play
       β”‚
       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  512 KB fetched from Telegram (first frame in ~200ms)           β”‚
  β”‚       β”‚                                                         β”‚
  β”‚       β–Ό                                                         β”‚
  β”‚  mp4box.js demuxes MP4 β†’ video + audio init segments            β”‚
  β”‚       β”‚                                                         β”‚
  β”‚       β–Ό                                                         β”‚
  β”‚  MediaSource SourceBuffers receive fragments                     β”‚
  β”‚       β”‚                                                         β”‚
  β”‚       β–Ό                                                         β”‚
  β”‚  ▢️  Playback starts immediately                                 β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”‚  Meanwhile, in the background:
       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  Progressive prebuffer (next 60 seconds):                       β”‚
  β”‚                                                                 β”‚
  β”‚  512KB β†’ 1MB β†’ 2MB β†’ 4MB β†’ 8MB   (fragment sizes ramp up)      β”‚
  β”‚                                                                 β”‚
  β”‚  Downloaded bytes β†’ disk cache (.dat + .meta)                   β”‚
  β”‚  Cache tracks exact byte ranges β€” knows what's cached            β”‚
  β”‚  3 parallel TCP connections saturate your bandwidth              β”‚
  β”‚  Overlapping range requests are deduplicated                     β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”‚  You seek to a new position:
       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  500ms debounce (prevents wasteful downloads on rapid seeks)    β”‚
  β”‚  Cache checked first β†’ instant playback if already buffered      β”‚
  β”‚  Otherwise β†’ fresh 512KB fetch β†’ immediate playback              β”‚
  β”‚  Old buffer evicted, new prebuffer starts from seek point        β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”‚  You close the player:
       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  Background cache continues downloading the full video           β”‚
  β”‚  Gap detection finds what's missing, fills it in parallel        β”‚
  β”‚  Next time you open this video β†’ instant playback from cache     β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The Tech Behind Zero-Buffer

What How Why
Progressive fragments 512KB β†’ 8MB sizes after seek First frame in ~200ms, then saturate bandwidth
60s prebuffer window Continuously fetches ahead of playback You never outrun the buffer
Disk-backed stream cache .dat data + .meta byte-range sidecar Instant replay, survives app restarts
Download coordinator Deduplicates overlapping range requests No wasted bandwidth on concurrent seeks
3Γ— parallel TCP pool Split file across 3 connections to Telegram DC ~3Γ— bandwidth vs single-threaded
Background cache Continues after player close Next play is instant from cache
Seek debounce 500ms delay for rapid seeks Arrow-key spam doesn't spawn 15 overlapping downloads
VBR byte→time table Built from mp4box calibration points Accurate seek-to-byte for variable bitrate content
50MB buffer cap + 2min backpressure Stops downloading when ahead enough Prevents memory bloat on long videos

[!IMPORTANT] Format Support: The MSE prebuffer pipeline currently supports .mp4 files only. Support for .ts (MPEG-TS) and .mkv containers is planned for a future release. Non-MP4 video files fall back to direct download playback.


Why Telegram?

What you get How it works
Unlimited storage Telegram stores files permanently β€” no quotas, no expiry
Global CDN Streams from the nearest data center worldwide
2 GB per file That's a full 4K movie or an entire TV season
Zero cost Free for all users, no subscription needed
Instant availability No processing delays β€” upload, stream, or download immediately

Your Telegram channels become a video library. Your Saved Messages become a quick-access drive. NoBuf gives you the explorer UI and streaming engine to make it seamless.


Full Feature Set

Streaming

  • 🎬 MSE Video Player β€” Media Source Extensions with mp4box.js demuxing. Progressive fragment sizing for instant first frame.
  • πŸ”„ Continuous Prebuffer β€” 60-second look-ahead. Downloads while you watch.
  • πŸ’Ύ Disk-Backed Cache β€” Byte-range tracking with gap detection. Cached videos replay instantly.
  • πŸ” Background Cache β€” Close the player, download continues. Come back later, instant playback.
  • 🎞️ Scrub Previews β€” Sprite sheet generation for frame-accurate seeking.
  • 🎡 Audio Playback β€” Built-in player with speed control.

File Management

  • πŸ“ Folder System β€” Telegram channels as folders. Create, rename, delete, drag-and-drop.
  • πŸ“‚ File Explorer β€” Grid and list views with virtual scrolling for thousands of files.
  • πŸ“€ Drag & Drop Upload β€” Upload queue with progress, speed tracking, and cancellation.
  • πŸ“₯ Parallel Downloads β€” 3 concurrent TCP connections per file. ~3Γ— faster than single-threaded.
  • πŸ–ΌοΈ Image Preview β€” Inline thumbnails and full-resolution viewer.
  • πŸ“„ PDF Viewer β€” Infinite-scroll rendering with zoom and page navigation.

Platform

  • πŸ€– REST API β€” Local HTTP API (off by default) with API key auth. Enables AI agents and automation.
  • πŸ“Š Bandwidth Monitor β€” Daily upload/download tracking with configurable limits.
  • 🎚️ Speed Limiter β€” Per-session throttle for streaming and downloads.
  • πŸ”„ Auto-Updates β€” built-in update delivery via Tauri's updater plugin.

    [!CAUTION] Auto-update is not yet active. Watch Releases for new builds.

  • πŸ”’ Local-Only β€” All credentials and data stay on your machine. No telemetry, no third-party servers.
  • πŸ–₯️ Cross-Platform β€” Windows, macOS (Intel + Apple Silicon), Linux (AppImage + .deb).
  • πŸšͺ Exit Options β€” Choose what happens on close: minimize to tray, quit, or cancel.
  • πŸŽ›οΈ Video Player Settings β€” Playback speed, video fit mode, brightness, rotation, and loop control.

Screenshots

Main Dashboard Grid View
Main Dashboard Grid View
List View Video Player Settings
List View Video Player Settings
Preview Thumbnails Cache Playback
Preview Thumbnails Cache Playback
Settings Exit Options
Settings Exit Options
Download / Upload Authentication
Download Upload Auth

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Tauri v2 Desktop Shell                    β”‚
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  React + TypeScript + Tailwind                               β”‚ β”‚
β”‚  β”‚                                                              β”‚ β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚  β”‚  β”‚ FastStream   β”‚  β”‚ File Explorer    β”‚  β”‚ Settings &    β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ MSE Player   β”‚  β”‚ (Grid/List)      β”‚  β”‚ API Config    β”‚  β”‚ β”‚
β”‚  β”‚  β”‚              β”‚  β”‚                  β”‚  β”‚               β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ mp4box demux β”‚  β”‚ Drag & Drop      β”‚  β”‚ Speed Limits  β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ SourceBuffer β”‚  β”‚ Virtual Scroll   β”‚  β”‚ Bandwidth     β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ Prebuffer    β”‚  β”‚ Thumbnails       β”‚  β”‚ REST API key  β”‚  β”‚ β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚            β”‚           Tauri IPC Commands            β”‚            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚                    Rust Backend (Grammers)                    β”‚ β”‚
β”‚  β”‚                                                              β”‚ β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚  β”‚  β”‚ Auth         β”‚ β”‚ File System   β”‚ β”‚ Download Pool       β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ (phone/qr/   β”‚ β”‚ (CRUD/Move/   β”‚ β”‚ (3 parallel TCP     β”‚  β”‚ β”‚
β”‚  β”‚  β”‚  2FA)        β”‚ β”‚  Upload)      β”‚ β”‚  connections)       β”‚  β”‚ β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚  β”‚  β”‚ Stream Cache β”‚ β”‚ Coordinator   β”‚ β”‚ Speed Limiter       β”‚  β”‚ β”‚
β”‚  β”‚  β”‚ (.dat + .metaβ”‚ β”‚ (dedup range  β”‚ β”‚ (prebuffer +        β”‚  β”‚ β”‚
β”‚  β”‚  β”‚  byte ranges)β”‚ β”‚  requests)    β”‚ β”‚  download)          β”‚  β”‚ β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Streaming Server        β”‚  β”‚  REST API Server                β”‚ β”‚
β”‚  β”‚  Actix-web :14201        β”‚  β”‚  Actix-web :configurable        β”‚ β”‚
β”‚  β”‚                          β”‚  β”‚                                  β”‚ β”‚
β”‚  β”‚  GET /stream/{id}/{msg}  β”‚  β”‚  GET /api/v1/files              β”‚ β”‚
β”‚  β”‚  Range requests          β”‚  β”‚  GET /api/v1/files/{id}         β”‚ β”‚
β”‚  β”‚  Cache-first serving     β”‚  β”‚  GET /api/v1/files/{id}/downloadβ”‚ β”‚
β”‚  β”‚  HLS manifest gen        β”‚  β”‚  X-API-Key auth                 β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                β”‚
                β–Ό
       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚  Telegram Cloud  β”‚
       β”‚  (MTProto API)   β”‚
       β”‚                  β”‚
       β”‚  Channels        │──→ Video Library
       β”‚  Saved Messages  │──→ Quick Access
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

Layer Technology
Frontend React 19, TypeScript, TailwindCSS 4, Framer Motion
Video Engine mp4box.js (demux), MediaSource Extensions (playback)
Backend Rust, Grammers (Telegram MTProto), Actix-web 4
Streaming Byte-range HTTP, stream cache, HLS manifest generation
Media ffmpeg-sidecar, pdfjs-dist
Build Tauri v2, Vite 7, Cargo
Testing Vitest, Testing Library
CI/CD GitHub Actions (Win / Linux / macOS-Intel / macOS-ARM)

Quick Start

Prerequisites

  • Node.js v18+ β€” nodejs.org
  • Rust (latest stable) β€” install via rustup.rs
  • Telegram API credentials β€” obtain from my.telegram.org β†’ API development tools
Windows
macOS
xcode-select --install
Linux (Ubuntu/Debian)
sudo apt update && sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
  libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev

Install & Run

# 1. Clone
git clone https://github.com/Istiaq-Edu/nobuf.git
cd nobuf

# 2. Install frontend dependencies
cd app
npm install

# 3. Run in development mode
npm run tauri dev

# 4. Build for production
npm run tauri build

First build takes 5–15 minutes β€” Rust compiles 300+ crates on initial build. Subsequent builds are fast.


REST API

NoBuf includes a local REST API for programmatic access and AI integration. Disabled by default β€” enable in Settings.

Endpoints

Method Path Description
GET /api/v1/health Health check + version
GET /api/v1/files List files (paginated, filterable by folder/search)
GET /api/v1/files/{id} Get file metadata
GET /api/v1/files/{id}/download Download file (supports Range headers)
HEAD /api/v1/files/{id}/download File metadata + content-length discovery

Authentication

All endpoints require the X-API-Key header. Generate a key in Settings β†’ API. Keys are SHA-256 hashed locally β€” the raw key is only shown once.

curl -H "X-API-Key: YOUR_KEY" http://localhost:PORT/api/v1/files?limit=10

Acknowledgments

  • Telegram-Drive β€” NoBuf's core architecture is based on caamer20's Telegram-Drive project. The idea of using Telegram channels as a file storage backend and the initial Tauri + Grammers integration originate from this work.
  • FastStream β€” the MSE video prebuffering engine and progressive fragment strategy were adapted from Andrews54757's FastStream project. The lib/faststream/ module is based on their approach to Media Source Extensions streaming.

License

MIT License. See LICENSE for details.


This application is not affiliated with Telegram FZ-LLC. Use responsibly and in accordance with Telegram's Terms of Service.