<?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: Daniel Delgado</title>
    <description>The latest articles on DEV Community by Daniel Delgado (@thunderdanoae).</description>
    <link>https://dev.to/thunderdanoae</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%2F3822429%2F069bc4c5-14db-41c2-9cd1-a1105f889c2e.png</url>
      <title>DEV Community: Daniel Delgado</title>
      <link>https://dev.to/thunderdanoae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thunderdanoae"/>
    <language>en</language>
    <item>
      <title>Building ShipCheck: a static preflight scanner for Unity projects</title>
      <dc:creator>Daniel Delgado</dc:creator>
      <pubDate>Tue, 29 Sep 2026 02:30:14 +0000</pubDate>
      <link>https://dev.to/thunderdanoae/building-shipcheck-a-static-preflight-scanner-for-unity-projects-3b51</link>
      <guid>https://dev.to/thunderdanoae/building-shipcheck-a-static-preflight-scanner-for-unity-projects-3b51</guid>
      <description>&lt;p&gt;How I went from noisy project scanning to shipping graphs, confidence-aware readiness, and legacy Unity support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building ShipCheck: a static preflight scanner for Unity projects&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I went from noisy project scanning to shipping graphs, confidence-aware readiness, and legacy Unity support.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Building ShipCheck: a static preflight scanner for Unity projects
&lt;/h1&gt;

&lt;p&gt;I’ve been building &lt;strong&gt;ShipCheck&lt;/strong&gt;, a local, read-only preflight scanner for Unity projects.&lt;/p&gt;

&lt;p&gt;The original goal sounded simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Point the tool at a Unity project folder and tell me what could prevent this project from shipping.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The implementation turned out to be much more interesting.&lt;/p&gt;

&lt;p&gt;A Unity project can look structurally healthy while still being incomplete.&lt;br&gt;&lt;br&gt;
A completed legacy project can look suspicious because modern static analysis cannot parse its scenes properly.&lt;br&gt;&lt;br&gt;
Third-party assets can generate hundreds of findings that have absolutely nothing to do with the final build.&lt;/p&gt;

&lt;p&gt;That forced me to separate several concepts that initially looked like one problem.&lt;/p&gt;


&lt;h2&gt;
  
  
  Project Health is not Release Readiness
&lt;/h2&gt;

&lt;p&gt;One of the first mistakes was treating all findings as part of a single score.&lt;/p&gt;

&lt;p&gt;That doesn’t work.&lt;/p&gt;

&lt;p&gt;A project may have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicate assets&lt;/li&gt;
&lt;li&gt;oversized textures&lt;/li&gt;
&lt;li&gt;stale metadata&lt;/li&gt;
&lt;li&gt;unresolved references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;while still being perfectly shippable.&lt;/p&gt;

&lt;p&gt;Conversely, a structurally clean project may only contain one unfinished gameplay scene.&lt;/p&gt;

&lt;p&gt;So ShipCheck now separates:&lt;/p&gt;
&lt;h3&gt;
  
  
  Project Health
&lt;/h3&gt;

&lt;p&gt;Observable technical defects and project hygiene.&lt;/p&gt;
&lt;h3&gt;
  
  
  Release Readiness
&lt;/h3&gt;

&lt;p&gt;Evidence that the current project configuration represents something that could actually ship.&lt;/p&gt;
&lt;h3&gt;
  
  
  Confidence
&lt;/h3&gt;

&lt;p&gt;How much reliable evidence ShipCheck was able to inspect.&lt;/p&gt;

&lt;p&gt;This distinction became especially important with old Unity projects.&lt;/p&gt;


&lt;h2&gt;
  
  
  Sometimes the correct score is no score
&lt;/h2&gt;

&lt;p&gt;Some older Unity projects use scene serialization that cannot be reliably inspected offline.&lt;/p&gt;

&lt;p&gt;An early version of ShipCheck would still calculate something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Readiness: 94/100&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That looked precise, but it wasn’t honest.&lt;/p&gt;

&lt;p&gt;Now, if structural evidence is insufficient, ShipCheck reports:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;LIMITED EVIDENCE&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;instead of inventing a readiness number.&lt;/p&gt;

&lt;p&gt;The internal diagnostic score may still exist for debugging, but it is not presented as a reliable release score.&lt;/p&gt;


&lt;h2&gt;
  
  
  Building a Shipping Dependency Graph
&lt;/h2&gt;

&lt;p&gt;Another major issue was third-party noise.&lt;/p&gt;

&lt;p&gt;A Unity project may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;asset store packages&lt;/li&gt;
&lt;li&gt;demo scenes&lt;/li&gt;
&lt;li&gt;sample prefabs&lt;/li&gt;
&lt;li&gt;TextMesh Pro examples&lt;/li&gt;
&lt;li&gt;plugin documentation&lt;/li&gt;
&lt;li&gt;unused assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scanning everything equally produced terrible results.&lt;/p&gt;

&lt;p&gt;For example, a small WebGL trivia project looked badly broken because unresolved references inside TextMesh Pro example scenes were being treated as project release problems.&lt;/p&gt;

&lt;p&gt;The fix was to build a &lt;strong&gt;shipping dependency graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ShipCheck starts from enabled build scenes and follows serialized GUID references through the project.&lt;/p&gt;

&lt;p&gt;That lets it distinguish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shipping content&lt;/li&gt;
&lt;li&gt;project content&lt;/li&gt;
&lt;li&gt;non-shipping content&lt;/li&gt;
&lt;li&gt;third-party content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A broken GUID inside an unused demo scene can still be reported, but it should not reduce the release readiness of the actual game.&lt;/p&gt;


&lt;h2&gt;
  
  
  Static analysis also needs to understand Unity runtime loading
&lt;/h2&gt;

&lt;p&gt;The dependency graph introduced another problem.&lt;/p&gt;

&lt;p&gt;Not everything used at runtime has a direct serialized reference from a scene.&lt;/p&gt;

&lt;p&gt;Unity projects often load content from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Assets/Resources/
Assets/StreamingAssets/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So dimensional analysis and project intelligence also include these standard runtime-loading locations.&lt;/p&gt;

&lt;p&gt;This mattered for an AR project that contained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2D video/media&lt;/li&gt;
&lt;li&gt;sprite assets&lt;/li&gt;
&lt;li&gt;a 3D model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scene graph alone initially classified it as UNKNOWN.&lt;/p&gt;

&lt;p&gt;After including runtime resources, ShipCheck correctly classified it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MIXED 2D + 3D&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2.5D vs mixed 2D + 3D
&lt;/h2&gt;

&lt;p&gt;This was another surprisingly tricky distinction.&lt;/p&gt;

&lt;p&gt;One completed memory game had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2D UI&lt;/li&gt;
&lt;li&gt;sprites&lt;/li&gt;
&lt;li&gt;text&lt;/li&gt;
&lt;li&gt;3D meshes&lt;/li&gt;
&lt;li&gt;rigidbodies&lt;/li&gt;
&lt;li&gt;cards implemented as physical 3D objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A naive signal counter saw strong 2D and strong 3D evidence and called it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MIXED 2D + 3D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But visually and structurally it was really a &lt;strong&gt;2.5D game&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The difference I ended up using is roughly:&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5D
&lt;/h3&gt;

&lt;p&gt;A primarily flat or 2D presentation implemented partly with 3D mechanics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixed 2D + 3D
&lt;/h3&gt;

&lt;p&gt;Independent 2D and 3D content modalities coexist in the project.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a real 2D video feed&lt;/li&gt;
&lt;li&gt;plus an independent 3D model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction improved classification significantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Missing dependency detection is harder than matching names
&lt;/h2&gt;

&lt;p&gt;At one point ShipCheck reported this as a blocker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code references namespace DG but no matching dependency was found.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem?&lt;/p&gt;

&lt;p&gt;DOTween was actually installed under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Assets/Plugins/Demigiant/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and correctly declared:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;DG.Tweening&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The detector was matching names too literally.&lt;/p&gt;

&lt;p&gt;Now ShipCheck also indexes namespaces declared by installed third-party source code, packages, assemblies and plugins before deciding that a dependency is missing.&lt;/p&gt;

&lt;p&gt;That removed false blockers without weakening real missing-dependency detection.&lt;/p&gt;




&lt;h2&gt;
  
  
  Release states instead of only scores
&lt;/h2&gt;

&lt;p&gt;ShipCheck now uses several explicit release states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BLOCKED
NOT CONFIGURED
NOT READY
REVIEW BEFORE SHIP
LIMITED EVIDENCE
STRONG EVIDENCE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;/p&gt;

&lt;h3&gt;
  
  
  BLOCKED
&lt;/h3&gt;

&lt;p&gt;A deterministic missing dependency or similarly critical release problem exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  NOT CONFIGURED
&lt;/h3&gt;

&lt;p&gt;No effective enabled build-scene topology could be found.&lt;/p&gt;

&lt;h3&gt;
  
  
  LIMITED EVIDENCE
&lt;/h3&gt;

&lt;p&gt;A build configuration exists, but static evidence is insufficient to assign a reliable numeric readiness score.&lt;/p&gt;

&lt;p&gt;I found these states much more useful than trying to force every project into a 0–100 number.&lt;/p&gt;




&lt;h2&gt;
  
  
  The current tool
&lt;/h2&gt;

&lt;p&gt;ShipCheck currently analyzes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project Health&lt;/li&gt;
&lt;li&gt;Release Readiness&lt;/li&gt;
&lt;li&gt;Build configuration&lt;/li&gt;
&lt;li&gt;Enabled scenes&lt;/li&gt;
&lt;li&gt;Shipping dependency graph&lt;/li&gt;
&lt;li&gt;Missing dependencies&lt;/li&gt;
&lt;li&gt;Unresolved GUID references&lt;/li&gt;
&lt;li&gt;Near-empty scenes&lt;/li&gt;
&lt;li&gt;Incomplete-code markers&lt;/li&gt;
&lt;li&gt;Large and duplicate assets&lt;/li&gt;
&lt;li&gt;First-party vs third-party content&lt;/li&gt;
&lt;li&gt;2D / 2.5D / 3D / mixed project structure&lt;/li&gt;
&lt;li&gt;Rendering and physics signals&lt;/li&gt;
&lt;li&gt;Content completeness signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also generates an &lt;strong&gt;AI Context Pack&lt;/strong&gt;: a compact project brief designed to be pasted into tools such as ChatGPT, Claude or Codex without uploading the entire Unity project.&lt;/p&gt;

&lt;p&gt;Everything runs locally.&lt;/p&gt;

&lt;p&gt;No telemetry.&lt;br&gt;&lt;br&gt;
No cloud upload.&lt;br&gt;&lt;br&gt;
No API key.&lt;br&gt;&lt;br&gt;
Read-only analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing it on real projects
&lt;/h2&gt;

&lt;p&gt;I tested the current version against several real Unity projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;completed 2D games&lt;/li&gt;
&lt;li&gt;legacy Unity projects&lt;/li&gt;
&lt;li&gt;2.5D games&lt;/li&gt;
&lt;li&gt;unfinished prototypes&lt;/li&gt;
&lt;li&gt;WebGL projects&lt;/li&gt;
&lt;li&gt;AR experiments&lt;/li&gt;
&lt;li&gt;mixed 2D + 3D content&lt;/li&gt;
&lt;li&gt;projects with large third-party asset packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part was not getting every project to score highly.&lt;/p&gt;

&lt;p&gt;The useful part was getting each project to fail differently for the correct reason.&lt;/p&gt;

&lt;p&gt;That became the main design rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A scanner should explain what it knows, what it suspects, and what it cannot reliably prove.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ShipCheck 0.8.0.2
&lt;/h2&gt;

&lt;p&gt;I’ve just released the first public Windows build.&lt;/p&gt;

&lt;p&gt;If you work with Unity projects — especially old, messy, inherited or partially finished ones — I’d be very interested in examples where the analysis gets something wrong.&lt;/p&gt;

&lt;p&gt;False positives are particularly useful feedback right now.&lt;/p&gt;

&lt;p&gt;Project page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools043.itch.io/shipcheck" rel="noopener noreferrer"&gt;https://tools043.itch.io/shipcheck&lt;/a&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/hbzd4u1xn7wnw1dkblbs.png)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Why explaining project progress to clients is harder than writing the code</title>
      <dc:creator>Daniel Delgado</dc:creator>
      <pubDate>Fri, 13 Mar 2026 13:30:25 +0000</pubDate>
      <link>https://dev.to/thunderdanoae/why-explaining-project-progress-to-clients-is-harder-than-writing-the-code-323</link>
      <guid>https://dev.to/thunderdanoae/why-explaining-project-progress-to-clients-is-harder-than-writing-the-code-323</guid>
      <description>&lt;h1&gt;
  
  
  Why explaining project progress to clients is harder than writing the code
&lt;/h1&gt;

&lt;p&gt;When you work as a freelancer or in a small team, one thing becomes very clear very quickly:&lt;/p&gt;

&lt;p&gt;Writing the code is often easier than explaining the progress.&lt;/p&gt;

&lt;p&gt;Most real work happens inside the project itself.&lt;/p&gt;

&lt;p&gt;Files change.&lt;br&gt;&lt;br&gt;
Functions evolve.&lt;br&gt;&lt;br&gt;
Components get reorganized.&lt;br&gt;&lt;br&gt;
New systems appear.&lt;/p&gt;

&lt;p&gt;But when it's time to send an update to a client, the report often looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Worked on several parts of the project this week.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is technically true… but not very helpful.&lt;/p&gt;

&lt;p&gt;The real progress is hidden inside the project folder.&lt;/p&gt;


&lt;h2&gt;
  
  
  The problem with progress reports
&lt;/h2&gt;

&lt;p&gt;Clients usually want simple answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What changed?&lt;/li&gt;
&lt;li&gt;What was added?&lt;/li&gt;
&lt;li&gt;What parts of the project are active?&lt;/li&gt;
&lt;li&gt;Is the project moving forward?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often &lt;em&gt;know&lt;/em&gt; these answers.&lt;/p&gt;

&lt;p&gt;But extracting that information manually takes time.&lt;/p&gt;

&lt;p&gt;You end up doing things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scanning folders&lt;/li&gt;
&lt;li&gt;checking file timestamps&lt;/li&gt;
&lt;li&gt;remembering what you worked on&lt;/li&gt;
&lt;li&gt;writing explanations manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It becomes another task on top of the actual development work.&lt;/p&gt;

&lt;p&gt;And ironically, this happens in a world where &lt;strong&gt;almost everything we do is already recorded in the filesystem&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The project already knows what changed
&lt;/h2&gt;

&lt;p&gt;If you think about it, the project folder already contains most of the answers.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new files&lt;/li&gt;
&lt;li&gt;modified files&lt;/li&gt;
&lt;li&gt;recently active folders&lt;/li&gt;
&lt;li&gt;parts of the system evolving faster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The information is there — it’s just not organized in a way that is easy to communicate.&lt;/p&gt;

&lt;p&gt;So I started experimenting with a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if a tool could scan a project folder and generate a progress report automatically?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Turning project activity into a report
&lt;/h2&gt;

&lt;p&gt;The concept is simple.&lt;/p&gt;

&lt;p&gt;Instead of manually describing what changed, the tool analyzes the project itself and extracts signals like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;newly created files&lt;/li&gt;
&lt;li&gt;recently modified files&lt;/li&gt;
&lt;li&gt;active folders&lt;/li&gt;
&lt;li&gt;parts of the project that changed the most&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From there it generates a structured report that can be shared with clients or teams.&lt;/p&gt;

&lt;p&gt;The output can be exported as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML (easy to send to clients)&lt;/li&gt;
&lt;li&gt;Markdown (useful for documentation or internal reports)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace version control or project management tools.&lt;/p&gt;

&lt;p&gt;The goal is simply to make it easier to answer a very common question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What actually happened in the project?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Building a small experiment
&lt;/h2&gt;

&lt;p&gt;To test the idea, I built a small desktop tool called &lt;strong&gt;Workspace Snapshot Generator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The workflow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select your project folder
&lt;/li&gt;
&lt;li&gt;Analyze project activity
&lt;/li&gt;
&lt;li&gt;Generate a report
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The report highlights things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new files&lt;/li&gt;
&lt;li&gt;modified files&lt;/li&gt;
&lt;li&gt;active parts of the project&lt;/li&gt;
&lt;li&gt;recent development activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works with many types of digital projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;software development&lt;/li&gt;
&lt;li&gt;game development&lt;/li&gt;
&lt;li&gt;web projects&lt;/li&gt;
&lt;li&gt;design and creative projects&lt;/li&gt;
&lt;li&gt;media production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically anything where &lt;strong&gt;files evolve over time&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where this could go next
&lt;/h2&gt;

&lt;p&gt;The current version focuses on detecting activity.&lt;/p&gt;

&lt;p&gt;But the next logical step is more interesting.&lt;/p&gt;

&lt;p&gt;Instead of only listing file changes, future versions could analyze the content of those changes and generate &lt;strong&gt;human-readable explanations&lt;/strong&gt;, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Added new player controller logic”&lt;/li&gt;
&lt;li&gt;“Refactored inventory system”&lt;/li&gt;
&lt;li&gt;“Updated UI layout components”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;Turning raw project activity into &lt;strong&gt;clear progress explanations&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Freelancers and small teams often spend a surprising amount of time explaining what they did.&lt;/p&gt;

&lt;p&gt;But the project itself already contains most of the answers.&lt;/p&gt;

&lt;p&gt;Maybe the real opportunity is not in tracking work better —&lt;br&gt;&lt;br&gt;
but in &lt;strong&gt;explaining it automatically&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm curious how other developers handle this.&lt;/p&gt;

&lt;p&gt;How do you usually communicate project progress to clients?&lt;/p&gt;



&lt;p&gt;If you're curious about the experiment mentioned in the article,&lt;br&gt;&lt;br&gt;
I recorded a short demo here:&lt;br&gt;


  &lt;iframe src="https://www.youtube.com/embed/5TQUXK5BiDU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
