<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mert Koc</title>
    <description>The latest articles on DEV Community by Mert Koc (@mert_koc_e1587654700e8cc8).</description>
    <link>https://dev.to/mert_koc_e1587654700e8cc8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4224550%2F3fd83735-a46b-44e7-bd91-a7ca8c50c1d8.png</url>
      <title>DEV Community: Mert Koc</title>
      <link>https://dev.to/mert_koc_e1587654700e8cc8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mert_koc_e1587654700e8cc8"/>
    <language>en</language>
    <item>
      <title>Flutter ile 15 Telefonda 60 FPS Şişe Çevirmece: Neden Koordinat Yayını Yerine Deterministik Sönümleme Kullandık?</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:39:13 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/flutter-ile-15-telefonda-60-fps-sise-cevirmece-neden-koordinat-yayini-yerine-deterministik-1g1n</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/flutter-ile-15-telefonda-60-fps-sise-cevirmece-neden-koordinat-yayini-yerine-deterministik-1g1n</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/mert_koc_e1587654700e8cc8/flutter-ile-cok-oyunculu-online-sise-cevirmece-oyunu-gelistirdik-wobbly-bottle-420h"&gt;İlk yazımızda&lt;/a&gt; ev partilerinde tek telefona toplanma çilesini bitirmek için geliştirdiğimiz &lt;strong&gt;Wobbly Bottle&lt;/strong&gt;'ın hikayesini anlatmıştık.&lt;/p&gt;

&lt;p&gt;Dev.to topluluğundan sunucu otoritesi ve yeniden bağlanma (reconnection) modeli hakkında gelen teknik sorular üzerine bu ikinci bölümü hazırladık.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. İlk Hata: Her Karede Koordinat Akıtmak
&lt;/h2&gt;

&lt;p&gt;İlk prototipimizde basit düşündük: Şişeyi çeviren host telefon her animasyon karesinde (&lt;code&gt;onTick&lt;/code&gt;) şişenin güncel açısını WebSocket ile odadaki diğer 14 telefona göndersin.&lt;/p&gt;

&lt;p&gt;Sonuçlar tam bir kabustu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bant Genişliği Patlaması:&lt;/strong&gt; Saniyede 60 mesaj × 14 cihaz mobil veri kotasını ve sunucuyu dakikalar içinde tüketti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ağ Gecikmesi (Jitter):&lt;/strong&gt; Wi-Fi veya 4G dalgalanmalarında şişe diğer telefonlarda takılarak, zıplayarak veya geriden gelerek döndü.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eski Cihazlarda Isınma:&lt;/strong&gt; Yoğun JSON parse işlemi eski Android telefonlarda aşırı ısınmaya ve FPS düşüşüne yol açtı.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Çözüm: Durumu Değil, Girdiyi Senkronize Etmek
&lt;/h2&gt;

&lt;p&gt;Şişenin duracağı nokta tamamen başlangıç koşullarına bağlıdır. O halde her kareyi yayınlamak yerine, host çevirdiği an &lt;strong&gt;tek bir küçük paket&lt;/strong&gt; gönderir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roundId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"initialAngle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impulse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"angularVelocity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1730000000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Odadaki her telefon (iOS ve Android), yerel Flutter &lt;code&gt;CustomPainter&lt;/code&gt; katmanında aynı sönümleme matematiğini bağımsız çalıştırır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onTick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tüm cihazlar aynı başlangıç ivmesi ve aynı sürtünme katsayısıyla yerel olarak hesaplama yaptığı için, şişe salondaki 15 telefonun tamamında aynı derecede ve aynı milisaniyede durur!&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Yeniden Bağlanma: Replay Değil, Anlık Snapshot
&lt;/h2&gt;

&lt;p&gt;Oyunculardan birinin interneti kopup odaya geri döndüğünde geçmiş turların animasyonunu baştan sona oynatmak (event replay) parti akışını böler.&lt;/p&gt;

&lt;p&gt;Bunun yerine istemci sunucudan doğrudan &lt;strong&gt;anlık oda durumunu (Snapshot)&lt;/strong&gt; çeker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sıra kimde?&lt;/li&gt;
&lt;li&gt;Masada açık olan kart ne?&lt;/li&gt;
&lt;li&gt;Şişe şu an dönüyor mu yoksa durdu mu?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oyuncu tek bir kare bile beklemeden güncel ana ışınlanır.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ücretsiz İndirin ve Deneyin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/" rel="noopener noreferrer"&gt;Resmi Web Sitemiz ve Şişe Simülatörü&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;App Store'dan İndir&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play'den İndir&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;GitHub Depomuz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>turkish</category>
      <category>gamedev</category>
      <category>websockets</category>
    </item>
    <item>
      <title>Pourquoi la Physique Déterministe a Sauvé la Synchro de 15 Téléphones en Flutter</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:38:22 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/pourquoi-la-physique-deterministe-a-sauve-la-synchro-de-15-telephones-en-flutter-5goj</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/pourquoi-la-physique-deterministe-a-sauve-la-synchro-de-15-telephones-en-flutter-5goj</guid>
      <description>&lt;p&gt;Nous sommes l'équipe de développement indépendante derrière &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/jeu-de-la-bouteille-en-ligne.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lors des soirées étudiantes ou des apéros, 10 personnes se bousculent presque toujours autour d'un seul smartphone de 6 pouces. Wobbly Bottle élimine ce problème : jusqu'à 15 participants rejoignent le salon avec un code PIN à 6 lettres, et la bouteille tourne en temps réel, synchronisée à 60 FPS sur &lt;strong&gt;l'écran de chaque joueur&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Pourquoi streamer chaque image a échoué
&lt;/h2&gt;

&lt;p&gt;Notre première idée : diffuser l'angle de la bouteille 60 fois par seconde via WebSockets aux 14 autres téléphones.&lt;/p&gt;

&lt;p&gt;Le résultat a été catastrophique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consommation de données excessive :&lt;/strong&gt; 60 paquets par seconde multipliés par 14 clients saturent la bande passante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saccades et décalages :&lt;/strong&gt; Dès qu'un réseau 4G subit une micro-coupure, l'animation devient hachée.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surchauffe thermique :&lt;/strong&gt; Sur les anciens appareils Android, décoder des flux JSON intensifs entraînait des chutes de framerate.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. La solution : Synchroniser l'événement, calculer en local
&lt;/h2&gt;

&lt;p&gt;Au lieu de diffuser des coordonnées, l'hôte transmet &lt;strong&gt;un seul message initial&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roundId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"initialAngle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impulse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"angularVelocity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1730000000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque téléphone exécute ensuite localement la même formule de décélération dans un &lt;code&gt;CustomPainter&lt;/code&gt; Flutter à 60 FPS :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onTick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grâce à cette physique déterministe, la bouteille ralentit et s'arrête au même angle exact sur tous les écrans du salon.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Reconnexion instantanée : Snapshot au lieu de Replay
&lt;/h2&gt;

&lt;p&gt;Si un joueur perd momentanément la connexion, nous ne rejouons pas l'historique des animations passées. Le client demande un &lt;strong&gt;instantané d'état&lt;/strong&gt; (qui doit jouer, quelle carte est tirée) et reprend la partie immédiatement sans latence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Liens de Téléchargement Gratuit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/jeu-de-la-bouteille-en-ligne.html" rel="noopener noreferrer"&gt;Guide officiel du Jeu de la Bouteille en Ligne&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Télécharger sur l'App Store Apple&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Télécharger sur le Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;Dépôt Open Source sur GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>french</category>
      <category>gamedev</category>
      <category>websockets</category>
    </item>
    <item>
      <title>Por Qué la Física Determinista Salvó la Sincronización de 15 Móviles en Flutter</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:20:43 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/por-que-la-fisica-determinista-salvo-la-sincronizacion-de-15-moviles-en-flutter-3f8b</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/por-que-la-fisica-determinista-salvo-la-sincronizacion-de-15-moviles-en-flutter-3f8b</guid>
      <description>&lt;p&gt;Somos el equipo de desarrollo independiente detrás de &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/juego-de-la-botella-online.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En las fiestas con amigos, 10 personas siempre terminan amontonadas sobre una sola pantalla móvil de 6 pulgadas. Wobbly Bottle resuelve esto permitiendo que hasta 15 personas se unan a una sala con un código PIN de 6 dígitos: la botella gira en tiempo real y sincronizada a 60 FPS en el teléfono de &lt;strong&gt;cada participante&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. El fallo de transmitir fotograma por fotograma
&lt;/h2&gt;

&lt;p&gt;Nuestra primera idea fue transmitir el ángulo de rotación a 60 FPS por WebSockets a los 14 teléfonos restantes. &lt;/p&gt;

&lt;p&gt;Las consecuencias fueron inmediatas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consumo masivo de datos:&lt;/strong&gt; 60 mensajes por segundo multiplicados por 14 dispositivos saturan la red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micro-cortes:&lt;/strong&gt; Si una conexión 4G flaquea, la animación se vuelve entrecortada y pierde sincronía.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calentamiento:&lt;/strong&gt; Los móviles antiguos sufrían caídas de rendimiento al procesar tantos paquetes de red.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. La solución: Sincronizar el evento, renderizar en local
&lt;/h2&gt;

&lt;p&gt;En lugar de enviar posiciones, el anfitrión envía &lt;strong&gt;un único mensaje inicial&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roundId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"initialAngle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impulse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"angularVelocity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1730000000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada móvil ejecuta exactamente la misma fórmula de fricción en su propio &lt;code&gt;CustomPainter&lt;/code&gt; a 60 FPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onTick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al compartir el mismo impulso de inicio y el mismo paso de integración, la botella frena en el mismo grado exacto en todas las pantallas.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Reconexión instantánea por instantánea (Snapshot)
&lt;/h2&gt;

&lt;p&gt;Si un jugador pierde cobertura o cambia de app unos segundos, no reproducimos animaciones pasadas. El cliente solicita una &lt;strong&gt;instantánea de estado&lt;/strong&gt; (quién tiene el turno y qué carta está en juego) y vuelve a la partida al instante.&lt;/p&gt;




&lt;h2&gt;
  
  
  Descarga y Enlaces Oficiales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/juego-de-la-botella-online.html" rel="noopener noreferrer"&gt;Guía oficial del Juego de la Botella Online&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;App Store (iOS)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play (Android)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;Repositorio en GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>spanish</category>
      <category>gamedev</category>
      <category>websockets</category>
    </item>
    <item>
      <title>Flaschendrehen Multi-Device in Flutter: Warum deterministische Physik unsere 15-Handy-Sync rettete</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 19:19:35 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/flaschendrehen-multi-device-in-flutter-warum-deterministische-physik-unsere-15-handy-sync-rettete-4cep</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/flaschendrehen-multi-device-in-flutter-warum-deterministische-physik-unsere-15-handy-sync-rettete-4cep</guid>
      <description>&lt;p&gt;Wir sind das unabhängige Entwickler-Team hinter &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/flaschendrehen-online.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Part 1 haben wir das Konzept vorgestellt: Bei WG-Partys und Feiern hängen oft 10 Leute über einem einzigen 6-Zoll-Display. Mit Wobbly Bottle treten bis zu 15 Personen über einen 6-stelligen PIN-Code einem Raum bei – und die Flasche dreht sich synchron auf &lt;strong&gt;jedem einzelnen Handy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ein Leser auf Dev.to hat uns nach der Server-Autorität und Reconnect-Logik gefragt. Hier ist die detaillierte Architektur:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Warum "Jeden Frame streamen" fehlschlug
&lt;/h2&gt;

&lt;p&gt;Unser erster Impuls: Wenn sich der Flaschenwinkel 60 Mal pro Sekunde ändert, senden wir den Winkel einfach per WebSocket an alle 14 anderen Handys.&lt;/p&gt;

&lt;p&gt;Das Problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bandbreiten-Verschwendung:&lt;/strong&gt; 60 Updates pro Sekunde an 14 Clients erzeugen massiven Traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netzwerk-Jitter:&lt;/strong&gt; Schwankende WLAN- oder 4G-Pings führen zu Rucklern und asynchronen Stopps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Akku &amp;amp; Hitze:&lt;/strong&gt; Ältere Android-Geräte überhitzen bei hoher JSON-Dekodierungsrate.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Die Lösung: Event synchronisieren, lokal rendern
&lt;/h2&gt;

&lt;p&gt;Statt Bildpunkte zu übertragen, sendet der Host beim Drehen &lt;strong&gt;eine einzige kompakte Nachricht&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roundId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"initialAngle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impulse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"angularVelocity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1730000000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jedes verbundene Gerät führt die identische physikalische Dämpfung in einem 60 FPS &lt;code&gt;CustomPainter&lt;/code&gt; lokal aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onTick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da alle Handys mit demselben Startimpuls und derselben Reibungsformel rechnen, stoppt die Flasche auf jedem Display im Raum auf das exakt selbe Grad.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Reconnects: Snapshot statt Replay
&lt;/h2&gt;

&lt;p&gt;Verliert ein Spieler kurz das Netz, spielen wir nicht mühsam alte Animationen nach. Der Client holt sich sofort einen &lt;strong&gt;State-Snapshot&lt;/strong&gt; des Raums (wer ist dran, welche Karte liegt offen) und schaltet sich nahtlos wieder ein.&lt;/p&gt;




&lt;h2&gt;
  
  
  Download &amp;amp; Open Source Guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/flaschendrehen-online.html" rel="noopener noreferrer"&gt;Offizieller deutscher Flaschendrehen Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;App Store (iOS)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play (Android)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>deutsch</category>
      <category>gamedev</category>
      <category>websockets</category>
    </item>
    <item>
      <title>The Anti-Awkward First Date Playbook: Why Center-Table Physics Breaks the Ice</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 17:37:02 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/the-anti-awkward-first-date-playbook-why-center-table-physics-breaks-the-ice-dbc</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/the-anti-awkward-first-date-playbook-why-center-table-physics-breaks-the-ice-dbc</guid>
      <description>&lt;p&gt;A first date can start out feeling like a job interview in nice clothes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What do you do for work?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Where did you grow up?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Do you come to this cafe often?"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Those questions aren’t inherently bad. The trouble is that they put all the pressure on two people to continuously produce the next line of dialogue. When a pause arrives, both people notice it, get self-conscious, and suddenly the awkward pause becomes the entire focus of the table.&lt;/p&gt;

&lt;p&gt;A shared activity gives your mutual attention somewhere else to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Put Something in the Middle of the Table
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Table Mode&lt;/strong&gt; in &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/first-date-icebreakers-and-date-night-games.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt; was designed for a single phone placed flat in the middle of the table between both drinks.&lt;/p&gt;

&lt;p&gt;The bottle spins on that screen; two people take turns and use the prompt as a natural springboard for conversation.&lt;/p&gt;

&lt;p&gt;The phone becomes a small shared focal point. Instead of staring across the table and trying to invent the next clever question, both people react to the same visual moment: the spin, the suspense as the physics slows down, and the comic relief of a squeaky rubber chicken squawking on screen.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why a Shared Object Changes the Chemistry
&lt;/h2&gt;

&lt;p&gt;When every pause seems to demand an immediate conversational recovery, tension builds up. A small game changes the psychological rhythm:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;There is a simple next action:&lt;/strong&gt; Swipe to spin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is a shared result to react to:&lt;/strong&gt; Both eyes are locked on the same outcome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A prompt opens a door:&lt;/strong&gt; It leads naturally into travel stories, funny childhood phases, or playful debates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Either person controls the depth:&lt;/strong&gt; You can keep the answer light and sarcastic, or take it in a deeper direction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The point isn’t to outsource the date to a mobile app. It’s to have a gentle fallback when the conversation needs a nudge.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Comfort Comes Before Competition
&lt;/h2&gt;

&lt;p&gt;The best icebreaker is one both people actually want to play. In Wobbly Bottle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero account creation or sign-up walls:&lt;/strong&gt; Start playing in 2 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy pass option:&lt;/strong&gt; If a question feels too personal for date one, skip it with a tap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works 100% offline:&lt;/strong&gt; No cellular data or Wi-Fi needed in noisy bars or cozy cafes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the conversation finds its own rhythm and the ice is broken, put the phone back in your pocket and enjoy the evening.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/first-date-icebreakers-and-date-night-games.html" rel="noopener noreferrer"&gt;Official First Date Icebreaker Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Download on Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Download on Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;Explore the Open Ecosystem on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>social</category>
      <category>dating</category>
      <category>mobile</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why Streaming Coordinates at 60 FPS Failed: How Deterministic Angular Damping Saved Our 15-Phone Party Game in Flutter</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 17:35:58 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/why-streaming-coordinates-at-60-fps-failed-how-deterministic-angular-damping-saved-our-15-phone-enb</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/why-streaming-coordinates-at-60-fps-failed-how-deterministic-angular-damping-saved-our-15-phone-enb</guid>
      <description>&lt;p&gt;When every phone receives every animation frame, network traffic starts driving the experience. We wanted the network to agree on what happened, while each device handled drawing locally.&lt;/p&gt;

&lt;p&gt;A bottle spin looks simple: apply force, watch it rotate, wait for it to stop. Put that spin on fifteen phones at once, though, and it becomes a distributed-systems problem disguised as a party game.&lt;/p&gt;

&lt;p&gt;Our first instinct was to synchronize the visible motion. If the bottle’s angle changes every frame, why not send the new angle over a WebSocket 60 times per second?&lt;/p&gt;

&lt;p&gt;Because &lt;strong&gt;“send every frame” makes the network part of the animation loop.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cost of Synchronizing Pixels
&lt;/h2&gt;

&lt;p&gt;At 60 frames per second, one spinning bottle can produce 60 state updates each second. Each update needs to be encoded, sent, received, decoded, and applied. A server that fans the updates out to fourteen other phones has to deliver those updates repeatedly, too.&lt;/p&gt;

&lt;p&gt;The raw number of bytes is only part of the cost. Every message also competes with network jitter, mobile radio power saving, background scheduling, and other room events. If several updates arrive late or in a burst, the receiving phone has to decide whether to render stale positions, skip ahead, or wait.&lt;/p&gt;

&lt;p&gt;None of those choices is ideal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rendering every received coordinate&lt;/strong&gt; can make the bottle trail behind the host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropping old coordinates&lt;/strong&gt; creates visible, jarring jumps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiting for updates&lt;/strong&gt; makes the animation feel uneven and choppy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deeper issue is that the network is carrying a description of every frame, when the game really needs agreement on the spin event itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Synchronize the Event; Draw the Motion Locally
&lt;/h2&gt;

&lt;p&gt;A spin can be represented by a small set of inputs: the initial angle, the angular impulse, and a shared start time. The host publishes that event once over the WebSocket connection. Each client then runs the same motion model locally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roundId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"round-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spinId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spin-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"initialAngle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impulse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"angularVelocity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1730000000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"simulationVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works reliably when every client interprets those inputs consistently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The starting angle is shared.&lt;/li&gt;
&lt;li&gt;The spin begins at a common room time reference.&lt;/li&gt;
&lt;li&gt;All clients use the same motion rules and fixed simulation step.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What &lt;code&gt;angularVelocity *= 0.985&lt;/code&gt; Does
&lt;/h2&gt;

&lt;p&gt;The damping rule is compact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At each simulation step, angular velocity shrinks to 98.5% of its previous value. The bottle keeps rotating while gradually losing speed.&lt;/p&gt;

&lt;p&gt;If 0.985 is applied once per fixed 60 Hz simulation tick, the velocity after $n$ ticks is:&lt;br&gt;
$$\omega_n = \omega_0 \times 0.985^n$$&lt;/p&gt;

&lt;p&gt;Given the same initial angle, initial angular velocity, tick count, and update order, every client following the same recurrence computes the exact same sequence of angles.&lt;/p&gt;

&lt;p&gt;To avoid frame rate divergence (e.g. 120 Hz ProMotion vs 60 Hz standard screens), we decouple simulation time from rendering time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;dampingPerStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.985&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;simulateSpin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;dampingPerStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;angularVelocity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fixedStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application renders with Flutter’s &lt;code&gt;CustomPainter&lt;/code&gt; at the display’s available rate while advancing the spin in fixed simulation steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reconnecting with a Snapshot
&lt;/h2&gt;

&lt;p&gt;A 6-digit PIN makes it easy to enter or return to a room. When a phone drops Wi-Fi for 5 seconds and reconnects, replaying every historical event since disconnection is wasteful and slow.&lt;/p&gt;

&lt;p&gt;Instead, the client requests a &lt;strong&gt;compact current-state snapshot&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The room and current round identifiers.&lt;/li&gt;
&lt;li&gt;The current phase (waiting, spinning, showing a result).&lt;/li&gt;
&lt;li&gt;The participant list and current turn.&lt;/li&gt;
&lt;li&gt;The resolved angle or selected player.&lt;/li&gt;
&lt;li&gt;The current prompt card state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The player returns to the current moment immediately, without watching historical animations fast-forward.&lt;/p&gt;




&lt;h2&gt;
  
  
  15 Screens, One Shared Result
&lt;/h2&gt;

&lt;p&gt;Local animation changes what the network has to guarantee. It no longer has to deliver sixty positions per second to every phone. It has to deliver the spin event reliably, provide a shared timing reference, and resolve any meaningful disagreement.&lt;/p&gt;

&lt;p&gt;In a party room with up to 15 phones, that keeps the experience responsive and silky-smooth without making every animation frame wait for the network.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/best-party-game-apps.html" rel="noopener noreferrer"&gt;Best Party Game Apps Comparison 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/61mertkoc-cpu/wobbly-bottle" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>architecture</category>
      <category>gamedev</category>
      <category>distributed</category>
    </item>
    <item>
      <title>Jeux de Soirée et Apéro sur Mobile : Comment Nous Avons Créé Wobbly Bottle avec Flutter</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 17:03:58 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/jeux-de-soiree-et-apero-sur-mobile-comment-nous-avons-cree-wobbly-bottle-avec-flutter-2bjd</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/jeux-de-soiree-et-apero-sur-mobile-comment-nous-avons-cree-wobbly-bottle-avec-flutter-2bjd</guid>
      <description>&lt;h2&gt;
  
  
  Pourquoi réinventer le jeu de la bouteille et les jeux d'apéro ?
&lt;/h2&gt;

&lt;p&gt;Lors des soirées entre amis, des apéros ou des fêtes d'étudiants, le problème des applications de jeux de société classiques est récurrent :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un seul petit écran&lt;/strong&gt; que 10 personnes essaient de regarder en même temps en se bousculant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Des cartes de questions répétitives&lt;/strong&gt; ou bloquées derrière des abonnements coûteux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Des connexions compliquées&lt;/strong&gt; avec création de compte obligatoire qui coupent l'ambiance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est pour éliminer ces frictions que nous avons conçu &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/jeu-de-la-bouteille-en-ligne.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Deux modes pensés pour la vraie vie
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mode En Ligne Multi-Écrans (Online Sync)
&lt;/h3&gt;

&lt;p&gt;Chaque participant rejoint la salle en scannant un QR code ou en entrant un code à 4 lettres. &lt;br&gt;
Lorsque l'hôte fait tourner la bouteille, &lt;strong&gt;la rotation physique est synchronisée en temps réel à 60 FPS sur l'écran de chacun&lt;/strong&gt;, peu importe qu'ils soient sur iPhone ou Android.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mode Table (Pass-and-Play)
&lt;/h3&gt;

&lt;p&gt;Pour les apéros intimistes, les premiers rendez-vous (dates) ou les voyages en voiture, posez simplement le smartphone au centre de la table. La bouteille tourne, ralentit avec un moteur physique réaliste et désigne le joueur.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Au-delà de la simple bouteille en verre
&lt;/h2&gt;

&lt;p&gt;Pour apporter une dimension festive et décalée, Wobbly Bottle permet de faire tourner des objets loufoques :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le fameux &lt;strong&gt;Poulet en Plastique Couineur&lt;/strong&gt; avec son cri authentique qui déclenche des fous rires immédiats.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;Baguette Magique Scintillante&lt;/strong&gt;, le &lt;strong&gt;Pinceau Cosmique&lt;/strong&gt; ou le &lt;strong&gt;Marteau Thor&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Les packs de questions pour toutes les ambiances
&lt;/h2&gt;

&lt;p&gt;Le jeu intègre des centaines de cartes adaptées à chaque contexte :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action ou Vérité Déjanté&lt;/strong&gt; pour animer les soirées étudiantes et les apéros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Briser la Glace &amp;amp; Date Romantique&lt;/strong&gt; pour détendre l'atmosphère lors d'un premier rendez-vous sans malaise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spécial Amis &amp;amp; Confessions&lt;/strong&gt; pour découvrir les secrets les plus inavouables de votre bande.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Liens de téléchargement gratuit
&lt;/h2&gt;

&lt;p&gt;L'application est disponible gratuitement sans publicité intrusive :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Télécharger sur l'App Store Apple&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Télécharger sur le Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/meilleures-applications-jeux-de-soiree-comparatif.html" rel="noopener noreferrer"&gt;Guide officiel et comparatif des jeux de soirée&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The First Date Paradox: Killing Awkward Silences with Physics and Table Mode</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:54:59 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/the-first-date-paradox-killing-awkward-silences-with-physics-and-table-mode-2jj9</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/the-first-date-paradox-killing-awkward-silences-with-physics-and-table-mode-2jj9</guid>
      <description>&lt;h2&gt;
  
  
  The Job-Interview Trap on First Dates
&lt;/h2&gt;

&lt;p&gt;We have all experienced this uncomfortable dynamic:&lt;br&gt;
You meet someone for coffee or drinks. In the beginning, small talk flows naturally, but 20 minutes in, you hit the inevitable wall. You start asking standard resume questions:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"So, where did you grow up?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"What do you do for work?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Do you have siblings?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It stops feeling like a romantic date and starts feeling like an HR interview. The moment a lull in conversation occurs, both people get self-conscious.&lt;/p&gt;

&lt;p&gt;When building &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/first-date-icebreakers-and-date-night-games.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;, we realized our app wasn't just for wild 15-person house parties. We engineered a dedicated &lt;strong&gt;Table Mode&lt;/strong&gt; specifically to save two-person date nights.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Psychology of Table Mode
&lt;/h2&gt;

&lt;p&gt;Instead of holding phones separately or pulling out clunky card decks, you place &lt;strong&gt;one single phone&lt;/strong&gt; in the center of the cafe or bar table between both glasses.&lt;/p&gt;

&lt;p&gt;You smile and say:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Let's see what the bottle wants us to talk about next."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You swipe to spin. The custom 2D/3D physics engine tilts, bends, and spins the bottle. As it slows down, both of your eyes are locked on the screen with shared anticipation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Handcrafted Flirt &amp;amp; Icebreaker Cards
&lt;/h2&gt;

&lt;p&gt;The prompt cards are carefully designed to avoid interview questions while staying away from uncomfortable intimacy too early:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playful Opinions:&lt;/strong&gt; Debating funny life philosophies and quirky habits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Confessions:&lt;/strong&gt; Revealing guilty pleasures, embarrassing childhood phases, and travel stories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flirt Chemistry:&lt;/strong&gt; Gentle sparks that break physical and conversational tension without being overly intrusive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comic Relief:&lt;/strong&gt; If you spin the Squeaky Rubber Chicken, it lets out an authentic squawk that immediately causes both of you to burst out laughing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Perfect for Road Trips and Campfires Too
&lt;/h2&gt;

&lt;p&gt;Because Table Mode runs on a single device without requiring room codes or strong internet connections, it also doubles as the ultimate road trip and campfire game:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep passengers awake during late-night drives.&lt;/li&gt;
&lt;li&gt;Play around the campfire without cards blowing away in the wind.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Free to Download
&lt;/h2&gt;

&lt;p&gt;Wobbly Bottle is 100% free with no mandatory sign-ups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/first-date-icebreakers-and-date-night-games.html" rel="noopener noreferrer"&gt;Official First Date Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Juegos de Beber y Fiestas en el Movil: Como Construimos Wobbly Bottle con Flutter</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:45:24 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/juegos-de-beber-y-fiestas-en-el-movil-como-construimos-wobbly-bottle-con-flutter-2110</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/juegos-de-beber-y-fiestas-en-el-movil-como-construimos-wobbly-bottle-con-flutter-2110</guid>
      <description>&lt;h2&gt;
  
  
  La Trampa del "Unico Movil" en las Fiestas
&lt;/h2&gt;

&lt;p&gt;Todos conocemos la escena:&lt;br&gt;
Estas en una previa, reunion o fiesta en casa con 10 o 15 amigos y alguien propone jugar a &lt;strong&gt;Verdad o Reto o el Juego de la Botella&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;De repente empieza la incomodidad:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Doce personas apretadas hombro con hombro intentando leer una pantallita de 6 pulgadas.&lt;/li&gt;
&lt;li&gt;Pasarse el telefono entre vasos de cerveza llenos de condensacion, con el riesgo continuo de que caiga al suelo.&lt;/li&gt;
&lt;li&gt;Apps que tras 3 preguntas te exigen suscripciones semanales de 9,99 euros.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para solucionar esto creamos &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/juegos-para-parejas-a-distancia-facetime.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Salas Sincronizadas tipo Jackbox
&lt;/h2&gt;

&lt;p&gt;¿Por que pasarse un solo dispositivo cuando &lt;strong&gt;cada jugador puede participar desde su propio smartphone&lt;/strong&gt;?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;El anfitrion crea la sala:&lt;/strong&gt; Toca "Crear Sala" y genera un codigo PIN de 6 digitos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrada instantanea:&lt;/strong&gt; Todos los amigos abren la app en iOS o Android, ponen el PIN y eligen su avatar. Sin registros ni contraseñas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fisica sincronizada en tiempo real:&lt;/strong&gt; Cuando la botella gira, se tambalea, inclina y rueda en &lt;strong&gt;todas las pantallas a la vez&lt;/strong&gt; al milisegundo exacto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objetos disparatados:&lt;/strong&gt; Gira el Pollo de Goma que chilla, la Chancla voladora, el Pepinillo tembloroso o el Champan VIP.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3 Modos de Juego para Cualquier Ocasion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modo Mesa:&lt;/strong&gt; Un solo telefono en el centro de la mesa para partidas rapidas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modo Fiesta en Casa:&lt;/strong&gt; Cada uno desde su movil con chupitos de castigo y retos grupales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modo Remoto:&lt;/strong&gt; Diseñado para parejas a distancia y videollamadas de Discord o FaceTime con retos de captura de pantalla y webcam.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Descarga Gratis en iOS y Android
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/mejores-juegos-para-beber-en-fiestas.html" rel="noopener noreferrer"&gt;Guia Oficial y Preguntas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Designing Games for Long Distance Couples: Beating Video Call Fatigue with Wobbly Bottle</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:40:45 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/designing-games-for-long-distance-couples-beating-video-call-fatigue-with-wobbly-bottle-47p5</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/designing-games-for-long-distance-couples-beating-video-call-fatigue-with-wobbly-bottle-47p5</guid>
      <description>&lt;h2&gt;
  
  
  The FaceTime Fatigue in Long-Distance Relationships
&lt;/h2&gt;

&lt;p&gt;If you have ever been in a long-distance relationship (LDR), you know this exact cycle:&lt;br&gt;
You love talking to each other, but after 45 minutes on FaceTime or WhatsApp video, you run out of things to say. Asking &lt;em&gt;"How was your day?"&lt;/em&gt; for the fifth time feels repetitive, and staring at each other's faces in silence creates unnecessary pressure.&lt;/p&gt;

&lt;p&gt;Most mobile party games and Truth or Dare apps fail miserably over video chat because their dares assume you are in the same room:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Hug the person to your left"&lt;/em&gt; or &lt;em&gt;"Drink from their cup"&lt;/em&gt; makes zero sense when your partner is 2,000 miles away.&lt;/p&gt;

&lt;p&gt;When developing &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/long-distance-relationship-games.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;, we built a dedicated &lt;strong&gt;Remote Mode&lt;/strong&gt; specifically for video call couples and long-distance friends.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Dares Tuned for Video Screens
&lt;/h2&gt;

&lt;p&gt;Instead of physical-contact challenges, our Remote Mode decks feature digital intimacy and interactive camera challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot Dares:&lt;/strong&gt; &lt;em&gt;"Show your screen time stats or the 4th photo in your camera roll right now without deleting anything."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room Scavenger Hunts:&lt;/strong&gt; &lt;em&gt;"Find the weirdest object in your bedroom and explain its origin in 15 seconds on webcam."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice &amp;amp; Social Dares:&lt;/strong&gt; Send a funny voice note to a mutual friend or read your most embarrassing saved note out loud.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Synchronized Bottle Physics Across Thousands of Miles
&lt;/h2&gt;

&lt;p&gt;Both partners open Wobbly Bottle on iOS or Android, enter a 6-digit room PIN, and the room syncs over low-latency WebSockets.&lt;/p&gt;

&lt;p&gt;When one partner swipes to spin, the bottle bends, tilts, and spins on &lt;strong&gt;both screens simultaneously&lt;/strong&gt;. There is no need to aim a camera at a real bottle or share screens over heavy desktop software.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Handcrafted Intimacy &amp;amp; Flirt Prompts
&lt;/h2&gt;

&lt;p&gt;Beyond laughs, late-night calls thrive on vulnerable conversations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep relationship questions you have never thought to ask.&lt;/li&gt;
&lt;li&gt;Playful flirt and couples chemistry prompts.&lt;/li&gt;
&lt;li&gt;+18 Spicy adult party decks for intimate late-night game sessions.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Free on iOS &amp;amp; Android
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/long-distance-relationship-games.html" rel="noopener noreferrer"&gt;Official Long-Distance Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The Introverts Guide to Being the Life of the Party: The Wobbly Bottle Playbook</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:27:25 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/the-introverts-guide-to-being-the-life-of-the-party-the-wobbly-bottle-playbook-2o84</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/the-introverts-guide-to-being-the-life-of-the-party-the-wobbly-bottle-playbook-2o84</guid>
      <description>&lt;h2&gt;
  
  
  The Awkward First 30 Minutes of Any Gathering
&lt;/h2&gt;

&lt;p&gt;We have all been there:&lt;br&gt;
You walk into a house party, pre-drinks, or casual mixer. You know maybe two people. Small groups have already formed, and everyone else is nervously staring at their smartphone screens, checking Instagram or texting people who aren't in the room.&lt;/p&gt;

&lt;p&gt;It is the classic social friction point. Most party games try to solve this by forcing everyone to crowd shoulder-to-shoulder around a single cracked smartphone screen, passing it around sticky drink tables.&lt;/p&gt;

&lt;p&gt;When we designed &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/how-to-be-the-life-of-the-party-guide.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt;, we asked a simple question:&lt;br&gt;&lt;br&gt;
&lt;em&gt;What if, instead of fighting people's phones, we turned them into the party's central catalyst?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Secret Weapon: Frictionless Synchronized Rooms
&lt;/h2&gt;

&lt;p&gt;Here is the exact playbook to become the undisputed hero of the night:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Announce the Room Code
&lt;/h3&gt;

&lt;p&gt;Tap &lt;strong&gt;"Host Room"&lt;/strong&gt; on Wobbly Bottle. Hold up your screen with the 6-digit PIN and QR code:&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Hey, open Wobbly Bottle and type 684-219 on your phones, we are spinning the bottle."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Within 15 seconds, 10 to 15 people are in your lobby. No passwords, no email registration, zero friction.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Switch to the Squeaky Rubber Chicken
&lt;/h3&gt;

&lt;p&gt;A plain green soda bottle is fine, but spinning a &lt;strong&gt;squeaky rubber chicken&lt;/strong&gt; that bends, tilts, and squawks dynamically across every phone in the room instantly breaks the ice. The shared anticipation as it slows down gets everyone watching together.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Laser-Targeted Prompts
&lt;/h3&gt;

&lt;p&gt;When the bottle lands, neon lasers point at both the questioner and the answerer across everyone's phone screen. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ice Breaker:&lt;/strong&gt; Lighthearted questions designed for people who just met.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flirt &amp;amp; Couples:&lt;/strong&gt; Sparks chemistry and playful conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extreme Dares &amp;amp; Shots:&lt;/strong&gt; Physical challenges and drinking penalties for high-energy pre-drinks.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3 Modes for Any Social Setting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Table Mode:&lt;/strong&gt; Single device in the center of the table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;House Party Mode:&lt;/strong&gt; Multi-phone synchronized room play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Mode:&lt;/strong&gt; Specially crafted for long-distance friends over Discord, Zoom, and FaceTime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Free to Download
&lt;/h2&gt;

&lt;p&gt;Wobbly Bottle is free on both major platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/how-to-be-the-life-of-the-party-guide.html" rel="noopener noreferrer"&gt;Official Web Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Flaschendrehen &amp; Wahrheit oder Pflicht fur Hauspartys: Wie wir Wobbly Bottle gebaut haben</title>
      <dc:creator>Mert Koc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 16:07:45 +0000</pubDate>
      <link>https://dev.to/mert_koc_e1587654700e8cc8/flaschendrehen-wahrheit-oder-pflicht-fur-hauspartys-wie-wir-wobbly-bottle-gebaut-haben-3b8l</link>
      <guid>https://dev.to/mert_koc_e1587654700e8cc8/flaschendrehen-wahrheit-oder-pflicht-fur-hauspartys-wie-wir-wobbly-bottle-gebaut-haben-3b8l</guid>
      <description>&lt;h2&gt;
  
  
  Das Problem auf jeder Hausparty
&lt;/h2&gt;

&lt;p&gt;Jeder kennt die Situation: Man sitzt mit 8 bis 12 Freunden in der WG oder beim Vortrinken zusammen und mochte eine Runde &lt;strong&gt;Flaschendrehen oder Wahrheit oder Pflicht&lt;/strong&gt; spielen.&lt;/p&gt;

&lt;p&gt;Bisherige Apps fuhren immer zum gleichen Frust:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Das Ein-Handy-Gedrange:&lt;/strong&gt; Alle mussen sich um einen einzigen 6-Zoll-Bildschirm drangen. Das Handy wird uber klebrige Tische gereicht und landet fast im Bierglas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abzock-Abos:&lt;/strong&gt; Nach drei Runden verlangen viele Apps unverschamt 9,99 Euro pro Woche fur Standard-Fragen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aus diesem Frust heraus haben wir &lt;strong&gt;&lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/flaschendrehen-online.html" rel="noopener noreferrer"&gt;Wobbly Bottle&lt;/a&gt;&lt;/strong&gt; entwickelt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Das Prinzip: Raum-Codes wie bei Jackbox
&lt;/h2&gt;

&lt;p&gt;Warum ein Handy herumreichen, wenn &lt;strong&gt;jeder auf seinem eigenen Smartphone&lt;/strong&gt; spielen kann?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host erstellt einen Raum:&lt;/strong&gt; Ein Spieler tippt auf "Raum erstellen" und bekommt einen 6-stelligen PIN-Code und QR-Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sofortiger Beitritt:&lt;/strong&gt; Alle Freunde offnen die App auf iOS oder Android und geben den Code ein. Keine Registrierung, kein Passwort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synchronisierte Flaschenphysik:&lt;/strong&gt; Wenn der Host dreht, rotiert, kippt und wackelt die Flasche &lt;strong&gt;auf allen Handys synchron zur exakt gleichen Millisekunde&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laser-Zielauswahl:&lt;/strong&gt; Wenn die Flasche stoppt, zeigen Neon-Laser auf den Fragesteller und den Antwortenden.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3 Spielmodi fur jeden Anlass
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tisch-Modus:&lt;/strong&gt; Das Handy liegt klassisch in der Mitte des Tisches, wenn nur ein Gerat vorhanden ist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hausparty-Modus:&lt;/strong&gt; Jeder auf dem eigenen Smartphone mit Gruppen-Challenges, Trinkstrafen und Mutproben.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote-Modus:&lt;/strong&gt; Fur Fernbeziehungen und Freunde in anderen Stadten uber Discord oder FaceTime mit Screenshot- und Webcam-Aufgaben.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lustige Dreh-Objekte
&lt;/h2&gt;

&lt;p&gt;Statt nur der klassischen grunen Glasflasche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐔 &lt;strong&gt;Das quietschende Gummihuhn&lt;/strong&gt; (wackelt und quietscht bei jedem Stoß)&lt;/li&gt;
&lt;li&gt;🥒 &lt;strong&gt;Die wackelnde Gurke&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🩴 &lt;strong&gt;Die fliegende Sandale&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🍾 &lt;strong&gt;Der VIP-Gold-Champagner&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1.000+ handverlesene Karten in 5 Sprachen
&lt;/h2&gt;

&lt;p&gt;Verfugbar auf Deutsch, Englisch, Turkisch, Spanisch und Franzosisch in 5 Kategorien:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eisbrecher&lt;/li&gt;
&lt;li&gt;Tiefe Geheimnisse&lt;/li&gt;
&lt;li&gt;Extreme Aufgaben &amp;amp; Shots&lt;/li&gt;
&lt;li&gt;Flirt &amp;amp; Paare&lt;/li&gt;
&lt;li&gt;+18 Pikant (VIP)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Kostenlos herunterladen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🍏 &lt;a href="https://apps.apple.com/app/id6794894168" rel="noopener noreferrer"&gt;Apple App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;a href="https://play.google.com/store/apps/details?id=com.wobblybottle.game" rel="noopener noreferrer"&gt;Google Play Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;a href="https://61mertkoc-cpu.github.io/wobbly-bottle/die-besten-flaschendrehen-fragen.html" rel="noopener noreferrer"&gt;Offizielle Webseite &amp;amp; Fragenkatalog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
