JELLAI — public showcase (README + screenshots)
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# JELLAI
|
||||
|
||||
An AI-native TV experience layered over an **existing Emby media server**. Not a library you browse —
|
||||
a channel that's already on, plus a concierge you talk to. A single tool-calling model runs the whole
|
||||
loop: it drives the gateway tools (search, schedule, playback handoff) and talks to you from a
|
||||
personality prompt. Always-on chat, TV-style time-block scheduling, mood awareness, and preference
|
||||
learning seeded from your real watch history.
|
||||
|
||||
**Status:** v1 — working prototype. TV-first, single user. Built on the Emby you already have (one
|
||||
server, one source of truth — your watch history is the personalization seed).
|
||||
|
||||
## What it feels like
|
||||
|
||||
You don't open JELLAI. It's already there — your media server, just with the lights turned down and
|
||||
a concierge in the corner. A **TONIGHT strip** runs along the bottom, and a 💬 door waits bottom-right.
|
||||
Nothing covers what you're watching.
|
||||
|
||||

|
||||
|
||||
Tap the door and the **concierge panel** slides in from the right — video keeps playing. Tell it how
|
||||
you feel, not what to search for: *"build me a chill TV night — something funny and easygoing."* It
|
||||
talks back in its own voice, then **builds a real lineup** into the strip: time blocks, in order, drawn
|
||||
from your actual library. Don't like it? `[yes] [swap] [keep]` — one word steers the whole night.
|
||||
Click any block to start playing from there, in Emby's own player.
|
||||
|
||||

|
||||
|
||||
> The strip is the spine. Ask once, and the rest of the night schedules itself — then re-schedules
|
||||
> live every time you change your mind. That's the whole product: a channel that's already on, tuned
|
||||
> to you, that you can talk to.
|
||||
|
||||
These are real screenshots — a live themed Emby client driving the running gateway and a **local**
|
||||
language model. No cloud LLM in the loop.
|
||||
|
||||
## How it works
|
||||
|
||||
```
|
||||
Emby web UI ──CSS/JS inject──▶ concierge panel ──WebSocket──▶ gateway ──▶ local LLM (Ollama)
|
||||
(your server) (overlay theme) (tool loop) tool-calling
|
||||
▲ │
|
||||
└──────────────── Emby REST API (/Items, schedule, playback)─┘
|
||||
```
|
||||
|
||||
- **Frontend (v1):** a concierge panel + schedule strip injected into the Emby web client via CSS/JS.
|
||||
It couples to almost nothing in Emby's DOM — it only appends its own fixed-position nodes — so it
|
||||
survives Emby updates. Playback always delegates to Emby's own player. The eventual target is a
|
||||
custom SPA over the Emby REST API.
|
||||
- **Gateway:** a small Python WebSocket server mediating between the UI and a local model. It runs a
|
||||
tool-calling loop against one stock instruct model — no fine-tune unless a measured gap demands it.
|
||||
- **Tools:** search, TV-style scheduling, and watch-state queries against the Emby API. The model sees
|
||||
JSON tool schemas and composes them (e.g. "movie night" → a movies-only lineup).
|
||||
|
||||
## Why build on Emby instead of a new frontend
|
||||
|
||||
The original plan was a dedicated themed media app. We reversed it and built on the existing Emby:
|
||||
|
||||
- **Single source of truth** — no duplicate library scan, no second metadata DB.
|
||||
- **Watch history is the personalization seed** — per-user learning is the whole premise, and that
|
||||
history already lives in Emby. A fresh install starts cold.
|
||||
- **Emby is enough** — a full documented REST API, plus community CSS/JS injection for the overlay.
|
||||
|
||||
## Status & scope
|
||||
|
||||
Working today: the concierge loop, live TV-style scheduling into the strip, mood-aware search with
|
||||
type/year/rating/sort filters, and one-word lineup steering. Deliberately out of v1: content
|
||||
acquisition, multi-user profiles, and model fine-tuning — added only against a measured need.
|
||||
Reference in New Issue
Block a user