Show HN: Ambiphone, no-nonsense ambient music and white noise (ambiph.one)

357 points by matteason ↗ HN
I built this free, no-nonsense white noise app. I know there are plenty of them out there already, but I wanted to make something beautiful and easy-to-use, without logins or ads or in-app purchases or any of the other stuff a lot of them have.

I appeared on The Economist's The Intelligence podcast [0] this week talking about Ambiphone and another ambient music project, Ambient ScotRail Beats [1] - I'm on at about 17:30

There's a big selection of music and sounds already but I'm always adding more - if there's anything you'd like to see added, let me know!

[0] https://www.economist.com/podcasts/2024/01/01/why-2024-could...

[1] https://matteason.co.uk/scotbeats

135 comments

[ 3.7 ms ] story [ 233 ms ] thread
Pretty cool, I personally prefer the sound selections on Forest, though.
(comment deleted)
Love it! Need to try it for my next work session.

What'd you make it with?

Thanks! It's built in Vue 3, UI is all built from scratch.

The sounds are FLAC files, which is the only compressed format which loops seamlessly across all browsers. Sound files are hosted in an S3 bucket, which is behind Cloudflare (free) to minimise S3 egress costs, so thankfully it doesn't cost much to run at all.

The sounds are all permissively licensed and mainly sourced from freesound.org and freemusicarchive.org - I'm hugely grateful to everyone who shared such high-quality sounds and music for free. There's a list of credits at https://ambiph.one/acknowledgements

Winner. Anything no-nonsense, now a days in this world, is a winner! Thank you!
Fantastic! The design is just great; so simple and no-nonsense.

Honestly, I don't really use white-noise generators so I didn't plan on using it, myself, but after realizing it allows layering the sounds, I've built a really nice little soundscape and find myself missing a function that would allow me to transfer that design (selected sounds and volumes) to another instance of the app.

Totally not necessary, of course! Easy enough to re-configure. Just something I thought I might use, in case you were interested.

Thanks for the great feedback!

I'm building the ability to save mixes at the moment actually - good point about being over to move them over to a new device. At the moment I'm just storing saved mixes in localstorage but people will definitely want the ability to sync at some point. I've been trying to avoid having an account system in the interests of keeping things simple but I might have to bite the bullet or come up with another clever way to keep things in sync

You could store all state in the URL fragment. Maybe each key is a sound and each value is the volume, like /#whale=5&fire=8 or whatever. Call replaceState (better than pushState to avoid polluting the back button history with every little tweak) whenever the user changes something. On page load, read from the URL fragment using window.location.hash and then sharing is just a matter of copying the URL, which could be done entirely in browser chrome, and/or via a "share" button you provide.

These might help:

https://www.jvt.me/posts/2019/08/01/node-parse-url-fragment/

https://stackoverflow.com/a/66416539

Great recommendation for such simple state! The portability of that is just perfect!
This is exactly what I do on https://www.matteason.co.uk/scotbeats/ actually - any settings change is reflected in the URL and read back on load. When I implement sharing of individual mixes it'll probably look a lot like this
I feel your pain. I'm building my own local-first, no-nonsense app and need to solve the same problem. I've got proof of concepts for both a no-account server syncing scheme (app generates key, you manually enter that key in whichever instance you want to share the data with) and a web-rtc based p2p sync.

But I will say that I have a need to sync data, which is why I'm putting effort into getting that syncing working (as well as compressed and encrypted). I really doubt you would need something robust for this type of thing. I'd, personally, be perfectly happy to get a json "export" of your local storage values that I could just "import" into a new instance of the app. I'll email it to myself. No need to complicate it with automation and all of the baggage that comes along with accounts.

If nothing else, a manual import/export is a fully-featured first implementation that can be iterated into something more robust.

This is a good point. I like the safety of being able to have my own local copy of my data so json export/import would be a good first step
You could generate some sort of hash of the selected options, encode it with something that’s short and human readable and then share that on the screen?

Something easy for a human to transfer like honey-chair-balcony or something. Store the settings in the backend against this identifier and then you can retrieve it later? So you still need a backend but no need for accounts

This is the best version of this kind of thing, thanks! I like how a sound fades in over a second or two when you enable it, it might be nice if it also faded out when you disable it. Especially for when you're sound 'DJing' to find the right mix.
Thank you! I had wanted to do that but it's marginally trickier than fading in - I agree it would be a much nicer experience than a harsh cut-off though, I'll look into it
I had guessed it might be something like this, and that of course you'd have wanted this! Will definitely use this lots, thanks again
Despite the unappealing name, I've found brown noise the best noise to study with.

Also, didn't expect to see number stations pop up in there, nice surprise.

Found similar thing other day [0] but thing is.. If this is not an App it's not usable. People tend to listen this while resting (in bed for example) so makes no sense have this in browser. For example [0] stops playing when screen is off/locked

[0] https://moodist.app

OK to reply to myself, after testing it, this one does work while phone screen is off so this is usable. Thanks
Yeah, it's actually surprisingly tricky to get sound to persist with the screen off, especially on iOS, but I managed it in the end.

I'm testing a PWA version at the moment too so it'll be installable to your home screen - the test version at https://test.ambiph.one is PWA-enabled if anyone would like to try it out

Yeah, this is even better. Maybe add 'reset' button that will reset all sounds to "not selected".
(comment deleted)
This is great! (One thing I noticed is that at the default volume, the "heavy rain" is much louder than the "thunder". It would arguably be more realistic if they were similar in volume.)
Good point, I'll get this cleaned up
This is really cool.

Can we maybe have apollo mission chatter?

Yes great idea!

Coincidentally I'm also building a live ISS tracker which embeds NASA's live camera stream [0]. Sometimes I have Ambiphone and the ISS tracker running at the same time and it's nice when the ISS chatter pops up, so I think the Apollo recordings would work really well.

[0] https://www.youtube.com/watch?v=P9C25Un7xaM

The fact that we can put these things over top of each other is awesome.
Very clean! By the way, I find the volume sliders a bit tricky to use, as it's way too easy to accidentally toggle the sound instead of just moving the slider.
Oh this is great feedback, thanks. I'll look at putting a deadzone around the volume slider so it's harder to mix them up
I have been using Atmosphere for years now.

Its main advantage is that it's an app (at least on Android) and that it works perfectly even when offline.

It has a wide variety of sounds to mix and match, as well as an option to save favorite combinations for quick access.

Another big benefit of Atmosphere is that its audio can play while other apps are also playing audio, such as a music or video player. This opens up even more avenues for custom mixes for when your brain needs exactly the right ambient sound combo to fall asleep.
Was going to mention this site. One nice thing it has that could be useful for this app is to have the ability to save a preset and load it in the future. I found it quite useful in mynoise.net
This is in development at the moment and very close to being launched - watch this space
(comment deleted)
Very slick interface with a nice selection of sounds! I would definitely use this if only it could connect to my Sonos.
I'll look into the Sonos API. The problem I've found with other casting/streaming APIs (Google Cast in particular) is that it expects a single URL to stream from, whereas Ambiphone is just loading individual sound files and playing them simultaneously on your device. It should work fine over Bluetooth but I appreciate that's not the best experience with Sonos and other smart speakers
Oh no! I think we’re out of luck if my reading of [1] is right. Sonos API only supports streaming from a single URL.

[1]: https://docs.sonos.com/docs/streaming-basics

It's not out of the question at all, I just need to figure out how to combine the sounds server-side and stream them out. On the plus side it should then be pretty simple to make work across different smart speakers, I'm just not sure how complex/expensive it would be to get set up
If you have police scanner audio, then you should definitely include archival NASA radio recordings as another option.
On it! The Apollo 11 audio is all on archive.org [0] so I'll get some samples from that added

https://archive.org/details/Apollo11Audio

There are also air traffic recordings. Those are very lengthy streams.

Nice work, BTW.

Offhand do you know what the copyright status of ATC recordings is? The Apollo recordings are public domain because they're US government works
https://www.liveatc.net/legal/

(liveatc.net seems to be the most well-known website for live atc audio)

It sounds like they just don't want you to create an app for livestreaming contents of liveatc.net and that they allegedly own all rights to the content.

Maybe you could contact them, and ask if you could use some recordings.

I love it!

I hate that most of these apps are subscription based for no good reason. This is so clean and nice...

One thing that would be awesome would be an option to preload and cache the noises. I regularly use white noise machines in offline situations (planes, remote camp ground), offline mode would make it the ultimate machine!

Great suggestion. I'm testing a PWA version at the moment (https://test.ambiph.one) and PWAs do allow offline caching of resources but I'm not sure if I'll bump up against any cache size limits. I seem to remember reading that Safari is particularly stingy unfortunately.
Awesome! Maybe a toggle to select those you want to preload?
Yeah, once I've implemented saved mixes prioritising those sounds would be good too
This would be so sick!
> I hate that most of these apps are subscription based for no good reason.

The developer earning a living?

If there are continued costs associated with running the service, sure, I’ll pay a subscription if it’s good enough. A subscription for static content is a complete and total grift. Such content should be a one-time payment, which I will happily pay if it’s good enough
> A subscription for static content is a complete and total grift.

You're here so I'll charitably assume you've managed a web server ever.

There is no such thing as 'static'.

Yes there is. And I am the admin of multiple webservers. What you are right about is that the content being static does not mean the work load is zero
If you're building a mobile app with a few noises, then it's static. You might get updates to the OS API once in a while, but there's no ongoing work. I'm fine giving you a fixed fee, as we've always done until everybody became crazy about subscriptions.
I have considered adding a subscription tier called Ambiphone Minus which gets you absolutely nothing extra and may even take features away
I think I would do a donation if I use it
(comment deleted)
I have side projects as well but I'm pretty sure most developers have a day job. I don't earn anything from my side projects and don't want to. I'm afraid money would "change the equation" and might damage the user experience and awaken the low-key greed in me.
Please tell me that ‘ambiphone’ rhymes with ‘antiphone’ as my music teacher said it, rhyming also with ‘catastrophe’ or ‘Penelope’
Ha! I've always said am-BEE-fone but am-BIH-fon-EE is now the official alternative pronounciation
The ticking clock being an actual clock is a nice touch.
Thanks, you're the first to spot that!
Beautiful interface.

I played Kirk Osamayo- Realization to test it and it put me into a 5 minutes of refreshing nap.

You're welcome or I'm sorry, depending on where you are
Cool! I put the ScotRail Beats on for a good 30 minutes, no complaints here. Great job.
I've been working on white noise app for a bit, but with a slightly different focus. While it's maintaining the same core points (limited bullshit, hopefully clear interface, sound staying on with phone screen being off) it addresses problem I constantly found myself having with every app: if I want to switch anything, I have to go back to the webpage/app and there goes some of my focus. Link: https://stimulantnoi.se/

So I made an app focused (hehe.) on ease of switching between noise intensity. There's a long explanation why it's important if you want one (https://incentiveassemblage.substack.com/p/why-is-nobody-ser...), but if you're the kind of nerd who knows about 'flow state' and 'Yerkes-Dodson law', you pretty much got everything covered. The core point is: if intensity of your main activity is changing, your background noise should too, so that you maintain the same total level of arousal. Most likely double so for ADD people.

My current solution is to use media buttons (forward/backward) to control intensity. It took much more work than you'd expect to get media interface to do this without breaking currently playing sounds. In general anything that isn't 'Play this sound' works much worse than one would anticipate with how prevalent media is on the internet - I see ambiphone does the same thing with playing sounds separately, but you saved yourself from managing media interface, so I can't quite tell how much pain exactly you have experienced with this.

That's really interesting, I'll check yours out.

Yeah it has been painful. It took a lot of trial and error to get it working consistently across browsers, from absolute basics like getting gapless looping audio working consistently across browsers to maintaining playback while the screen's off to iOS treating background audio differently in PWAs vs Safari. I've managed to get it in a fairly hack-free state now but I am definitely worried about browsers shifting underneath me and breaking things in the future. Best of luck with your app too!

If you want to block out distractions, without damaging your ability to perceive high frequencies, use brown noise.