---
title: Bones — a precise offline music player
canonical: "https://d9d.dev/projects/bones-player/"
pubDate: "2026-10-25T00:00:00.000Z"
updatedDate: "2026-10-27T00:00:00.000Z"
description: An offline hi-fi player for Android that shows what the audio path really does and learns what you actually listen to.
tags: [android, audio, kotlin]
categories: [projects]
---

## The problem

I listen to my own files — FLAC, MP3, rips I made years ago. Players for that either look
like they were built in 2012 or quietly resample everything and don't say so. None of them
would tell me what actually reaches my headphones.

## The constraint

Android decides a lot about the sound and admits little: the output format, the Bluetooth
codec, whether a USB DAC gets the original bits. The player can only show what the system
reports. Anything it has to work out by itself must be marked as an estimate, and what it
cannot know it must not invent.

## What was built

An offline player around one idea: be honest about the sound. A tap on the audio path opens
a report in plain language — what is played, what Android does to it, how to make it
cleaner. Around that: crossfade, an equalizer, folders as a library, Android Auto, lyrics,
themes, and a "wave" that learns from what you skip and what you play to the end.

## What it changed

The honesty paid off right away: the indicator showed that the player itself was losing
bits. The next version fixed it. Friends install it from the landing page, and their
phones keep finding cases no emulator would.

## What I'd do differently

Start with the audio path report, not with the library. Everything else in the player
turned out to be a way to keep that report true.

<!-- Estimated tokens: 428 (characters / 4, excluding this comment). -->
