<?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: Redson Ngwira</title>
    <description>The latest articles on DEV Community by Redson Ngwira (@redsonngwira).</description>
    <link>https://dev.to/redsonngwira</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%2F3823099%2Ff8d9fe9d-f411-46c3-b08e-5c34f7c2b388.png</url>
      <title>DEV Community: Redson Ngwira</title>
      <link>https://dev.to/redsonngwira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/redsonngwira"/>
    <language>en</language>
    <item>
      <title>I built Sonder — describe any scene, AI agents spawn and live it out autonomously</title>
      <dc:creator>Redson Ngwira</dc:creator>
      <pubDate>Wed, 18 Mar 2026 00:51:39 +0000</pubDate>
      <link>https://dev.to/redsonngwira/i-built-sonder-describe-any-scene-ai-agents-spawn-and-live-it-out-4lg7</link>
      <guid>https://dev.to/redsonngwira/i-built-sonder-describe-any-scene-ai-agents-spawn-and-live-it-out-4lg7</guid>
      <description>&lt;p&gt;I wanted to watch AI agents interact without directing them. Not chatbots answering &lt;br&gt;
questions — actual people, with histories and tensions, living inside a scene I described.                         &lt;/p&gt;

&lt;p&gt;So I built Sonder.                                                                                                 &lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You type a scene. Something like:                                                                                  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Five coworkers watching football at someone's flat. The team is losing.&lt;br&gt;&lt;br&gt;
One of them hasn't been paid in three weeks."&lt;/em&gt;                                                                   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sonder generates five agents. Each gets a name, a personality, a backstory,&lt;br&gt;&lt;br&gt;
a reason to be in that room, and something eating at them. Then it starts the room.                                &lt;/p&gt;

&lt;p&gt;You don't say anything. They just... go.                                                                           &lt;/p&gt;




&lt;p&gt;Derek: &lt;em&gt;slams cup down&lt;/em&gt;                                                                                            &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lena, if you'd pulled your reports an hour earlier like I asked, 'barely'&lt;br&gt;&lt;br&gt;
wouldn't be the best win we had all week.                                                                        &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Marcus: &lt;em&gt;leans back, voice low and sharp&lt;/em&gt;                                                                          &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wow. The 'team player' act's really holding strong, isn't it, Derek? Must be&lt;br&gt;&lt;br&gt;
exhausting — lying to clients, lying to us, lying to yourself.                                                   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tariq: &lt;em&gt;stands up abruptly, chair screeching&lt;/em&gt;                                                                      &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You wanna talk lies, Marcus? At least Derek shows up stressed — unlike you,&lt;br&gt;&lt;br&gt;
smirking like you're not one bonus away from selling us all out!                                                 &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;You can:                                                                                                           &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watch silently&lt;/strong&gt; — just observe
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whisper to one agent&lt;/strong&gt; — only they hear you
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join as a named character&lt;/strong&gt; — agents address you by name
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask the narrator&lt;/strong&gt; — an omniscient LLM that knows what everyone is really thinking
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The narrator
&lt;/h2&gt;

&lt;p&gt;Ask it anything mid-scene:                                                                                         &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"what is happening"&lt;/em&gt;                                                                                            &lt;/p&gt;

&lt;p&gt;The room is unraveling. What began as a routine post-work gathering has cracked&lt;br&gt;&lt;br&gt;
open into a raw exposure of dread, resentment, and unspoken betrayals. Derek's&lt;br&gt;&lt;br&gt;
forced cheer has shattered. His outburst at Lena wasn't about reports — it was&lt;br&gt;&lt;br&gt;
panic, a man lashing out because he feels the ground giving way beneath him.&lt;br&gt;&lt;br&gt;
Marcus sees it all. He's bitter, yes, but he's not wrong. The team is burning —&lt;br&gt;&lt;br&gt;
not from incompetence, but from the weight of withheld truths.                                                   &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Parallel &lt;code&gt;asyncio.gather&lt;/code&gt; loop — all agents fire simultaneously
&lt;/li&gt;
&lt;li&gt;Agent personalities are hot-reloadable &lt;code&gt;.md&lt;/code&gt; files — edit them mid-simulation
&lt;/li&gt;
&lt;li&gt;World creation fetches real behavioral research via DuckDuckGo
&lt;/li&gt;
&lt;li&gt;Plugin hooks for voice, avatar, memory, and export
&lt;/li&gt;
&lt;li&gt;SQLite persistence — worlds survive restarts
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Completely free to run
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Free allowance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerebras&lt;/td&gt;
&lt;td&gt;1M tokens/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;Rate-limited free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;Fully local, unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Works on Linux, macOS, Windows, and Android (Termux, Android 7+).                                                  &lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;

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


                                                                                          &lt;/p&gt;

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

&lt;p&gt;bash&lt;br&gt;&lt;br&gt;
git clone &lt;a href="https://github.com/RedsonNgwira/sonder" rel="noopener noreferrer"&gt;https://github.com/RedsonNgwira/sonder&lt;/a&gt;&lt;br&gt;
cd sonder&lt;br&gt;
python -m venv venv &amp;amp;&amp;amp; source venv/bin/activate&lt;br&gt;
pip install -r requirements.txt&lt;br&gt;
python onboard.py&lt;br&gt;
python main.py&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/RedsonNgwira/sonder" rel="noopener noreferrer"&gt;github.com/RedsonNgwira/sonder&lt;/a&gt;                                   &lt;/p&gt;




&lt;p&gt;Built this from Malawi 🇲🇼. GPL-3.0. Feedback welcome. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>selfhosted</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Django Needs Convention Over Configuration (And How DJX Fixes It)</title>
      <dc:creator>Redson Ngwira</dc:creator>
      <pubDate>Sat, 14 Mar 2026 15:33:48 +0000</pubDate>
      <link>https://dev.to/redsonngwira/why-django-needs-convention-over-configuration-and-how-djx-fixes-it-1f81</link>
      <guid>https://dev.to/redsonngwira/why-django-needs-convention-over-configuration-and-how-djx-fixes-it-1f81</guid>
      <description>&lt;p&gt;I've been building Django apps for a while now, and every single time I start a new feature, I do the same thing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a model
&lt;/li&gt;
&lt;li&gt;Create views (ListView, DetailView, CreateView, UpdateView, DeleteView)
&lt;/li&gt;
&lt;li&gt;Create templates for each view
&lt;/li&gt;
&lt;li&gt;Create urls.py
&lt;/li&gt;
&lt;li&gt;Wire it into the project urls.py
&lt;/li&gt;
&lt;li&gt;Add the app to INSTALLED_APPS
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every. Single. Time.                                                                                              &lt;/p&gt;

&lt;p&gt;Rails developers have been laughing at us for 20 years. They type one command:                                    &lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;&lt;br&gt;
rails generate scaffold Post title:string content:text&lt;/p&gt;

&lt;p&gt;And they're done.                                                                                                 &lt;/p&gt;

&lt;h2&gt;
  
  
  Django Deserves Better
&lt;/h2&gt;

&lt;p&gt;Django is more powerful than Rails in many ways. But the developer experience gap is real. There's no scaffolding. No conventions enforced by tooling. No "happy path" that just works.                                             &lt;/p&gt;

&lt;p&gt;So I built DJX.                                                                                                   &lt;/p&gt;

&lt;h2&gt;
  
  
  What DJX Does
&lt;/h2&gt;

&lt;p&gt;DJX is a CLI tool that brings convention over configuration to Django. Inspired by Rails, built for Django developers.                                                                                                              &lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;&lt;br&gt;
pip install djx-cli&lt;br&gt;
djx new myblog &amp;amp;&amp;amp; cd myblog&lt;br&gt;
djx scaffold Post title:string content:text published:boolean&lt;br&gt;
python manage.py migrate &amp;amp;&amp;amp; python manage.py runserver&lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;http://127.0.0.1:8000/posts/&lt;/code&gt; — you have a working list, create, edit, and delete. No code written.        &lt;/p&gt;

&lt;h2&gt;
  
  
  What Gets Generated
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;djx scaffold Post title:string content:text&lt;/code&gt;, DJX creates:                                          &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;posts/models.py&lt;/code&gt; — model with all your fields + automatic &lt;code&gt;created_at&lt;/code&gt; / &lt;code&gt;updated_at&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;posts/views.py&lt;/code&gt; — all 5 class-based views
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;posts/templates/posts/&lt;/code&gt; — list, detail, form, confirm_delete templates
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;posts/urls.py&lt;/code&gt; — all RESTful routes
&lt;/li&gt;
&lt;li&gt;Auto-wired into project &lt;code&gt;urls.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auto-added to &lt;code&gt;INSTALLED_APPS&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other Commands
&lt;/h2&gt;

&lt;p&gt;bash                                                                                                              &lt;/p&gt;

&lt;h1&gt;
  
  
  See all your routes in a clean table
&lt;/h1&gt;

&lt;p&gt;djx routes&lt;/p&gt;

&lt;h1&gt;
  
  
  Remove a feature cleanly
&lt;/h1&gt;

&lt;p&gt;djx destroy scaffold Post&lt;/p&gt;

&lt;h1&gt;
  
  
  Install a package and auto-add to INSTALLED_APPS
&lt;/h1&gt;

&lt;p&gt;djx add djangorestframework&lt;/p&gt;

&lt;h1&gt;
  
  
  Generate just a model or just views
&lt;/h1&gt;

&lt;p&gt;djx model Article title:string body:text&lt;br&gt;
djx controller Post&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Django&lt;/th&gt;
&lt;th&gt;DJX&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New project&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;django-admin startproject&lt;/code&gt; + manual setup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;djx new myproject&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full CRUD feature&lt;/td&gt;
&lt;td&gt;model + views + urls + templates (manual)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;djx scaffold Post title:string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See all routes&lt;/td&gt;
&lt;td&gt;no built-in command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;djx routes&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove a feature&lt;/td&gt;
&lt;td&gt;delete files manually&lt;/td&gt;
&lt;td&gt;&lt;code&gt;djx destroy scaffold Post&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  It's Early Stage — Contributions Welcome
&lt;/h2&gt;

&lt;p&gt;DJX is early stage and there's a lot to build. Ideas on the roadmap:                                              &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;djx console&lt;/code&gt; — Django shell with all models auto-imported
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;djx generate api&lt;/code&gt; — DRF REST API scaffold
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;djx db migrate&lt;/code&gt; — shortcut for makemigrations + migrate
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/RedsonNgwira/djx-cli" rel="noopener noreferrer"&gt;https://github.com/RedsonNgwira/djx-cli&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/djx-cli/" rel="noopener noreferrer"&gt;https://pypi.org/project/djx-cli/&lt;/a&gt;                                                                       &lt;/p&gt;

&lt;p&gt;Built with ❤️ from Malawi 🇲🇼                                                                                       &lt;/p&gt;




&lt;p&gt;&lt;em&gt;What Rails-like features would you want in Django? Drop a comment below.&lt;/em&gt;     &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>django</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
