<?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: Moha Saker</title>
    <description>The latest articles on DEV Community by Moha Saker (@uploadforsoftware).</description>
    <link>https://dev.to/uploadforsoftware</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%2F4144132%2F2d1f72a9-27b5-46eb-b08f-4a03ee87e5dd.png</url>
      <title>DEV Community: Moha Saker</title>
      <link>https://dev.to/uploadforsoftware</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uploadforsoftware"/>
    <language>en</language>
    <item>
      <title>A game release calendar is a dependency map, not a task list</title>
      <dc:creator>Moha Saker</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:58:51 +0000</pubDate>
      <link>https://dev.to/uploadforsoftware/a-game-release-calendar-is-a-dependency-map-not-a-task-list-3ign</link>
      <guid>https://dev.to/uploadforsoftware/a-game-release-calendar-is-a-dependency-map-not-a-task-list-3ign</guid>
      <description>&lt;p&gt;A small game can have a short feature list and still miss its launch window. The usual culprit is not a single difficult task. It is the handoff between decisions: a mechanic is approved too late for level design, a device test arrives after release assets are prepared, or a store requirement is discovered when the build is already considered finished.&lt;/p&gt;

&lt;p&gt;Here is a practical way to build a calendar that exposes those dependencies before they become surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a playable question
&lt;/h2&gt;

&lt;p&gt;Before scheduling every screen and asset, decide what the first playable build must prove. For a mobile action game, the question might be whether the core control loop remains readable and responsive on a physical phone. A prototype that only works in the editor has not answered it.&lt;/p&gt;

&lt;p&gt;The first review should therefore include a target device, a short play scenario, acceptance criteria, and the person who can approve the result. Give that person a decision date. “Prototype complete” is not a useful milestone if nobody has time to play or accept it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put approval time on the critical path
&lt;/h2&gt;

&lt;p&gt;A schedule often treats client feedback as instant. It rarely is. A two-day art task can turn into a two-week delay if its visual direction is approved after the next environment batch starts.&lt;/p&gt;

&lt;p&gt;For every approval, record four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What build or artifact will be reviewed?&lt;/li&gt;
&lt;li&gt;Who gives one consolidated decision?&lt;/li&gt;
&lt;li&gt;What is the latest decision date that protects the next dependency?&lt;/li&gt;
&lt;li&gt;What happens if the decision is late: pause, use a pre-agreed fallback, or move the release date?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes the calendar a shared decision tool, not just a developer estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule risk checks before polish
&lt;/h2&gt;

&lt;p&gt;Move uncertain work toward the beginning. If input latency, device heat, save recovery, multiplayer connection quality, or store compliance could change architecture, test them before the content pipeline is full.&lt;/p&gt;

&lt;p&gt;A useful sequence for a modest mobile game is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate the core loop on a real target device.&lt;/li&gt;
&lt;li&gt;Lock the control and camera assumptions needed by content production.&lt;/li&gt;
&lt;li&gt;Build one representative level or progression slice.&lt;/li&gt;
&lt;li&gt;Run performance, save/recovery, and interruption checks on supported devices.&lt;/li&gt;
&lt;li&gt;Enter content production only after the riskiest assumptions are tested.&lt;/li&gt;
&lt;li&gt;Reserve a separate window for store assets, submission, review feedback, and fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The durations vary by project; the ordering is the important part. Polishing every environment before testing an actual release build creates the wrong kind of progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define what “ready to ship” means
&lt;/h2&gt;

&lt;p&gt;A calendar needs a release gate with evidence. For example: the release candidate has passed on the agreed device set; blocking defects are resolved; save data survives interruption and update scenarios; the store listing and privacy details match the shipped build; and someone owns the decision to submit.&lt;/p&gt;

&lt;p&gt;Without that gate, “development finished” is easily mistaken for “ready for customers.” They are different dates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep one visible buffer, not hidden padding everywhere
&lt;/h2&gt;

&lt;p&gt;Distributed padding makes a plan look safer while concealing what it protects. A visible contingency window at the end of each risky phase is easier to manage. Name the risks it covers, review whether they materialised, and release unused buffer only after the gate is met.&lt;/p&gt;

&lt;p&gt;A schedule can still change. What matters is whether the team can explain &lt;em&gt;why&lt;/em&gt; a date changed, which dependency moved, and what decision is needed next.&lt;/p&gt;

&lt;p&gt;For a fuller buyer-side framework, our &lt;a href="https://uploadforsoftware.com/insights/game-development-timeline/" rel="noopener noreferrer"&gt;game development timeline guide&lt;/a&gt; maps discovery, prototyping, production, testing, client reviews, and release readiness into one plan. If you are commissioning a game, ask for the dependency map and approval owners before asking for a final delivery date.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>testing</category>
      <category>mobile</category>
    </item>
    <item>
      <title>A telemetry contract for a mobile game soft launch</title>
      <dc:creator>Moha Saker</dc:creator>
      <pubDate>Thu, 01 Oct 2026 00:24:34 +0000</pubDate>
      <link>https://dev.to/uploadforsoftware/a-telemetry-contract-for-a-mobile-game-soft-launch-2h92</link>
      <guid>https://dev.to/uploadforsoftware/a-telemetry-contract-for-a-mobile-game-soft-launch-2h92</guid>
      <description>&lt;p&gt;A limited release only produces useful evidence when the build, events, and decision rule agree. Before opening a mobile game to a small real audience, write a one-page telemetry contract. It prevents a team from calling a broken event trigger “poor retention.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a question, not an event list
&lt;/h2&gt;

&lt;p&gt;Suppose the launch question is: can a new player complete the first mission without help on the target device class? Name the build version, audience, observation window, and owner. Then define only the events needed to answer it: &lt;code&gt;session_started&lt;/code&gt;, &lt;code&gt;mission_started&lt;/code&gt;, &lt;code&gt;mission_completed&lt;/code&gt;, and an abandonment or failure state. A crash trace and device/build identifier provide context; they do not replace player behavior.&lt;/p&gt;

&lt;p&gt;Each event needs a trigger, allowed properties, and an expected count. For example, &lt;code&gt;mission_completed&lt;/code&gt; should fire once after the game state commits the result, not every time a completion animation replays. If the game works offline, document how events queue and how duplicates are handled after reconnecting. Without that rule, a retry can make a completion funnel look healthier than it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate test traffic from release traffic
&lt;/h2&gt;

&lt;p&gt;Validate events in a development or test environment before the limited release, then verify that the production build sends to the intended production environment. Unity Analytics supports environment separation; an impressive graph is not evidence if internal QA sessions are mixed with real players.&lt;/p&gt;

&lt;p&gt;Run a small acceptance matrix before opening the audience:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Expected evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install and complete mission&lt;/td&gt;
&lt;td&gt;One start and one completion for the correct build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit halfway&lt;/td&gt;
&lt;td&gt;A start without a completion, with no invented success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lose connection and retry&lt;/td&gt;
&lt;td&gt;No duplicate completion after recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crash before objective&lt;/td&gt;
&lt;td&gt;Crash and last known stage can be correlated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal QA session&lt;/td&gt;
&lt;td&gt;Excluded or clearly segmented from release analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not put personal identifiers into public reports. Decide what data is actually needed and check consent and privacy requirements before instrumenting a user journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the decision before seeing the graph
&lt;/h2&gt;

&lt;p&gt;The contract should say which outcome means continue to the next bounded audience, which means fix and retest, and which means stop or rescope. A tiny or biased cohort should be labelled inconclusive. If the build changes during the test, split the results by version. If an event is unreliable, mark the measurement invalid; do not treat missing data as player failure.&lt;/p&gt;

&lt;p&gt;This is only one part of a wider release decision. Build stability, support load, store availability, and the actual first-session experience matter too. Our broader &lt;a href="https://uploadforsoftware.com/insights/game-soft-launch/" rel="noopener noreferrer"&gt;game soft-launch decision guide&lt;/a&gt; covers the difference between beta testing, limited-market release, and staged app updates, plus the evidence a game owner should ask the development team to deliver.&lt;/p&gt;

&lt;p&gt;The useful deliverable is not a wall of charts. It is a versioned build, a verified event contract, and a written go/fix/stop decision that another person can audit.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Why our game brief scorer stops at 16 points instead of estimating price</title>
      <dc:creator>Moha Saker</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:15:18 +0000</pubDate>
      <link>https://dev.to/uploadforsoftware/why-our-game-brief-scorer-stops-at-16-points-instead-of-estimating-price-3c78</link>
      <guid>https://dev.to/uploadforsoftware/why-our-game-brief-scorer-stops-at-16-points-instead-of-estimating-price-3c78</guid>
      <description>&lt;p&gt;When someone asks for a game development estimate, the difficult part is rarely choosing a number of screens. Two projects described as “a mobile game with levels” can differ radically in controls, online dependencies, content volume, transaction rules, device targets, and the evidence needed at handover. A form that asks for a genre and returns a price would make those unknowns look solved.&lt;/p&gt;

&lt;p&gt;We built a small, browser-only &lt;a href="https://memomedo2018.github.io/game-development-brief-checklist/game-development-brief-scorer.html" rel="noopener noreferrer"&gt;Game Development Brief Scorer&lt;/a&gt; to expose those unknowns before a scoping conversation. It is deliberately a readiness check, &lt;strong&gt;not&lt;/strong&gt; a cost calculator.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model: eight decisions, three states
&lt;/h2&gt;

&lt;p&gt;The tool asks about audience and platform, core loop, first playable proof, content boundaries, online dependencies, monetization, quality targets, and handover/ownership. Each area gets one of three answers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not defined&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;The decision still needs a conversation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partly defined&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;There is a direction, but no testable boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Written and testable&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Someone can point to a decision and an example or acceptance check.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The total is 0–16, but the list of gaps matters more than the total. Two briefs can both score 10 and still need entirely different next steps. One may have a crisp playable loop but no ownership for store accounts; another may list every deliverable while leaving the multiplayer authority model undefined.&lt;/p&gt;

&lt;p&gt;The application sorts all criteria below 2 so completely undefined items come first. In simplified JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gaps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scores&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;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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;score&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;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&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="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result gives a concrete question to answer for each gap, such as the target devices and controls for “audience and platform” or the build steps and account owner for “handover.” We intentionally do not multiply points by a guessed hourly rate. Brief completeness is not effort, schedule, technical risk, or commercial price.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “testable” changes in a brief
&lt;/h2&gt;

&lt;p&gt;“The game should feel smooth” is a useful goal but not an acceptance rule. A testable version names target devices, a performance floor, representative scenes, and the build on which to measure them. “We need multiplayer” becomes more useful when it states whether matches are synchronous, who owns authoritative game state, what happens on disconnect, and which failure case the first playable must demonstrate.&lt;/p&gt;

&lt;p&gt;The same discipline applies to the first milestone. Instead of promising “a prototype,” define one slice, the behavior it must prove, and the decision it unlocks. If the slice cannot answer a real production question, adding content before that proof can make a bad assumption more expensive to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it stays in the browser
&lt;/h2&gt;

&lt;p&gt;The current tool has no account, form submission, or analytics. Selections are scored in the page and the result can be printed. That is a modest architecture choice, but it fits the job: a prospective client can inspect the questions without handing over an unfinished idea or personal details. The scorer does not need that information to identify missing decisions.&lt;/p&gt;

&lt;p&gt;This also limits the tool honestly. It does not save a project, compare teams, validate a proposed scope against source code, or turn a number into a reliable quote. A low score says “start with focused discovery,” not “your idea is weak.” A high score says the first estimate discussion can be more specific, not that the scope cannot change.&lt;/p&gt;

&lt;p&gt;If you are building a similar planning tool, I would keep the output tied to &lt;em&gt;specific unanswered decisions&lt;/em&gt; and make the limitations visible. A plausible-looking number without a trail of assumptions is less helpful than a short, actionable gap list.&lt;/p&gt;

&lt;p&gt;The live scorer is free to try. We use it as an early conversation aid at Upload For Software, not as a substitute for a technical review or written project scope.&lt;/p&gt;

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