HN user

geekuillaume

623 karma

I'm a french developer and good food adict. I love the web and everything working around it.

Posts37
Comments65
View on HN
www.youtube.com 5mo ago

A 3000W Water-Cooled Power Supply (With GAN and Sic) [video]

geekuillaume
1pts0
xakcop.com 2y ago

Making a Chromecast Receiver

geekuillaume
4pts1
developer.chrome.com 4y ago

Smooth and simple page transitions with the shared element transition API

geekuillaume
1pts0
there.oughta.be 5y ago

Open-source macro keyboard with E-Ink display

geekuillaume
2pts0
soundsync.app 5y ago

Show HN: Soundsync – Easy to use synchronized multiroom audio

geekuillaume
10pts4
www.youtube.com 6y ago

Swashplateless Helicopter [video]

geekuillaume
3pts0
github.com 6y ago

Snapcast – Synchronous multi-room audio player

geekuillaume
301pts131
v8.dev 7y ago

Weak References and Finalizers – V8 Features

geekuillaume
2pts0
blog.besson.co 7y ago

Getting per-request context in Node.js with async_hooks

geekuillaume
5pts0
dbacked.github.io 7y ago

Show HN: DBacked, open-source database backup script with interactive install

geekuillaume
1pts0
medium.com 7y ago

SQL Tip: JSONB_AGG in PostgreSQL for simple one-to-many joins

geekuillaume
16pts3
news.ycombinator.com 8y ago

Ask HN: What did you do to comply with GDPR?

geekuillaume
1pts2
github.com 8y ago

NgraphJS: Path finding in a graph

geekuillaume
1pts0
medium.com 9y ago

10x engineers take long naps

geekuillaume
85pts50
github.com 9y ago

React PDF: Create PDF Files Using React

geekuillaume
2pts0
blog.lizzie.io 9y ago

Notes about CVE-2016-7117

geekuillaume
1pts0
github.com 10y ago

Pokemon Go API with Protobuf

geekuillaume
1pts0
medium.com 10y ago

A tweaker guide to OS X personalization

geekuillaume
8pts0
github.com 10y ago

Show HN: ChatUp, a highly performant and scalable Chat platform in Node.js

geekuillaume
2pts0
medium.com 10y ago

A YC Fellowship Rejection

geekuillaume
5pts0
medium.com 11y ago

Technology and the Evolution of Storytelling

geekuillaume
4pts0
acelisweaven.github.io 11y ago

Show HN: Arrow Hero

geekuillaume
195pts55
angular.io 11y ago

Angular 2 Developer Preview (and new docs)

geekuillaume
3pts0
news.ycombinator.com 11y ago

Ask HN: Are non-free Slack Communities worth the cost?

geekuillaume
4pts4
wentin.github.io 11y ago

Underline.js – playful underlines

geekuillaume
2pts0
news.ycombinator.com 11y ago

Ask HN: I'm going to present technology jobs to 400 16yo,what should I tell them?

geekuillaume
6pts6
tympanus.net 11y ago

Best of Codrops in 2014

geekuillaume
8pts0
www.reddit.com 11y ago

What line from a book has stuck with you?

geekuillaume
2pts3
usecrawly.com 11y ago

Crawly – Easy Real-time Web Crawling as a Service

geekuillaume
22pts0
besson.co 12y ago

ShowHN: Web SVG Typographic Experiment

geekuillaume
1pts0
PostHog FOSS 13 days ago

Agreed, I tried self-hosting it a couple of month ago and it was impossible. I spent the day on it but the setup process was broken because of a recent change which was made for their cloud offering. Managing both a codebase both adapted to a cloud deployment with a huge amount of users and to a self-hosted way small deployment is very hard and requires a lot of resources. It's hard to justify investing this much time and money in making it work well for a self-hosted setup, and it seems like they stopped doing so.

It's still great to make the code open, but it's not usable anymore for a self-hosted setup.

I also been using it for 5+ years, it's been really great! And Neamar, the creator, is a really nice guy who goes the extra mile to make sure it works great, doesn't need any permission that are not absolutely required and stays up-to-date with the last changes of the Android API.

The first image is a Rancilio Silvia espresso machine. If you like DIY, you can add your own PID with an ESP32 (wifi-enabled cheap microcontroler), a thermocouple (to measure the temperature of the boiler) and a solid-state relay (to turn on/off the boiler heating element) for less than $40. I did it in my own machine following this repo: https://github.com/rancilio-pid/clevercoffee. I have perfectly stable temperature, I can turn on the heating from my bed (with MQTT and HomeAssistant) and I used the occasion to fully understand how my machine works (which tbh is always a big part of the motivation for doing these kind of projects).

There are some projects like Snapcast[1] or SoundSync[2] (disclaimer: I'm the creator of Soundsync) to let multiple devices communicate together on the same network. The transmission-side isn't that complex: you choose an audio codec, transmit chunks of data and add a synchronization layer (to keep multiple outputs in sync and to correctly delay video playback to match the soundtrack). The bigger problem is building an ecosystem big enough to make it attractive. Bluetooth sucks but is everywhere.

[1] https://github.com/badaix/snapcast [2] https://github.com/geekuillaume/soundsync

HiFiBerryOS 6 years ago

HifiBerryOS is really nice. I used it for a couple of years (mainly for Spotify and Airplay) and I never had any problem with it. I need to create a PR to integrate my project Soundsync[1], it would add multi-room audio synchronization to this project. The last missing integration imo is a Chromecast receiver but this is blocked by the missing encryption keys. It would really be awesome if Google releases them.

[1] https://github.com/geekuillaume/soundsync

I encountered this problem on my project Soundsync. It's controlled by a webpage that needs to connect to every Soundsync peer on the current local network. I couldn't use HTTP as I need to instantiate an AudioWorklet (which has the same security requirements as a WebWorker). The big browser warning of a self-signed HTTPS certificate is a deal-breaker for a lot of non tech-savy users (which are my target).

In the end, I used WebRTC from an external HTTPS webpage I'm hosting and a "mailbox" service where two peers can post and retrieve messages from a UUID. To communicate this UUID on the local network to the peer, I first used an <img> tag with the UUID in the URL query string but this method was recently broken because of increased security measures by browsers. I now use two methods:

- Bonjour: Every peer listen for every bonjour request on the network, on the webpage I make a request to https://soundsync-UUID.local/. The peer then extract the UUID from the request and connect

- TLS Server Name Indication: I use sslip.io to connect to https://UUID_IP.sslip.io/. This is redirected to the local network IP of the peer which use the full domain name in the TLS handshake to extract the conversation UUID. This method doesn't always work because of some router filtering out DNS records resolving to 192.168.X.X.

All this process is very hacky and doesn't always work but I haven't found anything else better. We still don't have a good way to make self-hosting easy for anyone while making it secure and not dependant on an external service.

The latency is dynamically set from the max latency of each audio output (reported by the OS or the WebAudio context) plus 200ms. I haven't tweaked this yet to find the best possible value so it's still quite high. In the future I want to observe the network quality (packets loss mainly, latency on the local network is not an issue in most cases) to use a custom latency for each network. As I use Opus for the audio encoding, I've enabled the packet loss concealer which is already helping in case of package loss.

Hello everyone, I’m Guillaume, the creator of Soundsync.

Soundsync is a software to synchronize every audio speaker in your home and listen to your music however you want. It’s compatible with a lot of existing audio systems (Chromecast, Airplay, Spotify, WebAudio, OS audio) and focus on using what you already own instead of selling you a new proprietary system. I’ve been working on this since early 2020 and it’s in a good enough shape now that I use it everyday at home.

You can install it on any number of Windows, MacOS and Linux computers (and also RaspberryPis) on your local network and control each speaker from the web interface from any web browser on the same network. When multiple speakers are linked to the same audio source, Soundsync synchronizes them to make the playback seamless (less than 10ms drift in most cases). It supports any type of configuration, as many audio sources and audio outputs on any number of devices. You can even connect multiple audio cards on a single computer and control them separately.

The full source-code is available on Github and it’s released under the BSL License. It respects your privacy (more info in the FAQ on the landing page), doesn’t share any information with third-parties and only collects anonymous basic usage data that can be disabled easily.

On the technical side, this is Javascript, uses WebRTC to communicate in a peer-to-peer model (no server-client) and some WebAssembly to encode and resample the audio streams. The Web interface uses the same code as the installable binary for the audio and communication. The binary is an Electron package built on Github Actions. I’m using Cubeb, the multi-OS audio library used by Firefox. This is the most technically complex project I’ve ever done. Some hard problems I’ve encountered include precise audio synchronization, peer-to-peer communication system, connection to local peers from an external https webpage (the controller at https://soundsync.app/controller) and C bindings between the audio lib and NodeJS (which are available separately here https://github.com/geekuillaume/node-audioworklet/).

I’m happy to talk more about this if you have any questions! :)

You can use the Airplay output integration of Soundsync to send your music to your Sonos speakers. Soundsync keep track of each output latency and correct for it to keep all output synchronized.

All the communication stack is based on WebRTC. I made this decision to centralize the command and audio communication methods and also to easily support web targets. For Gstreamer, it should be possible to use the same method as for the Librespot (Spotify) and Shairport (Airplay source) intergration: capturing the stdout of a program. I didn't test it yet but there is the `! filesink location=/dev/stdout` option to do just that. I might also add a way to read on a named pipe (which should be easy to do) if its needed.

Snapcast is really cool, Johannes did an awesome job! I used it for a long time at home on multiple RaspberryPis. I've been working for some time on a more user-friendly and cross-OS alternative. It's available here: https://github.com/geekuillaume/soundsync

I think I'm going to try to integrate net-boot in Soundsync this weekend. It would be awesome to be able to install Soundsync on any computer on the network, turn on an option and then just start the rPi to get it to play music.

I've been part of the early testers and I can fully recommend the game! It's simple at first, gets harder really fast but the learning curve is well adapted.

Perfect game to pass time without the modern games addictive bullshit :)

Not my project but I've been using it for a year on 3 Raspberry Pi and it has been rock solid. I highly recommend it. The synchronization is perfect and it only adds a small delay (500ms max) to the music. I've configured Librespot to use this as a Spotify Play speaker and control it from the desktop or mobile Spotify app.

The presigned requests are great, you can also use multi-part presigned URL to upload a large file in multiple chunks and resume the upload if it's interrupted.

Just one precision, you don't need to contact S3 to get a presigned URL, it's a cryptographic operation most libs do on your server. This means that if your key is invalid for any reason, the URL will be signed but the error will only be raised when the client starts the upload. You need to check for this in your code.