No description
Find a file
Gabe Farrell 36f984a1a2
Pre-release version v0.0.14 (#96)
* add dev branch container to workflow

* correctly set the default range of ActivityGrid

* fix: set name/short_name to koito (#61)

* fix dev container push workflow

* fix: race condition with using getComputedStyle primary color for dynamic activity grid darkening (#76)

* Fix race condition with using getComputedStyle primary color for dynamic activity grid darkening

Instead just use the color from the current theme directly. Tested works on initial load and theme changes.
Fixes https://github.com/gabehf/Koito/issues/75

* Rework theme provider to provide the actual Theme object throughtout the app, in addition to the name
Split name out of the Theme struct to simplify custom theme saving/reading

* fix: set first artist listed as primary by default (#81)

* feat: add server-side configuration with default theme (#90)

* docs: add example for usage of the main listenbrainz instance (#71)

* docs: add example for usage of the main listenbrainz instance

* Update scrobbler.md

---------

Co-authored-by: Gabe Farrell <90876006+gabehf@users.noreply.github.com>

* feat: add server-side cfg and default theme

* fix: repair custom theme

---------

Co-authored-by: m0d3rnX <jesper@posteo.de>

* docs: add default theme cfg option to docs

* feat: add ability to manually scrobble track (#91)

* feat: add button to manually scrobble from ui

* fix: ensure timestamp is in the past, log fix

* test: add integration test

* feat: add first listened to dates for media items (#92)

* fix: ensure error checks for ErrNoRows

* feat: add now playing endpoint and ui (#93)

* wip

* feat: add now playing

* fix: set default theme when config is not set

* feat: fetch images from subsonic server (#94)

* fix: useQuery instead of useEffect for now playing

* feat: custom artist separator regex (#95)

* Fix race condition with using getComputedStyle primary color for dynamic activity grid darkening

Instead just use the color from the current theme directly. Tested works on initial load and theme changes.
Fixes https://github.com/gabehf/Koito/issues/75

* Rework theme provider to provide the actual Theme object throughtout the app, in addition to the name
Split name out of the Theme struct to simplify custom theme saving/reading

* feat: add server-side configuration with default theme (#90)

* docs: add example for usage of the main listenbrainz instance (#71)

* docs: add example for usage of the main listenbrainz instance

* Update scrobbler.md

---------

Co-authored-by: Gabe Farrell <90876006+gabehf@users.noreply.github.com>

* feat: add server-side cfg and default theme

* fix: repair custom theme

---------

Co-authored-by: m0d3rnX <jesper@posteo.de>

* fix: rebase errors

---------

Co-authored-by: pet <128837728+againstpetra@users.noreply.github.com>
Co-authored-by: mlandry <mike.landry@gmail.com>
Co-authored-by: m0d3rnX <jesper@posteo.de>
2025-11-19 20:26:56 -05:00
.github/workflows Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
.vscode chore: initial public commit 2025-06-11 19:45:39 -04:00
assets fix: repair default_img 2025-06-14 16:17:52 -04:00
client Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
cmd/api feat: v0.0.10 (#23) 2025-06-18 08:48:19 -04:00
db Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
docs Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
engine Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
internal Pre-release version v0.0.14 (#96) 2025-11-19 20:26:56 -05:00
queue chore: initial public commit 2025-06-11 19:45:39 -04:00
romanizer chore: initial public commit 2025-06-11 19:45:39 -04:00
test_assets fix: reset mbid for artists when native importing 2025-06-18 17:46:48 -04:00
testing_init chore: initial public commit 2025-06-11 19:45:39 -04:00
CHANGELOG.md Pre-release version v0.0.13 (#52) 2025-07-26 15:57:46 -04:00
Dockerfile fix: bump dockerfile go version 2025-06-15 19:19:46 -04:00
go.mod feat: v0.0.5 2025-06-15 19:09:44 -04:00
go.sum chore: initial public commit 2025-06-11 19:45:39 -04:00
LICENSE chore: LICENSE 2025-06-13 22:00:20 -04:00
Makefile Pre-release version v0.0.13 (#52) 2025-07-26 15:57:46 -04:00
README.md docs: include port in allowed hosts config 2025-06-14 11:14:49 -04:00
sqlc.yaml chore: initial public commit 2025-06-11 19:45:39 -04:00

Koito

Koito is a modern, themeable ListenBrainz-compatible scrobbler for self-hosters who want control over their data and insights into their listening habits. It supports relaying to other compatible scrobblers, so you can try it safely without replacing your current setup.

This project is currently pre-release, and therefore you can expect rapid development and some bugs. If you don't want to replace your current scrobbler with Koito quite yet, you can set up a relay from Koito to another ListenBrainz-compatible scrobbler. This is what I've been doing for the entire development of this app and it hasn't failed me once. Or, you can always use something like multi-scrobbler.

Features

  • More performant than similar software
  • 🖌️ Sleek UI
  • 🔁 Compatible with anything that scrobbles to ListenBrainz
  • 🔌 Easy relay to your existing setup
  • 📂 Import support for Maloja, ListenBrainz, LastFM, and Spotify

Demo

You can view my public instance with my listening data at https://koito.mnrva.dev

Screenshots

screenshot one screenshot two screenshot three

Installation

See the installation guide, or, if you just want to cut to the chase, use this docker compose file:

services:
  koito:
    image: gabehf/koito:latest
    container_name: koito
    depends_on:
      - db
    environment:
      - KOITO_DATABASE_URL=postgres://postgres:secret_password@db:5432/koitodb
      - KOITO_ALLOWED_HOSTS=koito.example.com,192.168.0.100:4110
    ports:
      - "4110:4110"
    volumes:
      - ./koito-data:/etc/koito
    restart: unless-stopped

  db:
    image: postgres:16
    container_name: psql
    restart: unless-stopped
    environment:
      POSTGRES_DB: koitodb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: secret_password
    volumes:
      - ./db-data:/var/lib/postgresql/data

Be sure to replace secret_password with a random password of your choice, and set KOITO_ALLOWED_HOSTS to include the domain name or IP address you will be accessing Koito from when using either of the Docker methods described above. You should also change the default username and password, if you didn't configure custom defaults.

Importing Data

See the data importing guide in the docs.

Full list of configuration options

See the configuration reference in the docs.

Contributing

There are currently some known issues that I am actively working on, in addition to adding new features. If you want to contribute (especially more and more robust testing) feel free to fork the repository and make a pull request with your changes.

If you have any feature ideas, open a GitHub issue to let me know. I'm sorting through ideas to decide which data visualizations and customization options to add next.

Albums that fueled development + notes

More relevant here than any of my other projects...

Not just during development, you can see my complete listening data on my live demo instance.

Random notes

  • I find it a little annoying when READMEs use emoji but everyone else is doing it so I felt like I had to...
  • It's funny how you can see the days in my listening history when I was just working on this project because they have way more listens than other days.
  • About 50% of the reason I built this was minor/not-so-minor greivances with Maloja. Could I have just contributed to Maloja? Maybe, but I like building stuff and I like Koito's UI a lot more anyways.