FloatFM
FloatFM logo

Free to use · No accounts · No subscription

Take the music you like into places streaming cannot follow.

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.

Your bucket

Music lives in S3 (or MinIO). FloatFM never hosts your files.

On this device

Keys, playlists, and downloads stay on the phone. There is no FloatFM login.

Always free

The app is free to use. You only pay AWS (or your own storage) if you use it.

Motivation

Built for caves, trails, and dead zones.

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

Connect storage. Cache tracks. Walk away from the network.

  1. Put audio in a private S3 bucket. mp3, m4a, and aac files. Folders show up as folders in the Cloud tab.
  2. Create a locked-down IAM user. List and read only. Never use root keys. Paste the keys into Settings on the phone.
  3. Browse, stream, download. Play from the bucket when you have signal. Save tracks to Library for caves and trails.

Setup

Create an S3 bucket and an IAM user

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.

1. Create the bucket

  1. Sign in to the AWS Console and open S3.
  2. Choose Create bucket.
  3. Pick a unique bucket name and a region. You will type both into FloatFM Settings (region example: us-east-1).
  4. Leave Block all public access turned on. The app uses signed requests, not a public website.
  5. Default encryption (SSE-S3) is fine. Create the bucket.
  6. Upload your audio. Supported extensions: .mp3, .m4a, .aac. A prefix such as music/ is optional — if you use one, enter the same prefix in Settings.

2. Attach a CORS configuration

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:

cors.json
[
  {
    "AllowedHeaders": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ],
    "AllowedOrigins": [
      "*"
    ],
    "ExposeHeaders": [
      "ETag",
      "Content-Length",
      "Content-Type",
      "x-amz-request-id"
    ],
    "MaxAgeSeconds": 3000
  }
]

3. Create a dedicated IAM user

  1. Open IAM → Users → Create user.
  2. Name it something obvious, for example floatfm-reader.
  3. Do not attach AdministratorAccess or any AWS managed full-access policy.
  4. Create the user, then open it.
  5. Permissions → Add permissions → Create inline policy → JSON. Paste one of the policies below. Replace YOUR-BUCKET-NAME.
  6. Open Security credentials → Create access key. Choose Application running outside AWS (or Other). Save the Access key ID and Secret access key.
  7. In FloatFM, open Settings → Connections and enter Access key ID, Secret access key, Region, and Bucket. Use Test connection.

Never paste root-account keys into the app. A user that can only s3:ListBucket and s3:GetObject on this one bucket is enough.

4. IAM policy JSON

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.

iam-policy.json
{
  "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/*"
    }
  ]
}

MinIO and S3-compatible storage

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

Support and Questions

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

What FloatFM collects — and what it never sees

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

Use the player. You own the files and the risk.

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.