- JavaScript 73.6%
- CSS 19.1%
- HTML 7.1%
- Dockerfile 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Build and publish Docker image / build (push) Successful in 3s
|
||
| .forgejo/workflows | ||
| public | ||
| scripts | ||
| test | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| CHANGELOG.md | ||
| config.example.json | ||
| docker-compose.yml | ||
| Dockerfile | ||
| package.json | ||
| qa-frontend.js | ||
| README.md | ||
| server.js | ||
🎬 Cinemati — Personal Movie & Series Tracker
A simple local app to manage your watchlist: movies, series, seasons, ratings,
franchises, custom lists, and statistics. All data stays on your machine in
data/library.json.
No AI required — all metadata (titles, descriptions, images, cast, franchises) comes straight from TMDB.
Storage (works offline)
data/library.json— your library with all its details (descriptions, cast, franchises...)data/images/— images are stored locally (posters, backdrops, cast photos)- After adding an item, all its data and images stay with you — browsing your library works fully offline
- Only searching for new items and new franchises requires internet
Requirements
- Node.js 20 or newer — we recommend the latest LTS (currently 24): https://nodejs.org
Running
node server.js
Then open: http://127.0.0.1:8080
TMDB Token (one-time)
- Sign up at https://www.themoviedb.org, open the API page, and get a token.
- From the app: ⚙️ Settings → paste the token → 💾 Save token
(or place it manually in
config.jsonlike this:){ "tmdbToken": "your_token_here" } - Without a token, TMDB search/add won't work — everything else still works fine.
Moving the app to another machine
- Copy the whole project folder (or clone it):
git clone https://git.majlis.lab/debe/cinemati.git cd cinemati - Run
node server.js - Your data: copy
data/library.json(andconfig.jsonfor the token) from the old machine to the same locations on the new one — or use the ⬇️ Export data button on the home page, then ⬆️ Import backup on the new machine.
Running with Docker (docker-compose)
The image is published to the built-in Forgejo registry: git.majlis.lab/debe/cinemati.
- One-time: make Docker trust the
git.majlis.labself-signed certificate — add to/etc/docker/daemon.jsonand restart Docker:{ "insecure-registries": ["git.majlis.lab"] }The repo is public — no
docker loginis needed to pull. - Copy
docker-compose.ymlto the server and create a.envfrom.env.examplewith your TMDB token:cp .env.example .env # then edit TMDB_TOKEN inside .env - Copy your current
data/folder (library + images) next todocker-compose.ymlto keep your data. - Run:
Then open: http://:8080docker compose pull docker compose up -d
Automatic builds (Forgejo Actions)
The Dockerfile is built and published to the registry with this tagging strategy:
| Tag | When it updates |
|---|---|
sha-xxxxxxx |
Every push to main or a v* tag (immutable per commit) |
vX.Y.Z |
Only when a release tag (v*) is pushed |
latest |
Only when a release tag (v*) is pushed — always points to the newest release |
So docker compose pull (using :latest) always gets the latest released version,
while :sha-... lets you pin any specific commit.
One-time requirements (on the server):
- Register a Forgejo Runner on
git.majlis.lab(see the Forgejo docs). - Add a secret named
REGISTRY_TOKENin the repo (Settings → Actions → Secrets) with an access token. - Make sure the runner's Docker trusts
git.majlis.lab(sameinsecure-registriesas above).
Features
- 🎬 Movies / 📺 Series with search and filters by genre and grouping (year / decade / genre)
- ▶️ Currently watching, ✅ Watched with 👍 OK / 👎 No rating
- 🎬 Franchises: detects the franchise and shows the remaining parts with quick add
- 📁 Custom lists, ⭐ Watch later, 🔢 Episode progress, 🔁 Rewatch
- 📊 Statistics: monthly, watch calendar, genres
- 🎲 Random pick, 📋 List view, 🌙 Light/dark mode, 🔄 Refresh from TMDB
- ⬇️ Backup (JSON export/import)
Internationalization (i18n)
All UI text lives in public/locales/ (one file per language). The default UI language is Arabic.
public/locales/ar.js— Arabic translationspublic/locales/en.js— English translations
To add a language, create public/locales/<lang>.js, add the matching keys, and include the
file in index.html. Switch languages with setLang("<lang>").
Versioning
The project uses Semantic Versioning (MAJOR.MINOR.PATCH):
- MAJOR — radical/large changes (breaking changes, big rewrites).
- MINOR — adding/removing a feature or medium changes.
- PATCH — small fixes and tweaks only.
To release a new version:
npm run release -- major # or: minor | patch
This bumps package.json, commits, and tags vX.Y.Z. Pushing the tag builds and
publishes the versioned Docker image. See CHANGELOG.md for the release history.
Notes
- Language: Arabic UI, metadata (titles and descriptions) in English from TMDB
- Requires internet for TMDB (search, images, cast, franchises)
- Data is stored locally only — nothing is uploaded anywhere