<?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: JoeStrout</title>
    <description>The latest articles on DEV Community by JoeStrout (@joestrout).</description>
    <link>https://dev.to/joestrout</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%2F955389%2Ffdd96374-bc61-43f2-bf73-c2d6d6968a72.png</url>
      <title>DEV Community: JoeStrout</title>
      <link>https://dev.to/joestrout</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joestrout"/>
    <language>en</language>
    <item>
      <title>MiniScript Weekly(ish) News — September 17, 2026</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Thu, 17 Sep 2026 15:14:44 +0000</pubDate>
      <link>https://dev.to/joestrout/miniscript-weeklyish-news-september-17-2026-2jje</link>
      <guid>https://dev.to/joestrout/miniscript-weeklyish-news-september-17-2026-2jje</guid>
      <description>&lt;p&gt;(Editor's note: sorry for the long delay since the last update... it was a very busy summer!  We'll try to get back to a weekly or near-weekly cadence.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Updates
&lt;/h2&gt;

&lt;p&gt;MiniScript 2 is nearing the finish line: Joe shared &lt;strong&gt;Preview 9&lt;/strong&gt; this week, with a long list of small but important fixes and improvements. He also said the remaining checklist before an official release is basically empty, while still encouraging everyone to keep testing for those sneaky unknown bugs: &lt;a href="https://github.com/JoeStrout/miniscript2/releases/tag/v2.0-preview-9" rel="noopener noreferrer"&gt;MiniScript 2.0 preview 9&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The work behind the scenes has been busy too, especially around performance and correctness. Recent fixes include GC tuning, better handling of lists and maps, cleaner error reporting, and a number of compiler/parser edge cases that were uncovered by real-world projects.&lt;/p&gt;

&lt;p&gt;Mini Micro 2 and raylib-miniscript also got meaningful updates. The raylib layer now has a Matrix class, a physics engine, and demos like Connect-4 inference, Game of Life, and the new &lt;strong&gt;Angry Balls&lt;/strong&gt; demo.  Meanwhile, both Soda and Mini Micro 2 have been rewritten on top of raylib-miniscript and are now in early testing.  Here's a screen shot of a game running in Mini Micro 2, using the new Matrix class to run a deep neural network AI:&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%2F21abpe9lcsw9bfkny24t.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%2F21abpe9lcsw9bfkny24t.png" alt="Screen shot of Triango on Mini Micro 2" width="799" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a major milestone for MiniScript maturity, GitHub's &lt;em&gt;Linguist&lt;/em&gt; library (used to identify the programming language used by each source file) now recognizes MiniScript.  Their servers are slowly reclassifying older projects now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Projects
&lt;/h2&gt;

&lt;p&gt;A big shout-out to community members shipping useful tools and experiments! &lt;strong&gt;DSlower&lt;/strong&gt; shared work on &lt;strong&gt;The Slow Shell&lt;/strong&gt; and a buffer file finder, and &lt;strong&gt;shellrider&lt;/strong&gt; posted a small &lt;strong&gt;UUIDv4 generator&lt;/strong&gt;: &lt;a href="https://github.com/shellrider-games/ms-uuid" rel="noopener noreferrer"&gt;ms-uuid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;minerobber&lt;/strong&gt; also helped push the ecosystem forward with language tooling and portability work, including a self-hosting &lt;strong&gt;Clojette&lt;/strong&gt; compiler, a MiniScript classification fix for GitHub Linguist, and other helpful contributions. They also have a handy tip for forcing correct identification of your MiniScript files on GitHub: in &lt;code&gt;.gitattributes&lt;/code&gt;, add &lt;code&gt;*.ms linguist-language=MiniScript&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There were also some fun Mini Micro-adjacent demos and projects worth highlighting. &lt;strong&gt;Trey Tomes&lt;/strong&gt; shared &lt;strong&gt;micro-bfxr&lt;/strong&gt; for sound effects generation: &lt;a href="https://github.com/treytomes/micro-bfxr" rel="noopener noreferrer"&gt;micro-bfxr&lt;/a&gt;, and &lt;strong&gt;machiaworx&lt;/strong&gt; posted the Steam release of &lt;strong&gt;Cry Pic&lt;/strong&gt;, noting that most of the game is controlled by MiniScript: &lt;a href="https://store.steampowered.com/app/2976740/Cry_Pic/" rel="noopener noreferrer"&gt;Cry Pic on Steam&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discussion Highlights
&lt;/h2&gt;

&lt;p&gt;A lot of the summer’s conversation centered on making MiniScript and Mini Micro more welcoming and more fun to use. Joe floated a &lt;strong&gt;Top 10 Mini Micro Most Wanted&lt;/strong&gt; list, asking what classic game genres the platform still needs; suggestions ranged from text RPGs and music sequencers to networked play and a Mini Micro BBS.&lt;/p&gt;

&lt;p&gt;There was also a great thread for beginners who want to understand how programming “thinks.” Joe walked through tokenizing, parsing, and ASTs with a new learner, encouraging them to start small and build confidence one step at a time — a very MiniScript-friendly way to learn.&lt;/p&gt;

&lt;p&gt;On the Mini Micro 2 side, testing continues to uncover useful edge cases. Community feedback helped surface memory and GC issues, import behavior, and a few platform-specific quirks, and Joe responded quickly with fixes and follow-up explanations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links Worth Checking Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/joestrout/mini-micro-10-most-wanted-games-pm"&gt;Mini Micro “10 Most Wanted” Games&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/joestrout/miniscript-is-a-recognized-language-on-github-4pg7"&gt;MiniScript is a recognized language on GitHub!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JoeStrout/miniscript2/releases/tag/v2.0-preview-9" rel="noopener noreferrer"&gt;MiniScript 2 Preview 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://store.steampowered.com/app/2976740/Cry_Pic/" rel="noopener noreferrer"&gt;Cry Pic on Steam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/treytomes/micro-bfxr" rel="noopener noreferrer"&gt;micro-bfxr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shellrider-games/ms-uuid" rel="noopener noreferrer"&gt;ms-uuid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and keep making cool things — we love seeing what you build!&lt;/p&gt;

&lt;h2&gt;
  
  
  Upcoming Game Jams
&lt;/h2&gt;

&lt;p&gt;These upcoming jams look like a great fit for Mini Micro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/garbage-jam-7" rel="noopener noreferrer"&gt;Garbage jam #7&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-21 12:00:00) — A super low-stress jam built around experimentation, bad art, and having fun makes it a perfect excuse to try a quirky pixel, tile, or text-based idea without worrying about polish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/untitled-game-jam-133" rel="noopener noreferrer"&gt;Untitled Game Jam #133&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-18 00:00:00) — A flexible, beginner-friendly jam with an open theme vote, any engine allowed, and no heavy technical constraints—great for a quick retro-style prototype or polished 2D game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/grc-game-jam" rel="noopener noreferrer"&gt;GRC GAME JAM&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-17 22:43:48) — A strong retro-leaning jam focused on fun, creativity, and polished gameplay, with the exciting possibility of seeing your game preserved as a ROM and played on a real arcade cabinet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/beginners-jam-autumn-2026" rel="noopener noreferrer"&gt;Beginners' Jam_Autumn 2026&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-20 12:00:00) — A very beginner-friendly jam with flexible, open-ended themes and no technical demands beyond making a fun free-to-play game, making it an easy fit for Mini Micro projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/creature-collector-jam" rel="noopener noreferrer"&gt;Creature Collector Game Jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-21 06:00:00) — A very strong fit for a retro, 2D-friendly jam centered on collecting, raising, and studying creatures, with plenty of room for charming pixel art, simple systems, and creative monster design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/goose-jam-3" rel="noopener noreferrer"&gt;Goose Jam 3&lt;/a&gt;&lt;/strong&gt; (starts 2026-09-19 21:00:00) — A very approachable low-scope jam with broad freedom to make anything from a tiny video game to a card or roleplaying game, plus flexible interpretation and no engine restrictions.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>development</category>
      <category>news</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Mini Micro "10 Most Wanted" Games</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Wed, 16 Sep 2026 14:46:44 +0000</pubDate>
      <link>https://dev.to/joestrout/mini-micro-10-most-wanted-games-pm</link>
      <guid>https://dev.to/joestrout/mini-micro-10-most-wanted-games-pm</guid>
      <description>&lt;p&gt;&lt;a href="https://miniscript.org/MiniMicro" rel="noopener noreferrer"&gt;Mini Micro&lt;/a&gt; is the neo-retro virtual computer that those of us who grew up in the personal computer era (the 1980s or so) could only dream of.  But there's one way in which those Apple IIs, C-64s, and Atari 800s still have Mini Micro beat: there was a lot more software for them.&lt;/p&gt;

&lt;p&gt;The Mini Micro software catalog is still regrettably small.  It comes with dozens of small demos; and there are 80-ish &lt;a href="https://miniscript.org/MiniMicro/#programs" rel="noopener noreferrer"&gt;small games and apps&lt;/a&gt; for it, but if we're being honest, most of them are demos, half-finished projects, or weekend game-jam projects.  Those are still awesome, and I'm always glad to see them.  But on any real computer in the 80s, every year saw dozens of full, deep games you could get lost in for weeks, not to mention productivity software you could use for real work.&lt;/p&gt;

&lt;p&gt;Now, for getting real work done in the 21st century, Mini Micro is probably not ideal.  You really are better off using Google Sheets and your favorite desktop word processor.  But for entertainment, Mini Micro is still a fine environment.  And this is where I really wish we had some more fully polished games to choose from.  Games like &lt;a href="https://joestrout.itch.io/solitaire" rel="noopener noreferrer"&gt;Klondike Solitaire&lt;/a&gt;, &lt;a href="https://joestrout.itch.io/galactic-empire" rel="noopener noreferrer"&gt;Galactic Empire&lt;/a&gt;, or the several &lt;a href="https://miniscript.org/MiniMicro/dlc/" rel="noopener noreferrer"&gt;DLC games&lt;/a&gt;, but covering other genres.  Of particular interest are genres that are hard to find today, because they've been ruined by microtransactions or have simply fallen out of favor.&lt;/p&gt;

&lt;p&gt;And so, with no further ado, here is my "top 10" list of games I'd love to see for Mini Micro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wizardry/Bard's Tale-Style RPG
&lt;/h2&gt;

&lt;p&gt;Before there were sprawling open worlds, there was the dungeon crawl: a party of adventurers, a first-person view down a stone corridor, and a stack of graph paper next to the keyboard so you could map where you'd been.  &lt;a href="https://en.wikipedia.org/wiki/Wizardry" rel="noopener noreferrer"&gt;&lt;em&gt;Wizardry&lt;/em&gt;&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/The_Bard%27s_Tale_(1985_video_game)" rel="noopener noreferrer"&gt;&lt;em&gt;The Bard's Tale&lt;/em&gt;&lt;/a&gt; made this one of the biggest genres of the 80s, and a handful of modern games (like &lt;a href="https://en.wikipedia.org/wiki/Legend_of_Grimrock" rel="noopener noreferrer"&gt;&lt;em&gt;Legend of Grimrock&lt;/em&gt;&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Etrian_Odyssey" rel="noopener noreferrer"&gt;&lt;em&gt;Etrian Odyssey&lt;/em&gt;&lt;/a&gt;) show it still works.  But there are very few of them.&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%2F9ahpo04n51cog4rr4ocm.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%2F9ahpo04n51cog4rr4ocm.png" alt="Screen shot from one of the Bard's Tale games" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The step-by-step, grid-based view is easy to draw in Mini Micro, which leaves you free to spend your effort where it counts: interesting party building, tactical turn-based combat, clever puzzles and traps, and a dungeon that rewards careful exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Space Combat Game
&lt;/h2&gt;

&lt;p&gt;Few things in 80s gaming felt as cool as sitting in the cockpit of a starfighter.  &lt;a href="https://en.wikipedia.org/wiki/Star_Raiders" rel="noopener noreferrer"&gt;&lt;em&gt;Star Raiders&lt;/em&gt;&lt;/a&gt; put you there in 1979, with enemy ships swooping across a starfield, a long-range scanner, and damage reports as your systems got shot out one by one.  &lt;a href="https://en.wikipedia.org/wiki/Wing_Commander_(video_game)" rel="noopener noreferrer"&gt;&lt;em&gt;Wing Commander&lt;/em&gt;&lt;/a&gt; took it further in 1990: its ships were just scaled and rotated bitmaps, not true 3D models, but with a detailed cockpit around them, a wingman on the radio, and a campaign that changed depending on how you flew, it felt like starring in a space movie.&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%2Frx4uqliyulq53oi6tk74.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%2Frx4uqliyulq53oi6tk74.png" alt="*Wing Commander* screen shot" width="320" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today's space games tend to be vast 3D simulators, and some of the biggest are now built around selling ships for real money.  The tight, arcade-style cockpit dogfight has mostly disappeared.  But that faux-3D approach is a great match for Mini Micro, whose sprites can scale and rotate, with the cockpit, radar, and instruments drawn on a display layer in front.  It doesn't need realistic physics; it needs the &lt;em&gt;feeling&lt;/em&gt; of flying: throttle, afterburners, shields, wingmen, and enemies that bank and weave instead of just flying straight at you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pinball Construction Set
&lt;/h2&gt;

&lt;p&gt;Bill Budge's &lt;a href="https://en.wikipedia.org/wiki/Pinball_Construction_Set" rel="noopener noreferrer"&gt;&lt;em&gt;Pinball Construction Set&lt;/em&gt;&lt;/a&gt; (1983) was a toy as much as a game: drag bumpers, flippers, spinners, and targets onto a blank table, tweak the gravity and elasticity, and then play what you'd built.  You could even save your table and give it to your friends.&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%2Foinccgp8jrttju2gzkmr.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%2Foinccgp8jrttju2gzkmr.png" alt="Screenshot of *Pinball Construction Set*" width="560" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are good pinball games today, but almost nothing that makes building your own table this easy and fun.  Mini Micro has everything needed: sprites, sound, and a file system for saving and sharing tables.  Include a handful of well-designed tables to show what's possible, and then let players go wild.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lode Runner-ish Puzzle Platformer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Lode_Runner" rel="noopener noreferrer"&gt;&lt;em&gt;Lode Runner&lt;/em&gt;&lt;/a&gt; (1983) turned the platformer into a puzzle.  You can't jump; instead, you collect gold while guards chase you, and your only weapon is digging holes in the brick floor to trap them (or to reach gold below).  The holes fill back in a few seconds later, so every level becomes a tense puzzle about timing and route planning.  Plenty of puzzle platformers exist today, but the dig-and-trap mechanic has hardly ever been copied.&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%2Fxomf27d48invd6zr1fnf.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%2Fxomf27d48invd6zr1fnf.png" alt="Screen shot of *Lode Runner* on the Apple II" width="799" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shipped with 150 levels &lt;em&gt;and&lt;/em&gt; a level editor, and that pairing is worth keeping.  Mini Micro's tile display makes both easy.  Build a solid set of hand-crafted levels that teach the mechanics and then twist them, and include an editor so players can make and share their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Text Adventure/Interactive Fiction
&lt;/h2&gt;

&lt;p&gt;There was a time when text adventures, or "interactive fiction" as it came to be known, was a huge game category.  They weren't all fantasy RPGs; there were mysteries, science fiction, and more.&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%2Fldje59o2ko50qqwvb6dd.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%2Fldje59o2ko50qqwvb6dd.png" alt="Screen shot from *Hitchhiker's Guide to the Galaxy*" width="500" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mini Micro comes with one little mini-adventure among its demos, but you can &lt;a href="https://dev.to/joestrout/create-a-text-adventure-in-mini-micro-2oc5"&gt;create your own text adventure&lt;/a&gt; using the same core code.  Make it deep; make the interactions rich and the characters believable.  Give players something they can get lost in.&lt;/p&gt;

&lt;h2&gt;
  
  
  M.U.L.E.-like Economic Multiplayer Game
&lt;/h2&gt;

&lt;p&gt;There are other economic games today, but none that match the compact, social, board-game-like quality of &lt;a href="https://en.wikipedia.org/wiki/M.U.L.E." rel="noopener noreferrer"&gt;&lt;em&gt;M.U.L.E.&lt;/em&gt;&lt;/a&gt;  And a big key to its charm was the way it supported up to 4 players around one computer, each with their own game controller.&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%2Fyfw2s7qbkagvrlq0yxlj.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%2Fyfw2s7qbkagvrlq0yxlj.png" alt="Screenshot of *M.U.L.E.*" width="655" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But don't just copy the original; be inspired by it, but design something new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Archon-like Strategy/Action Game
&lt;/h2&gt;

&lt;p&gt;Design a game with a Chess-like strategy layer, taking turns moving pieces around on a board; but when two pieces meet, they fight in a real-time arcade battle.  The classic example of this is &lt;a href="https://en.wikipedia.org/wiki/Archon:_The_Light_and_the_Dark" rel="noopener noreferrer"&gt;&lt;em&gt;Archon&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsi92ubmqm7kwzhehbd25.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%2Fsi92ubmqm7kwzhehbd25.png" alt="Screenshot from *Archon Ultra*" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a weirdly underexplored area, even today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deckbuilding Roguelike Game
&lt;/h2&gt;

&lt;p&gt;Modern games like &lt;a href="https://en.wikipedia.org/wiki/Slay_the_Spire" rel="noopener noreferrer"&gt;&lt;em&gt;Slay the Spire&lt;/em&gt;&lt;/a&gt; show how much fun a deck-building game can be, but this is a genre with plenty of room for creativity and innovation.  It could be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;em&gt;space-combat deckbuilder&lt;/em&gt;, where cards are maneuvers, weapons, shields, reactor tricks, crew actions;&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;wizard-duel game&lt;/em&gt;, where you assemble a spellbook and spells interact chemically or elementally;&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;heist deckbuilder&lt;/em&gt;, where cards represent tools, disguises, contacts, distractions, and escape routes;&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;dungeon crawler&lt;/em&gt; where your deck literally represents stamina/memory/equipment availability rather than abstract “cards”;&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;civilization or kingdom deckbuilder&lt;/em&gt;, where cards are policies, buildings, military units, discoveries, etc.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6tjroza1rgfs0sh5jwc.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%2Fg6tjroza1rgfs0sh5jwc.png" alt="Screenshot of *Slay the Spire*" width="526" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is probably the most nebulous idea on the list, but the basic idea is a game where the inventory, abilities, or actions you acquire become a shuffled deck, and constructing that deck is the main form of character development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Musical Toy
&lt;/h2&gt;

&lt;p&gt;Rhythm games are a huge genre, but most of them amount to &lt;em&gt;press the button the screen tells you to press&lt;/em&gt; at the right time in order to keep the music playing.  A much smaller subgenre gives you a virtual instrument you can actually play, like in &lt;a href="https://en.wikipedia.org/wiki/Trombone_Champ" rel="noopener noreferrer"&gt;&lt;em&gt;Trombone Champ&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffipec5rnn8p1x6tbdfjd.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%2Ffipec5rnn8p1x6tbdfjd.png" alt="Screenshot of *Trombone Champ*" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mini Micro is a powerful music machine, with both digitized and synthesized sounds and dynamic control over pitch and volume.  So, build a game/toy with an instrument you can actually play, but make it guided and easy enough for non-musicians to have fun too.  Maybe organize it around several mini-games that do varying amounts of hand-holding.  And you should be able to record and share your compositions, too -- maybe on a global map, like &lt;a href="https://en.wikipedia.org/wiki/Ocarina_(app)" rel="noopener noreferrer"&gt;&lt;em&gt;Ocarina by Smule&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rube Goldberg Game
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://en.wikipedia.org/wiki/The_Incredible_Machine" rel="noopener noreferrer"&gt;&lt;em&gt;The Incredible Machine&lt;/em&gt;&lt;/a&gt; (1993), each puzzle gave you a goal (get the ball into the basket, turn on the light, launch the rocket) and a bin of odd parts: ramps, conveyor belts, balloons, bowling balls, candles, and a cat who chases the mouse who runs the treadmill.  Your job was to arrange the parts into a contraption that does the job.  There was also a free-play mode where you could build whatever silly machine you could imagine.&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%2Fsmttrumgpo1l1vwnqv2g.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%2Fsmttrumgpo1l1vwnqv2g.png" alt="Screenshot from *The Incredible Machine*" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apart from a sequel or two by the original developers, this genre has been left mostly alone.  It suits 2D perfectly, but it does take a real physics simulation, which makes it one of the more challenging projects on this list.  A game that nails the feel of the physics and the humor of the parts would be a real gem, and shared puzzles and contraptions would make it even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developers Wanted!
&lt;/h2&gt;

&lt;p&gt;Mini Micro is an amazing platform, but it could be so much more amazing with games like these.  You (yes, &lt;em&gt;you&lt;/em&gt;) can contribute to the community in an important way by taking the lead!  Pick an idea that inspires you, discuss it on the discord, roll up your sleeves, and dig in.  Who knows -- your game might become the next big hit that people will be talking about for years!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>MiniScript is a recognized language on GitHub!</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Mon, 14 Sep 2026 23:24:58 +0000</pubDate>
      <link>https://dev.to/joestrout/miniscript-is-a-recognized-language-on-github-4pg7</link>
      <guid>https://dev.to/joestrout/miniscript-is-a-recognized-language-on-github-4pg7</guid>
      <description>&lt;p&gt;It's been a long time, but MiniScript support has finally been &lt;a href="https://github.com/github-linguist/linguist/pull/7384/changes/faa42ed9ad5e681d0890c3f86796c343f6f00c50..4896e938a7e9e7ef980875e22a18feaaceba3b5d" rel="noopener noreferrer"&gt;added&lt;/a&gt; to &lt;a href="https://github.com/github-linguist/linguist/" rel="noopener noreferrer"&gt;Linguist&lt;/a&gt;, the library that GitHub itself uses to identify what programming language each file is.&lt;/p&gt;

&lt;p&gt;That means that when you go to a repo like &lt;a href="https://github.com/JoeStrout/fathoms-edge" rel="noopener noreferrer"&gt;fathoms-edge&lt;/a&gt;, and look at the bottom of the "About" section, it should correctly report that it's mostly (or entirely) written in MiniScript!&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%2F2oaa244gcp8buik6jdab.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%2F2oaa244gcp8buik6jdab.png" alt="Screen shot of GitHub site showing " width="318" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or for a more interesting example, look at this breakdown from the &lt;a href="https://github.com/JoeStrout/raylib-miniscript" rel="noopener noreferrer"&gt;raylib-miniscript project&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulenh5gjb0ax6z5s3vip.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%2Fulenh5gjb0ax6z5s3vip.png" alt="Screen shot of GitHub site showing multiple languages, including " width="316" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Previously, GitHub was quite confused by our .ms files and would classify them as something else.  Now it's getting them right.&lt;/p&gt;

&lt;p&gt;To get this update accepted to Linguist, we had to show an active, thriving MiniScript community with a lot of MiniScript code on GitHub.  So, great job everyone!  This is an important milestone.&lt;/p&gt;

&lt;p&gt;(Next target: &lt;a href="https://github.com/highlightjs/highlight.js" rel="noopener noreferrer"&gt;highlight.js&lt;/a&gt;, the syntax highlighting library used by Discord, among others!)&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>Create a Text Adventure in Mini Micro</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Thu, 10 Sep 2026 03:12:31 +0000</pubDate>
      <link>https://dev.to/joestrout/create-a-text-adventure-in-mini-micro-2oc5</link>
      <guid>https://dev.to/joestrout/create-a-text-adventure-in-mini-micro-2oc5</guid>
      <description>&lt;p&gt;Text adventures (sometimes called interactive fiction) are a classic and celebrated game genre —  see &lt;a href="https://if50.textories.com/" rel="noopener noreferrer"&gt;50 Years of Text Games&lt;/a&gt;, for example.  &lt;a href="https://miniscript.org/MiniMicro/" rel="noopener noreferrer"&gt;Mini Micro&lt;/a&gt; has not neglected this genre; among the built-in demos is a 5-minute text adventure called &lt;em&gt;The Greedy Gargoyle&lt;/em&gt;, which you can &lt;a href="https://miniscript.org/MiniMicro/index.html?cmd=run%20%22%2Fsys%2Fdemo%2FtextAdventure.ms%22&amp;amp;info=greedyGargoyle" rel="noopener noreferrer"&gt;play on the web right here&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femm1odssicbw8xxd3jl0.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%2Femm1odssicbw8xxd3jl0.png" alt="Screen shot of The Greedy Gargoyle in Mini Micro" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have Mini Micro running on your own computer, you can also run this demo with &lt;code&gt;run "/sys/demo/textAdventure"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But did you know that this demo is more than just a demo - it's a foundation you can import and use to make your own text adventures?&lt;/p&gt;

&lt;p&gt;In this post, we'll walk through making a little custom adventure with three rooms to explore, and an object you can pick up and move around.&lt;/p&gt;

&lt;h2&gt;
  
  
  The import trick
&lt;/h2&gt;

&lt;p&gt;Because &lt;code&gt;textAdventure.ms&lt;/code&gt; is located in &lt;code&gt;/sys/demo&lt;/code&gt; rather than &lt;code&gt;/sys/lib&lt;/code&gt;, it's not on the standard import path.  So we need to add &lt;code&gt;/sys/demo/&lt;/code&gt; to &lt;code&gt;env.importPaths&lt;/code&gt; before we try to import it.  Then, to make the various classes and methods in that module easier to use, we're going to copy the contents of the imported module into &lt;code&gt;locals&lt;/code&gt;.  So the top of the program will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if env.importPaths[0] != "/sys/demo" then
    env.importPaths.insert 0, "/sys/demo"
end if
import "textAdventure"
for id in textAdventure.indexes
    locals[id] = @textAdventure[id]
end for
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Mini Micro, &lt;code&gt;reset&lt;/code&gt; the program state, then &lt;code&gt;edit&lt;/code&gt;, and paste in the above code.  Give it a &lt;code&gt;run&lt;/code&gt;.  You can then check to be sure it worked by entering &lt;code&gt;Object&lt;/code&gt; at the prompt.  &lt;code&gt;Object&lt;/code&gt; is the base of the textAdventure class hierarchy; if it returns a map containing keys like &lt;code&gt;"location"&lt;/code&gt;, &lt;code&gt;"contents"&lt;/code&gt;, and &lt;code&gt;"name"&lt;/code&gt;, then it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Required Globals
&lt;/h2&gt;

&lt;p&gt;Next, there are a small number of globals values needed by the textAdventure code, which are not automatically defined when it's imported this way.  So &lt;code&gt;edit&lt;/code&gt; again and add this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Globals required by the textAdventure code:
lamp = {}
lamp.lit = true
done = false
normalColor = color.aqua  // (or whatever you prefer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(This will probably be improved in Mini Micro 2, but having this code won't do any harm in any case.)&lt;/p&gt;

&lt;h2&gt;
  
  
  ...And Create!
&lt;/h2&gt;

&lt;p&gt;Now the fun part: build your virtual world!  A world in a text adventure consists of a bunch of objects, including rooms (locations), exits (doors/passageways connecting rooms), and things (items).  You create these by simply instantiating various classes in &lt;code&gt;textAdventure.ms&lt;/code&gt;, and configuring their properties.&lt;/p&gt;

&lt;p&gt;For this tutorial, we're going to make a little world consisting of a small one-room house, with a front yard and an attic.  So, let's start with the yard.  Edit your program again and add this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Now, let's define our universe!
yard = new Room
yard.name = "Front Yard"
yard.desc = "You're standing in the yard in front of a small house." + 
  "  The grass is long and overgrown with weeds that almost hide " +
  "an old car tire.  The house lies directly to the north."
Player.moveTo yard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not too hard, right?  We're creating a new &lt;code&gt;Room&lt;/code&gt;, and giving it a name and description.  And then, to make the player start in this room, we add a &lt;code&gt;Player.moveTo yard&lt;/code&gt; call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Loop
&lt;/h2&gt;

&lt;p&gt;Finally, to get our first playable demo, we need a main program.  This clears the screen, does the initial &lt;code&gt;look&lt;/code&gt; at the player's location, and then enters a simple main loop that takes input from the player and handles it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Main loop.
text.color = normalColor
clear
look
while not done
    text.color = color.gray
    cmd = input("&amp;gt;").lower
    text.color = normalColor
    handleCommand cmd
end while
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the above code to your program, and then run it.  It should be a playable but very minimal game.  You can use the &lt;code&gt;i&lt;/code&gt; or &lt;code&gt;inventory&lt;/code&gt; command to check your inventory (which is empty), you can &lt;code&gt;look&lt;/code&gt; again at the room you're in, and... well, that's about it so far.&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%2Fvha9hwir5qys5rw6rvru.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%2Fvha9hwir5qys5rw6rvru.png" alt="Screen shot of game so far" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create some more!
&lt;/h2&gt;

&lt;p&gt;Let's make the world bigger!  The code below creates two more locations, &lt;code&gt;house&lt;/code&gt; and &lt;code&gt;attic&lt;/code&gt;, and then connects them all up with doors.  Insert this code after &lt;code&gt;Player.moveTo yard&lt;/code&gt;, but before &lt;code&gt;// Main loop.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;house = new Room
house.name = "Small House"
house.desc = "You're on the main floor of a small one-room house."

attic = new Room
attic.name = "Attic"
attic.desc = "You're in the attic of the small house.  It's dusty " +
  "and full of cobwebs.  Wan light comes from a tiny window at one " +
  "end.  The only exit is down."

doors = Exit.connect(yard, "north", house)
doors[0].altNames = ["house", "door", "n"]
doors[0].salient = false
doors[1].altNames = ["exit", "leave", "out", "door", "s"]
doors[1].salient = false

doors = Exit.connect(house, "up", attic)
doors[0].altNames = ["attic", "trapdoor", "n"]
doors[0].type = "trapdoor"
doors[0].fullName = "trapdoor in the ceiling"
doors[0].open = false
doors[1].altNames = ["exit", "leave", "out", "door", "d"]
doors[1].salient = false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this particular example, the door configuration is longer than the locations themselves, but that's not always the case.  Here's what's going on with the exits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each call to &lt;code&gt;Exit.connect&lt;/code&gt; returns two exits; element &lt;code&gt;[0]&lt;/code&gt; in the forward direction (e.g. yard to house), and element &lt;code&gt;[1]&lt;/code&gt; in the reverse direction (e.g. house to yard).&lt;/li&gt;
&lt;li&gt;Giving a generous supply of &lt;code&gt;altNames&lt;/code&gt; allows the player more freedom in what they type to move around; instead of always &lt;code&gt;go north&lt;/code&gt;, they can say &lt;code&gt;go house&lt;/code&gt;, or &lt;code&gt;door&lt;/code&gt;, or just &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Setting &lt;code&gt;salient = false&lt;/code&gt; keeps the door from being automatically listed among the room contents.  Try commenting that line out and see how it behaves.&lt;/li&gt;
&lt;li&gt;Setting &lt;code&gt;type&lt;/code&gt; just gives the engine a more colorful term for the exit than "door"; similarly, setting &lt;code&gt;fullName&lt;/code&gt; helps color the description that appears for a door that is salient.&lt;/li&gt;
&lt;li&gt;Finally, doors default to already open; set &lt;code&gt;open = false&lt;/code&gt; to make it closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the program at this point, and you should be able to navigate from the yard to the house, and then up into the attic, and back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add some things!
&lt;/h2&gt;

&lt;p&gt;A game consisting only of empty rooms isn't a very interesting game!  The core of any adventure is a set of things you can pick up, carry around, and interact with.  Our description of the front yard claimed there was a tire in the weeds.  This brings up an important design rule for any text adventure game:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you mention an object in a description, players &lt;em&gt;will&lt;/em&gt; try to grab it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, a well-written game has actual objects (possibly with &lt;code&gt;salient = false&lt;/code&gt;) that correspond to any object mentioned in the descriptions.&lt;/p&gt;

&lt;p&gt;In this case, we mentioned a tire, so we better make a tire.  And to keep things simple, we'll take it out of the room description and let the game engine list it when present.  So, start by editing the code that sets &lt;code&gt;yard.desc&lt;/code&gt; to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yard.desc = "You're standing in the yard in front of a small house." + 
  "  The house lies directly to the north."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then, after creating the doors (or really anywhere after &lt;code&gt;yard&lt;/code&gt; is built), add new code for the tire:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tire = new Thing
tire.name = "old tire"
tire.altNames = ["tire", "tyre"]
tire.desc = "It's just an old, worn-out car tire."
tire.moveTo yard
tire.descInRoom = function
    if self.location != yard then return super.descInRoom
    printWrap "The grass is long and overgrown with weeds that " +
      "almost hide an old car tire."
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example is a little fancier than your typical room object, but I couldn't help myself; tweaking the behavior of objects to make them "special" is a large part of the magic of text adventure games.  And the magic in this case is relatively minor: it's just overriding the &lt;code&gt;descInRoom&lt;/code&gt; function, so that if it is located in the yard, it prints a special description about it being among the weeds.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are other ways we could have handled this; perhaps better would be to make the tire nonsalient, and give &lt;code&gt;yard&lt;/code&gt; a custom &lt;code&gt;desc&lt;/code&gt; function that includes the bit about the tire when the tire is present, and a different message about weeds (but no tire) when it is not.  This is left as an exercise for the reader.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now run the game again.  Try picking the tire up, carrying it around, dropping it in the house or the attic, or back in the yard, and be sure to &lt;code&gt;look&lt;/code&gt; at your surroundings to verify it's all working.&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%2Fx54fupelg4pmvg9u3zp2.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%2Fx54fupelg4pmvg9u3zp2.png" alt="Screen shot of completed demo" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overriding the stock code
&lt;/h2&gt;

&lt;p&gt;You might notice a minor bug that doesn't appear in my screen shot above -- there's an extra space every time the game says &lt;code&gt;an  old tire&lt;/code&gt;.  It turns out this is a bug in textAdventure.ms that was never noticed because none of the items in the stock game begin with a vowel.&lt;/p&gt;

&lt;p&gt;But good news!  You have the power to replace any imported method.  Add this code near the top of your program, after the required globals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Fix the minor bug in the Thing.a function
Thing.a = function
    if "aeiou".indexOf(self.name[0]) != null then return "an"
    return "a"
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code is copied directly out of textAdventure.ms, but &lt;code&gt;"an "&lt;/code&gt; has been replaced with &lt;code&gt;"an"&lt;/code&gt; (without the extra space).  Problem solved.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Here's the complete tutorial code if you need it.
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Demo text adventure.

if env.importPaths[0] != "/sys/demo" then
    env.importPaths.insert 0, "/sys/demo"
end if
import "textAdventure"
for id in textAdventure.indexes
    locals[id] = @textAdventure[id]
end for

// Globals required by the textAdventure code:
lamp = {}
lamp.lit = true
done = false
normalColor = color.aqua

// Fix the minor bug in the Thing.a function
Thing.a = function
    if "aeiou".indexOf(self.name[0]) != null then return "an"
    return "a"
end function

// Now, let's define our universe!
yard = new Room
yard.name = "Front Yard"
yard.desc = "You're standing in the yard in front of a small house." + 
  "  The house lies directly to the north."
Player.moveTo yard

house = new Room
house.name = "Small House"
house.desc = "You're on the main floor of a small one-room house."

attic = new Room
attic.name = "Attic"
attic.desc = "You're in the attic of the small house.  It's dusty " +
  "and full of cobwebs.  Wan light comes from a tiny window at one " +
  "end.  The only exit is down."

doors = Exit.connect(yard, "north", house)
doors[0].altNames = ["house", "door", "n"]
doors[0].salient = false
doors[1].altNames = ["exit", "leave", "out", "door", "s"]
doors[1].salient = false

doors = Exit.connect(house, "up", attic)
doors[0].altNames = ["attic", "trapdoor", "n"]
doors[0].type = "trapdoor"
doors[0].fullName = "trapdoor in the ceiling"
doors[0].open = false
doors[1].altNames = ["exit", "leave", "out", "door", "d"]
doors[1].salient = false

tire = new Thing
tire.name = "old tire"
tire.altNames = ["tire", "tyre"]
tire.desc = "It's just an old, worn-out car tire."
tire.moveTo yard
tire.descInRoom = function
    if self.location != yard then return super.descInRoom
    printWrap "The grass is long and overgrown with weeds that " +
      "almost hide an old car tire."
end function


// Main loop.
text.color = normalColor
clear
look
while not done
    text.color = color.gray
    cmd = input("&amp;gt;").lower
    text.color = normalColor
    handleCommand cmd
end while
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




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

&lt;h2&gt;
  
  
  Go forth and create!
&lt;/h2&gt;

&lt;p&gt;You have now created a simple world with a house, an attic accessible via a trapdoor, and an overgrown front yard containing an old tire you can manipulate.  That's a foundation for high adventure if I've ever heard one.&lt;/p&gt;

&lt;p&gt;Where you go from here is up to you.  Read &lt;code&gt;textAdventure.ms&lt;/code&gt; (in Mini Micro or &lt;a href="https://github.com/JoeStrout/minimicro-sysdisk/blob/master/sys/demo/textAdventure.ms" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;) to learn the full set of object types, properties, and methods available to you.  They include things like countable objects (like the coins in &lt;em&gt;The Greedy Gargoyle&lt;/em&gt;) and liquid (like the water in the pool).&lt;/p&gt;

&lt;p&gt;I'd recommend you start with the built-in functions and classes, and sketch out your world as much as you can with these.  Then start building in special behaviors.  This is how you make puzzles: objects that react based on where other objects are, or what state they're in, or special commands entered by the user.&lt;/p&gt;

&lt;p&gt;Or, if you don't like puzzles, fill your world with mobs and craft a combat system.  Add magic if you like.  Or maybe you prefer ray guns and rocket ships.  It's all possible.&lt;/p&gt;

&lt;p&gt;Do you have any fond memories of text adventures you've played, or is the genre new to you?  What new adventures would you love to see?  Share your thoughts in the comments below!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>programming</category>
      <category>adventure</category>
    </item>
    <item>
      <title>Living Without Constructors</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Wed, 05 Aug 2026 21:52:33 +0000</pubDate>
      <link>https://dev.to/joestrout/living-without-constructors-6bk</link>
      <guid>https://dev.to/joestrout/living-without-constructors-6bk</guid>
      <description>&lt;p&gt;The &lt;a href="https://miniscript.org" rel="noopener noreferrer"&gt;MiniScript&lt;/a&gt; language does not have constructors; when you create a new object with &lt;code&gt;new&lt;/code&gt;, like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okBtn = new PushButton
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...what you get back is exactly a map with &lt;code&gt;__isa&lt;/code&gt; set, like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"__isa": PushButton}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, &lt;em&gt;hooray&lt;/em&gt; for simplicity!  But &lt;em&gt;boo&lt;/em&gt; for wanting to do any more sophisticated initialization when your object is created.  In other languages, you'd likely do such initialization in a constructor (a method that automatically runs when you create an instance of a class).  But MiniScript doesn't have those.  So what do you do?&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%2Fes2m5yhzzyebu1ne97wj.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%2Fes2m5yhzzyebu1ne97wj.png" alt="Yuki The Chinchilla, by Maxunbanned (CC BY-SA 4.0)" width="640" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: Separate &lt;code&gt;init&lt;/code&gt; method
&lt;/h2&gt;

&lt;p&gt;The first and most obvious remedy is to have a separate &lt;code&gt;init&lt;/code&gt; method that you call after creating each object.  You can find an example of this in the &lt;a href="https://dev.to/joestrout/demo-highlight-asteroids-250d"&gt;Asteroids demo&lt;/a&gt; at /sys/demo/asteroids.  Line 37 defines GameSprite as a subclass of Sprite (&lt;code&gt;GameSprite = new Sprite&lt;/code&gt;), and then lines 55-59 give it an &lt;code&gt;init&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GameSprite.init = function
    self.v = {"x":0, "y":0}
    self.destroyed = false
    display(4).sprites.push self
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then later, it makes a subclass of GameSprite called TimedSprite, to represent a game sprite that despawns after a little while:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TimedSprite = new GameSprite
TimedSprite.despawnTime = 0
TimedSprite.init = function(duration = 0.5)
    super.init
    self.despawnTime = time + duration
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(TimedSprite also has a custom &lt;code&gt;update&lt;/code&gt; method, but that's not important here.)  Note how TimedSprite.init calls &lt;code&gt;super.init&lt;/code&gt;, ensuring that the base class gets a chance to do its usual initialization.  Similarly, when we make a subclass of TimedSprite called Bullet, it does the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bullet = new TimedSprite
Bullet.instances = []
Bullet.init = function(lifetime = 0.6)
    super.init lifetime
    Bullet.instances.push self
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then when the player presses the fire button, we create a new bullet with the &lt;em&gt;create, then initialize&lt;/em&gt; pattern (line 116-117):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        b = new Bullet
        b.init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find other examples of this pattern in some other demos, like fatbits and flappyBat.  This pattern works.  But it's no longer my favorite solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: Static factory method
&lt;/h2&gt;

&lt;p&gt;The other basic option is to never have callers use &lt;code&gt;new&lt;/code&gt; directly, but instead to call a &lt;em&gt;factory method&lt;/em&gt; on the class.  A factory method is nothing more or less than a method whose job it is to create and return an object.  And a "static" method is one that you call on the class, rather than on some specific object.  I've lately settled into the habit of naming static methods and properties with a capital first letter, to distinguish them from ordinary instance methods and properties, and most typically, I call my factory method &lt;code&gt;Make&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So this solution is just: stick a &lt;code&gt;Make&lt;/code&gt; method on your class that creates, initializes, and returns a new instance.&lt;/p&gt;

&lt;p&gt;You can find examples of this pattern in /sys/demo/soundLab, which first makes a &lt;code&gt;RectControl&lt;/code&gt; class, and then makes several subclasses of that, including PushButton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PushButton = new RectControl
PushButton.Instances = []
PushButton.image = desktopPic.getImage(248,106, 20,20)
PushButton.icon = null

PushButton.Make = function(left, bottom, image=null, icon=null)
    noob = new self
    noob.left = left
    noob.bottom = bottom
    noob.icon = icon
    if image then noob.image = image
    noob.width = noob.image.width
    noob.height = noob.image.height
    PushButton.Instances.push noob
    return noob
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be sure to notice the neat trick here: to actually create the new instance, this &lt;code&gt;Make&lt;/code&gt; method says &lt;code&gt;noob = new self&lt;/code&gt;.  Here &lt;code&gt;self&lt;/code&gt; is whatever class the &lt;code&gt;Make&lt;/code&gt; method was called on; so if the user said &lt;code&gt;PushButton.Make&lt;/code&gt;, then &lt;code&gt;new self&lt;/code&gt; is equivalent to &lt;code&gt;new PushButton&lt;/code&gt;.  But if they call &lt;code&gt;Make&lt;/code&gt; on some &lt;em&gt;subclass&lt;/em&gt; of PushButton, then this &lt;code&gt;new&lt;/code&gt; will instantiate that subclass instead.&lt;/p&gt;

&lt;p&gt;Of course we're only using &lt;code&gt;new&lt;/code&gt; here at all because the base class (RectControl) did not define a &lt;code&gt;Make&lt;/code&gt; method.  What if it does?  Well, let's look at the WaveButton class, which derives from PushButton:&lt;br&gt;
&lt;/p&gt;

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

WaveButton.Make = function(left, bottom, imageIdx=1, iconIdx=0)
    return super.Make(left, bottom, WaveButton.Images[imageIdx], WaveButton.Icons[iconIdx])
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The WaveButton.Make method just calls &lt;code&gt;super.Make&lt;/code&gt; to create the new instance.  In this case, we only overrode &lt;code&gt;Make&lt;/code&gt; in order to pass the appropriate button image and icon.  But we could have also done something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WaveButton.Make = function(left, bottom, imageIdx=1, iconIdx=0)
    noob = super.Make(left, bottom, WaveButton.Images[imageIdx], WaveButton.Icons[iconIdx])
    // ...do other initialization with noob here...
    return noob
end function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Factory Methods Rock
&lt;/h2&gt;

&lt;p&gt;A strong case can be made that factory methods are actually &lt;em&gt;superior&lt;/em&gt; to constructors.  Here are some reasons why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can have &lt;strong&gt;multiple factory methods&lt;/strong&gt; on the same class, with unique names making it clear what each is for: &lt;code&gt;MakeForStorage&lt;/code&gt; or &lt;code&gt;MakeFromFile&lt;/code&gt; or whatever.&lt;/li&gt;
&lt;li&gt;A factory method &lt;strong&gt;doesn't have to actually create a new object&lt;/strong&gt;; it could pull an old object out of a recycling pool, or some sharable instance, and the caller doesn't need to know or care.&lt;/li&gt;
&lt;li&gt;A factory method could &lt;strong&gt;return a different type&lt;/strong&gt; based on the parameter values: maybe you need a different class for high-speed sprites (like bullets) vs stationary sprites (like trees).  That logic can be hidden inside the factory method, so callers don't have to remember it.&lt;/li&gt;
&lt;li&gt;A factory method can &lt;strong&gt;fail gracefully&lt;/strong&gt;, returning &lt;code&gt;null&lt;/code&gt; or (in MiniScript 2) and &lt;code&gt;error&lt;/code&gt; in place of a new object.  &lt;code&gt;new&lt;/code&gt; can never do that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factories are easier to evolve&lt;/strong&gt;.  You can change the return type, caching policy, initialization steps, etc., without having to update all the callers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some of these benefits would also apply to the &lt;code&gt;init&lt;/code&gt; method, but most of them would not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;New MiniScript programmers are sometimes surprised by the lack of a constructor feature.  But now that you know how to live with it, it's not a lack at all!  Just a different way of doing things.&lt;/p&gt;

&lt;p&gt;What's your favorite approach to creating &amp;amp; initializing objects in MiniScript?  Share your thoughts below!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>programming</category>
      <category>tips</category>
    </item>
    <item>
      <title>The Mini Micro Desktop GUI</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Wed, 01 Jul 2026 23:26:19 +0000</pubDate>
      <link>https://dev.to/joestrout/the-mini-micro-desktop-gui-2gbm</link>
      <guid>https://dev.to/joestrout/the-mini-micro-desktop-gui-2gbm</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.toMini%20Micro"&gt;https://miniscript.org/MiniMicro&lt;/a&gt; is a virtual home computer with a primarily command-line interface.  It boots into a prompt with a friendly blinking cursor, where you can type MiniScript commands or code to navigate around the system and get things done.&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%2Fkkl0g31g44hetavn7502.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%2Fkkl0g31g44hetavn7502.png" alt="Screen shot of Mini Micro, freshly booted" width="799" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, among the demos in the &lt;code&gt;/sys/demo&lt;/code&gt; directory is a program called &lt;code&gt;desktop&lt;/code&gt;.  You can run it from there like any other demo, or you can use the convenient &lt;code&gt;desktop&lt;/code&gt; function, built right in as one of the globals defined in &lt;code&gt;/sys/startup.ms&lt;/code&gt;.  Just type:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;and Mini Micro will load up the desktop GUI (graphical user interface)!&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%2Fomsowqwmgbzlfzcbrc6e.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%2Fomsowqwmgbzlfzcbrc6e.png" alt="Screen shot of desktop initial state" width="799" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The initial state has one window open, showing the mounted disks -- in my case that is &lt;code&gt;/sys&lt;/code&gt;, &lt;code&gt;/usr&lt;/code&gt;, and &lt;code&gt;/usr2&lt;/code&gt;.  You can drag the window around by any part of the gray border, except the textured lower-right corner, which stretches the window out.  You can double-click folders to open them in new windows:&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%2Fkpnw0nst0on98tlhjll6.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%2Fkpnw0nst0on98tlhjll6.png" alt="Screen shot of desktop with several windows open" width="799" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Power-user Tip
  &lt;p&gt;If you hold the Alt/Option key while double-clicking a folder, it will simultaneously open that folder and close the previous window.  This is known as "Tunneling". &lt;/p&gt;

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

&lt;p&gt;Scrollbars appear on disk/folder windows, which can be used to scroll around the files therein.  You can double-click some files (for examples, pictures and text files) to preview them with the &lt;code&gt;view&lt;/code&gt; command, or double-click MiniScript files to run them.  The desktop acts as a &lt;a href="https://miniscript.org/wiki/Env.shell" rel="noopener noreferrer"&gt;shell&lt;/a&gt;, so when the program exits normally, the desktop should reappear.  If the program aborts due to an error, or you press Control-C, then you can type &lt;code&gt;exit&lt;/code&gt; to return to the desktop (or just use the &lt;code&gt;desktop&lt;/code&gt; command again).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;File&lt;/strong&gt; menu has three commands, all functional: &lt;strong&gt;New Window&lt;/strong&gt;, &lt;strong&gt;Close Window&lt;/strong&gt;, and &lt;strong&gt;Exit to Shell&lt;/strong&gt; (which really means, exit to the standard command-line prompt).  &lt;strong&gt;Close Window&lt;/strong&gt; closes the frontmost window; you can also do that from the keyboard by pressing the &lt;code&gt;W&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Window&lt;/strong&gt; menu also works, and provides quick access to any of the windows you have open.&lt;/p&gt;

&lt;p&gt;And that's about it.  &lt;code&gt;/sys/demo/desktop&lt;/code&gt; is more of a demo than a fully functional GUI.  But maybe, in Mini Micro 2.0, it could be.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fully functional desktop?
&lt;/h2&gt;

&lt;p&gt;I have big plans for Mini Micro 2.0... probably &lt;em&gt;too&lt;/em&gt; big, if I'm being honest.  But among them is the idea of turning this demo into a proper, full-fledged desktop environment you can actually use to browse and manage your files.  &lt;a href="https://github.com/JoeStrout/minimicro-sysdisk/issues/61" rel="noopener noreferrer"&gt;GitHub issue #61&lt;/a&gt; is all about this possibility, which would include ways to move/rename files, desk accessories you could add to or replace yourself, etc.&lt;/p&gt;

&lt;p&gt;But what do you think?  Is this worth spending time on, or would you rather use the command line anyway?  And if you do want to spend significant time in the desktop environment, what features are most important to you?&lt;/p&gt;

&lt;p&gt;Let us know in the comments below, or chime in &lt;a href="https://github.com/JoeStrout/minimicro-sysdisk/issues/61" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;.  I can't wait to hear your thoughts!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>programming</category>
      <category>gui</category>
    </item>
    <item>
      <title>MiniScript Weekly News — June 25, 2026</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Thu, 25 Jun 2026 20:50:45 +0000</pubDate>
      <link>https://dev.to/joestrout/miniscript-weekly-news-june-25-2026-3ghh</link>
      <guid>https://dev.to/joestrout/miniscript-weekly-news-june-25-2026-3ghh</guid>
      <description>&lt;h2&gt;
  
  
  Development Updates
&lt;/h2&gt;

&lt;p&gt;MiniScript 2 kept moving fast this week, with Preview 5 now available: &lt;a href="https://github.com/JoeStrout/miniscript2/releases/tag/v2.0-preview-5" rel="noopener noreferrer"&gt;https://github.com/JoeStrout/miniscript2/releases/tag/v2.0-preview-5&lt;/a&gt;. Joe has been polishing error handling, tightening up stack traces, and adding a &lt;code&gt;key&lt;/code&gt; module for console input along the way. If you’ve been testing the previews, now’s a great time to keep poking at edge cases and reporting what you find.&lt;/p&gt;

&lt;p&gt;A big performance highlight landed with &lt;strong&gt;computed lists&lt;/strong&gt;, which make things like &lt;code&gt;range(...)&lt;/code&gt; and list repetition much faster without changing how they behave in normal code. Joe also wrote up the idea in a new Dev.to post: &lt;a href="https://dev.to/joestrout/computed-lists-in-miniscript-2-j4"&gt;Computed Lists in MiniScript 2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;key&lt;/code&gt; module has landed for console apps too, with &lt;code&gt;.available&lt;/code&gt; and &lt;code&gt;.get&lt;/code&gt; mimicking their behavior in Mini Micro. That should open the door for more interactive command-line MiniScript tools and games.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Projects
&lt;/h2&gt;

&lt;p&gt;Congratulations to &lt;strong&gt;Venti&lt;/strong&gt; for shipping a tutorial update to their game, &lt;strong&gt;&lt;a href="https://store.steampowered.com/app/3681230/Observe/" rel="noopener noreferrer"&gt;Observe&lt;/a&gt;&lt;/strong&gt;. It now teaches MiniScript in-game, which is a fantastic way to bring new players into the community while showing off what can be built with the language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;maho_citrus&lt;/strong&gt; shared &lt;strong&gt;&lt;a href="https://github.com/mahocitrus/Regicide.ms-unofficial" rel="noopener noreferrer"&gt;Regicide.ms-unofficial&lt;/a&gt;&lt;/strong&gt;, a MiniScript take on the card game Regicide. Joe immediately recognized it as a neat find and even suggested a Mini Micro GUI version—great encouragement all around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show and Tell
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;#mini-micro&lt;/code&gt;, &lt;strong&gt;Trey Tomes&lt;/strong&gt; showed off progress on his SVG renderer, which now handles the &lt;code&gt;&amp;lt;animate&amp;gt;&lt;/code&gt; tag: &lt;a href="https://github.com/treytomes/micro-svg/blob/main/demo/constellation2.svg" rel="noopener noreferrer"&gt;demo/constellation2.svg&lt;/a&gt;. It’s a lovely example of experimentation leading to something genuinely useful and expressive.&lt;/p&gt;

&lt;p&gt;Meanwhile &lt;strong&gt;shellrider&lt;/strong&gt; has been pushing on 3D rendering experiments, adding a z-buffer and intersecting triangles. Joe chimed in with encouragement and a bit of nostalgia about older software renderers, which feels very on-brand for this community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discussion Highlights
&lt;/h2&gt;

&lt;p&gt;There was a lively thread around the new MiniScript 2 previews, including testing on Windows and Linux, stack traces, ANSI terminal behavior, and consistency across builds. Community testing quickly found and helped fix a few early crashes, which is exactly the kind of collaboration that makes preview releases so valuable.&lt;/p&gt;

&lt;p&gt;Joe also shared that MiniScript 2 is coming along well for embedding, but he’s recommending a little patience before others start integrating it heavily. In the meantime, he’s working toward a smoother path for raylib-miniscript and other targets, including better build support and more portable tooling.&lt;/p&gt;




&lt;p&gt;Thanks for reading, and thanks to everyone sharing code, tests, ideas, and projects. See you next week!&lt;/p&gt;

&lt;h2&gt;
  
  
  Upcoming Game Jams
&lt;/h2&gt;

&lt;p&gt;These upcoming jams look like a great fit for Mini Micro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/the-52-card-pickup-jam-1" rel="noopener noreferrer"&gt;The 52 Card Pickup Jam #1&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-29 11:00:00) — A perfect excuse to build a stylish card game or clever twist on classic decks, with plenty of room for polished visuals, sound, and inventive mechanics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/killyourdarlingsno1" rel="noopener noreferrer"&gt;KILL YOUR DARLINGS Mini Jam No. 1&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-26 05:01:00) — A perfect anti-scope-creep jam that celebrates tiny, finished, weirdly personal projects over polish—ideal for making something bold, simple, and delightfully unexpected in just three days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/8gameaweek" rel="noopener noreferrer"&gt;One Game A Week Jam #8&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-29 16:00:00) — A fast, small-scope jam built around clever puzzle design and unusual weekly prompts, perfect for making a polished retro-style brainteaser with a striking mirror-and-path twist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/mini-jame-gam-56" rel="noopener noreferrer"&gt;Mini Jame Gam #56&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-26 11:00:00) — A beginner-friendly jam with a flexible theme, a required special object, and a short prototype-friendly format makes this a great place to build something creative, polished, and fun.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/fake-update-jam" rel="noopener noreferrer"&gt;Fake Update Jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-29 11:00:00) — A delightfully meta jam where the game itself can pretend to boot, patch, glitch, and rewrite its own rules—perfect for inventive UI tricks, fake system screens, and story-driven surprises.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>Computed Lists in MiniScript 2</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Wed, 24 Jun 2026 22:39:19 +0000</pubDate>
      <link>https://dev.to/joestrout/computed-lists-in-miniscript-2-j4</link>
      <guid>https://dev.to/joestrout/computed-lists-in-miniscript-2-j4</guid>
      <description>&lt;p&gt;Progress on MiniScript 2 has been rapid lately, and it's now in the "final polish" stage.  Today that included adding a cool new feature, an optimization that many users will never consciously notice, but which will be quietly improving things in almost every MiniScript program.  This feature is &lt;em&gt;computed lists.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Computed What, Now?
&lt;/h2&gt;

&lt;p&gt;Here's the issue we set out to solve: a &lt;code&gt;for&lt;/code&gt; loop in MiniScript must iterate over a list, string, or map; and very often, that's a list that comes from the &lt;code&gt;range&lt;/code&gt; function.  Here's a typical example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nb"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;range&lt;/code&gt; function, until today, would allocate a million-and-one-element list and store the numbers from 1 million down to zero in it, just so we can assign each number to &lt;code&gt;i&lt;/code&gt; in turn.  And then it would release that list, to be garbage collected at some point.  This is a lot of extra work that we really didn't need to do.  Instead of storing all those numbers, we could instead just store the information we need to compute any element on demand.  This saves a ton of allocation and deallocation, and in many cases (like when you bail out of your loop early) it saves computation too.&lt;/p&gt;

&lt;p&gt;Python faced the same problem, and chose (starting with Python 3.0) to make &lt;code&gt;range&lt;/code&gt; return an &lt;em&gt;iterable&lt;/em&gt; rather than a list.  That's fine for cases like the above, but in cases where you actually needed a list, you have to cast it through the &lt;code&gt;list()&lt;/code&gt; function to get one.  This is a gotcha that everybody trips over initially, and just extra noise in the code even once you're used to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Solution: Computed List
&lt;/h2&gt;

&lt;p&gt;For MiniScript 2, we have chosen a different solution: a list may, under the hood, be a &lt;em&gt;computed&lt;/em&gt; list.  Rather than storing individual values, a computed list stores just three: the base, the step, and the count.  But unlike Python, this is completely transparent to your code; it is still a real list, and may be used exactly like any other list.&lt;/p&gt;

&lt;p&gt;So now when you run the code above in MiniScript 2, it no longer allocates and precomputes over a million elements.  Instead it allocates space for just 3 elements.  But it &lt;em&gt;acts&lt;/em&gt; like it has a million and one elements, in every way (unless you use the &lt;code&gt;info&lt;/code&gt; intrinsic to peek at its &lt;em&gt;computed&lt;/em&gt; flag).&lt;/p&gt;

&lt;p&gt;You get such a computed list, currently, in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;range&lt;/code&gt; function always returns a computed list.&lt;/li&gt;
&lt;li&gt;List replication, i.e. &lt;code&gt;[x] * n&lt;/code&gt;, returns a computed list if &lt;code&gt;x&lt;/code&gt; is any immutable value and &lt;code&gt;n&lt;/code&gt; is an integer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Stays Computed
&lt;/h2&gt;

&lt;p&gt;There are lots of things you can do with a computed list that leave the list in computed form, and just calculate the answer (very quickly).  If &lt;code&gt;foo&lt;/code&gt; is such a list, then all of these work directly on the computed data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;foo.len&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foo[i]&lt;/code&gt; for any index &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foo[i:j]&lt;/code&gt; slicing from &lt;code&gt;i&lt;/code&gt; up to &lt;code&gt;j&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foo.pop&lt;/code&gt; (yes, it mutates the computed list!)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foo.sum&lt;/code&gt; and other non-mutating intrinsics&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;freeze foo&lt;/code&gt; (making it into a &lt;em&gt;frozen&lt;/em&gt; computed list)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That loop above could have been written as simply &lt;code&gt;range(1000000).sum&lt;/code&gt;, and it very quickly computes the right answer, without ever allocating a million-element list.&lt;/p&gt;

&lt;h2&gt;
  
  
  When It Can't Stay Computed
&lt;/h2&gt;

&lt;p&gt;However, unless you freeze the list, it's still a mutable object and you can change its contents.  This generally requires "materializing" the list, i.e., at this point MiniScript goes ahead and allocates as much space as needed to hold all the values.  (The exception to this rule is &lt;code&gt;pop&lt;/code&gt;, which keeps it computed and merely reduces the count.)  So, any of these operations will materialize the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;foo.push x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo.remove i&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo.insert i, x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo[i] = x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foo.sort&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point you lose the benefit of having a computed list, but that's OK.  You're no worse off than we were yesterday, when we didn't have computed lists at all.  And critically, &lt;em&gt;you don't have to think about this.&lt;/em&gt;  You ask for a list, you get a list, MiniScript keeps it computed when it can and materializes it when it must.  Everything just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;We built some benchmarks to measure code that relies heavily on big lists without mutating them, as well as code that does need to mutate them (and so can't take advantage of computed lists).  This new feature brought about a 100X speedup in the first case, and had no measurable impact on the second.&lt;/p&gt;

&lt;p&gt;Of course the improvement will depend greatly on the details of what the code is doing, but the key point is, as expected, this is an overall win.  Not only do we avoid allocating and deallocating big hunks of RAM, but also a computed list (which is only 3 elements) fits comfortably into all levels of the memory cache hierarchy, unlike bigger lists.  Cache misses are a major bottleneck in a lot of compute-heavy code, so this optimization wins both ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  Life is Good
&lt;/h2&gt;

&lt;p&gt;I'm proud of this solution because it gives us enormous benefits in cases that were needlessly slow before, but doesn't require the user to learn or remember anything new.  I mean, I just told you all about it, but that was for sheer "Gee Whiz"-ism — nobody &lt;em&gt;needs&lt;/em&gt; to understand what you now know!&lt;/p&gt;

&lt;p&gt;And it does all this in a way that is relatively simple and didn't require a ton of new code under the hood, either.&lt;/p&gt;

&lt;p&gt;This new feature will ship with MiniScript 2 Preview 6 (probably tomorrow).  If you use &lt;a href="https://miniscript.org/cmdline/" rel="noopener noreferrer"&gt;command-line MiniScript&lt;/a&gt;, or would like to, keep your eye on the &lt;a href="https://github.com/JoeStrout/miniscript2/releases/" rel="noopener noreferrer"&gt;releases&lt;/a&gt; page, and give it a try!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>programming</category>
      <category>performance</category>
      <category>news</category>
    </item>
    <item>
      <title>Announcing MiniScript 2 Preview Builds!</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Thu, 18 Jun 2026 00:03:03 +0000</pubDate>
      <link>https://dev.to/joestrout/announcing-miniscript-2-preview-builds-2p40</link>
      <guid>https://dev.to/joestrout/announcing-miniscript-2-preview-builds-2p40</guid>
      <description>&lt;p&gt;As announced in our &lt;a href="https://dev.to/joestrout/miniscript-road-map-for-2026-17mh"&gt;MiniScript Road Map for 2026&lt;/a&gt;, the big push this year is working on &lt;strong&gt;MiniScript version 2.0&lt;/strong&gt;.  This first major update to the MiniScript language will be substantially faster than MiniScript 1.x, and include some important new language features too.&lt;/p&gt;

&lt;p&gt;I'm pleased to say it's going very well -- we have MiniScript 2 written in both C# and C++ now (in a more clever way than before), and it's right on schedule, or even ahead.&lt;/p&gt;

&lt;p&gt;If you are impatient and want to download MiniScript 2 immediately, please do!  You can find the latest releases &lt;a href="https://github.com/JoeStrout/miniscript2/releases" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved REPL
&lt;/h2&gt;

&lt;p&gt;The first thing you'll notice when you run MiniScript 2 interactively (i.e., without giving it a script to run) is a much fancier user experience in the REPL (read-eval-print 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%2Fqgswp3m61zmq2n23w38i.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%2Fqgswp3m61zmq2n23w38i.png" alt="Screen shot of MiniScript 2.0 preview 4" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two main differences from the 1.x REPL:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Every input goes onto an &lt;code&gt;_in&lt;/code&gt; list (as a string); every result goes onto an &lt;code&gt;_out&lt;/code&gt; list (as whatever data type the result was). You can refer to these in your code, which is often quite convenient when you want to build on a previous result, write the whole input history out to a file, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Terminal control codes are used to display less-relevant text (like the initial version info and input/output labels) in subdued text, your inputs as ordinary text, and outputs as bold text.  This helps you focus on the most important info (and is also quite pretty!).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  New &lt;code&gt;error&lt;/code&gt; Data Type
&lt;/h2&gt;

&lt;p&gt;Error handling in MiniScript 1.x was rather weak; mostly it involved functions returning something unexpected when things went wrong, like &lt;code&gt;null&lt;/code&gt; or a string error message instead of the usual result map.&lt;/p&gt;

&lt;p&gt;After a lot of community discussion (and yes, we &lt;em&gt;did&lt;/em&gt; consider exceptions and try/catch), we settled on an approach to error handling that I think is very elegant.  There is a new &lt;code&gt;error&lt;/code&gt; data type, equal in status to &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, etc.  Error values have some special behaviors: trying to &lt;em&gt;use&lt;/em&gt; an error value in almost any way will terminate your program, but you can inspect it to see what the error is, where in the code it occurred, etc.&lt;/p&gt;

&lt;p&gt;Read more about this (and other features) in the &lt;a href="https://github.com/JoeStrout/miniscript2/blob/main/notes/LANGUAGE_CHANGES.md" rel="noopener noreferrer"&gt;Language Changes doc&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frozen Maps &amp;amp; Lists
&lt;/h2&gt;

&lt;p&gt;Another language enhancement in 2.0 is &lt;em&gt;frozen lists and maps&lt;/em&gt;.  Lists and maps are normally "mutable," which means they can be changed in place; if you have two references to the same list, and you change the list via one of them, you see the change in the other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; _in[17]: a = [1,2,3]

 _in[18]: b = a

 _in[19]: a[0] = 999

 _in[20]: b
_out[20]: [999, 2, 3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is often exactly what you want.  But sometimes you want to build a list or map that &lt;em&gt;can't&lt;/em&gt; be changed; i.e. is "immutable".  In Python, they have a whole other data type for an immutable list (the "tuple"), with different syntax, just for this purpose.&lt;/p&gt;

&lt;p&gt;In MiniScript 2, you can instead &lt;em&gt;freeze&lt;/em&gt; a list or map.  A frozen list or map is immutable and can't be changed.  Some intrinsic APIs return frozen maps now, like &lt;code&gt;version&lt;/code&gt; for example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; _in[21]: version 
_out[21]: {"miniscript": "2.0", "buildDate": "2026-06-17", "platform": 
"macOS 13.6.4", "host": "2.0 Preview", "hostName": "Command-Line (Unix)", 
"hostInfo": "https://miniscript.org/cmdline/"}

 _in[22]: version.host = "2.1"
Runtime Error: Attempt to modify a frozen map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MiniScript will also use a frozen copy of a list or map when you use it as a map key, since mutating a map key is very bad juju.&lt;/p&gt;

&lt;p&gt;This is one of those refinements that new users probably won't even notice, but for serious MiniScript users, it will save a lot of headaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Function Notes &amp;amp; &lt;code&gt;info&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Another nifty new feature of MiniScript two is &lt;em&gt;function notes&lt;/em&gt;.  If the first statement in a function evaluates to a constant string, then this string is stored on the function, and can be accessed via the new &lt;code&gt;info&lt;/code&gt; intrinsic, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; _in[4]: f = function(x,y)
    ...:   "Return the magnitude of vector x,y"
    ...:   return sqrt(x^2 + y^2)
    ...:   end function

 _in[7]: info(@f)
_out[7]: {"type": "funcRef", "name": "f", "note": "Return the magnitude 
of vector x,y", "params": [{"name": "x", "default": null}, {"name": "y", 
"default": null}], "closure": 1}

 _in[10]: info(@f).note
_out[10]: Return the magnitude of vector x,y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides a standard, convenient place to give a little hint or reminder to users about what the function does.  (Note to self: I'll need to go through all the &lt;a href="https://github.com/JoeStrout/minimicro-sysdisk" rel="noopener noreferrer"&gt;/sys disk&lt;/a&gt; modules and add function notes!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Performance
&lt;/h2&gt;

&lt;p&gt;I already discussed performance in our &lt;a href="https://dev.to/joestrout/miniscript-roadmap-update-march-2026-41a4"&gt;March update&lt;/a&gt;, so I won't repeat that here.  Suffice to say, MiniScript 2.0 is many times faster than 1.x, comparable to Python, and we still have plenty of opportunities for pushing it further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Right On Track
&lt;/h2&gt;

&lt;p&gt;The schedule from December laid out these milestones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026 Q1&lt;/td&gt;
&lt;td&gt;MS2 compiles &amp;amp; runs a subset of MiniScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 Q2&lt;/td&gt;
&lt;td&gt;MS2 feature complete (whole language implemented)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 Q3&lt;/td&gt;
&lt;td&gt;MS2 testing, refinement, &amp;amp; polish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 Q4&lt;/td&gt;
&lt;td&gt;MS2 released 🥳&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We're at the end of Q2 now, and the first two steps above are done.  A lot of stuff in the "testing, refinement, &amp;amp; polish" category has already been done too (for example, the terminal colors/styles and in/out value lists in the REPL).  So we're actually a little ahead of schedule.  It's time now for some serious testing -- but we're also going to start in on Raylib bindings within the next month, which wasn't expected until Q2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Please Help!
&lt;/h2&gt;

&lt;p&gt;Did I mention that it's now &lt;strong&gt;time for some serious testing&lt;/strong&gt;?  That means you!  I will do what I can, but I can't do it all by myself.&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%2Fms0pe00ve7j9pl25gaaa.gif" 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%2Fms0pe00ve7j9pl25gaaa.gif" alt="That's why it's got to be you!" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Indeed, we wouldn't be where we are today without some very helpful testing of Windows and Linux builds by Discord users BibleClinger, minerobber, shellrider, and MoTrix -- thanks guys!)&lt;/p&gt;

&lt;p&gt;So please download the preview release for your platform, and take it for a spin.  Throw some of your older scripts at it.  Write some new scripts.  Explore the &lt;a href="https://github.com/JoeStrout/miniscript2/blob/main/notes/LANGUAGE_CHANGES.md" rel="noopener noreferrer"&gt;new language features&lt;/a&gt;.  Try to break it!  This is a large amount of brand new code, much of it quite complex, so there are almost certainly bugs to be found.&lt;/p&gt;

&lt;p&gt;When you find a problem, either bring it up on &lt;a href="https://discord.gg/7s6zajx" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; (in the &lt;strong&gt;#miniscript-2&lt;/strong&gt; channel), or file an issue &lt;a href="https://github.com/JoeStrout/miniscript2/issues" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;.  Do the same if you have some suggestion or feature request -- we're &lt;em&gt;mostly&lt;/em&gt; feature-frozen at this point, but it's not too late for small refinements, especially if they bring important quality-of-life improvements.&lt;/p&gt;

&lt;p&gt;I hope you're excited as I am for this major milestone.  MiniScript 2 unlocks all the other cool stuff in the &lt;a href="https://dev.to/joestrout/miniscript-road-map-for-2026-17mh"&gt;Road Map&lt;/a&gt;.  Let's go!!&lt;/p&gt;

</description>
      <category>miniscript</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>devops</category>
    </item>
    <item>
      <title>MiniScript Weekly News — June 05, 2026</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Fri, 05 Jun 2026 18:12:46 +0000</pubDate>
      <link>https://dev.to/joestrout/miniscript-weekly-news-june-05-2026-1l0d</link>
      <guid>https://dev.to/joestrout/miniscript-weekly-news-june-05-2026-1l0d</guid>
      <description>&lt;h2&gt;
  
  
  Development Updates
&lt;/h2&gt;

&lt;p&gt;MiniScript 2 kept moving forward this week with a solid round of cleanup and polish. The dev log mentions Unicode improvements, faster string handling, O(1) intrinsic lookup, a &lt;code&gt;!help&lt;/code&gt; metacommand for the REPL, and a few opcode / naming cleanups to make the internals more consistent.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev log: &lt;a href="https://github.com/JoeStrout/miniscript2" rel="noopener noreferrer"&gt;JoeStrout/miniscript2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was also useful progress on cross-platform builds. After some back-and-forth with compiler quirks, the project is now building on more than one platform, and Joe is weighing the best Windows strategy going forward: MSVC, MinGW-w64, or potentially clang-cl.  &lt;/p&gt;

&lt;p&gt;The Mini Micro sysdisk also got a nice little refactor. The LCARS demo now has its app modules split into &lt;code&gt;/sys/lcarsApps&lt;/code&gt;, and the new structure can also load modules from &lt;code&gt;/usr/lcarsApps&lt;/code&gt;, opening the door for community-made add-ons.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit: &lt;a href="https://github.com/JoeStrout/minimicro-sysdisk/commit/9fdc95a" rel="noopener noreferrer"&gt;Extract LCARS app modules into sys/lcarsApps&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community Projects
&lt;/h2&gt;

&lt;p&gt;Trey Tomes has been building a Mini Micro SVG experiment, and it’s looking really fun. He shared parser and renderer work for circles, colors, and XML handling, along with a constellation-style SVG demo — a great example of diving into a new graphics idea in MiniScript.&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%2Fl2z0yvhc2wtjlm8lh7fu.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%2Fl2z0yvhc2wtjlm8lh7fu.png" alt="Screenshot of SVG renderer in action" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parser: &lt;a href="https://github.com/treytomes/micro-svg/blob/main/parseSvgColor.ms" rel="noopener noreferrer"&gt;parseSvgColor.ms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;XML helper: &lt;a href="https://github.com/treytomes/micro-svg/blob/main/xml.ms" rel="noopener noreferrer"&gt;xml.ms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Renderer: &lt;a href="https://github.com/treytomes/micro-svg/blob/main/render.ms" rel="noopener noreferrer"&gt;render.ms&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also saw a new MiniScript-powered game called &lt;em&gt;Touhou Creator&lt;/em&gt; on Steam, which is exciting news for the ecosystem. Huge congrats to hachimi for sharing it — always wonderful to see MiniScript reaching a broader audience.&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%2Fe25a7jd0p5gynqgkrfzx.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%2Fe25a7jd0p5gynqgkrfzx.png" alt="Screenshot of Touhou Creator" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steam link: &lt;a href="https://store.steampowered.com/app/4191130/_/" rel="noopener noreferrer"&gt;Store page&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community &amp;amp; Discussion Highlights
&lt;/h2&gt;

&lt;p&gt;A few newcomers stopped by looking for tutorials and next steps, and the community had some good recommendations ready. Joe pointed people toward the Mini Micro getting-started guide, the intro-to-programming resource, and the language try-it page, while also reminding everyone that MiniScript is best learned by doing.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://miniscript.org/wiki/How_to_get_started_with_Mini_Micro" rel="noopener noreferrer"&gt;How to get started with Mini Micro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://introtocomputerprogramming.online/#cover" rel="noopener noreferrer"&gt;Intro to Computer Programming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://miniscript.org/tryit/" rel="noopener noreferrer"&gt;Try-It!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was also some useful discussion around tooling and distribution. People talked about a potential Lutris runner for Mini Micro on Linux, and Joe clarified that a Mini Micro mobile version is still on the roadmap, just not ready yet.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Roadmap update: &lt;a href="https://dev.to/joestrout/miniscript-roadmap-update-march-2026-41a4"&gt;MiniScript roadmap update — March 2026&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Events &amp;amp; Outreach
&lt;/h2&gt;

&lt;p&gt;A new Micro Jam was announced with an ANIMALS theme, which sounds like a great excuse to explore Mini Micro’s built-in sprite resources. If you’ve been waiting for a gentle prompt to make something small and playful, this is a lovely one.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jam: &lt;a href="https://itch.io/jam/micro-jam-059" rel="noopener noreferrer"&gt;Micro Jam #059 — ANIMALS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the outreach side, Dat_One_Dev reported encouraging movement on getting Mini Micro covered by GameFromScratch. It’s always great to see community members helping spread the word beyond our usual circles.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Channel: &lt;a href="https://youtube.com/@gamefromscratch?si=sTPFK_Di_zZm6m8u" rel="noopener noreferrer"&gt;GameFromScratch on YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it for this week — thanks to everyone building, testing, sharing, and welcoming new folks. See you next week!&lt;/p&gt;

&lt;h2&gt;
  
  
  Upcoming Game Jams
&lt;/h2&gt;

&lt;p&gt;These upcoming jams look like a great fit for Mini Micro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/slop-jam-2-electric-boogaloo" rel="noopener noreferrer"&gt;Slop Jam 2: Electric Boogaloo&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-12 22:00:00) — An anything-goes, low-pressure jam with no engine restrictions and a theme revealed at the start, making it a great place to whip up a quirky 2D, pixel, or text-based game over a weekend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/the-demo" rel="noopener noreferrer"&gt;The Demo Jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-07 23:00:00) — A strong fit for a retro-style, bite-sized vertical slice with lots of room for polished presentation, teaser content, and playful demo-only limitations like locked features or a mock ‘full version’ hook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/turtley-in-love-pride-2026" rel="noopener noreferrer"&gt;Turtley in Love - Pride 2026&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-12 20:00:00) — A one-week Pride-themed jam with a cozy, celebratory vibe and an open theme makes this a great chance to create something heartfelt, playful, and approachable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/district-jam-7" rel="noopener noreferrer"&gt;District Jam VII&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-12 23:00:00) — A relaxed, short-form jam with any engine allowed and no technical constraints, making it an excellent chance to build a pixel-art, tile-based, or text-driven game in a friendly community setting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/tiny-game-big-twist-jam" rel="noopener noreferrer"&gt;Tiny Game, Big Twist Jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-08 11:00:00) — A 3-day jam built around small, surprising games with a meaningful twist, leaving lots of room for clever mechanics, experimental storytelling, and memorable genre shifts.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>news</category>
      <category>programming</category>
    </item>
    <item>
      <title>MiniScript Weekly News — May 27, 2026</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Thu, 28 May 2026 02:05:15 +0000</pubDate>
      <link>https://dev.to/joestrout/miniscript-weekly-news-may-27-2026-5570</link>
      <guid>https://dev.to/joestrout/miniscript-weekly-news-may-27-2026-5570</guid>
      <description>&lt;h2&gt;
  
  
  Development Updates
&lt;/h2&gt;

&lt;p&gt;The MiniScript 2 work continues to move forward at a brisk pace. Joe’s latest dev log shows major progress on shell intrinsics like &lt;code&gt;file&lt;/code&gt; and &lt;code&gt;import&lt;/code&gt;, plus support for &lt;code&gt;RawData&lt;/code&gt; and &lt;code&gt;GCHandle&lt;/code&gt;, while also tightening up compiler behavior around globals, &lt;code&gt;super&lt;/code&gt;, short-circuiting, and error handling. The recent commit trail is especially busy, with fixes for function storage, variable naming in conditionals, and a cleanup to remove &lt;code&gt;extern "C"&lt;/code&gt; from &lt;code&gt;CS_value_util.h&lt;/code&gt; for better compiler compatibility.&lt;/p&gt;

&lt;p&gt;There’s also been a healthy round of real-world testing against existing demos and code. In particular, &lt;code&gt;superstartrek&lt;/code&gt; has been a great stress test for edge cases, helping uncover and resolve a cluster of bugs that made the system stronger overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Projects
&lt;/h2&gt;

&lt;p&gt;A quick update from &lt;strong&gt;Redspark&lt;/strong&gt; on &lt;em&gt;Emberfall&lt;/em&gt;: the engine has nearly been converted to Raylib-MiniScript, and work is underway on the 3D renderer. That’s the kind of behind-the-scenes momentum that makes a future show-and-tell post especially exciting.&lt;/p&gt;

&lt;p&gt;A big shout-out to everyone helping push &lt;strong&gt;MiniScript 2&lt;/strong&gt; across different platforms. &lt;strong&gt;MoTrix&lt;/strong&gt; and &lt;strong&gt;minerobber&lt;/strong&gt; have both been digging into build issues, with fixes and PRs emerging for Linux, Ubuntu, and Windows/MSVC compatibility — a fantastic example of community-powered portability work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discussion Highlights
&lt;/h2&gt;

&lt;p&gt;The community had a lively discussion about decorators and argument unpacking in MiniScript. Joe floated the idea of a “decorators in MiniScript” article, and the conversation turned into a practical look at wrappers, &lt;code&gt;apply&lt;/code&gt;-style functions, and how argument packing/unpacking might work without too much syntactic sugar.&lt;/p&gt;

&lt;p&gt;Mini Micro users also weighed in on documentation ideas, with suggestions ranging from a “Getting Started” guide to a whimsical 1980s-style manual for the virtual computer. Separately, Joe is exploring hardware possibilities for a future “hardware Mini Micro” setup, including Intel N100 mini-PCs and Orange Pi options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Notes
&lt;/h2&gt;

&lt;p&gt;Welcome to all the new folks joining the server this week! It’s always nice to see more people arriving with game-dev ideas, curiosity about MiniScript, and interest in helping shape what comes next.&lt;/p&gt;

&lt;p&gt;There were also some fun project ideas in the mix, including a sci-fi cloaked-ship combat game and even a tongue-in-cheek dystopian tale about the “Spacers” versus the “Tabbers.” That kind of playful creativity is exactly what makes the MiniScript community so enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Around the Community
&lt;/h2&gt;

&lt;p&gt;Joe also shared a fun new mini-project on DEV: &lt;a href="https://dev.to/joestrout/where-in-the-world-am-i-53bo"&gt;Where in the World Am I?&lt;/a&gt;. It shows how to use web services and simple 3D rendering to pinpoint your location on a rotating globe.&lt;/p&gt;

&lt;p&gt;And on the Mini Micro side, Joe’s been thinking about future documentation and accessibility features, including possible TTS/STT support for Mini Micro 2. A promising model was shared here: &lt;a href="https://github.com/supertone-inc/supertonic" rel="noopener noreferrer"&gt;Supertonic&lt;/a&gt;, with voice samples at &lt;a href="https://supertone-inc.github.io/supertonic-py/voices/" rel="noopener noreferrer"&gt;supertone-inc.github.io/supertonic-py/voices&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for reading — happy scripting, and keep sharing what you’re building!&lt;/p&gt;

&lt;h2&gt;
  
  
  Upcoming Game Jams
&lt;/h2&gt;

&lt;p&gt;These upcoming jams look like a great fit for Mini Micro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/you-can-play-this-game-jam" rel="noopener noreferrer"&gt;YOU CAN PLAY THIS GAME JAM&lt;/a&gt;&lt;/strong&gt; (starts 2026-05-30 04:00:00) — A highly accessible, beginner-friendly jam centered on pitching great ideas and designing for inclusivity, with no requirement to build a full playable prototype.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/smilejam" rel="noopener noreferrer"&gt;smilejam&lt;/a&gt;&lt;/strong&gt; (starts 2026-05-17 23:00:00) — A perfect match for quick, intimate, experimental games: short playable pieces, strong mood, prose, collage, and low-pressure creativity all line up beautifully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/cgdct-jam-2026" rel="noopener noreferrer"&gt;Cute Girls Doing Cool Things VN Jam 2026&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-01 04:00:00) — A strong fit for a story-first project: the jam’s visual novel focus, cute-character premise, and summer-blockbuster energy all lend themselves to expressive 2D scenes, branching dialogue, and stylish presentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/never-joined-a-game-jam-game-jam" rel="noopener noreferrer"&gt;Never Joined A Game Jam Game Jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-05-29 14:00:00) — A beginner-friendly, no-theme jam focused on learning by doing, with plenty of room for a straightforward top-down shooter, simple UI, scoring, and extra polish like particles or enemy variants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/trijam-374" rel="noopener noreferrer"&gt;Trijam #374: The 3 hour game jam&lt;/a&gt;&lt;/strong&gt; (starts 2026-05-28 21:00:00) — A fast, friendly jam built around making something fun in just 3 hours, with flexible rules, room for pre-made assets, and an emphasis on simple, playable ideas that are perfect for quick 2D projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://itch.io/jam/romance-game-jam-01" rel="noopener noreferrer"&gt;Romance Game Jam #01&lt;/a&gt;&lt;/strong&gt; (starts 2026-06-01 06:00:00) — A very welcoming romance-focused jam with a four-week window, no voting pressure, and plenty of room for anything from sweet SFW stories to weird, esoteric love games.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>Where in the World Am I?</title>
      <dc:creator>JoeStrout</dc:creator>
      <pubDate>Wed, 20 May 2026 23:09:33 +0000</pubDate>
      <link>https://dev.to/joestrout/where-in-the-world-am-i-53bo</link>
      <guid>https://dev.to/joestrout/where-in-the-world-am-i-53bo</guid>
      <description>&lt;p&gt;There are so many fun things you can do with web services, and most of them are trivial to use in &lt;a href="https://miniscript.org/MiniMicro" rel="noopener noreferrer"&gt;Mini Micro&lt;/a&gt;.  Today, let's use a couple of these together to plot your location on a map of the world!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Your Place In the World
&lt;/h2&gt;

&lt;p&gt;...begins by finding your &lt;em&gt;external (or public) IP address&lt;/em&gt;.  This is the Internet Protocol address by which you are seen on the internet, outside your local network.  It's probably different from your &lt;em&gt;internal&lt;/em&gt; (or private) IP address, which is what probably appears when you look at the network settings on your computer.  We don't care how your computer is known to other computers in your house or neighborhood; we only care how packets are routed to it from the great wide world beyond.  Fire up Mini Micro (available free &lt;a href="https://miniscript.org/MiniMicro/#download" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http.get("https://api.ipify.org")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should return an IP address, something like &lt;code&gt;66.212.203.27&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, to get information about that IP address, including the city it's in and an approximate latitude/longitude, we'll use a different web service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http.get("http://ip-api.com/json/66.212.203.27")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can replace the IP address above with whatever you got from the first query.  The result will be a string of JSON code that contains your city, region, country, latitude, and longitude, along with the name of your internet service provider (ISP) and other details.&lt;/p&gt;

&lt;p&gt;Putting this all together into a little program.  Use &lt;code&gt;edit&lt;/code&gt; to enter the code editor, then paste in the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "json"
import "stringUtil"
clear

// What's my external IP address?
myIP = http.get("https://api.ipify.org")

// And where am I?
locJson = http.get("http://ip-api.com/json/" + myIP)
locInfo = json.parse(locJson)

pprint locInfo
print "You are in {city}, {region} ({country})".fill(locInfo)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this, and it should tell you where you are (along with all those other details).  Neat, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Tell Me, Show Me!
&lt;/h2&gt;

&lt;p&gt;But we can make it more fun.  Let's pinpoint you on a map of the Earth!  &lt;code&gt;edit&lt;/code&gt; your program again, delete the last two lines (&lt;code&gt;pprint&lt;/code&gt; and &lt;code&gt;print&lt;/code&gt;), and add in this additional code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mapImage = file.loadImage("/sys/pics/earth_day.jpg")

// Find the pixel coordinates of our lat/long in this image
px = (locInfo.lon + 180) / 360 * mapImage.width
py = mapImage.height - (90 - locInfo.lat) / 180 * mapImage.height

// Draw a marker (using an offscreen PixelDisplay)
g = new PixelDisplay
g.clear color.black, mapImage.width, mapImage.height
g.drawImage mapImage
g.line 0, py, g.width, py, "#00FFFF88", 3
g.line px, 0, px, g.height, "#00FFFF88", 3
g.fillEllipse px-10, py-10, 20, 20, "#00FFFFFF"
g.drawEllipse px-15, py-15, 30, 30, "#00FFFFAA"
g.drawEllipse px-20, py-20, 40, 40, "#00FFFF88"
markedMap = g.getImage(0, 0, g.width, g.height)

// And draw the mapImage, fit to the screen!
scale = 960/mapImage.width
gfx.drawImage markedMap,
  480 - mapImage.width*scale/2, 320 - mapImage.height*scale/2,
  mapImage.width*scale, mapImage.height*scale

s = "{city}, {region}, ({countryCode})".fill(locInfo)
text.row = 2
text.column = 34 - s.len/2
print s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result, if you happen to be my neighbor right now, should look like this:&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%2Fcfvyunv5oihji1vifsop.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%2Fcfvyunv5oihji1vifsop.png" alt="World map with Tucson pinpointed" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trick here is knowing that the map image uses a standard &lt;strong&gt;equiprectangular projection&lt;/strong&gt;, where longitude and latitude both map linearly to x and y.  That lets us convert from lat/long to pixel coordinates with some reasonably simple math.  Most of the code above is then drawing the pinpoint lines and circles on top of the map.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: if you are reading this in the future and live somewhere other than Earth, this code will need adjustment.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Now in Animated 3D!
&lt;/h2&gt;

&lt;p&gt;Let's take it one step further: combine what you've done so far with the &lt;code&gt;globe&lt;/code&gt; demo!  Follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save your program, if you haven't already.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edit "/sys/demo/globe"&lt;/code&gt; to load the globe demo code.&lt;/li&gt;
&lt;li&gt;Select All (&lt;code&gt;^A&lt;/code&gt;) and then Copy (&lt;code&gt;^C&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Exit the editor, then edit your program.&lt;/li&gt;
&lt;li&gt;Scroll to the bottom, and Paste (&lt;code&gt;^V&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Find the line (at the top of the pasted code) that says &lt;code&gt;bigMapImg = file.loadImage("/sys/pics/earth_day.jpg")&lt;/code&gt;, and change it to just say &lt;code&gt;bigMapImg = markedMap&lt;/code&gt; instead.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it.  Now run your program, and you should see your location on a beautiful rotating globe.&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%2F7rai0o20jhny387el2n1.gif" 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%2F7rai0o20jhny387el2n1.gif" alt="Globe animation with Tucson pinpointed" width="434" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Never Be Lost Again
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;http&lt;/code&gt; module is an often-overlooked gem in the Mini Micro APIs.  With one little call we can get our external IP address, and with a second little call, get all sorts of information about that, including the info we need to place ourselves on a map.  We also looked at how you are able — nay, &lt;em&gt;encouraged!&lt;/em&gt; — to steal from the demo code and make it your own.&lt;/p&gt;

&lt;p&gt;What do you think of this?  Let me know in the comments below!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>miniscript</category>
      <category>minimicro</category>
      <category>geolocation</category>
    </item>
  </channel>
</rss>
