๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ Connect With Me

  • ๐ŸŽฏ Seeking Roles: Research or industry roles where I can leverage my multi-disciplinary toolkit, combining low-level systems logic, machine learning workflows, and modern web architecture, to solve real-world problems in engineering, finance, and adjacent fields.
  • ๐Ÿ“ CV / Resume: View my Resume
  • ๐Ÿ“ Location: Bologna, Italy
  • ๐Ÿ“ฑ Phone: (+39) 366 4207296
  • ๐Ÿ“ง Email: giovannigravili112@gmail.com
  • ๐Ÿ”— LinkedIn: linkedin.com/in/giovanni-gravili
  • ๐Ÿ™ GitHub: github.com/ghovax

Selected Projects

๐ŸŽฅ Multi-View HLS Stream Synchronization

I built a multi-view video engine that synchronizes four separate HLS streams in real-time. The core challenge was ensuring multiple high-bitrate video feeds stay in perfect lockstep while maintaining smooth playback in the browser. The synchronization uses a Leader/Follower system where one video acts as the clock, and the others constantly monitor and correct their timeline. I set a strict tolerance of 50 milliseconds, the threshold for human perception. But forcing those corrections simultaneously overloaded the browserโ€™s media pipeline.

The solution was staggered execution. I applied a tiny 30-millisecond delay between each streamโ€™s seek command. It sounds minor, but it completely stabilized the system, preventing media decoder stuttering. To handle intensive analytics, frame drop rates, efficiency scores, sync drift, I integrated Go WebAssembly. The idea is simple: donโ€™t block the main JavaScript thread thatโ€™s busy decoding four video streams. My TypeScript component grabs raw data and sends it to the Go WASM module, which quickly returns performance classifications. I packaged the WASM loading into a custom React hook for clean, reusable integration.

The engine includes a dedicated logging layer that captures every performance metric, sync correction, and network error. I specifically chose JSON Lines (JSONL) for the data format, ideal for high-volume log aggregation and perfect for feeding into systems like New Relic or BigQuery. One crucial defense against crashes: I explicitly capped the HLS back-buffer length to 90 seconds, protecting against out-of-memory issues on low-power devices.