nano (shiopa nano) is a self-hostable, zero-bloat web interface for discovering and streaming movies and TV shows. It gives you a fast, private front-end that fetches metadata from TMDB, resolves streams via an encrypted plugin system (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/mohameodo/nano/llms.txt
Use this file to discover all available pages before exploring further.
.rink files), and plays them through a built-in video player — all without ads, trackers, or accounts. Whether you’re a developer who wants a personal media portal or a homelab enthusiast who needs a clean self-hosted alternative to bloated streaming sites, nano strips the experience down to exactly what you need.
Key Features
Instant TMDB Search
Live search suggestions powered by The Movie Database (TMDB). Titles, posters, and metadata load instantly as you type. A built-in API key fallback means you don’t need your own TMDB credentials to get started.
Encrypted .rink Plugin System
Stream sources are packaged as encrypted
.rink files. Add or swap sources without touching application code. The shiopa CLI manages plugin installation with a single command.Built-in Video Player
Ships with a custom HTML5 player (hls.js) and optional Vidstack player for advanced controls. Supports HLS streaming, autoplay, and fullscreen out of the box.
Server-side Proxy
A range-request proxy rewrites M3U8 playlists and proxies video segments server-side, solving CORS restrictions from third-party stream sources without any client-side workarounds.
16-Language i18n
The interface ships with translations for 16 languages. Set your default with
DEFAULT_LOCALE and let users switch at runtime via the header language selector.Flexible Deployment
First-class support for Docker, Vercel, Railway, Cloudflare Workers/Pages, and Render. Every deployment target is a single config file away.
Runtime Environment Configuration
Every setting — theming, player options, features, auth — is controlled by environment variables. No recompilation needed. Pass
-e flags to Docker or edit .env and restart.Optional Auth & Local Library
Enable a simple login page with
ENABLE_AUTH=true. Optionally enable a local media library (ENABLE_LOCAL_LIBRARY) for curating your own catalogue alongside scraped results.Architecture Overview
nano is built on Astro in full SSR (output: 'server') mode with React islands for interactive components. Here is how a stream request flows through the stack:
-
Search & metadata — The Astro front-end calls the TMDB API (v3/v4) server-side to fetch titles, posters, cast, and episode data. The built-in fallback key is used when you haven’t configured your own
TMDB_API_KEY. -
Stream resolution via
.rinkplugins — When a user selects a title, nano loads the appropriate.rinkscraper plugin (encrypted with@rinko67/rinke). The plugin resolves a stream URL or HLS manifest for that title from its configured source. -
Server-side M3U8 proxy — HLS manifests and video segment URLs often carry CORS restrictions. nano’s proxy layer (Astro API routes under
/api/) rewrites manifest playlists so all segment requests are tunnelled through your own domain, removing cross-origin issues entirely. -
Video player — The rewritten HLS stream is handed to the video player. By default this is a lightweight custom HTML5 player backed by
hls.js. SettingUSE_VIDSTACK=trueswaps it for the full-featured Vidstack player with advanced controls, quality selection, and keyboard shortcuts. -
Runtime config injection — On each page render, Astro serialises your environment variables into
window.__SHIOPA_CONFIG__so React components read configuration without a build step.
nano is a search and stream aggregator, not a media host. It does not store, upload, or distribute any video content. All streams are sourced from third-party providers resolved at runtime by
.rink plugins. You are responsible for ensuring your usage complies with applicable laws and the terms of service of any stream source you use.