Skip to content

Latest commit

Β 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Gobby

Gobby

Gobby is a free elf. Gobby serves your media, and Gobby serves it only to you.

Go SQLite Alpine.js MCP Cloudflare version license release binary

English Β· EspaΓ±ol


Hello! Gobby is here to help, oh yes.

Gobby is one little Go binary β€” no masters to install, no databases to feed. You point Gobby at a folder and Gobby scans your movies, series, music, books and loose files, remembers them in a tidy SQLite drawer, and opens two doors on the same port:

  • a web page for your phone or browser (Gobby prints a link and a QR in the terminal), and
  • an MCP server πŸ§™β€β™‚οΈ so a supreme intelligence can search your library.

Gobby never owns anything. Gobby only explores what you already have, fetches the little covers and details from free services, and β€” if you ask him nicely β€” opens a tunnel so you can watch from afar. No copyright lives in Gobby's drawer, oh no. Gobby is a free elf, not a pirate.

Your little edits β€” titles, notes, ratings, the watchlist β€” live only in the drawer. Gobby would iron his hands before touching your original files.

Made with vibe coding ✨ β€” Gobby was written hand-in-hand with a supreme intelligence, then read over line by line. A free elf and a clever wizard, oh yes. 🧦πŸͺ„

Getting Gobby πŸ“₯

Grab the binary for your platform from the Releases page and drop it in the folder you want it to live in. That's it β€” one file, no install. (See the CHANGELOG for what's new.)

ffmpeg is baked in. mkv/avi playback needs ffmpeg, and the release binary carries it embedded as WebAssembly (go-ffmpreg) β€” truly one file, nothing to download. Want it faster? Drop a native ffmpeg next to Gobby (or have one on PATH) and Gobby uses that instead of the embedded one β€” no startup cost, no transcode limits.

Building πŸ”¨

Needs Go 1.26+. Pure-Go SQLite (modernc) and a WASM ffmpeg mean no CGO and no C toolchain β€” cross-compile all three platforms from one machine.

go build -tags embedffmpeg -o gobby ./src   # your platform, ffmpeg embedded
./build/publish.sh                          # cross-compile Win + Linux + macOS into bin/
./build/publish.sh v0.3.0                   # ...stamping an explicit version

Without -tags embedffmpeg you get the lean build that downloads a slim ffmpeg on demand instead (LGPL, smaller binary). That slim ffmpeg is built separately with Docker:

./build/ffmpeg-slim/build.sh    # drops ffmpeg.exe next to the script

How to call Gobby πŸ“£

gobby                              # scans next to the binary (or one folder up if empty)
gobby -p D:\                       # scans this folder
gobby -p E:\ -library my-disk      # keeps the same library even if the drive letter changes
gobby -port 9000                   # a different door (8420 by default)
gobby -h                           # Gobby explains himself

Gobby prints his name, version and a link (with a QR) when he wakes up.

Then open the link Gobby prints, or scan the QR from your phone. Same house, same door.

Chat with Gobby πŸ’¬

A chat bubble sits in the corner: ask Gobby about your library in plain language ("what action films haven't I watched?") β€” by voice too β€” and he uses his own tools to answer, speaking like a shy house-elf. Beyond looking things up he can also act: open an item you ask for, or add a title to your watchlist. Replies keep context across the conversation, show which tools he used, and offer clickable result cards.

Point it at any OpenAI-compatible endpoint β€” Ollama, LM Studio, OpenAI, Gemini, Groq, or a gateway like LiteLLM / OpenRouter / OmniRoute. Configure it right in the bubble's settings: pick a preset, load the model list (which also tests the connection β€” you can't save until it connects), pick a model from a searchable list, save. You can keep several providers and switch with a click, turn a model's slow "thinking" off per provider, and read its reasoning in a collapsible note.

API keys are stored per provider but never leave the machine: they're redacted from every response and excluded from database export. A GOBBY_LLM_KEY env var still works as an override.

Gobby in a box 🐳

Gobby runs headless in a container just as happily. A Dockerfile and docker-compose.yml ship in the repo. Point the media mount at your library, then:

docker compose up

Two volumes, each with its own job:

  • /media β€” your library, mounted read-only (:ro). Gobby only reads it.
  • /data β€” where gobby.db lives, a persistent volume so your catalogue survives restarts.

ffmpeg is baked into the image, so mkv/avi play with nothing to download. Configure with env vars (all optional): GOBBY_PATH (scan folder, default /media), GOBBY_DATA (db folder, default /data), GOBBY_PORT, GOBBY_LIBRARY.

Running the plain binary still works exactly as before β€” the container is just another way to wake Gobby, not a replacement.

What Gobby can do 🎬

  • Scans offline β€” reads filenames and embedded tags, no internet needed to catalogue.
  • Fetches covers & details β€” from free, keyless services (see below) when you ask.
  • Series, albums, authors β€” grouped neatly, with seasons, episodes and synopses.
  • Files tab β€” a coloured size-tree of the whole disk, so you see what eats the space.
  • Photo gallery β€” images get their own tab: a thumbnail grid with a lightbox and per-image details (name, format, resolution, size).
  • Filter by colour β€” Gobby reads the dominant colour of every cover and photo, so you can filter the library by colour with a click.
  • Saved β€” one place for anything to watch/read/listen later, links worth keeping (paste a URL and Gobby fetches the title, description and image β€” GitHub repos too), and your physical shelf: mark what you own, add location/format/condition, and scan a barcode (phone camera) to pull the title and cover and file it β€” or link it to an entry you already had, no duplicates.
  • Plays in the browser β€” mkv/avi are remuxed on the fly with a slim ffmpeg (video copied, audio to AAC), so they play where browsers normally refuse.
  • Pick the audio, drop in subtitles β€” choose an audio track and load embedded subtitles as WebVTT, all decoded by the same little ffmpeg.
  • Resumes where you left off β€” playback position is remembered, with a progress bar on the shelf; finishing an episode auto-plays the next (music too).
  • Keyboard player β€” space to pause, ←/β†’ to seek, f for fullscreen.
  • Reads epub inline β€” a paginated reader (epub.js) that remembers your page.
  • Voice search β€” tap the mic and speak your query (where the browser supports it).
  • Reveal, upload & delete (on the machine running Gobby) β€” open a file's folder in your OS explorer, drop a file into a folder from the Files tab, or delete a file from disk (host-only, with confirmation). Everyone else stays read-only.
  • Filter the Files tree β€” a search box that narrows the size-tree as you type.
  • Cast to a TV β€” Gobby also serves over HTTPS (self-signed, on the next port) so the browser's Cast SDK works on the LAN; the QR points there.
  • Remote access β€” one click opens a temporary Cloudflare tunnel (public link + QR), gated by a per-tunnel key so a stray URL alone can't reach your library.
  • Preview PDFs/audio/images inline, and a little sound for every tap.
  • Read-only for guests β€” anyone arriving through the public tunnel can look, not edit.
  • Updates himself β€” from the About screen Gobby checks GitHub for a newer release and swaps his own binary (and ffmpeg) in place. Restart and he's new.

The free services Gobby borrows (no keys, ever) 🎁

For Service
Movies & series Cinemeta
Books Open Library
Music MusicBrainz + Cover Art Archive
Games CheapShark
Fallback covers iTunes Search
Remote access Cloudflare Tunnel
Cast to TV Google Cast

What Gobby is built from 🧱

Go Β· SQLite (modernc) Β· Alpine.js Β· cuelume (sound) Β· MCP Go SDK Β· dhowden/tag Β· rsc.io/qr Β· a slim ffmpeg (playback)

MCP β€” for the wizards πŸ§™

Gobby exposes an MCP server at /mcp on the same port. Add it and your supreme intelligence πŸ§™β€β™‚οΈ can:

  • Browse & search β€” search_media, get_media, browse_library, recent_media, library_info
  • Play β€” play_media (opens on the host and returns a web link to watch on any device)
  • Edit β€” update_media (title/notes/rating/…), set_media_section, set_media_progress, enrich_media
  • Watchlist β€” search_titles, add_to_watchlist, list_watchlist, remove_from_watchlist, set_watchlist_done
claude mcp add --transport http gobby http://localhost:8420/mcp

License & credits πŸ“œ

Gobby's own code is MIT β€” see LICENSE. But the release binary ships ffmpeg embedded (go-ffmpreg, GPLv3), so the distributed binary as a whole is GPLv3. Build without -tags embedffmpeg (the slim, downloaded-on-demand ffmpeg is LGPL) if you need a non-GPL binary. Bundled components and their licenses:

Component License Notes
go-ffmpreg (embedded WASM ffmpeg) GPLv3 ffmpeg compiled to WebAssembly, bundled in the release binary β†’ makes the whole binary GPLv3.
ffmpeg (slim build, non-embed builds) LGPL-2.1-or-later Built with no --enable-gpl / --enable-nonfree. Config in build/ffmpeg-slim/. A separate, replaceable binary β€” used when not embedding.
Go std + golang.org/x/* BSD-3-Clause
modernc.org/sqlite (+ libc, memory, …) BSD-3-Clause pure-Go SQLite
dhowden/tag BSD-2-Clause audio metadata
mdp/qrterminal, rsc.io/qr MIT / BSD-3 terminal + PNG QR
MCP Go SDK, google/jsonschema-go, google/uuid Apache-2.0 / BSD-3
Alpine.js MIT vendored in src/web/
cuelume MIT tap sounds, vendored in src/web/
epub.js BSD-2-Clause inline epub reader, vendored in src/web/
JSZip MIT used under MIT (JSZip is MIT-or-GPLv3); vendored in src/web/

Logo: the goblin mark is β€œGoblin” by Caro Asercion, licensed CC BY 3.0 and recoloured / set on a background for Gobby.

On the media Gobby indexes: Gobby ships no content and no copyrighted material. It only reads files you already have on your own disk and fetches cover art and metadata from public, keyless services β€” Cinemeta, Open Library, MusicBrainz / Cover Art Archive, CheapShark, and the iTunes Search API β€” used within their terms for read-only, personal cataloguing. The Cloudflare tunnel and Google Cast are optional, user-initiated conveniences. What you do with your own library is, as ever, on you β€” Gobby is a free elf, not your lawyer. 🧦


Gobby has no master. Gobby has a friend. 🧦

About

A tiny portable media indexer & player in one Go binary β€” web UI + MCP server, no install, no database. 🧦

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages