What TVArgenta is (high level)
TVArgenta is a self-contained retro TV experience built around a Raspberry Pi. It is:
- Offline-first — all videos and metadata live locally on the device (no streaming required).
- Oldschool — a rotary encoder acts as the old-school dial for channel surfing.
- Nostalgic UI — CRT-style blue menus, static noise between channels and short intros to create the authentic feeling of zapping.
- Shareable — the enclosure and the backend were designed so other makers can adopt and adapt the system to their own content (commercials, family videos, short documentaries, regional clips, whatever defines “home”).


🧱 Hardware Setup
The core of the system is a Raspberry Pi 4, running a lightweight Python stack.
It connects to:
-
a 4.3” DSI touchscreen (800x480)
-
a KY-040 rotary encoder (for zapping and menu navigation)
-
an amplifier + 3W speaker
-
and a status LED connected to GPIO25
an additional button behind to turn the tv on and to pass to the next video within the same channel

The whole setup lives inside a 3D-printed case, designed to look like a mini CRT with vintage proportions.

💻 Software Architecture
TVArgenta runs as two complementary layers:
-
Frontend Player (Kiosk Mode)
-
Runs Chromium in fullscreen kiosk mode on boot.
-
The web UI displays video playback, menus, and overlays in a retro CRT style (scanlines, flicker, noise).
-
It reacts to encoder input and internal logic handled by Flask routes and JavaScript events.
-
Playback is driven by an HTML5
<video>element pointing to locally stored MP4s under/srv/tvargenta/content/videos/.
-
-
Backend Manager (Flask Web App)
-
Runs locally on the same Pi.
-
Provides an interface for uploading, tagging, and organizing videos, defining channels, and managing configuration JSONs (
metadata.json,canales.json, etc.). -
Handles automatic thumbnail generation, tag synchronization, and orphan file cleanup.
-
Exposes REST endpoints for real-time feedback (upload status, processing steps, etc.).
-
Both layers share the same content directory, allowing the system to manage everything offline, without cloud dependencies or external CDNs.

🧩 Content Logic
Each video has an entry in metadata.json, which stores tags, duration, and other fields.
When the Pi boots, it compares the /content/videos/ folder against this JSON — marking any missing files as “ghosts” and generating new thumbnails if needed.
Channels are defined in canales.json, each with their own set of priorities (like “Comedy”, “Music”, or “90s Ads”).
A “child mode” toggle hides all clips marked with NOATP (not suitable for all audiences).
The result: a dynamic, rules-based offline TV that feels surprisingly alive.
🎛️ Interaction and UX
The rotary encoder is the soul of the interface. Turning it changes channels; pressing it opens menus.
There’s even visual and audio feedback — flicker, scan lines, and zapping sounds — to simulate analog tuning.
The UI follows a retro 90s vibe with pixel fonts and minimal overlays, rendered in real-time on the Pi display.
Design and enclosure
The visual goal was to evoke the look and proportions of small 90s CRT TVs without being a bulky full-size set. The enclosure is 3D printed with snap-fit joins and uses M3 screws for the parts that need serviceability (screen, Pi, speaker, encoder). I designed internal mounting points for neat cable routing and easy removal of the Pi for maintenance.
I uploaded the 3D files to MakerWorld so other makers can print their own shells or adapt the design.


Ricardo Sappia








Dmitry
AndreasVS
Really cool project Ricardo! Reminds me of those old TV's from former Yugoslavia, I saw them once in a museum. Keep it up!