<?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: Meso Francis</title>
    <description>The latest articles on DEV Community by Meso Francis (@fmeso).</description>
    <link>https://dev.to/fmeso</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%2F4033799%2F267314d8-be0a-4470-b70b-4451aeef60cb.jpg</url>
      <title>DEV Community: Meso Francis</title>
      <link>https://dev.to/fmeso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fmeso"/>
    <language>en</language>
    <item>
      <title>Go Now Reads Your Container's CPU Limit. It Still Can't Read Your Memory Limit.</title>
      <dc:creator>Meso Francis</dc:creator>
      <pubDate>Tue, 13 Oct 2026 14:36:48 +0000</pubDate>
      <link>https://dev.to/fmeso/go-now-reads-your-containers-cpu-limit-it-still-cant-read-your-memory-limit-53pk</link>
      <guid>https://dev.to/fmeso/go-now-reads-your-containers-cpu-limit-it-still-cant-read-your-memory-limit-53pk</guid>
      <description>&lt;p&gt;If you run Go on Kubernetes, there's a good chance two things have bitten you without leaving a single error in your logs: latency spikes you can't explain, and pods that die with &lt;code&gt;OOMKilled&lt;/code&gt; while your heap graphs looked fine.&lt;/p&gt;

&lt;p&gt;Those are two different problems with two different fixes. Recent Go versions quietly solved one of them. The other is still your job.&lt;/p&gt;

&lt;p&gt;One quick correction before we start, because I've seen it repeated in a few places: container-aware &lt;code&gt;GOMAXPROCS&lt;/code&gt; didn't arrive in a late patch release. It shipped in &lt;strong&gt;Go 1.25&lt;/strong&gt;, and everything newer (1.26, 1.27.x) inherits it. What matters in practice is not just which toolchain you build with, but what your &lt;code&gt;go.mod&lt;/code&gt; says. More on that trap in a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: Go counted the node, not your pod
&lt;/h2&gt;

&lt;p&gt;Say your pod has &lt;code&gt;limits.cpu: "2"&lt;/code&gt; and lands on a 32-core node. Before Go 1.25, the runtime asked the OS how many CPUs exist, got 32, and set &lt;code&gt;GOMAXPROCS=32&lt;/code&gt;. So you had a scheduler happily running up to 32 threads of Go code in parallel, inside a container that was only paid for 2 CPUs' worth of time.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd3p92dhmx29p7ycle27.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd3p92dhmx29p7ycle27.png" alt="GOMAXPROCS before and after: 32 versus 2" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linux enforces CPU limits with CFS bandwidth control. Your limit becomes a quota: for &lt;code&gt;cpu: 2&lt;/code&gt;, that's 200 ms of CPU time per 100 ms period. Thirty-two busy threads can burn that 200 ms in about 6 ms of wall-clock time. After that the kernel does the blunt thing: it &lt;strong&gt;pauses the whole container&lt;/strong&gt; until the next period starts.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0dotob73ep315wjxwqh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0dotob73ep315wjxwqh.png" alt="CFS throttling timeline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the outside this looks like random tail latency. No panic, no error, no log line. Your p50 is great and your p99 is haunted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Go 1.25 changed
&lt;/h2&gt;

&lt;p&gt;The runtime now reads the cgroup CPU quota at startup and sets the default &lt;code&gt;GOMAXPROCS&lt;/code&gt; to the lower of the machine's CPU count and your container's CPU limit. A few details worth knowing, because they're where people get surprised:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It reads the limit, not the request.&lt;/strong&gt; &lt;code&gt;requests.cpu&lt;/code&gt; is just a scheduling hint and a weight under contention. Go ignores it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fractions round up.&lt;/strong&gt; A limit of &lt;code&gt;0.5&lt;/code&gt; gives you &lt;code&gt;GOMAXPROCS=1&lt;/code&gt;, and &lt;code&gt;2.5&lt;/code&gt; gives you &lt;code&gt;3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It keeps watching.&lt;/strong&gt; The runtime re-checks the limit about once a second, so if something resizes your pod's CPU limit in place, &lt;code&gt;GOMAXPROCS&lt;/code&gt; follows without a restart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any manual setting wins.&lt;/strong&gt; If the &lt;code&gt;GOMAXPROCS&lt;/code&gt; env var is set, or your code calls &lt;code&gt;runtime.GOMAXPROCS(n)&lt;/code&gt;, the automatic behavior steps aside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No limit, no change.&lt;/strong&gt; With no CPU limit set, you get the usual &lt;code&gt;NumCPU&lt;/code&gt; default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you were pulling in &lt;code&gt;go.uber.org/automaxprocs&lt;/code&gt; for this, you can most likely delete it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;go.mod&lt;/code&gt; trap
&lt;/h3&gt;

&lt;p&gt;This is the one I'd put in a code review checklist. Go gates new runtime behavior behind the language version in &lt;code&gt;go.mod&lt;/code&gt;. If your module still says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="m"&gt;1.24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then building with a shiny new toolchain does &lt;strong&gt;not&lt;/strong&gt; turn this on. The documented defaults for &lt;code&gt;containermaxprocs&lt;/code&gt; and &lt;code&gt;updatemaxprocs&lt;/code&gt; are the old behavior for language versions 1.24 and below. Bump the &lt;code&gt;go&lt;/code&gt; line to 1.25 or later, or set the GODEBUG settings explicitly.&lt;/p&gt;

&lt;p&gt;And if you ever need the old behavior back, you have the escape hatches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;containermaxprocs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0   &lt;span class="c"&gt;# ignore the cgroup limit at startup&lt;/span&gt;
&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;updatemaxprocs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0      &lt;span class="c"&gt;# don't re-check the limit periodically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What it doesn't fix
&lt;/h2&gt;

&lt;p&gt;Don't over-credit it. &lt;code&gt;GOMAXPROCS&lt;/code&gt; limits how many threads run Go code in parallel. It doesn't cap everything your process does with CPU. Cgo calls, threads blocked in syscalls, and background work still draw from the same quota. And GOMAXPROCS equal to your limit is a good default, not a guarantee of zero throttling: a bursty service can still hit the quota inside a single period.&lt;/p&gt;

&lt;p&gt;So measure. The number I'd put on a dashboard is the throttled-period ratio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sum(rate(container_cpu_cfs_throttled_periods_total{container="my-service"}[5m]))
/
sum(rate(container_cpu_cfs_periods_total{container="my-service"}[5m]))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that sits near zero, you're fine. If it's climbing under load, either the limit is too tight for the work or something other than Go code is eating your quota.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now the part Go did &lt;em&gt;not&lt;/em&gt; fix: memory
&lt;/h2&gt;

&lt;p&gt;Here's the asymmetry that trips people up. Go learned to read the CPU limit. It did not learn to read the memory limit.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GOMEMLIMIT&lt;/code&gt; defaults to effectively unlimited. The Go runtime documentation still describes the default as &lt;code&gt;math.MaxInt64&lt;/code&gt;, which disables the limit, and the 1.27 docs say the same. So your garbage collector paces itself against heap growth (that's &lt;code&gt;GOGC&lt;/code&gt;'s job), with no idea that a cgroup wall stands at 512 MiB.&lt;/p&gt;

&lt;p&gt;The result is the classic story: under load the heap grows, nothing tells the GC to work harder, the container crosses its limit, and the kernel's OOM killer ends the process. No Go panic. Just exit code 137 and &lt;code&gt;OOMKilled&lt;/code&gt; in &lt;code&gt;kubectl describe pod&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft16ofqzeo3afrucqusgr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft16ofqzeo3afrucqusgr.png" alt="Heap growth with and without GOMEMLIMIT" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GOMEMLIMIT&lt;/code&gt; is a &lt;strong&gt;soft&lt;/strong&gt; limit. As the runtime approaches it, the GC runs more aggressively and the runtime gets more eager to return memory to the OS. It's a pressure valve, not a wall. Two honest caveats:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It covers memory the Go runtime manages (heap, stacks, runtime structures). It excludes things like cgo allocations and the binary's own mappings, but those still count toward the container limit. That's why you set it &lt;strong&gt;below&lt;/strong&gt; the limit rather than at it.&lt;/li&gt;
&lt;li&gt;If your live data genuinely exceeds the limit, no setting helps. The GC will work harder and harder and you'll just trade an OOM kill for a slow, GC-bound death. The fix there is a bigger limit or less memory.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to set it
&lt;/h3&gt;

&lt;p&gt;The rule of thumb I follow: &lt;strong&gt;GOMEMLIMIT at roughly 85 to 90 percent of the container memory limit&lt;/strong&gt;, leaving headroom for everything the runtime doesn't track.&lt;/p&gt;

&lt;p&gt;The simplest option is to be explicit and keep the two numbers next to each other in your manifest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GOMEMLIMIT&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;460MiB"&lt;/span&gt;   &lt;span class="c1"&gt;# ~90% of the 512Mi limit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might be tempted to use the Kubernetes downward API (&lt;code&gt;resourceFieldRef: limits.memory&lt;/code&gt;) so the value follows the limit automatically. It gives you the raw limit, though, and there's no way to multiply it by 0.9 there. Setting &lt;code&gt;GOMEMLIMIT&lt;/code&gt; equal to the limit leaves the GC no room to act before the kernel does.&lt;/p&gt;

&lt;p&gt;If you want it derived automatically, a small library handles the ratio and cgroup v1/v2 for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"github.com/KimMachineGun/automemlimit"&lt;/span&gt; &lt;span class="c"&gt;// sets GOMEMLIMIT from the cgroup limit, 90% by default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(It's a no-op if &lt;code&gt;GOMEMLIMIT&lt;/code&gt; is already set. &lt;code&gt;AUTOMEMLIMIT&lt;/code&gt; adjusts the ratio.) Either approach is fine. Pick one and be consistent, because the failure mode of forgetting is silent.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 10-line sanity check
&lt;/h2&gt;

&lt;p&gt;Don't trust configuration you haven't observed. Log this at startup and look at it in a real pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"runtime"&lt;/span&gt;
    &lt;span class="s"&gt;"runtime/debug"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;logRuntimeLimits&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NumCPU=%d GOMAXPROCS=%d GOMEMLIMIT=%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumCPU&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GOMAXPROCS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetMemoryLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c"&gt;// negative = just report the current limit&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;Healthy output in a pod limited to 2 CPUs on a big node: &lt;code&gt;GOMAXPROCS=2&lt;/code&gt; while &lt;code&gt;NumCPU&lt;/code&gt; shows the node's count, and a &lt;code&gt;GOMEMLIMIT&lt;/code&gt; that's a real number rather than 9223372036854775807. If you see that giant number, your memory limit isn't set and the GC is flying blind.&lt;/p&gt;

&lt;h2&gt;
  
  
  My checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Set the &lt;code&gt;go&lt;/code&gt; line in &lt;code&gt;go.mod&lt;/code&gt; to 1.25 or later, so container-aware &lt;code&gt;GOMAXPROCS&lt;/code&gt; actually turns on.&lt;/li&gt;
&lt;li&gt;Set a CPU &lt;strong&gt;limit&lt;/strong&gt; on latency-sensitive services. Go can only match a limit that exists. (Whether every workload should have one is a long-running Kubernetes debate. For Go services where tail latency matters, I'd rather have a predictable limit than none.)&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;GOMEMLIMIT&lt;/code&gt; to about 90% of the memory limit, explicitly or via a library.&lt;/li&gt;
&lt;li&gt;Set memory &lt;code&gt;requests&lt;/code&gt; equal to &lt;code&gt;limits&lt;/code&gt;, so memory is never over-committed on the node.&lt;/li&gt;
&lt;li&gt;Alert on the throttled-period ratio and on &lt;code&gt;OOMKilled&lt;/code&gt; restarts, not just on CPU and heap graphs.&lt;/li&gt;
&lt;li&gt;Log &lt;code&gt;GOMAXPROCS&lt;/code&gt; and the memory limit at startup so the config is visible in every environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Go 1.25 closed a decade-old gap: your scheduler now sizes itself to the CPU you were actually given. That removes a whole class of mysterious tail latency. Memory is the one the runtime still leaves to you, and it costs one environment variable to fix. Set it, check it, and spend your debugging time on something more interesting than exit code 137.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've seen different behavior on your own clusters, especially around throttling after the upgrade, I'd like to hear about it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>performance</category>
    </item>
    <item>
      <title>Your Game Engine Isn't Dead: What Decart's Oasis Actually Proved</title>
      <dc:creator>Meso Francis</dc:creator>
      <pubDate>Mon, 21 Sep 2026 12:46:55 +0000</pubDate>
      <link>https://dev.to/fmeso/your-game-engine-isnt-dead-what-decarts-oasis-actually-proved-38np</link>
      <guid>https://dev.to/fmeso/your-game-engine-isnt-dead-what-decarts-oasis-actually-proved-38np</guid>
      <description>&lt;h2&gt;
  
  
  AI-generated games run at playable framerates. But 'no physics engine' is the wrong takeaway. Here's what neural rendering really changes for developers.
&lt;/h2&gt;

&lt;p&gt;In October 2024, Decart and Etched released Oasis, a Minecraft-like game with a striking claim: there is no physics engine, just a foundation model. You press WASD, and a network generates the next frame.&lt;/p&gt;

&lt;p&gt;The headline takeaway was "engines are obsolete." I think that's the wrong lesson. The right one is stranger and more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually happening
&lt;/h2&gt;

&lt;p&gt;Oasis does next-frame prediction. It anticipates the next frame from keyboard and mouse input, trained on millions of hours of gameplay footage. Both parts are Transformer-based: a ViT autoencoder and a DiT backbone.&lt;/p&gt;

&lt;p&gt;Nothing in there simulates gravity. The network has learned what usually happens next when a player jumps or breaks a block. That is statistical imitation of physics, not physics.&lt;/p&gt;

&lt;p&gt;Engine pipeline vs neural world model loop&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F231qeblbs3hja28z3bqf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F231qeblbs3hja28z3bqf.png" alt="The diagram shows the real difference. An engine keeps **explicit state** (positions, velocities, inventory). A world model's state is **whatever fits in its context window of recent frames**." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2024 reality check
&lt;/h2&gt;

&lt;p&gt;Early reviews were harsh. Critics noted 360p resolution, about 20 FPS, and heavy hallucination: digging could teleport you to the surface. Objects didn't persist, and builds couldn't be saved. Decart itself said the tech was still in early development.&lt;/p&gt;

&lt;p&gt;That's the core weakness. With no explicit state, there is nothing to save, load, diff or debug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The field moved fast
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google's Genie 3&lt;/strong&gt; generates navigable worlds at 24 FPS and 720p, staying consistent for a few minutes. The catch: visual memory reaches back only about a minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oasis 2.0&lt;/strong&gt; shifted toward transforming game worlds and styles in real time at 1080p, 30fps. That is closer to a neural &lt;em&gt;skin over an existing game&lt;/em&gt; than a replacement for one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oasis 3&lt;/strong&gt; dropped the "AI game" pitch. It is now an interactive world model for physical AI, with an API, action-conditioned training and multi-camera output for robotics. Latency is under 200 ms at 22 FPS.
The pattern is that the money moved from "replace the engine" to "simulate worlds where engines are too expensive to author": robotics, autonomy, training environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Engine vs world model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional engine&lt;/th&gt;
&lt;th&gt;Neural world model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Explicit, inspectable&lt;/td&gt;
&lt;td&gt;Implicit, in the frame context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Determinism&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Save/load is trivial&lt;/td&gt;
&lt;td&gt;Unsolved past minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authoring&lt;/td&gt;
&lt;td&gt;Code and assets&lt;/td&gt;
&lt;td&gt;Data and prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge cases&lt;/td&gt;
&lt;td&gt;You write them&lt;/td&gt;
&lt;td&gt;You hope they appear in training data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per frame&lt;/td&gt;
&lt;td&gt;Cheap&lt;/td&gt;
&lt;td&gt;Datacenter GPUs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where I think this lands
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid pipelines.&lt;/strong&gt; The engine owns state and rules. The neural layer owns look and feel (restyling, lighting, upscaling).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation, not shipping games.&lt;/strong&gt; Where correctness is approximate and diversity matters, generated worlds win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence research.&lt;/strong&gt; Long-horizon consistency remains unsolved, and implicit frame-by-frame models are brittle over extended play. Whoever fixes this changes the whole picture.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Oasis published model weights on Hugging Face and code on GitHub. Run it, dig a hole, look away and look back. You'll learn more about implicit state in five minutes than from any launch post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Neural rendering isn't deleting the physics engine. It's showing us a second way to represent a world: explicit and exact, or implicit and approximate. The interesting engineering is in combining them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Grok 4.6 available now on Gemini Enterprise Agent Platform</title>
      <dc:creator>Meso Francis</dc:creator>
      <pubDate>Thu, 27 Aug 2026 01:10:02 +0000</pubDate>
      <link>https://dev.to/fmeso/grok-46-available-now-on-gemini-enterprise-agent-platform-20dp</link>
      <guid>https://dev.to/fmeso/grok-46-available-now-on-gemini-enterprise-agent-platform-20dp</guid>
      <description>&lt;p&gt;SpaceXAI’s Grok 4.6 is now available in Public Preview as a fully managed model in Model Garden on Gemini Enterprise Agent Platform. You can learn more on the model card on Model Garden.&lt;/p&gt;

&lt;p&gt;Why Grok 4.6&lt;br&gt;
Grok 4.6 is SpaceXAI’s most capable model, released in August 12, 2026. From SpaceXAI:&lt;/p&gt;

&lt;p&gt;Grok 4.6 builds on Grok 4.5 with a particular focus on long-running agents and more ambitious interactive and visual work. It stays with complex tasks across many steps, whether researching a topic, analyzing information, working across a codebase, or turning an idea into a polished application or work artifac&lt;/p&gt;

&lt;p&gt;What the managed endpoint gives you&lt;br&gt;
Serverless: No provisioning, no scaling policies, no patching. Pay only for the tokens you use, at the same rates offered by SpaceXAI.&lt;/p&gt;

&lt;p&gt;Two OpenAI-compatible surfaces: Chat Completions for standard requests, and the Responses API for agentic loops that need server-side state.&lt;/p&gt;

&lt;p&gt;Enterprise Readiness: One project, one bill, and one IAM policy under one roof. Partners can not access data sent through our endpoint.&lt;/p&gt;

&lt;p&gt;Get started&lt;br&gt;
Enable the model on its Model Garden card, then call it through the OpenAI-compatible Chat Completions API. Here is a complete request against the global endpoint:&lt;/p&gt;

&lt;p&gt;curl -X POST \&lt;br&gt;
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \&lt;br&gt;
  -H "Content-Type: application/json" \&lt;br&gt;
  &lt;a href="https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/endpoints/openapi/chat/completions" rel="noopener noreferrer"&gt;https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/endpoints/openapi/chat/completions&lt;/a&gt; \&lt;br&gt;
  -d '{&lt;br&gt;
    "model": "xai/grok-4.6",&lt;br&gt;
    "messages": [&lt;br&gt;
      {&lt;br&gt;
        "role": "user",&lt;br&gt;
        "content": "Who are you?"&lt;br&gt;
      }&lt;br&gt;
    ]&lt;br&gt;
  }'&lt;br&gt;
Preview details&lt;br&gt;
Grok 4.6 is offered at the Preview launch stage, on the global endpoint. Function calling, structured output, and reasoning are supported; reasoning_effort is not, so the model runs at its default effort. Provisioned Throughput and batch inference are not available for this model at launch.&lt;/p&gt;

&lt;p&gt;Quota is fixed rather than dynamic. Each project starts at 13 QPM, 188,000 input TPM, and 16,000 output TPM on the global endpoint, and increases are available on request.&lt;/p&gt;

&lt;p&gt;Pricing matches SpaceXAI’s direct rates and tiers on context length: $2.00 per million input tokens and $6.00 per million output tokens up to 200K tokens of context, doubling to $4.00 and $12.00 above it. Cached input is $0.50 per million, or $1.00 past the 200K mark.&lt;/p&gt;

&lt;p&gt;What’s next&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>How I Organize and Ship Small Open‑Source Projects</title>
      <dc:creator>Meso Francis</dc:creator>
      <pubDate>Wed, 19 Aug 2026 13:36:37 +0000</pubDate>
      <link>https://dev.to/fmeso/how-i-organize-and-ship-small-open-source-projects-iaf</link>
      <guid>https://dev.to/fmeso/how-i-organize-and-ship-small-open-source-projects-iaf</guid>
      <description>&lt;h2&gt;
  
  
  Practical habits, repo structure, and workflows that keep small projects healthy and approachable
&lt;/h2&gt;

&lt;p&gt;Why small projects succeed (and why many don’t) Every open‑source project starts with an idea. What separates projects that quietly rot from those that attract contributors and users isn’t always technical sophistication — it’s clarity. Clear goals, a consistent structure, minimal friction for contributors, and reliable automation make it easy for people (including future-you) to understand, use, and improve your work.&lt;/p&gt;

&lt;p&gt;In this post I’ll share a practical, opinionated workflow I use for small projects: how I design the repository, automate tests and releases, write docs, and manage issues and contributions. These are the same habits that help me keep projects shipping and lower the cost of maintenance.&lt;/p&gt;

&lt;p&gt;Goals I optimize for&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fast time-to-first-success: a visitor should be able to clone, run, and see something work in under 5 minutes.
Low cognitive overhead: a clear layout and a short README so folks know what the project does quickly.
Safe automation: CI catches obvious problems and automates releases so manual steps are minimized.
Contributor friendliness: clear CONTRIBUTING.md and issues that are starter-friendly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Repository layout (one page of truth) A consistent layout reduces friction. Here’s a minimal, language-agnostic structure I use:&lt;br&gt;
Text&lt;/p&gt;

&lt;p&gt;README.md&lt;br&gt;
LICENSE&lt;br&gt;
CHANGELOG.md&lt;br&gt;
CONTRIBUTING.md&lt;br&gt;
CODE_OF_CONDUCT.md&lt;br&gt;
/.github&lt;br&gt;
  /workflows&lt;br&gt;
    ci.yml&lt;br&gt;
    release.yml&lt;br&gt;
src/&lt;br&gt;
  (project source)&lt;br&gt;
tests/&lt;br&gt;
  (unit / integration tests)&lt;br&gt;
examples/&lt;br&gt;
  (small runnable examples)&lt;br&gt;
docs/&lt;br&gt;
  (long-form docs if needed)&lt;br&gt;
package.json / pyproject.toml / Cargo.toml (as applicable)&lt;/p&gt;

&lt;p&gt;Key files explained&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;README.md: the single place a new visitor will read. Include: 1-sentence summary, badges (CI, coverage), install/run example, links to docs and contributing.
CONTRIBUTING.md: step-by-step for opening issues, running tests, and submitting PRs.
CHANGELOG.md: keep a short changelog using conventional commits or a manual summary.
.github/workflows: CI and release automation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Make README work for newcomers Top-of-README should answer the three most important questions:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What does it do? (one sentence)
Who is it for? (one sentence)
How do I get started? (one quick example)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Example intro snippet:&lt;br&gt;
Markdown&lt;/p&gt;

&lt;h1&gt;
  
  
  TinyWidget
&lt;/h1&gt;

&lt;p&gt;TinyWidget is a small library that converts CSV to JSON in streaming fashion.&lt;br&gt;&lt;br&gt;
Run: &lt;code&gt;npx tinywidget input.csv &amp;gt; out.json&lt;/code&gt; (or &lt;code&gt;python -m tinywidget input.csv&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Automate the boring stuff: CI, formatting, and tests Set up CI early. My baseline includes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linting and formatting check (fail fast)
Unit tests on PRs
A smoke test on main (quick integration check)
Automated releases on tagged commits (optional)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A minimal GitHub Actions CI flow:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger on pull_request and push to main
Steps: checkout → install deps → run format/lint → run tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This reduces subjective feedback in reviews and keeps the main branch reliable.&lt;/p&gt;

&lt;p&gt;Make it easy to try (examples and scripts) Nothing beats a short example that demonstrates value. Add an examples/ folder with runnable code and a small README that explains what each example shows.&lt;/p&gt;

&lt;p&gt;Also include simple convenience scripts in package.json / Makefile:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make test
make lint
make run-example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Document the mental model, not every line Good docs explain the mental model: what the system is, its main components, and how the pieces interact. Keep API reference in a separate area (docs/ or generated docs); README should be about value and quick start.&lt;/p&gt;

&lt;p&gt;Be deliberate about issues and labels An issue tracker is both roadmap and to-do list. Keep issue types clear:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;good-first-issue: small entry-level tasks
bug: reproducible problems
enhancement: feature requests
question: usage questions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Write at least one good-first-issue when you publish — it invites people to contribute.&lt;/p&gt;

&lt;p&gt;Release strategy: keep releases frequent and predictable For small projects I prefer semantic versioning and frequent releases for visible progress. Automate releases with:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a release workflow that runs on tag push or merges to main
generate changelog entries from PR summaries or conventional commits
attach binaries/artifacts when relevant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This reduces the “stalls” that happen when release tasks pile up.&lt;/p&gt;

&lt;p&gt;Maintainability: tests and dependency hygiene&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Keep a test suite that runs quickly; fast tests make CI practical.
Use dependabot or a scheduled job to update dependencies.
Pin CI environment versions to avoid surprises.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Code review and PR etiquette&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limit PR size. Small, focused PRs are reviewed and merged faster.
Describe the “why”, not just the “what”.
Prefer descriptive commit messages and squash when merging if history will get noisy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Community: be friendly and consistent&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a brief Code of Conduct.
Acknowledge contributors in the changelog or release notes.
Be explicit about how you triage issues (labels, stale bot policy).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Example README snippet (Quickstart)&lt;br&gt;
Markdown&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clone:
git clone &lt;a href="https://github.com/yourname/project.git" rel="noopener noreferrer"&gt;https://github.com/yourname/project.git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install:
npm install&lt;/li&gt;
&lt;li&gt;Run:
npm start&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Measuring success (simple signals)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stars and forks are vanity metrics — watch for: PRs from others, issues filed by users, people using examples, or real-world forks and badges in other projects.
If you get repeat questions, add docs or an FAQ to prevent duplicate issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Common pitfalls and how to avoid them&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Overengineering: ship the smallest solution that solves a real problem.
No examples: users won’t take the time to build one.
No automation: manual releases, tests, and checks create friction that kills momentum.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Final checklist before publishing a repo&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;README: 1-sentence description + quickstart
CONTRIBUTING.md and CODE_OF_CONDUCT.md present
CI: lint + tests
At least one example that runs locally
At least one good-first-issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Wrap-up Small projects win when they’re easy to understand and easy to contribute to. Use clear structure, reliable automation, and a small set of human-friendly documents to lower the activation energy for users and contributors.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devex</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
