{"id":3965,"date":"2026-04-20T09:29:15","date_gmt":"2026-04-20T13:29:15","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3965"},"modified":"2026-04-20T09:29:19","modified_gmt":"2026-04-20T13:29:19","slug":"bringing-worlds-to-life-integrating-ai-personas-in-multi-user-dungeons-muds","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/angular\/bringing-worlds-to-life-integrating-ai-personas-in-multi-user-dungeons-muds\/","title":{"rendered":"Bringing Worlds to Life: Integrating AI Personas in Multi-User Dungeons (MUDs)"},"content":{"rendered":"\n<p>A few weeks ago, I found myself pondering the ultimate objective for an artificial intelligence system. The answer kept returning to a single concept: the ability to truly mimic a human. This spark of an idea gave rise to a challenge\u2014I needed a sandbox where I could work with AI and model human-like behavior in a structured, observable environment.<\/p>\n\n\n\n<p>My mind eventually drifted back to the Multi-User Dungeons (MUDs) I used to play. A MUD is essentially its own little world, contained and consistent. Having recently read <em>Dungeon Crawler Carl<\/em> by Matt Dinniman, the idea of a world managed by a complex (and sometimes erratic) AI likely primed my brain for this specific path. It was then that the realization hit me: why try to force a single AI instance to appear human when I could build a system where one AI could interact as potentially hundreds of different, distinct personalities?<\/p>\n\n\n\n<p>A MUD is the perfect sandbox for this endeavor. By its very nature, it provides the exact hooks needed for complex personas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Emotes:<\/strong> Systems that allow NPCs to perform specific behaviors and physical actions.<\/li>\n\n\n\n<li><strong>Faction Systems:<\/strong> Logic that dictates whether an NPC loves you, hates you, or simply doesn&#8217;t care, providing an emotional baseline for interaction.<\/li>\n\n\n\n<li><strong>Communication:<\/strong> A robust chat system for natural language speaking.<\/li>\n<\/ul>\n\n\n\n<p>I decided I would need to build this from the ground up. I chose to &#8220;VIBE Code&#8221; the project\u2014a process of rapid, intuitive development that I\u2019ll cover in detail in my next article. The result is <strong>AIMUD<\/strong>, a world built with Java, Angular, and Spring, powered by the critical integration of Spring AI talking to a local Ollama server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Dual Faces of AI Agency in AIMUD<\/h2>\n\n\n\n<p>In designing AIMUD, I realized that for a world to feel truly alive, AI needs to exist in two distinct capacities: as a resident of the world and as a creator of the world. This led to the development of two primary AI interfaces.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. The Observational Interface: NPCs as Living Inhabitants<\/h3>\n\n\n\n<p>The first interface is embedded within the NPCs (or &#8220;mobiles&#8221;) themselves. These agents use Spring AI to process the stream of events happening around them.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dynamic AI Instructions:<\/strong> Every mobile is assigned instructions that govern its persona. A shopkeeper isn&#8217;t just a menu; they are a character who interprets your actions.<\/li>\n\n\n\n<li><strong>Contextual Awareness:<\/strong> NPCs perceive room descriptions, player lists, and world events. If you draw a sword in a peaceful tavern, the AI-driven NPCs respond immediately\u2014some with fear, others with a hand on their own hilt.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Dynamically Generated Prompts &amp; Skill Awareness<\/h4>\n\n\n\n<p>A key innovation in the Observational Interface is how prompts are dynamically constructed for each NPC. We don&#8217;t use a &#8220;one-size-fits-all&#8221; system prompt. Instead, the <code>AiService<\/code> builds a context-rich prompt tailored to that specific entity&#8217;s capabilities.<\/p>\n\n\n\n<p>When an event occurs, the system compiles:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The Core Persona:<\/strong> Their base instructions (e.g., &#8220;You are a grizzled veteran of the goblin wars&#8221;).<\/li>\n\n\n\n<li><strong>The Skill Registry:<\/strong> The system looks up the specific skills, spells, or songs that the NPC possesses.<\/li>\n\n\n\n<li><strong>Capability Injection:<\/strong> These skills are injected into the prompt, telling the AI exactly what &#8220;tools&#8221; it has at its disposal.<\/li>\n<\/ol>\n\n\n\n<p>For example, if an NPC is a Bard, the prompt dynamic generation includes their available <code>BardSong<\/code> annotations. The AI doesn&#8217;t just &#8220;know&#8221; it&#8217;s a Bard; it knows it can sing the <em>HpRegenSong<\/em> to help an ally or a <em>DiscordantStrike<\/em> to hinder an enemy. By surfacing these unique mechanics directly in the LLM&#8217;s system context, the NPC can make tactical decisions that are consistent with their class and stats, allowing for a much higher level of roleplay fidelity.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. The Constructive Interface: The AI Chat and MCP World Building<\/h3>\n\n\n\n<p>The second interface is a dedicated <strong>AI Chat<\/strong> designed for the &#8220;God-mode&#8221; sandbox experience. This is where the <strong>Model Context Protocol (MCP)<\/strong> becomes the star of the show. Instead of manually writing database entries or complex JSON files to build the world, you simply talk to the system.<\/p>\n\n\n\n<p>Through MCP, the LLM is granted direct access to the internal mechanisms of AIMUD. This allows for rapid, natural language creation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Room Creation:<\/strong> &#8220;Create a dark, damp cavern to the north with a dripping ceiling and the faint smell of sulfur.&#8221; The AI interprets this, invokes the <code>RoomService<\/code>, and builds the room according to the MUD&#8217;s schema.<\/li>\n\n\n\n<li><strong>NPC Generation:<\/strong> &#8220;Spawn a legendary dragon hunter named Kaelen who is weary of war but looking for one last quest.&#8221; The system doesn&#8217;t just create a character; it populates its persona instructions and stats automatically.<\/li>\n\n\n\n<li><strong>Item Forge:<\/strong> &#8220;Give me a legendary sword that glows with blue light and deals extra frost damage.&#8221; The AI uses MCP to interact with the <code>ItemService<\/code>, defining the item&#8217;s type, stats, and effects in real-time.<\/li>\n<\/ul>\n\n\n\n<p>This dual-interface approach means that while you are adjusting the &#8220;brains&#8221; of the NPCs, you are using another AI &#8220;brain&#8221; to build the very stage they stand upon.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Power of Java and Spring AI<\/h2>\n\n\n\n<p>As an architect designing a multi-user environment, the choice of tech stack was vital for both performance and AI integration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why Java?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stability and Performance:<\/strong> For an environment where hundreds of world events and AI requests happen simultaneously, Java\u2019s multi-threading capabilities and enterprise-grade stability are essential.<\/li>\n\n\n\n<li><strong>Object-Oriented Modeling:<\/strong> Java makes it easy to model complex game entities\u2014rooms, items, spells, and characters\u2014as clean, maintainable classes.<\/li>\n\n\n\n<li><strong>The Ecosystem:<\/strong> With Gradle for build management and the robust Spring framework, Java allows us to focus on game logic and AI personality rather than low-level plumbing.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Spring AI Advantage<\/h3>\n\n\n\n<p>Spring AI acts as the &#8220;connective tissue&#8221; between the MUD&#8217;s backend and modern LLMs.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ollama Integration:<\/strong> By utilizing Spring AI to connect to <strong>Ollama<\/strong>, AIMUD runs powerful models locally. This eliminates the latency and cost of cloud APIs, making real-time, high-frequency NPC interactions feasible.<\/li>\n\n\n\n<li><strong>Function Calling &amp; MCP:<\/strong> One of the most powerful features used in AIMUD is &#8220;tool calling.&#8221; Spring AI allows the LLM to trigger actual Java methods via MCP. Whether an NPC decides to &#8220;follow&#8221; a player or the AI Chat decides to &#8220;create&#8221; a new item, the AI generates the intent, and Spring AI maps it directly to the corresponding game mechanism.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The Ultimate Goal: The Indistinguishable World<\/h2>\n\n\n\n<p>What is the end goal of AIMUD? It is to create a digital world where the NPCs are <strong>indistinguishable from human-run players<\/strong>\u2014or at least, indistinguishable from players who are deeply roleplaying their characters.<\/p>\n\n\n\n<p>In classic MUDs, the best experiences came from interacting with players who were deep in roleplay. You didn&#8217;t just see &#8220;A Knight&#8221;; you saw a person with a history, a temperament, and a specific way of speaking. We are striving to reach a point where an AI-driven NPC behaves with that same level of depth and unpredictability.<\/p>\n\n\n\n<p>By mastering the art of the <strong>System Prompt<\/strong> and the <strong>Persona Instruction<\/strong>, we can move past simple scripted responses. We are building agents that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Roleplay with intent:<\/strong> They don&#8217;t just &#8220;talk&#8221;; they pursue personal goals, remember your past kindness (or cruelty), and react to the world with genuine consistency.<\/li>\n\n\n\n<li><strong>Maintain the &#8220;Fourth Wall&#8221;:<\/strong> They interact within the lore of the world, never breaking character unless the system dictates a god-mode interaction.<\/li>\n\n\n\n<li><strong>Bridge the &#8220;Uncanny Valley&#8221; of NPCs:<\/strong> When you enter a room and strike up a conversation with a wandering bard, the goal is for you to forget, even for a moment, that you are talking to a local Llama 3 instance.<\/li>\n<\/ul>\n\n\n\n<p>When we achieve this, the sandbox becomes more than a game\u2014it becomes a living simulation of society where the prompts are the DNA of a new kind of social interaction.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Looking Ahead: The Next Evolution of AIMUD<\/h2>\n\n\n\n<p>The foundation is built, but the horizon for AI in this sandbox is vast. As the project evolves, the focus shifts toward deeper immersion and technical refinement:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Live Prompt Tuning:<\/strong> We are working toward providing more granular, real-time control over the prompts governing the Observational Interface. This will allow for &#8220;hot-swapping&#8221; personality traits or behavioral logic without restarting the world.<\/li>\n\n\n\n<li><strong>Granular Personality Control:<\/strong> Beyond basic instructions, we intend to introduce more specific sliders for NPC traits\u2014aggression, greed, loyalty, and curiosity\u2014to ensure every mobile feels truly unique.<\/li>\n\n\n\n<li><strong>Knowledge Retrieval (RAG):<\/strong> To move beyond temporary interactions, NPCs need to &#8220;know&#8221; things. We are introducing knowledge retrieval systems so an NPC can remember historical world events, player reputations, or even their own personal backstory.<\/li>\n\n\n\n<li><strong>Dynamic Dialog Trees:<\/strong> Moving away from static responses, we are optimizing for more natural, branching conversations that can trigger actual world events or quests.<\/li>\n\n\n\n<li><strong>Speed Optimization:<\/strong> As the world grows, speed is paramount. We continue to optimize the integration between Spring AI and local model serving to ensure NPC reactions feel near-instant, maintaining the fast-paced &#8220;vibe&#8221; of a classic MUD.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The future of MUDs lies in agency and emergent storytelling. By combining the structured reliability of Java with the creative potential of Spring AI, MCP, and Ollama, AIMUD provides a unique environment for developers to master AI engineering. You are no longer just coding behaviors; you are narrating a living world into existence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Get Involved<\/h2>\n\n\n\n<p>If you&#8217;re interested in exploring the code, contributing, or setting up your own AI sandbox, you can find the project here:<\/p>\n\n\n\n<p><strong>Repository:<\/strong> <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\" target=\"_blank\" rel=\"noreferrer noopener\">Ghost-Programmer\/aimud<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"github-embed github-embed-repository github-logo-mark\">    <p>        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\" target=\"_blank\">\t\t\t<strong>\t\t\t\t\t\t\t<\/strong>\t\t<\/a>\t\t<br>        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\" target=\"_blank\">https:\/\/github.com\/Ghost-Programmer\/aimud<\/a><br>        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/network\" target=\"_blank\">0<\/a> forks.<br>        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/stargazers\" target=\"_blank\">0<\/a> stars.<br>        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/issues\" target=\"_blank\">0<\/a> open issues.<br>        <details open>            <summary>Recent commits:<\/summary>            <ul class=\"github_commits\">                                    <li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/commit\/09b60c6a61427233453c44bb533e23a1ca729077\" target=\"_blank\">feat: implement EffectService with caching and bulk item effect retrieval<\/a>, Jeff Miller                    <\/li>                                    <li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/commit\/18d92a3f99cf8d2618b43254fb27eee2046de7d8\" target=\"_blank\">feat: implement core MUD command and prayer system with character service integration<\/a>, Jeff Miller                    <\/li>                                    <li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/commit\/1ad765b0c72afc02c0aad81abaa270712cf4af13\" target=\"_blank\">docs: add player and admin dashboard documentation and update README references<\/a>, Jeff Miller                    <\/li>                                    <li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/commit\/2bd6d16c0546b119e08c7f7a59197aea11706744\" target=\"_blank\">feat: implement Race model and add character starting effects database support<\/a>, Jeff Miller                    <\/li>                                    <li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/Ghost-Programmer\/aimud\/commit\/eeaa50bd66c32b14f4f9ed45799cf02fbba9d3f2\" target=\"_blank\">feat: implement effect management services and optimize item effect lookups with bulk R2DBC queries<\/a>, Jeff Miller                    <\/li>                            <\/ul>        <\/details>    <\/p><\/div>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>A few weeks ago, I found myself pondering the ultimate objective for an artificial intelligence system. The answer kept returning to a single concept: the ability to truly mimic a human. This spark of an idea gave rise to a challenge\u2014I needed a sandbox where I could work with AI and model human-like behavior in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3966,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[281,443],"tags":[429,269,69,492,319],"series":[],"class_list":["post-3965","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular","category-spring_ai","tag-ai","tag-angular","tag-java-2","tag-mud","tag-spring"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_hsr3ethsr3ethsr3-scaled.avif","jetpack-related-posts":[{"id":3811,"url":"https:\/\/www.mymiller.name\/wordpress\/angular\/streamline-your-workflow-generate-angular-services-from-spring-boot-rest-apis-with-gradle\/","url_meta":{"origin":3965,"position":0},"title":"Streamline Your Workflow: Generate Angular Services from Spring Boot REST APIs with Gradle","author":"Jeffery Miller","date":"February 24, 2025","format":false,"excerpt":"Integrating your Angular frontend with a Spring Boot backend can be a breeze if you automate the process of creating your Angular services. This post will show you how to leverage Gradle, OpenAPI (Swagger), and the OpenAPI Generator to generate type-safe Angular TypeScript services directly from your Spring Boot REST\u2026","rel":"","context":"In &quot;Angular&quot;","block_context":{"text":"Angular","link":"https:\/\/www.mymiller.name\/wordpress\/category\/angular\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 3x"},"classes":[]},{"id":3893,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/building-intelligent-apps-with-spring-ai\/","url_meta":{"origin":3965,"position":1},"title":"Building Intelligent Apps with Spring AI","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"In today's fast-paced world of software development, integrating artificial intelligence into applications is no longer just a trend\u2014it's a necessity. At the heart of this revolution is Generative AI, a type of artificial intelligence that can create new content, such as text, images, and code, in response to prompts. It's\u2026","rel":"","context":"In &quot;Spring AI&quot;","block_context":{"text":"Spring AI","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_ai\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8273796_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8273796_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8273796_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8273796_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8273796_1280.avif 3x"},"classes":[]},{"id":3557,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/spring-ai-simplifying-ai-development\/","url_meta":{"origin":3965,"position":2},"title":"Spring AI: Simplifying AI Development","author":"Jeffery Miller","date":"September 22, 2025","format":false,"excerpt":"Spring AI is a new framework aimed at making AI development easier for Java developers. It provides a simple, Spring-friendly way to integrate AI models into your applications, including the use of templates for more structured prompts. It currently supports models from various providers. Why Spring AI? Simplified Integration: Easily\u2026","rel":"","context":"In &quot;Spring AI&quot;","block_context":{"text":"Spring AI","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8686301_640.jpg?fit=640%2C640&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8686301_640.jpg?fit=640%2C640&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8686301_640.jpg?fit=640%2C640&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3951,"url":"https:\/\/www.mymiller.name\/wordpress\/java\/scaling-streams-mastering-virtual-threads-in-spring-boot-4-and-java-25\/","url_meta":{"origin":3965,"position":3},"title":"Scaling Streams: Mastering Virtual Threads in Spring Boot 4 and Java 25","author":"Jeffery Miller","date":"December 22, 2025","format":false,"excerpt":"As a software architect, I\u2019ve seen the industry shift from heavy platform threads to reactive streams, and finally to the \"best of both worlds\": Virtual Threads. With the recent release of Spring Boot 4.0 and Java 25 (LTS), Project Loom's innovations have officially become the bedrock of high-concurrency enterprise Java.\u2026","rel":"","context":"In &quot;JAVA&quot;","block_context":{"text":"JAVA","link":"https:\/\/www.mymiller.name\/wordpress\/category\/java\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 3x"},"classes":[]},{"id":2940,"url":"https:\/\/www.mymiller.name\/wordpress\/angular\/tips-tricks-for-an-angular-material-library\/","url_meta":{"origin":3965,"position":4},"title":"Tips\/Tricks for an Angular Library","author":"Jeffery Miller","date":"December 21, 2020","format":false,"excerpt":"Tips and tricks for building an Angular Material Library.","rel":"","context":"In &quot;Angular&quot;","block_context":{"text":"Angular","link":"https:\/\/www.mymiller.name\/wordpress\/category\/angular\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2020\/12\/start-2465624_640.jpg?fit=640%2C425&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2020\/12\/start-2465624_640.jpg?fit=640%2C425&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2020\/12\/start-2465624_640.jpg?fit=640%2C425&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3012,"url":"https:\/\/www.mymiller.name\/wordpress\/angular\/angular-maintenance-alert-system\/","url_meta":{"origin":3965,"position":5},"title":"Angular Maintenance Alert System","author":"Jeffery Miller","date":"April 12, 2021","format":false,"excerpt":"So often we need to schedule maintenance on a system, and we need to be able to stop users from doing things during this time. To that end, here is a system I created. It uses a Spring backend, that is not presented here. Created a method that would contact\u2026","rel":"","context":"In &quot;Angular&quot;","block_context":{"text":"Angular","link":"https:\/\/www.mymiller.name\/wordpress\/category\/angular\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/03\/wrench-717684_640.jpg?fit=640%2C426&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/03\/wrench-717684_640.jpg?fit=640%2C426&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2021\/03\/wrench-717684_640.jpg?fit=640%2C426&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3965"}],"version-history":[{"count":2,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3965\/revisions"}],"predecessor-version":[{"id":3969,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3965\/revisions\/3969"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3966"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3965"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}