Your bucket
Music lives in S3 (or MinIO). FloatFM never hosts your files.
Free to use · No accounts · No subscription
FloatFM is a personal player. You point it at your own S3 bucket, browse the files you already own, download them to the phone, and keep playing when the signal dies.
Music lives in S3 (or MinIO). FloatFM never hosts your files.
Keys, playlists, and downloads stay on the phone. There is no FloatFM login.
The app is free to use. You only pay AWS (or your own storage) if you use it.
Motivation
I built FloatFM because I wanted the music I already like with me when I go underground or out on a long hike. Streaming apps assume a signal. Subscriptions assume I should rent access to files I already own. Neither of those holds up in a cave, on a ridge with no coverage, or on a week of camping where the only network is the one you packed.
So the app does one job: read audio from a bucket I control, cache it locally, and keep playing offline. No catalog I do not own. No monthly fee to hear my own library. Folders in the bucket become the way you browse. Downloads become the library you carry.
If you have the same itch — take your music into places that do not have Spotify — this is the supporting page for that app.
How it works
Setup
FloatFM talks to storage from the device using the AWS SDK. Keep the bucket private, grant the smallest IAM policy that can list and read objects, and store the access keys only in the app.
us-east-1).
.mp3, .m4a,
.aac. A prefix such as music/ is optional — if you use one,
enter the same prefix in Settings.
Native iOS and Android do not rely on CORS. Add this anyway if you use FloatFM on web, a custom endpoint, or any client that reads the bucket from a browser. In the bucket, open Permissions → Cross-origin resource sharing (CORS) → Edit and paste:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag",
"Content-Length",
"Content-Type",
"x-amz-request-id"
],
"MaxAgeSeconds": 3000
}
]
floatfm-reader.YOUR-BUCKET-NAME.
Never paste root-account keys into the app. A user that can only
s3:ListBucket and s3:GetObject on this one bucket is enough.
Whole-bucket access is the usual setup. Use the prefix policy if the music lives under
a folder such as music/ and you do not want this user to see the rest of
the bucket.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListTheMusicBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::YOUR-BUCKET-NAME"
},
{
"Sid": "ReadMusicObjects",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListMusicPrefix",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::YOUR-BUCKET-NAME",
"Condition": {
"StringLike": {
"s3:prefix": ["music/", "music/*"]
}
}
},
{
"Sid": "ReadMusicObjects",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/music/*"
}
]
}
In Settings, set the optional custom endpoint (for example
https://s3.example.com) and enable path-style URLs. The same IAM actions
still apply: list the bucket and get objects. CORS on that endpoint should allow
GET and HEAD.
Support
I am happy to assist. If something in the app, the S3 setup, or this page is unclear, write to me and I will help you through it.
Email victor@ursu.net with the problem, the device you are on, and anything you already tried. There is no ticket queue and no FloatFM support portal — it is just me.
If you are a developer, you should have an easy time finding your way around. FloatFM is a small personal player: credentials in Settings, files from your bucket, downloads in Library. The IAM samples on this page are the permissions it needs. If you still get stuck, email me anyway.
Privacy policy
Last updated September 20, 2026.
FloatFM is a personal music player. You connect your own S3 bucket, browse audio on that bucket, stream or download it to the device, build playlists, and share files through the system share sheet. There are no FloatFM accounts. Playback and downloads stay on the device.
FloatFM does not create user accounts and does not operate a FloatFM server for your music. S3 credentials, playlist data, downloads, theme choices, and an optional ChatGPT key are stored only on the device.
When you browse or stream, requests go from the device to the storage you configured. If you add a ChatGPT key, song-related requests go from the device to OpenAI. FloatFM does not receive a copy of those requests. You are responsible for the keys you enter and for any third-party services you use.
We do not sell your data. We cannot see your bucket, your library, or files you share with other people.
This website is a static supporting page. It does not set tracking cookies or run an analytics pipeline. If you email victor@ursu.net, that message is handled as ordinary email.
Terms of use
Last updated September 20, 2026.
FloatFM is free to use. You are responsible for the music and files you store, stream, download, and share. You must have the right to access and share that content. FloatFM is a player and a local cache. It does not grant you rights to anyone else’s work.
Sharing uses the device share sheet (for example AirDrop or Nearby Share). Once a file leaves the app, FloatFM has no control over where it goes. We are not responsible for content you share with others, for how recipients use it, or for any loss, damage, or claim that comes from sharing, streaming, or storing files through FloatFM.
You are responsible for AWS (or other storage) charges, for keeping IAM keys safe, and for the configuration of your bucket. Do not use credentials that can write, delete, or administer more than this app needs.
FloatFM is provided as-is, without warranties of any kind. Features may change. Internet access, S3 availability, and third-party APIs are outside our control. Use FloatFM at your own risk.