Content
# Tool List
> A self-deployed, local video watching synchronization tool for two people: locally import videos, synchronize playback progress, chat, barrage, timeline notes, subtitle awareness, low-frequency screenshot generation, and generate movie ticket stubs, post-viewing receipts, and viewing postcards.
[](https://render.com/deploy?repo=https://github.com/linzhi-524/cineisle)
## What is this?
CineIsle is a lightweight watch-together tool. Two people import local video files on their own mobile devices, and the server only synchronizes room state, playback progress, chat, barrage, timeline notes, viewing cards, subtitle context, and low-frequency screenshot generation.
**It does not provide any video resources, nor does it upload your video files.** Video files are only kept on your mobile device; the screenshot function also requires you to actively enable it in the App, and only uploads low-frequency screenshots when CineIsle is in the foreground.
The public version supports filling in **AI name** in the settings. After filling in, all "watching assistant" related texts in the App will become your own AI name, such as "Little G perception" and "Give Little G a look". Creating a room, synchronizing progress, subtitle context, and MCP screenshot requests will also synchronize this name.
Suitable for:
- Two people remotely watching the same local video together
- Want to leave a viewing ticket stub, quote extraction, and post-viewing review
- Want to let AI participate in watching through MCP: send barrage, take notes, read subtitles, request "look at" screenshots
- Want to self-deploy a small viewing room that belongs to you
## Features
- Create/join viewing room
- Locally import video, no video file upload
- Play, pause, progress synchronization
- Chat and barrage separation
- Horizontal screen right drawer: default only shows `>`, click to chat, send barrage, synchronize progress, request screenshot
- Viewing invitation card: movie name, viewer, atmosphere, opening note
- Timeline notes: each note can be bound to the current playback time
- Quote extraction: manually record quotes/highlight moments
- Three viewing card templates: movie ticket stub, post-viewing receipt, viewing postcard
- Archive: collect each viewing card
- Cinema: save the URI, movie name, and last progress of the imported movie on the local device, convenient for next viewing
- Multi-theme: cream white, night blue, galaxy purple, mist green, film black, dusk purple
- Subtitle awareness: support importing `.srt` / `.vtt` / `.ass` / `.ssa` subtitles, synchronize current subtitles and recent subtitles according to playback progress
- ASS/SSA subtitle compatibility: try to remove style tags and drawing codes, only keep quotes
- Subtitle bottom line: when the current subtitle is empty, the backend will try to use the recent subtitle as context
- Low-frequency screenshot: after enabling accessibility services, low-frequency upload current screenshot
- Recent screenshot timeline: backend retains recent 5 screenshot summaries, convenient for AI to understand what just happened
- MCP interface: let ChatGPT/other supported AI read room, send barrage, control playback, request screenshot, read viewing context, generate card
## File Structure
```text
.
├─ android/ # Android App source code
├─ server/ # Node.js backend + MCP interface
├─ render.yaml # Render one-click deployment configuration
├─ .github/workflows/ # GitHub Actions automatic APK packaging
└─ README.md
```
---
# Tutorial: Get it running quickly
## Plan A: Render one-click deployment backend (recommended)
### 1. Fork or upload to your own GitHub repository
Put this project into your GitHub repository. The repository can be named:
```text
cineisle
```
### 2. Click the one-click deployment button
There is a button at the top of README:
```text
Deploy to Render
```
After clicking, Render will read `render.yaml` and automatically create a Web Service.
If you changed the repository name, you need to change the link in the README top button to your repository address, for example:
```markdown
[](https://render.com/deploy?repo=https://github.com/your-username/your-repo-name)
```
### 3. Set backend Token
Render will automatically generate an environment variable:
```text
CINEISLE_TOKEN
```
You can also manually change it to a value you remember. This Token is used to protect write interfaces and MCP operations.
The old environment variable `LINJIAN_CINEMA_TOKEN` is still compatible, but the public version is recommended to use `CINEISLE_TOKEN`.
### 4. Get backend address
After deployment, Render will give you an address, for example:
```text
https://cineisle-server.onrender.com
```
Open this address and see the `CineIsle Server` page, which means the backend is successful.
### 5. Fill in backend address in App
Open Android App → Settings:
```text
Backend address: https://your Render address
Token: your CINEISLE_TOKEN
Nickname: Viewer A / your own name
```
The other mobile device also fills in the same backend address and Token.
### 6. Create a room and import video
One mobile device creates a room, and the other mobile device enters the room number to join.
Both sides click "Import movie" and select the same local video file. Then, playback, pause, jump, send barrage, and write notes can be synchronized.
---
## Plan B: Local area network deployment backend (use within the same Wi-Fi)
This plan is suitable for dormitories, homes, or testing under the same Wi-Fi, without Render.
### 1. Install Node.js on your computer
Recommended Node.js 18 or later.
### 2. Start backend on your computer
Enter the `server` folder:
```bash
cd server
npm install
```
Windows PowerShell:
```powershell
$env:CINEISLE_TOKEN="change-me"
npm start
```
macOS / Linux:
```bash
export CINEISLE_TOKEN=change-me
npm start
```
See similar output:
```text
CineIsle server: http://localhost:8787
```
### 3. Check computer local area network IP
Windows:
```cmd
ipconfig
```
Find `IPv4 address`, generally like this:
```text
192.168.1.5
```
macOS:
```bash
ipconfig getifaddr en0
```
Linux:
```bash
ip addr
```
### 4. Fill in local area network address in mobile App
Mobile device and computer must connect to the same Wi-Fi. Fill in App settings:
```text
Backend address: http://computer IP:8787
Token: change-me
```
For example:
```text
http://192.168.1.5:8787
```
Open the following address in the browser to see the page, which means the mobile device can connect to the computer backend:
```text
http://computer IP:8787
```
If it cannot be opened, the common reason is that the computer firewall intercepts port 8787, allowing Node.js to pass through the firewall.
---
# Android APK packaging
## Automatic packaging using GitHub Actions
The project comes with `.github/workflows/build-debug-apk.yml`. After pushing to GitHub, enter:
```text
Actions → Build debug APK → Run workflow
```
After successful construction, download in Artifacts:
```text
cineisle-debug-apk
```
There will be:
```text
app-debug.apk
```
Send the APK to the mobile device for installation.
## Local packaging
If you have an Android build environment locally:
```bash
gradle :app:assembleDebug
```
APK output location:
```text
android/app/build/outputs/apk/debug/app-debug.apk
```
---
# Subtitle awareness and screenshot
## Import subtitles
Click "Import subtitles" in the cinema, select local subtitle file. Support:
```text
.srt / .vtt / .ass / .ssa
```
It is recommended to prioritize simple Chinese or Chinese-English bilingual subtitles. ASS/SSA subtitles will automatically parse `Dialogue:` quotes and try to clean up style tags, position codes, and drawing codes.
## Enable low-frequency screenshot
Low-frequency screenshot requires two steps:
1. Open "Auto screenshot ON" in App;
2. Go to system accessibility settings and enable "CineIsle screenshot".
After enabling, the App will only upload low-frequency screenshots when CineIsle is in the foreground. In horizontal screen, you can also click the right drawer "Give {AI name} a look" to request an immediate screenshot. AI name can be filled in App settings, such as Little G, Claude, viewing partner; if not filled, the default is "Viewing Assistant".
If the screenshot does not appear, you can check the "Screenshot status" prompt in the App, common situations include:
```text
No screenshot: CineIsle is not in the foreground
System screenshot failed: please confirm accessibility permissions
HTTP 403: Token inconsistent
HTTP 413: screenshot too large
Requested screenshot, waiting for upload
Screenshot uploaded
```
---
# MCP access tutorial
Backend comes with MCP interface:
```text
https://your backend address/mcp?token=your CINEISLE_TOKEN
```
For example:
```text
https://cineisle-server.onrender.com/mcp?token=change-me
```
## MCP tool list
| Tool name | Effect |
| --- | --- |
| `create_room` | Create a viewing room |
| `get_room_state` | Read room state, playback progress, chat, notes, and cards |
| `send_room_message` | Send chat or barrage |
| `control_playback` | Synchronize playback, pause, jump progress |
| `add_note` | Add timeline viewing notes |
| `generate_card` | Generate or update viewing card |
| `request_screenshot` | Request mobile device to upload a low-frequency screenshot in CineIsle foreground; default requester will use room AI name |
| `get_viewing_context` | Read playback state, current subtitle, recent subtitle, and optional screenshot |
## Example instructions for AI
```text
Please create a CineIsle viewing room with movie name Her, theme night, and viewers A × B.
```
```text
Please read the current state of room ABC123, then send a barrage: this scene is very beautiful.
```
```text
Please request room ABC123's mobile device to upload a current screenshot, then read the viewing context.
```
```text
Please read the current subtitle and recent subtitle of room ABC123, and tell me what just happened.
```
```text
Please generate a movie ticket stub based on the viewing notes of room ABC123.
```
---
# Security and privacy statement
- CineIsle does not provide video resources.
- CineIsle does not upload local video files.
- "Cinema" only saves local movie URI, movie name, and last progress.
- Backend will save room state, chat, barrage, notes, viewing cards, subtitle context, and recent 5 screenshot summaries.
- Screenshot function does not enable stealth, users need to turn on the switch in App and enable system accessibility services.
- Screenshot only uploads when CineIsle App is in the foreground.
- Render free service may hibernate, and the first opening may take dozens of seconds.
- Please set `CINEISLE_TOKEN` when deploying publicly, do not send Token to public comments or screenshots.
---
# Version
Current public version:
```text
CineIsle Public v0.3.2
```
The public version has removed private titles and private identifiers, suitable for open source, self-deployment, and secondary customization.
MCP Config
Below is the configuration for this MCP Server. You can copy it directly to Cursor or other MCP clients.
mcp.json
Connection Info
You Might Also Like
No recommendations available