<?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: ArcaneGaming</title>
    <description>The latest articles on DEV Community by ArcaneGaming (@arcanegaming).</description>
    <link>https://dev.to/arcanegaming</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2613324%2F8db2b63d-2e7c-499b-910a-62df39bce4f9.png</url>
      <title>DEV Community: ArcaneGaming</title>
      <link>https://dev.to/arcanegaming</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arcanegaming"/>
    <language>en</language>
    <item>
      <title>I Built My Own Scrum Poker Because All Others Suck 🎴</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Mon, 16 Mar 2026 11:03:57 +0000</pubDate>
      <link>https://dev.to/arcanegaming/i-built-my-own-scrum-poker-because-all-others-suck-2617</link>
      <guid>https://dev.to/arcanegaming/i-built-my-own-scrum-poker-because-all-others-suck-2617</guid>
      <description>&lt;h2&gt;
  
  
  The Problem 😩
&lt;/h2&gt;

&lt;p&gt;Sprint planning. Your team needs to estimate tasks. Someone shares a Planning Poker link. You click. You wait. Half the team can't connect. The other half already went for coffee.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;AGG TEAM&lt;/strong&gt;, we tried everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planning Poker Online (laggy, ads, ancient UI)&lt;/li&gt;
&lt;li&gt;Scrum Poker for Jira (expensive, requires Jira)&lt;/li&gt;
&lt;li&gt;PlanITpoker (works, but missing OUR features)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the third crash mid-estimation, I thought: &lt;em&gt;"Screw it, I'll build my own."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Challenge: 6 Teams, 1 Room 🤯
&lt;/h2&gt;

&lt;p&gt;Here's the twist: we don't have ONE scrum team. We have &lt;strong&gt;SIX departments&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend, Backend, DevOps, QA, Analytics, Management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone wants to do planning poker. &lt;strong&gt;Simultaneously.&lt;/strong&gt; In one room.&lt;/p&gt;

&lt;p&gt;It's chaos. Like playing six different card games at the same table.&lt;/p&gt;

&lt;p&gt;Existing tools say: "Here's one room, figure it out!" Not ideal.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎰 Multi-Table Support (Up to 6!)
&lt;/h3&gt;

&lt;p&gt;Core concept: one session, multiple independent tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// "Frontend Squad", "Backend Ninjas"&lt;/span&gt;
  &lt;span class="nl"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Are cards revealed for this table?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tableId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// Which table they're at&lt;/span&gt;
  &lt;span class="nl"&gt;vote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// "5", "13", "?", "☕"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Host creates tables with custom names. Everyone picks their table. Each table votes independently. You see all tables + an overall average.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host powers:&lt;/strong&gt; Add, remove, rename tables on the fly. Move people between tables if needed.&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚡ Real-Time Sync
&lt;/h3&gt;

&lt;p&gt;Used &lt;strong&gt;Supabase&lt;/strong&gt; as backend. Simple polling approach:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;room&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetchRoomState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchRoomState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Yeah, WebSockets would be cooler. But for prototypes and ~50 users? Polling works great. If it grows, I'll switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updates in real-time:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone joins → instant&lt;/li&gt;
&lt;li&gt;Someone votes → immediate&lt;/li&gt;
&lt;li&gt;Cards revealed → everyone sees results&lt;/li&gt;
&lt;li&gt;Emoji thrown → flies across screen&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  💓 Smart Disconnect Detection
&lt;/h3&gt;

&lt;p&gt;Problem with other tools: people close tabs, but their avatars stay forever. Ghost users.&lt;/p&gt;

&lt;p&gt;My solution uses &lt;strong&gt;heartbeat + explicit disconnect&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Send heartbeat every 10 seconds&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendHeartbeat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rooms/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/heartbeat`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playerId&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Also explicit disconnect on page close&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;beforeunload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendBeacon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rooms/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/disconnect`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playerId&lt;/span&gt; &lt;span class="p"&gt;})&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;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page open but idle? Stay as long as you want (no kicks)&lt;/li&gt;
&lt;li&gt;Close page/tab? Instant disconnect (2 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more ghosts. Clean rooms.&lt;/p&gt;
&lt;h3&gt;
  
  
  🎉 Emoji Attacks!
&lt;/h3&gt;

&lt;p&gt;My favorite feature. Click any participant, throw an emoji. It &lt;strong&gt;literally flies&lt;/strong&gt; from your avatar to theirs with smooth animation.&lt;/p&gt;

&lt;p&gt;12 emojis: 👍 👏 🎉 ❤️ 🚀 🔥 😂 🤔 💯 ✨ 👌 🙌&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👍 agree with estimate&lt;/li&gt;
&lt;li&gt;🔥 someone makes a great point&lt;/li&gt;
&lt;li&gt;😂 junior estimates simple task at 89 points&lt;/li&gt;
&lt;li&gt;☕ definitely coffee time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made our plannings &lt;strong&gt;fun&lt;/strong&gt;. People actually look forward to estimation meetings now!&lt;/p&gt;
&lt;h3&gt;
  
  
  🃏 Fibonacci + Special Cards
&lt;/h3&gt;

&lt;p&gt;Classic: 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89&lt;/p&gt;

&lt;p&gt;Plus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"?"&lt;/strong&gt; → "I have no idea"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"☕"&lt;/strong&gt; → "Need coffee before thinking"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can &lt;strong&gt;change your vote even after reveal&lt;/strong&gt;. Why? Because during discussion you might realize 13 should actually be 8. Most tools lock votes. Mine doesn't.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧮 Auto-Average Calculation
&lt;/h3&gt;

&lt;p&gt;Each table shows its average. Plus &lt;strong&gt;grand total&lt;/strong&gt; at bottom across ALL tables.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculateAverage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;players&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numericVotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;players&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;Perfect for: "What's the overall estimate across all teams?"&lt;/p&gt;
&lt;h3&gt;
  
  
  🌙 Dark Mode + 🌍 Multi-Language
&lt;/h3&gt;

&lt;p&gt;Toggle in corner switches theme (light/dark) and language (EN/RU). Saved to localStorage, auto-applied next time.&lt;/p&gt;

&lt;p&gt;Because if your app doesn't have dark mode in 2026... what are you even doing?&lt;/p&gt;


&lt;h2&gt;
  
  
  Tech Stack 🛠
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;li&gt;Lucide icons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase Edge Functions (Hono + Deno)&lt;/li&gt;
&lt;li&gt;Supabase KV Store (key-value table)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Supabase?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast setup (no server deployment)&lt;/li&gt;
&lt;li&gt;Edge Functions (TypeScript backend)&lt;/li&gt;
&lt;li&gt;Simple KV store for room state&lt;/li&gt;
&lt;li&gt;Free tier for prototypes&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Challenges &amp;amp; Solutions 💡
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Ghost Users
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Users close tabs, avatars stay forever&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Heartbeat mechanism + explicit disconnect via &lt;code&gt;navigator.sendBeacon&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Z-Index Wars
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Theme toggle covered modals&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Proper z-index hierarchy (&lt;code&gt;z-30&lt;/code&gt; buttons, &lt;code&gt;z-40&lt;/code&gt; modals)&lt;/p&gt;
&lt;h3&gt;
  
  
  3. State Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Keeping 6 tables + players in sync&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Single source of truth in backend, polling for updates&lt;/p&gt;


&lt;h2&gt;
  
  
  How Planning Changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Wait, is everyone loaded?"&lt;/li&gt;
&lt;li&gt;"Refresh, I don't see your vote"&lt;/li&gt;
&lt;li&gt;"Who's still here?"&lt;/li&gt;
&lt;li&gt;&lt;em&gt;awkward waiting&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create room (5 seconds)&lt;/li&gt;
&lt;li&gt;Everyone joins (instant)&lt;/li&gt;
&lt;li&gt;Vote, reveal, discuss&lt;/li&gt;
&lt;li&gt;Throw emojis for fun&lt;/li&gt;
&lt;li&gt;Actually finish on time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real feedback:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Wait, planning poker can be smooth?"&lt;/p&gt;

&lt;p&gt;"I love throwing fire emojis at people!"&lt;/p&gt;

&lt;p&gt;"Finally a tool that doesn't make me rage-quit"&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What's Next? 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Session history (who voted what)&lt;/li&gt;
&lt;li&gt;Voting timer (optional countdown)&lt;/li&gt;
&lt;li&gt;Custom decks (T-shirt sizes?)&lt;/li&gt;
&lt;li&gt;Sound effects (optional)&lt;/li&gt;
&lt;li&gt;Jira integration&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Key Takeaways 🧠
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Build what you need&lt;/strong&gt;&lt;br&gt;
Stop waiting for the "perfect" tool. 80% built in a weekend beats 100% coming "eventually."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Polling isn't evil&lt;/strong&gt;&lt;br&gt;
WebSockets are cool, but polling works great for small teams. Don't over-engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Small delights matter&lt;/strong&gt;&lt;br&gt;
Emoji feature took 2 hours. It's everyone's favorite. Little things make big differences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Dark mode is mandatory&lt;/strong&gt;&lt;br&gt;
Seriously. It's 2026.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try It! 🎮
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://scrumpoker.aggone.dev/" rel="noopener noreferrer" class="c-link"&gt;
            AGG POKER
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Engage teams in collaborative estimation with an interactive Scrum poker tool, allowing users to join sessions and streamline project planning.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          scrumpoker.aggone.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Use it, free&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Sometimes a few evenings of coding saves months of frustration. Plus you learn something new. Win-win.&lt;/p&gt;

&lt;p&gt;If your team has the same planning poker pain - build your own! We have amazing frameworks, free hosting, and AI assistants now. There's no excuse.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Questions? Ideas? Want to contribute?&lt;/strong&gt; Drop a comment!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Yes, enterprise solutions exist. Mine cost $0, works perfectly for us, and was fun to build. 😄&lt;/p&gt;

</description>
      <category>react</category>
      <category>vibecoding</category>
      <category>scrum</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Я запилил свой Scrum Poker, потому что все остальные - отстой 🎴</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Mon, 16 Mar 2026 11:01:42 +0000</pubDate>
      <link>https://dev.to/arcanegaming/ia-zapilil-svoi-scrum-poker-potomu-chto-vsie-ostalnyie-otstoi-2ilh</link>
      <guid>https://dev.to/arcanegaming/ia-zapilil-svoi-scrum-poker-potomu-chto-vsie-ostalnyie-otstoi-2ilh</guid>
      <description>&lt;h2&gt;
  
  
  Проблема 😩
&lt;/h2&gt;

&lt;p&gt;Спринт-планирование. Команде нужно оценить таски. Кто-то кидает ссылку на Planning Poker. Ты кликаешь. Ждёшь. Половина команды не может подключиться. Вторая половина уже ушла за кофе.&lt;/p&gt;

&lt;p&gt;Знакомо?&lt;/p&gt;

&lt;p&gt;У нас в &lt;strong&gt;AGG TEAM&lt;/strong&gt; мы перепробовали всё:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planning Poker Online (лагает, реклама, древний интерфейс)&lt;/li&gt;
&lt;li&gt;Scrum Poker for Jira (дорого, требует Jira)&lt;/li&gt;
&lt;li&gt;PlanITpoker (работает, но нет НАШИХ фич)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;После третьего краша посреди оценки я подумал: &lt;em&gt;"Да пошло оно, сделаю сам."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Настоящая задача: 6 команд, 1 комната 🤯
&lt;/h2&gt;

&lt;p&gt;Вот в чём загвоздка: у нас не ОДНА скрам-команда. У нас &lt;strong&gt;ШЕСТЬ отделов&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend, Backend, DevOps, QA, Аналитика, Менеджмент&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Все хотят делать планинг покер. &lt;strong&gt;Одновременно.&lt;/strong&gt; В одной комнате.&lt;/p&gt;

&lt;p&gt;Это хаос. Как играть в шесть разных карточных игр за одним столом.&lt;/p&gt;

&lt;p&gt;Существующие инструменты: "Вот комната, сами разбирайтесь!" Не идеально.&lt;/p&gt;




&lt;h2&gt;
  
  
  Что я сделал
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎰 Поддержка нескольких столов (до 6!)
&lt;/h3&gt;

&lt;p&gt;Основная идея: одна сессия, несколько независимых столов.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// "Frontend отдел", "Backend ниндзя"&lt;/span&gt;
  &lt;span class="nl"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Карты раскрыты для этого стола?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tableId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// За каким столом сидит&lt;/span&gt;
  &lt;span class="nl"&gt;vote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// "5", "13", "?", "☕"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Хост создаёт столы с кастомными названиями. Все выбирают свой стол. Каждый стол голосует независимо. Видишь все столы + общую среднюю оценку.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Возможности хоста:&lt;/strong&gt; Добавлять, удалять, переименовывать столы на лету. Перемещать людей между столами при необходимости.&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚡ Real-time синхронизация
&lt;/h3&gt;

&lt;p&gt;Использовал &lt;strong&gt;Supabase&lt;/strong&gt; как бэкенд. Простой подход с polling:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;room&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetchRoomState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchRoomState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Да, WebSocket'ы были бы круче. Но для прототипа и ~50 пользователей? Polling отлично работает. Если масштаб вырастет, переделаю.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Обновления в реальном времени:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Кто-то присоединился → мгновенно&lt;/li&gt;
&lt;li&gt;Кто-то проголосовал → сразу&lt;/li&gt;
&lt;li&gt;Карты раскрыты → все видят результаты&lt;/li&gt;
&lt;li&gt;Эмодзи брошено → летит через экран&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  💓 Умное определение отключения
&lt;/h3&gt;

&lt;p&gt;Проблема других инструментов: люди закрывают вкладки, но их аватары остаются навсегда. Пользователи-призраки.&lt;/p&gt;

&lt;p&gt;Моё решение использует &lt;strong&gt;heartbeat + явное отключение&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Отправляем heartbeat каждые 10 секунд&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendHeartbeat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rooms/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/heartbeat`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playerId&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Также явное отключение при закрытии страницы&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;beforeunload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendBeacon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rooms/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/disconnect`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playerId&lt;/span&gt; &lt;span class="p"&gt;})&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;&lt;strong&gt;Результат:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Страница открыта, но бездействуешь? Сиди сколько хочешь (без киков)&lt;/li&gt;
&lt;li&gt;Закрыл страницу/вкладку? Мгновенное отключение (2 секунды)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Никаких призраков. Чистые комнаты.&lt;/p&gt;
&lt;h3&gt;
  
  
  🎉 Атаки эмодзи!
&lt;/h3&gt;

&lt;p&gt;Моя любимая фича. Кликаешь на любого участника, кидаешь эмодзи. Оно &lt;strong&gt;буквально летит&lt;/strong&gt; от твоего аватара к его с плавной анимацией (💩)(🤮).&lt;/p&gt;

&lt;p&gt;12 эмодзи: 👍 👏 🎉 ❤️ 🚀 🔥 😂 🤔 💯 ✨ 👌 🙌&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Реальные сценарии:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👍 согласен с оценкой&lt;/li&gt;
&lt;li&gt;🔥 кто-то делает отличное замечание&lt;/li&gt;
&lt;li&gt;😂 джун оценивает простую таску в 89 поинтов&lt;/li&gt;
&lt;li&gt;☕ определённо пора за кофе&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Это сделало наши планирования &lt;strong&gt;весёлыми&lt;/strong&gt;. Люди реально теперь ждут оценочные встречи!&lt;/p&gt;
&lt;h3&gt;
  
  
  🃏 Фибоначчи + специальные карты
&lt;/h3&gt;

&lt;p&gt;Классика: 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89&lt;/p&gt;

&lt;p&gt;Плюс:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"?"&lt;/strong&gt; → "Понятия не имею"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"☕"&lt;/strong&gt; → "Нужен кофе перед размышлениями"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Можно &lt;strong&gt;менять голос даже после раскрытия&lt;/strong&gt;. Почему? Потому что во время обсуждения можешь понять, что 13 на самом деле 8. Большинство инструментов блокируют голоса. Мой - нет.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧮 Автоматический расчёт среднего
&lt;/h3&gt;

&lt;p&gt;Каждый стол показывает свою среднюю. Плюс &lt;strong&gt;общий итог&lt;/strong&gt; внизу по ВСЕМ столам.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculateAverage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;players&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numericVotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;players&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;numericVotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;Идеально для: "Какая общая оценка по всем командам?"&lt;/p&gt;
&lt;h3&gt;
  
  
  🌙 Тёмная тема + 🌍 Мультиязычность
&lt;/h3&gt;

&lt;p&gt;Переключатель в углу меняет тему (светлая/тёмная) и язык (RU/EN). Сохраняется в localStorage, автоматически применяется в следующий раз.&lt;/p&gt;

&lt;p&gt;Потому что если в твоём приложении в 2026-м нет тёмной темы... что ты вообще делаешь?&lt;/p&gt;


&lt;h2&gt;
  
  
  Технический стек 🛠
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;li&gt;Lucide иконки&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase Edge Functions (Hono + Deno)&lt;/li&gt;
&lt;li&gt;Supabase KV Store (key-value таблица)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Почему Supabase?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Быстрая настройка (без деплоя сервера)&lt;/li&gt;
&lt;li&gt;Edge Functions (TypeScript бэкенд)&lt;/li&gt;
&lt;li&gt;Простой KV store для состояния комнат&lt;/li&gt;
&lt;li&gt;Бесплатный tier для прототипов&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Вызовы и решения 💡
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Пользователи-призраки
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Проблема:&lt;/strong&gt; Пользователи закрывают вкладки, аватары остаются навсегда&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Решение:&lt;/strong&gt; Механизм heartbeat + явное отключение через &lt;code&gt;navigator.sendBeacon&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Управление состоянием
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Проблема:&lt;/strong&gt; Синхронизация 6 столов + игроков&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Решение:&lt;/strong&gt; Единый источник правды в бэкенде, polling для обновлений&lt;/p&gt;


&lt;h2&gt;
  
  
  Как изменились планирования
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;До:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Стойте, все загрузились?"&lt;/li&gt;
&lt;li&gt;"Обнови, я не вижу твой голос"&lt;/li&gt;
&lt;li&gt;"Кто ещё тут?"&lt;/li&gt;
&lt;li&gt;&lt;em&gt;неловкое ожидание&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;После:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Создать комнату (5 секунд)&lt;/li&gt;
&lt;li&gt;Все заходят (мгновенно)&lt;/li&gt;
&lt;li&gt;Голосуем, раскрываем, обсуждаем&lt;/li&gt;
&lt;li&gt;Кидаемся эмодзи для веселья&lt;/li&gt;
&lt;li&gt;Реально заканчиваем вовремя&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Реальные отзывы:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Стойте, планинг покер может быть плавным?"&lt;/p&gt;

&lt;p&gt;"Обожаю кидать огненные эмодзи в людей!"&lt;/p&gt;

&lt;p&gt;"Наконец инструмент, который не бесит"&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Что дальше? 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;История сессий (кто как голосовал)&lt;/li&gt;
&lt;li&gt;Таймер голосования (опциональный обратный отсчёт)&lt;/li&gt;
&lt;li&gt;Кастомные колоды (размеры футболок?)&lt;/li&gt;
&lt;li&gt;Звуковые эффекты (опционально)&lt;/li&gt;
&lt;li&gt;Интеграция с Jira&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Ключевые выводы 🧠
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Делай то, что нужно тебе&lt;/strong&gt;&lt;br&gt;
Хватит ждать "идеальный" инструмент. 80% за выходные лучше чем 100% "когда-нибудь".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Polling - не зло&lt;/strong&gt;&lt;br&gt;
WebSocket'ы круты, но polling отлично работает для малых команд. Не усложняй.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Маленькие радости важны&lt;/strong&gt;&lt;br&gt;
Фича с эмодзи заняла 2 часа. Это любимая фича всех. Мелочи делают разницу.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Тёмная тема - обязательна&lt;/strong&gt;&lt;br&gt;
Серьёзно. На дворе 2026-й.&lt;/p&gt;


&lt;h2&gt;
  
  
  Попробуй! 🎮
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://scrumpoker.aggone.dev/" rel="noopener noreferrer" class="c-link"&gt;
            AGG POKER
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Engage teams in collaborative estimation with an interactive Scrum poker tool, allowing users to join sessions and streamline project planning.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          scrumpoker.aggone.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Используй, это бесплатно&lt;/p&gt;




&lt;h2&gt;
  
  
  Итог
&lt;/h2&gt;

&lt;p&gt;Иногда несколько вечеров кодирования экономят месяцы фрустрации. Плюс учишь что-то новое. Win-win.&lt;/p&gt;

&lt;p&gt;Если у твоей команды та же боль с планинг покером - делай свой! Сейчас есть крутые фреймворки, бесплатный хостинг и AI-ассистенты. Отговорок нет.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Вопросы? Идеи? Хочешь помочь?&lt;/strong&gt; Пиши в комментах!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Да, существуют enterprise-решения. Моё стоило $0, отлично работает для нас и было весело делать. 😄&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vibecoding</category>
      <category>scrum</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Snuffer: Как я превратил Android-смартфоны в распределенную сеть мониторинга (и спас свои нервы)</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Wed, 11 Mar 2026 10:03:31 +0000</pubDate>
      <link>https://dev.to/arcanegaming/snuffer-kak-ia-prievratil-android-smartfony-v-raspriedieliennuiu-siet-monitoringha-i-spas-svoi-niervy-2p22</link>
      <guid>https://dev.to/arcanegaming/snuffer-kak-ia-prievratil-android-smartfony-v-raspriedieliennuiu-siet-monitoringha-i-spas-svoi-niervy-2p22</guid>
      <description>&lt;p&gt;Меня зовут Виталий (ну или просто "тот парень, который не любит, когда его сервер падает"), я из команды Arcane Gaming. &lt;br&gt;
Сегодня я хочу рассказать вам о своем пет-проекте, который немного вышел из-под контроля и превратился в полноценный продукт. Встречайте - &lt;strong&gt;Snuffer&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;😫 С чего всё началось?&lt;/strong&gt;&lt;br&gt;
Знаете это чувство, когда вам пишет клиент (или, что еще хуже, мама): &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi87amgpi5fcetc88bctl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi87amgpi5fcetc88bctl.jpg" alt=" " width="480" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"А почему сайт не открывается?"&lt;/strong&gt;&lt;br&gt;
И ты такой: &lt;br&gt;
&lt;strong&gt;"Да ладно, у меня всё работает!"&lt;/strong&gt;&lt;br&gt;
А потом оказывается, что сервер упал 3 часа назад, база данных ушла в дедлок, а ты в это время спокойно пил кофе и смотрел мемы.&lt;/p&gt;

&lt;p&gt;Я перепробовал кучу сервисов: UptimeRobot, Pingdom, Better Uptime. Они крутые, спору нет. &lt;br&gt;
Но:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Дорого , если нужно много проверок.&lt;/li&gt;
&lt;li&gt;Ограниченные локации . Иногда нужно проверить доступность именно из конкретной сети или региона.&lt;/li&gt;
&lt;li&gt;Скучно . Где веселье в том, чтобы просто заплатить денег?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;И тут я посмотрел на ящик своего стола. Там лежали они... Герои прошлых лет. Samsung Galaxy S7, какой-то старый Xiaomi с треснутым экраном и Pixel первого поколения. Они смотрели на меня своими пыльными камерами и шептали: "Мы еще можем быть полезны..." .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz0cih8sm9geqyyet7xt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz0cih8sm9geqyyet7xt.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;И меня осенило! 💡&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx31edmi8pkvktn5vz7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx31edmi8pkvktn5vz7l.png" alt=" " width="800" height="886"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;А что, если использовать эти устройства как узлы мониторинга? &lt;br&gt;
Ведь смартфон - это мощный компьютер с Wi-Fi и GSM модулем. Он может пинговать, делать HTTP-запросы, проверять порты. И если раздать такие телефоны друзьям в разных городах (или просто подключить к разным провайдерам), получится настоящая распределенная сеть мониторинга .&lt;br&gt;
Так родился Snuffer .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📱 Что такое Snuffer?&lt;/strong&gt;&lt;br&gt;
Если говорить умными словами, это распределенная система мониторинга доступности сервисов с использованием мобильных агентов .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Давай короче, что это такое?":&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://snuffer.net/" rel="noopener noreferrer"&gt;Вы регистрируетесь в админке . &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Скачиваете Android-приложение .&lt;/li&gt;
&lt;li&gt;Сканируете QR-код.&lt;/li&gt;
&lt;li&gt;БУМ! Ваш телефон превращается в "Снуффера" (нюхача), который постоянно проверяет, живы ли ваши сайты.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🛠 Что он умеет?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP / Keyword Monitor : Проверяет, отдает ли сайт 200 OK и есть ли на странице нужное слово (например, "Success"). Если нет - бьет тревогу.&lt;/li&gt;
&lt;li&gt;Ping / Port Monitor : Пингует серверы и проверяет открытые порты (полезно для баз данных или кастомных сервисов).&lt;/li&gt;
&lt;li&gt;DNS Monitor : Следит, чтобы ваши домены резолвились куда надо (а не на фишинговые заглушки).&lt;/li&gt;
&lt;li&gt;Vulnerability Scanner : В админке есть встроенный сканер уязвимостей! (Но я пока его еще не сделал, но обязательно доделаю, честно!)&lt;/li&gt;
&lt;li&gt;Telegram Бот : Уведомления прилетают мгновенно. Потому что почту мы читаем редко, а телегу - каждые 5 минут.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feerqsm57mbbn6mutg2rb.png" alt=" " width="800" height="802"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🤓 Немного "под капотом"&lt;/strong&gt;&lt;br&gt;
Я люблю, когда всё работает быстро и четко. Поэтому стек выбрал проверенный и надежный:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend : Node.js + Express (старая добрая классика).&lt;/li&gt;
&lt;li&gt;Database : PostgreSQL + Prisma (потому что писать SQL руками в 2025 — это моветон, хотя я умею!).&lt;/li&gt;
&lt;li&gt;Frontend : React + Tailwind CSS (чтобы было красиво и адаптивно).&lt;/li&gt;
&lt;li&gt;Mobile : React Native / Expo (одна кодовая база, минимум боли).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Самое интересное - это &lt;strong&gt;архитектура&lt;/strong&gt; .&lt;br&gt;
Сервер раздает "задачи" (tasks) подключенным устройствам через WebSocket. Устройства выполняют проверки и шлют отчеты обратно.&lt;br&gt;
Если устройство говорит "Сайт лежит", сервер не верит ему на слово (вдруг у телефона просто Wi-Fi отвалился?). Он ждет подтверждения от других узлов или от самого сервера. Это минимизирует ложные срабатывания.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌍 Почему это круто?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Вторая жизнь вещам . Ваши старые гаджеты не загрязняют природу, а приносят пользу. Экологично! 🌱&lt;/li&gt;
&lt;li&gt;Полный контроль . Вы сами выбираете, откуда мониторить. Хотите проверить доступность из офиса конкурента? Просто подбросьте им телефон с Snuffer (шутка... или нет?).&lt;/li&gt;
&lt;li&gt;Бесплатно (&lt;strong&gt;почти&lt;/strong&gt;). Вы платите только за электричество для зарядки телефона.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Немного забавных моментов разработки&lt;/strong&gt;😂 &lt;br&gt;
Конечно, не обошлось без факапов.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Однажды я случайно заставил все подключенные телефоны (около 20 штук) одновременно пинговать один несчастный сервер с интервалом в 1 секунду. Получился такой мини-DDoS своими руками. Сервер выстоял, но админы хостинга, наверное, напряглись.&lt;/li&gt;
&lt;li&gt;Борьба с режимом энергосбережения Android - это отдельная война. Android очень любит "убивать" фоновые процессы, чтобы сэкономить 1% батареи. Пришлось попотеть, чтобы объяснить системе: "Эй, этот процесс ВАЖЕН, не трогай его!".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🚀 Что дальше?&lt;/strong&gt;&lt;br&gt;
Проект живет и развивается. Сейчас я выкатил версию v4.15.11 (да,я часто обновляю его!).&lt;br&gt;
В планах:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iOS версия (Apple, пустите в AppStore, ну пожалуйста!).&lt;/li&gt;
&lt;li&gt;Больше типов проверок (например, скриншоты сайтов).&lt;/li&gt;
&lt;li&gt;Публичное API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если вам интересно попробовать или просто потыкать палочкой — залетайте:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://snuffer.net/" rel="noopener noreferrer"&gt;Лендинг&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://panel.snuffer.net/" rel="noopener noreferrer"&gt;Админка&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Буду рад любому фидбеку, критике или просто мемам в комментариях!&lt;/p&gt;

&lt;p&gt;Спасибо, что дочитали! Пусть ваш аптайм всегда будет 99.999%! 💚&lt;/p&gt;

&lt;p&gt;P.S.: Ни один старый смартфон не пострадал при разработке этого приложения (кроме того Xiaomi, он упал со стола, но это другая история).&lt;br&gt;
P.S.S.: Один минус забыл указать, что бы это работало, нужно что бы прила была запущена и горел экран, в фоне работать не будет, есть ограничения ОС.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Самые необычные технологические новинки, представленные на CES 2025</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Tue, 14 Jan 2025 14:37:15 +0000</pubDate>
      <link>https://dev.to/arcanegamingcom/samyie-nieobychnyie-tiekhnologhichieskiie-novinki-priedstavliennyie-na-ces-2025-4j13</link>
      <guid>https://dev.to/arcanegamingcom/samyie-nieobychnyie-tiekhnologhichieskiie-novinki-priedstavliennyie-na-ces-2025-4j13</guid>
      <description>&lt;p&gt;Ежегодная выставка электронной техники CES принесла в этом году немало новых интересных анонсов, среди которых можно встретить как обычные девайсы, так и довольно уникальные и даже странные разработки. Давайте рассмотрим самые необычные новинки, которые привлекли всеобщее внимание.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Одежда с солнечными панелями&lt;br&gt;
Стартап Anker &lt;a href="https://www.theverge.com/2025/1/7/24337991/my-other-solar-powered-cloak-is-at-the-dry-cleaner" rel="noopener noreferrer"&gt;представил&lt;/a&gt; концепт «первой в мире одежды с солнечными панелями» – это куртка с нашитыми треугольными фотоэлементами и светодиодными полосками. Она обеспечивает максимальную входную мощность 30 Вт, а также оснащена разъемом USB-C, с помощью которого можно подзарядить телефон.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w3xiakctv5lbga8mer5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w3xiakctv5lbga8mer5.jpeg" alt="Изображение: Antonio G. Di Benedetto / The Verge" width="569" height="722"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Самовыдвигающаяся клавиатура&lt;br&gt;
Клавиатура &lt;a href="https://www.theverge.com/2025/1/5/24336890/the-autokeybo-is-the-keyboard-for-people-who-dream-of-wolverine" rel="noopener noreferrer"&gt;AutoKeybo&lt;/a&gt; состоит из нескольких частей и встроенной камеры, которая следит за движениями рук пользователя и автоматически выдвигает или убирает нужные части клавиатуры, в том числе тачпад и клавиши с цифрами. Предполагается, что такой формат должен помочь печатать быстрее и эффективнее, однако в обсуждениях на технологических форумах многие считают, что это только усложнит процесс. «Кусается» и цена девайса – $700.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ноутбук с увеличивающимся экраном&lt;br&gt;
Компания Lenovo &lt;a href="https://www.engadget.com/computing/laptops/the-thinkbook-plus-gen-6-rollable-is-a-crazy-concept-made-real-162813649.html" rel="noopener noreferrer"&gt;представила&lt;/a&gt; ThinkBook Plus Gen 6 Rollable – это ноутбук с 14-дюймовым OLED-дисплеем, который с помощью нажатия кнопки или специальных жестов можно расширить до 16,7-дюймов.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl2d55w414dousoc91wo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl2d55w414dousoc91wo.jpeg" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Большая портативная игровая консоль&lt;br&gt;
В отличии от стандартных портативных консолей, которые удобно держать в руках, Acer &lt;a href="https://techcrunch.com/2025/01/07/acers-new-gaming-handheld-is-ridiculously-large/" rel="noopener noreferrer"&gt;выпустил&lt;/a&gt; Nitro Blaze 11 – ручную игровую приставку с 10,95-дюймовым дисплеем, размером с полноценный планшет и весом чуть более 1 кг. Она работает на процессоре AMD Ryzen 7 8840HS, имеет 16 ГБ памяти LPDDR5X RAM, несколько разных портов и аккумулятор с ёмкостью 55Wh.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9edbdv8l96p8s8md11p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9edbdv8l96p8s8md11p.png" alt="Изображение: Acer" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ИИ-помощник в виде украшения
Стартап Based Hardware &lt;a href="https://techcrunch.com/2025/01/08/omi-a-competitor-to-friend-wants-to-boost-your-productivity-using-ai-and-a-brain-interface/" rel="noopener noreferrer"&gt;представил&lt;/a&gt; Omi – концепт миниатюрного носимого устройства с функциями ИИ. Его можно носить как кулон, но стартап настаивает, что для более эффективной работы его лучше прикреплять к виску. Устройство подключается к смартфону пользователя и работает на базе GPT-4o; оно постоянно слушает разговоры пользователя, запоминает детали его работы или встреч, может отвечать на вопросы, подводить итоги разговоров, создавать списки дел и помогать планировать встречи. Релиз новинки ожидается через несколько месяцев.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fictwveln60eu194bzc9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fictwveln60eu194bzc9v.png" alt="Изображение: Omi" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Смарт-очки с проекцией в глазное яблоко
Компания Halliday &lt;a href="https://techcrunch.com/2025/01/08/hallidays-489-smart-glasses-beam-a-tiny-screen-to-your-eye/" rel="noopener noreferrer"&gt;продемонстрировала&lt;/a&gt; умные очки с 3,5-дюймовым круглым дисплеем, которые проецируют экран не на линзу, а прямо в глазные яблоки пользователя. Очки могут переводить текст в реальном времени на 40 языков, отображать уведомления телефона, заметки и подсказки по навигации.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq46gse16xjgts8ji9ucq.png" alt="Изображение: Sean O'Kane" width="591" height="394"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzptk262djaq1tl1t9zae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzptk262djaq1tl1t9zae.png" alt="Изображение: Halliday" width="591" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Смарт-кольцо из золота 18 карат&lt;br&gt;
Стартап Ultrahuman &lt;a href="https://www.theverge.com/2025/1/7/24337049/ultrahuman-rare-ces-2025-smart-ring-wearables" rel="noopener noreferrer"&gt;выпустил&lt;/a&gt; своё знаменитое смарт-кольцо Rare в золотом ($1900) и платиновом вариантах ($2200). В функциональном плане оно ничем не отличается от обычной версии – разве что здесь покупателю предлагается пожизненная гарантия.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76a4j2xivvezlwhr7om1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76a4j2xivvezlwhr7om1.png" alt="Изображение: Ultrahuman" width="591" height="394"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Игровое кресло с подогревом и охлаждением&lt;br&gt;
Компания Razer &lt;a href="https://techcrunch.com/2025/01/07/razers-concept-gaming-chair-will-heat-your-butt-up-cool-it-down/" rel="noopener noreferrer"&gt;придумала&lt;/a&gt; идеальное кресло для тех, кто любит подолгу засиживаться за игрой: это геймерское кресло с саморегулирующейся системой подогрева и охлаждения, которая может подогревать спинку до 30°C или, наоборот, подавать в неё прохладный воздух.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9olgrogmo4gtkwjppe64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9olgrogmo4gtkwjppe64.png" alt="Image description" width="592" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Робот-котик для охлаждения кофе&lt;br&gt;
Милый гаджет &lt;a href="https://techcrunch.com/2025/01/05/this-tiny-robot-cat-will-blow-on-your-coffee-to-cool-it-off/" rel="noopener noreferrer"&gt;Nékojita FuFu&lt;/a&gt; от Yukai Engineering выглядит как крошечный роботизированный котик, которого можно прикрепить к кружке или миске – он будет выдувать воздух для охлаждения напитков или супа.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8aruum8txeaq4yc9tjw5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8aruum8txeaq4yc9tjw5.png" alt="Изображение: Yukai Engineering" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Электронная ложка для усиления вкуса еды&lt;br&gt;
Японская компания Kirin Holdings &lt;a href="https://techcrunch.com/2025/01/05/kirin-offers-a-taste-of-its-electric-salt-spoon-at-ces-2025/" rel="noopener noreferrer"&gt;продемонстрировала&lt;/a&gt; электронную ложку, которая может придать еде более солёный вкус с помощью слабого электрического тока, концентрирующего в еде молекулы ионов натрия.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lhi6kqfht5022q1s66m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lhi6kqfht5022q1s66m.png" alt="Изображение: Maxwell Zerg" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Источники: TechCrunch, The Verge&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Microsoft выпустила обновленную малую языковую модель Phi-4</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Fri, 27 Dec 2024 10:07:05 +0000</pubDate>
      <link>https://dev.to/arcanegaming/microsoft-vypustila-obnovliennuiu-maluiu-iazykovuiu-modiel-phi-4-4h0d</link>
      <guid>https://dev.to/arcanegaming/microsoft-vypustila-obnovliennuiu-maluiu-iazykovuiu-modiel-phi-4-4h0d</guid>
      <description>&lt;p&gt;Компания Microsoft пополнила своё семейство генеративных моделей Phi новой разработкой Phi-4. По утверждению создателей, она обучалась на более качественном наборе данных, за счёт чего в итоге превзошла предыдущие версии Phi, а также некоторые модели аналогичного характера.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phi-4 относится к малым языковым моделям и имеет 14 миллиардов параметров. Она конкурирует с аналогичными моделями малых размеров – GPT-4o mini, Gemini 2.0 Flash и Claude 3.5 Haiku. За счет размера их проще и дешевле развернуть на различных устройствах, нежели модели больших форматов.&lt;/li&gt;
&lt;li&gt;Как указывается в блоге компании, Phi-4 превосходит аналогичные и более крупные модели по качеству и точности выдаваемых ответов. В отдельности подчеркивается, что модель особенно хорошо справляется с решением математических задач благодаря использованию высококачественных синтетических и органических наборов данных, а также инновационных методов обучения.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfx28lqxz6c455lxulj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfx28lqxz6c455lxulj6.png" alt="Пример решения математической задачи с помощью Phi-4 / Источник: techcommunity.microsoft.com" width="800" height="1153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Набор минусов у Phi-4 – стандартный для любой ИИ-модели: вероятность периодических «галлюцинаций» или слишком пространных ответов, в том числе из-за чересчур буквального понимания запросов.&lt;/li&gt;
&lt;li&gt;Phi-4 выпущена в качестве превью-версии на платформе для разработчиков Azure AI Foundry от Microsoft – её использование на данный момент разрешено только по лицензии в исследовательских целях. Также инструмент планируют загрузить на Hugging Face.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt9fff0fk5xxa2kvz2mj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt9fff0fk5xxa2kvz2mj.png" alt="Сравнение эффективности Phi-4 с другими моделями / Источник : techcommunity.microsoft.com" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfbxc3q2nxqqvo57iotw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfbxc3q2nxqqvo57iotw.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>OpenAI представила о3 – семейство генеративных моделей со способностью рассуждения</title>
      <dc:creator>ArcaneGaming</dc:creator>
      <pubDate>Thu, 26 Dec 2024 10:18:57 +0000</pubDate>
      <link>https://dev.to/arcanegamingcom/openai-priedstavila-o3-siemieistvo-ghienierativnykh-modieliei-so-sposobnostiu-rassuzhdieniia-33f6</link>
      <guid>https://dev.to/arcanegamingcom/openai-priedstavila-o3-siemieistvo-ghienierativnykh-modieliei-so-sposobnostiu-rassuzhdieniia-33f6</guid>
      <description>&lt;p&gt;Компания OpenAI провела пред-рождественский марафон анонсов новых продуктов, в ходе которого представила новое поколение генеративных моделей о3, пришедшее на замену предыдущей версии о1.&lt;/p&gt;

&lt;p&gt;В семейство вошли две модели: полноценная о3, и компактная о3-mini для менее сложных задач.&lt;br&gt;
Являясь моделью со способностью рассуждения, o3 способна самостоятельно проверять свои же ответы, что увеличивает точность и качество выдаваемой пользователю информации. Однако такие модели обрабатывают запросы медленнее стандартных, поскольку проверка фактов немного тормозит процесс. В зависимости от сложности запроса, задержка ответа у o3 может составлять от нескольких секунд до нескольких минут.&lt;/p&gt;

&lt;p&gt;Как описывается на портале TechCrunch, OpenAI обучала o3 «думать, прежде чем отвечать», с помощью технологии «частной цепочки мыслей». Модель может рассуждать о поставленной задаче и заранее распланировать ответ, выполняя ряд последовательных действий, помогающих ей найти решение. На практике, как &lt;a href="https://techcrunch.com/2024/12/20/openai-announces-new-o3-model/?guccounter=2" rel="noopener noreferrer"&gt;пишет&lt;/a&gt; портал, после ввода запроса o3 делает паузу, рассматривая ряд связанных подсказок и «объясняя» свои рассуждения по ходу дела, а затем выделяет и группирует ту информацию, которую считает наиболее точной в конкретном случае, и выдаёт её в качестве ответа.&lt;/p&gt;

&lt;p&gt;OpenAI также сообщила, что при обучении о3 использовалась новая технология «&lt;a href="https://openai.com/index/deliberative-alignment/" rel="noopener noreferrer"&gt;преднамеренного согласования&lt;/a&gt;», с помощью которой модель научилась проверять свои же ответы на соответствие принципам безопасности.&lt;/p&gt;

&lt;p&gt;В отличие от предыдущей версии, в o3 есть опция регулирования времени, которое модель может тратить на рассуждения. В частности, можно выбрать низкий, средний или высокий уровень рассуждений – чем он выше, тем лучше o3 выполняет задачу.&lt;/p&gt;

&lt;p&gt;Компания утверждает, что о3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;превзошла свою предшественницу о1 на 22,8% по бенчмарку SWE-Bench Verified, оценивающему эффективность решения задач по программированию;&lt;/li&gt;
&lt;li&gt;получила высокий рейтинг 2727 на платформе олимпиад по программированию Codeforces;&lt;/li&gt;
&lt;li&gt;набрала 96,7% по математическому тесту AIME;&lt;/li&gt;
&lt;li&gt;набрала 87,7% по тесту GPQA c вопросами по биологии, физике и химии;&lt;/li&gt;
&lt;li&gt;установила рекорд по бенчмарку EpochAI Frontier Math, решив 25,2% задач.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Публичный доступ к продукту пока не открыт – на данный момент он доступен только в предварительной версии для исследовательских целей. Полноценный релиз ожидается в следующем году.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>programming</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
