<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Mendix Community - Medium]]></title>
        <description><![CDATA[The community-sourced publication for low-code - Medium]]></description>
        <link>https://medium.com/mendix?source=rss----874212944ee7---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Mendix Community - Medium</title>
            <link>https://medium.com/mendix?source=rss----874212944ee7---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 23:05:36 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/mendix" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Dear Developer, Giving Access to Everyone Isn’t a Great Idea]]></title>
            <link>https://medium.com/mendix/october-security-series-dear-developer-giving-every-access-to-everyone-isnt-a-great-idea-ba71285a6427?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/ba71285a6427</guid>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[tips]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[mendix]]></category>
            <dc:creator><![CDATA[ABISHEK KUMAR]]></dc:creator>
            <pubDate>Wed, 28 Oct 2026 13:10:05 GMT</pubDate>
            <atom:updated>2026-10-28T13:10:03.987Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Dear Developer, Giving Access to Everyone Isn’t a Great Idea: October Security Series (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*iAWK9PaPbhIDmMxjljQGxQ.png" /><figcaption>Dear Developer, Giving Access to Everyone Isn’t a Great Idea: October Security Series</figcaption></figure><h4>October Security Series</h4><h4><strong><em>The biggest threat to your application’s data is not always a sophisticated attacker. Sometimes it’s a well-intentioned developer trying to meet a deadline. Entity Access Rules is one of the most powerful security features in Mendix, yet it’s often configured only after a security error appears on the screen.</em></strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mAkniY2QhYW67VAXPxVrZA.png" /></figure><p><strong><em>In this blog, we’ll break down Entity Access Rules from the ground up, explain what every permission does, and work through common business scenarios to demonstrate how secure access can be implemented without compromising usability.</em></strong></p><p>At some point, we’ve all encountered this in Studio Pro:</p><pre>No access to entity &#39;Module.Entity&#39; for user role &#39;User&#39;</pre><p>You open the Entity Access Rules and select all roles, create, delete, and set read and write to all attributes.</p><p>Error gone. Problem solved. Or is it?</p><h4>What have you done?</h4><p>For a problem with a lock, you removed all the doors in the house!</p><p>Surprisingly, many developers use Entity Access Rules every day without fully understanding what each permission controls.</p><h3>Entity Access Rules</h3><p>It is a set of rules that defines what an end user is allowed to do with the data. Simply, controlling which user can read, write, create and delete objects of an entity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C1Wd0OtxBaXO8CodA9cGkw.png" /></figure><ol><li><strong>Create<br></strong>Controls whether the selected role can create new objects of an entity.</li><li><strong>Delete<br></strong>Controls whether the selected role can delete objects of an entity.</li><li><strong>Read<br></strong>Controls whether the selected role can read the attribute of an entity.</li><li><strong>Write<br></strong>Controls whether the selected role can write the attribute of an entity.</li></ol><h3>Entity Access Rule Editor Section</h3><p><strong>Module Roles</strong><br>Section to select module roles to which the access rule will be applied.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*9TiZRvvnP4B3nbi7Dn-Njg.png" /></figure><p><strong>Access Rights</strong><br>Section to select the access for the selected users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/785/1*2WKbFVc4mGaoO-dmcnNjtA.png" /></figure><p><strong>XPath Constraint</strong><br>Section to specify conditions at attribute or association level using XPath.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*Wp-algiiaeNq13EHpjpNbA.png" /></figure><h3>Scenario 1</h3><p>Administrator can be able to create, delete, read and write but User can only be able to read.</p><p>In the above case, we need to create 2 Access Rules, 1 for Administrator and 1 for User.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/950/1*k5O4eKb0LxXZuo3sY_fTLw.png" /></figure><h3>Scenario 2</h3><p>All users can read the project details except for certain sensitive attributes that hold client details, but they can be read only by the user who created it.</p><p>In the above case, we need to create 2 Access Rules: 1 for the user who created the project and 1 for other users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/1*7XgVuDEjOwdcXsB3BhV71w.png" /></figure><h3>Scenario 3</h3><p>User can be able to read only the leave request submitted by them and should not be able to edit it once submitted.</p><p>In the above case, we need to create 1 Access Rule to create and read requests.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ra8BF8ZdV9lcUzbOT3eY7w.png" /></figure><h3>Decision Tree</h3><ol><li><strong>Create</strong><br>Would the user need to create new records?</li><li><strong>Delete</strong><br>Would this record ever be removed by this user?</li><li><strong>Read</strong><br>Would the user need to see this field?</li><li><strong>W</strong>ould the user need to change this field?</li></ol><h3>What If?</h3><ol><li><strong>What if there are no access rules specified?<br></strong>Mendix follows the principle of least privilege, so everything is restricted by default. So, the entity without any access rules can’t be accessed by any user.</li><li><strong>What if create access is provided but with no write access?</strong><br>Mendix treats create as a special case; it allows writing to attributes even when there is no write access. Write access will only take effect on data that is already there in the database.</li><li><strong>What if, in Generalization, the parent entity has no access rules, but the child entity has access rules?</strong><br>In Generalization, access rules of the parent entity are ignored, and both access to parent and child is controlled through the child entity. There is 1 special case where <strong>System.User</strong> entity access rules are always applied to its child entity.</li><li><strong>What if I didn’t give read access to one or more attributes?</strong><br>Attributes with no read access are not sent to client; when you do retrieve them, they will be shown empty.</li><li><strong>What if I create multiple access rules for the same role?</strong><br>Access rules are additive; there is no condition that will select only one or execute in a specific order. So if there is 1 read rule and 1 write rule for a role, now the role can perform both read and write.</li><li><strong>What if cascading delete is configured to delete B when A is deleted but there is no delete access rule set for entity B?</strong><br>Even though cascading delete is configured, Mendix always respects entity access rules, so cascade will fail, and both A and B won’t be deleted.</li></ol><h3>Conclusion</h3><p>Entity Access Rule is not a bug fix mechanism; it is not there to make Studio Pro stop complaining.</p><p>Every checkbox represents a business decision; every permission affects data security.</p><p><strong><em>Let me know if you’d like further adjustments or additional points for the blog post!</em></strong></p><p><strong><em>Have you learnt something new today? Leave a like and share the blog for better visibility. Follow for more content.</em></strong></p><h3>Read more</h3><ul><li><a href="https://docs.mendix.com/refguide/access-rules/">Access Rules</a></li><li><a href="https://docs.mendix.com/refguide/user-roles/">User Roles</a></li><li><a href="https://docs.mendix.com/refguide/module-security/">Module Security</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba71285a6427" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/october-security-series-dear-developer-giving-every-access-to-everyone-isnt-a-great-idea-ba71285a6427">Dear Developer, Giving Access to Everyone Isn’t a Great Idea</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Security Misconfigurations in Mendix Development]]></title>
            <link>https://medium.com/mendix/october-security-series-security-misconfigurations-in-mendix-development-9331c7b09631?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/9331c7b09631</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[tips]]></category>
            <category><![CDATA[low-code]]></category>
            <dc:creator><![CDATA[ABISHEK KUMAR]]></dc:creator>
            <pubDate>Tue, 27 Oct 2026 12:42:27 GMT</pubDate>
            <atom:updated>2026-10-27T12:42:26.281Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Security Misconfigurations in Mendix Development: October Security Series (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*FIoiYxtfKxi1S4wWfbG8Uw.png" /><figcaption>Security Misconfigurations in Mendix Development: October Security Series</figcaption></figure><h4>October Security Series</h4><h4><strong><em>As organizations increasingly adopt low-code platforms, application security remains a shared responsibility. While Mendix provides robust built-in security capabilities, misconfigurations can still introduce vulnerabilities that expose sensitive data, APIs, and business processes.</em></strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5jCitC-Sg6eRVp4ZYTNGHw.png" /></figure><p><strong><em>In this Cybersecurity Month, let’s explore some common security misconfigurations in Mendix development and how developers can avoid them.</em></strong></p><h3>01. Overly Permissive Entity Access</h3><p>One of the most common mistakes is granting excessive entity access to users who don’t need it.</p><p><strong>Example</strong>: Giving ‘Employee’ role access to read all employee data when they only need to access their own data.</p><p><strong>Risk</strong></p><ol><li>Unauthorized data exposure.</li><li>Regulatory compliance violations.</li><li>Insider threats.</li></ol><p><strong>Best Practice</strong></p><ol><li>Apply the ‘Principle of Least Privilege’.</li><li>Instead of broad access, use XPath constraints to only allow users to see relevant data.</li></ol><h3>02. Missing Page Access Restrictions</h3><p>Developers often secure entities but forget to secure pages.</p><p><strong>Example:</strong> An administrator page is accidentally accessible to standard users.</p><p><strong>Risk</strong></p><ol><li>Access to sensitive functionality.</li><li>Exposure of confidential information.</li><li>Unauthorized modifications.</li></ol><p><strong>Best Practice</strong></p><ol><li>Review page access for every release.</li><li>Ask yourself:</li></ol><ul><li>can users access this page?</li><li>Should they access it?</li><li>Is it restricted properly?</li></ul><h3>03. Insecure Anonymous User Configuration</h3><p>Anonymous access is useful for public applications but frequently misconfigured.</p><p><strong>Example:</strong> Allowing ‘Anonymous’ user to read, create data and to access microflows.</p><p><strong>Risk</strong></p><ol><li>An attacker can read, write, or delete data without authentication.</li><li>An attacker can execute certain functionalities without authentication.</li></ol><p><strong>Best Practice</strong></p><ol><li>Disable anonymous user.</li><li>If enabled, restrict entity access and regularly test anonymous user capabilities.</li></ol><h3>04. Exposed APIs Without Proper Authorization</h3><p>Many Mendix applications expose REST services for integration.</p><p><strong>Example:</strong> API to validate user requests but without proper authorization.</p><p><strong>Risk</strong></p><ol><li>Access to sensitive functionality.</li><li>Exposure of confidential information.</li></ol><p><strong>Best Practice</strong></p><ol><li>Implement Authentication and Authorization.</li><li>Implement Validation and Rate limiting.</li></ol><h3>05. Sensitive Data Stored In Plain Text</h3><p>A dangerous but surprisingly common issue.</p><p><strong>Example:</strong> Storing API keys, Access tokens, credentials, and Personal Information as plain text in a database.</p><p><strong>Risk</strong></p><ol><li>Insider threats.</li><li>Database compromise leads to direct data exposure.</li></ol><p><strong>Best practice</strong></p><ol><li>Encryption of sensitive information.</li><li>Use a secure credential manager.</li><li>Implement a secret rotation policy.</li></ol><h3>06. Logging Sensitive Information</h3><p>Logs help troubleshooting but can become a security liability.</p><p><strong>Example:</strong> Logging of customer ID, name, and Email.</p><p><strong>Risk</strong></p><ol><li>Insider threats.</li><li>Sensitive data exposure.</li></ol><p><strong>Best Practice</strong></p><ol><li>Log only events and errors.</li><li>Use only technical identifiers for identification.</li></ol><h3>07. Legacy Permissions</h3><p>As applications grow, permissions often accumulate.</p><p><strong>Example:</strong> A role created 3 years ago that is no longer required still has access to pages and some entities.</p><p><strong>Risk</strong></p><ol><li>Exploit through forgotten or unmanaged permissions.</li></ol><p><strong>Best Practice</strong></p><ol><li>Perform regular access reviews.</li><li>Remove unused roles, pages, flows, and entities.</li></ol><h3>08. Outdated Marketplace Modules</h3><p>Install Marketplace modules and never update them.</p><p><strong>Example:</strong> Old version of Excel import module.</p><p><strong>Risk</strong></p><ol><li>Known Vulnerabilities.</li><li>Compatibility issues.</li></ol><p><strong>Best Practice</strong></p><ol><li>Remove unused modules.</li><li>Upgrade marketplace content during the release cycle.</li></ol><h3>09. Insufficient Input Validation</h3><p>Trusting user input too much.</p><p><strong>Example:</strong> Allowing a user to enter a mobile number in the email input.</p><p><strong>Risk</strong></p><ol><li>Injection attacks.</li><li>Data quality issues.</li><li>Business rule bypass.</li></ol><p><strong>Best Practice</strong></p><ol><li>Implement proper input validations.</li><li>Implement server-side input validations.</li><li>Sanitize user input.</li></ol><h3>10. Skipping Security Testing Before Release</h3><p>Teams often focus heavily on functionality and performance while security receives minimal attention.</p><p><strong>Example:</strong> Moving to production without security testing.</p><p><strong>Risk</strong></p><ol><li>Unknown Vulnerabilities.</li></ol><p><strong>Best Practice</strong></p><ol><li>Conduct penetration testing.</li><li>Review logs.</li><li>Verify APIs.</li><li>Review user roles and access.</li></ol><h3>Conclusion</h3><p>Mendix provides a strong security foundation, but even the best platforms can be undermined by poor configuration choices. Most security incidents are not caused by sophisticated attacks; they result from simple oversights such as excessive permissions, weak access controls, and insufficient testing.</p><p>This Cybersecurity Month, take the opportunity to review your Mendix applications and ensure security is built into every layer of your solution, from user roles and entities to APIs and deployment processes.</p><p><strong><em>Let me know if you’d like further adjustments or additional points for the blog post!</em></strong></p><p><strong><em>Have you learnt something new today? Leave a like and share the blog for better visibility. Follow for more content.</em></strong></p><h3>Read more</h3><ul><li><a href="https://docs.mendix.com/refguide/security/">Security</a></li><li><a href="https://docs.mendix.com/refguide/security-best-practices/#introduction">Security Recommendations</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9331c7b09631" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/october-security-series-security-misconfigurations-in-mendix-development-9331c7b09631">Security Misconfigurations in Mendix Development</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building the Subscriber Side of Mendix Business Events]]></title>
            <link>https://medium.com/mendix/quick-hack-series-part-7-building-the-subscriber-side-of-mendix-business-events-part-3-cd7159d6a944?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/cd7159d6a944</guid>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[apache-kafka]]></category>
            <dc:creator><![CDATA[Gurumoorthy J]]></dc:creator>
            <pubDate>Wed, 21 Oct 2026 13:26:20 GMT</pubDate>
            <atom:updated>2026-10-21T13:26:18.567Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Building the Subscriber Side of Mendix Business Events : Quick Hack Series Part 7 (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*gVlf4no6l421hfGUlqj35A.png" /><figcaption>Building the Subscriber Side of Mendix Business Events : Quick Hack Series Part 7</figcaption></figure><h4>Quick Hack Series Part 7</h4><h4><strong>In this part, we take the event we published in </strong><a href="https://medium.com/@gurumoorthysutha/quick-hack-series-part-5-getting-started-with-mendix-business-events-publishing-part-1-cdf1985eafef"><strong>Part 1</strong></a><strong> and actually consume it in a second app. We import the AsyncAPI contract, let Studio Pro auto-generate the consumer entity and </strong><strong>Handle_BE microflow, and wire up real logic that reacts when the event arrives. By the end, you&#39;ll have a full publish-to-consume round trip running locally against the Docker broker from </strong><a href="#"><strong>Part 2</strong></a><strong>.</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cjdUpeswf5FAAdeOwEH5rQ.png" /></figure><h3>Where We Left Off</h3><ul><li><strong>Part 1</strong>: Modeled a Business Event Service, defined the event contract, and published it from a microflow.</li><li><strong>Part 2</strong>: Stood up a local Kafka broker with Docker and pointed Studio Pro at it via ChannelName/ServerUrl constants.</li></ul><p>Now it’s time to close the loop — build an app that actually <em>listens</em> for that event and does something useful with it.</p><h3>Step 1: Get the AsyncAPI Contract from the Publisher</h3><p>Back in your publishing app’s Business Event Service document, click <strong>Export AsyncAPI Document</strong>. This generates a YAML file describing the event’s name, attributes, and channel; this is the contract your subscriber app will import.</p><p>Copy this YAML file somewhere your subscriber app project can access it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xUv8jCqa5yeHfLJDiXWWWw.png" /></figure><h3>Step 2: Import the Event Service in the Subscriber App</h3><ol><li>In the consuming app, right-click the target module → <strong>Add other</strong> → <strong>Business Event Service</strong>.</li><li>Select <strong>Use an existing business event service</strong>.</li><li>Click <strong>Browse</strong>, select the YAML file you exported in Step 1.</li><li>Give the document a name (e.g. BE_LoanApplicationSubmitted_Consumer) → <strong>OK</strong>.</li></ol><p>Studio Pro reads the contract and shows you the event’s structure — same attributes the publisher defined, ready to consume.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/947/1*p-4lQHnZvRtrGYQj_6i4Gg.png" /></figure><h3>Step 3: Subscribe to the Event</h3><p>After importing the AsyncAPI document, Mendix displays a panel where you can configure the subscription implementation. Navigate to the <strong>Subscribe</strong> section, click <strong>Add</strong>, and specify your <strong>Business Entity Name</strong> and <strong>Handler Microflow Name</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1015/1*E02_IidhC6LQkcWxvh05dg.png" /></figure><p>Studio Pro auto-generates two things for you:</p><ul><li>A <strong>persistable consumer entity</strong> in your domain model, mirroring the event’s attributes</li><li>A <strong>Handle_BE microflow</strong>, placed in the same folder as the service document</li></ul><p>This is the key difference from the publisher side: you don’t write the “receive” plumbing yourself. Studio Pro wires the entity and the trigger microflow automatically. Your job is just to fill in what happens <em>after</em> the event lands.</p><h3>Step 4: Build Your Handle_BE Logic</h3><p>Open the generated Handle_BE microflow. It already receives the consumed event object as an input parameter — from here, treat it like any other microflow trigger.</p><p>Typical patterns worth knowing:</p><ul><li><strong>Simple record-and-store</strong>: commit the consumed entity as-is for audit/history purposes.</li><li><strong>Trigger downstream logic</strong>: read the event’s attributes and kick off your own business process — e.g., update a related record, send a notification, or call a REST action.</li><li><strong>Fan-out to multiple actions</strong>: split into decision branches based on event attribute values (e.g. status = “Approved” vs “Rejected”).</li></ul><h3>Step 5: Test the Full Round Trip Locally</h3><p>With both apps configured to point at the same local broker (ChannelName=local, ServerUrl=localhost:9092 from Part 2):</p><ol><li>Run the <strong>publisher app</strong> in Studio Pro, trigger the microflow that commits the published entity.</li><li>Run the <strong>subscriber app</strong> in Studio Pro (or have it already running).</li><li>Watch the subscriber app’s logs — you should see Handle_BE fire automatically once the event lands.</li></ol><p>If you want to verify the message is actually flowing through Kafka before it even reaches your subscriber app, use the same console consumer command from Part 2:</p><pre>docker exec kafka /bin/kafka-console-consumer --topic local --from-beginning --bootstrap-server kafka:19092</pre><p><strong>If you build this out yourself, I’d love to hear where you land; drop a comment with your use case!</strong></p><p><strong>Until next time, keep building and keep hacking!</strong></p><h4>Read more</h4><p><a href="https://docs.mendix.com/appstore/services/event-broker/">Mendix Event Broker</a></p><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd7159d6a944" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/quick-hack-series-part-7-building-the-subscriber-side-of-mendix-business-events-part-3-cd7159d6a944">Building the Subscriber Side of Mendix Business Events</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy Mendix on a Local Floci Kubernetes Lab]]></title>
            <link>https://medium.com/mendix/deploy-mendix-on-a-local-floci-kubernetes-lab-0ca099ca0115?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/0ca099ca0115</guid>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[how-to]]></category>
            <dc:creator><![CDATA[Sukhvindrasingh]]></dc:creator>
            <pubDate>Fri, 16 Oct 2026 14:45:10 GMT</pubDate>
            <atom:updated>2026-10-16T14:45:08.744Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Deploy Mendix on a Local Floci Kubernetes Lab (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*bXESG8Ogoe-5t8HJewxlqg.png" /><figcaption>Deploy Mendix on a Local Floci Kubernetes Lab</figcaption></figure><h4>A verified Windows guide for Floci, K3s, PostgreSQL, S3, ingress-nginx, GitHub Container Registry, and ngrok</h4><p><strong>This guide walks you through building a complete local lab on Windows. It uses Floci to emulate AWS services, running a K3s cluster, PostgreSQL, and S3 storage on your own machine, with ngrok making the app reachable at a public HTTPS URL. By the end, you’ll have a running Mendix 11 app and a single script that restores the whole lab automatically every time you sign in to Windows.</strong></p><h3>Guide details</h3><ul><li><strong>Verified on:</strong> 13 September 2026</li><li><strong>Host:</strong> Windows 11 with Docker Desktop and WSL2</li><li><strong>Outcome:</strong> Mendix 11.13.0 runtime accessible through a stable public ngrok URL</li><li><strong>Recovery:</strong> One PowerShell script automatically restores the lab after Windows sign-in</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mb8qqspXUHiWi8iRiD3jEQ.png" /></figure><p>Learn how to rebuild the lab from an empty Floci environment to a running Mendix application. Incorporate the corrections verified during the deployment: fixed Docker addresses, Kubernetes EndpointSlices, GitHub Container Registry authentication, a free ngrok Cloud Endpoint, and a restart automation that returned exit code 0.</p><blockquote>Scope: This is a learning and demonstration environment. Floci emulates AWS services locally; <strong>it does not reproduce production AWS security</strong>, resilience, backups, networking, or service-level guarantees.</blockquote><h3>Successful final state</h3><h4>Verified component status</h4><ul><li><strong>Floci:</strong> Healthy at 172.20.0.6:4566 with persistent storage</li><li><strong>Kubernetes:</strong> Floci EKS-compatible K3s node is ready; context: floci-mendix</li><li><strong>PostgreSQL:</strong> Floci RDS container available at 172.20.0.3:5432</li><li><strong>S3 storage:</strong> Bucket mendix-floci-files accessible through the floci-s3 service</li><li><strong>Ingress:</strong> ingress-nginx configured with NodePorts 30080 and 30443</li><li><strong>Container registry:</strong> Private GitHub Container Registry repository configured with a Kubernetes image-pull secret</li><li><strong>Mendix application:</strong> Build and runtime are green, with 1/1 replicas running</li><li><strong>Public URL:</strong> <a href="https://completable-noncommemorational-terica.ngrok-free.dev/">https://completable-noncommemorational-terica.ngrok-free.dev/</a></li><li><strong>Restart task:</strong> Start Floci Mendix Lab completed successfully with LastTaskResult: 0</li></ul><h3>Architecture and fixed addressing</h3><p>The public ngrok Cloud Endpoint forwards traffic to the local ngrok agent at default.internal. The agent sends traffic to localhost port 8080, where kubectl forwards it to ingress-nginx. Kubernetes routes the request to the Mendix runtime. The runtime reaches PostgreSQL and S3 through stable Kubernetes services backed by external EndpointSlices.</p><blockquote>Internet HTTPS<br>-&gt; ngrok Cloud Endpoint<br>-&gt; ngrok agent default.internal<br>-&gt; localhost:8080<br>-&gt; ingress-nginx service port 80<br>-&gt; Mendix Ingress and runtime<br>-&gt; floci-rds:5432 and floci-s3:4566</blockquote><h3>Network address mapping</h3><ul><li><strong>172.20.0.1:</strong> floci_default Docker network gateway</li><li><strong>172.20.0.3:</strong> Floci PostgreSQL container</li><li><strong>172.20.0.4:</strong> Floci K3s cluster container</li><li><strong>172.20.0.6:</strong> Floci API and S3 emulator</li><li><strong>localhost:6500:</strong> K3s Kubernetes API endpoint</li><li><strong>localhost:8080:</strong> Local ingress port-forward</li><li><strong>localhost:4566:</strong> Floci API accessible from Windows</li></ul><h3>Prerequisites and security rules</h3><ul><li>Docker Desktop with WSL2 enabled.</li><li>AWS CLI, kubectl, Helm 3, mxpc-cli, and ngrok v3 available on Windows.</li><li>A GitHub account and a private GHCR package path.</li><li>A reserved ngrok free domain and an authenticated ngrok agent.</li><li>Do not publish Namespace Secrets, GitHub tokens, ngrok authtokens, database passwords, subscription secrets, signed package URLs, or generated YAML containing credentials.</li><li>Never run docker system prune --volumes or docker volume prune against this lab.</li></ul><h3>Create the persistent Floci foundation</h3><h4>Create the external Docker network</h4><p>The Compose file uses an external network. Create it before you run docker compose.</p><pre>docker network create `<br>  --driver bridge `<br>  --subnet 172.20.0.0/16 `<br>  --gateway 172.20.0.1 `<br>  floci_default</pre><p>Verify the network configuration:</p><pre>docker network inspect floci_default</pre><h3>Create persistent storage</h3><pre>New-Item -ItemType Directory -Force -Path &quot;D:\Floci\data&quot;</pre><h3>Create the Compose file</h3><p>Save this as D:\Developer-Knowledge-Hub\01-Inbox\Floci\compose.yml. The fixed address prevents the S3 endpoint from changing after a restart.</p><pre>services:<br>  floci:<br>    image: floci/floci:latest<br>    ports:<br>      - &quot;4566:4566&quot;<br>    environment:<br>      FLOCI_STORAGE_MODE: persistent<br>      FLOCI_STORAGE_PERSISTENT_PATH: /app/data<br>    volumes:<br>      - D:/Floci/data:/app/data<br>      - /var/run/docker.sock:/var/run/docker.sock<br>    networks:<br>      default:<br>        ipv4_address: 172.20.0.6<br><br>networks:<br>  default:<br>    external: true<br>    name: floci_default<br></pre><pre>docker compose -f &quot;D:\Developer-Knowledge-Hub\01-Inbox\Floci\compose.yml&quot; up -d<br>docker inspect floci-floci-1 --format &quot;Status={{.State.Status}} Health={{.State.Health.Status}}&quot;</pre><p>Expected result: Status=running and Health=healthy.</p><h3>Verify Floci services</h3><pre>Invoke-RestMethod “http://localhost:4566/_localstack/health&quot; | ConvertTo-Json -Depth 10</pre><h3>Create and connect the K3s cluster</h3><h4>Create the emulated IAM role</h4><pre>$trustPolicy = &#39;{&quot;Version&quot;:&quot;2012-10-17&quot;,&quot;Statement&quot;:[{&quot;Effect&quot;:&quot;Allow&quot;,&quot;Principal&quot;:{&quot;Service&quot;:&quot;eks.amazonaws.com&quot;},&quot;Action&quot;:&quot;sts:AssumeRole&quot;}]}&#39;<br><br>aws iam create-role `<br>  --role-name FlociEksClusterRole `<br>  --assume-role-policy-document $trustPolicy `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --no-cli-pager</pre><h4>Create the EKS-compatible cluster</h4><pre>aws eks create-cluster `<br>  --name mendix-floci-cluster `<br>  --role-arn arn:aws:iam::000000000000:role/FlociEksClusterRole `<br>  --resources-vpc-config &quot;subnetIds=subnet-default-a,subnet-default-b,subnet-default-c,securityGroupIds=sg-default,endpointPublicAccess=true,endpointPrivateAccess=false&quot; `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --no-cli-pager</pre><pre>aws eks describe-cluster `<br>  --name mendix-floci-cluster `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --query &quot;cluster.{Status:status,Endpoint:endpoint}&quot; `<br>  --no-cli-pager</pre><p>Continue when the status is ACTIVE and the endpoint is <a href="https://localhost:6500/">https://localhost:6500</a>.</p><h4>Attach the K3s container to the fixed network</h4><pre>docker network connect `<br>  --ip 172.20.0.4 `<br>  floci_default `<br>  floci-eks-mendix-floci-cluster</pre><p>If Docker reports that the endpoint already exists, inspect the existing address instead of reconnecting it.</p><h4>Create the kubeconfig context</h4><pre>aws eks update-kubeconfig `<br>  --name mendix-floci-cluster `<br>  --alias floci-mendix `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1</pre><pre>kubectl config use-context floci-mendix<br>kubectl get nodes -o wide<br>kubectl get storageclass</pre><p>Expected result: one K3s control-plane node is Ready and local-path is the default StorageClass.</p><h3>Configure PostgreSQL and S3</h3><h4>Create PostgreSQL</h4><pre>aws rds create-db-subnet-group `<br>  --db-subnet-group-name mendix-rds-subnet-group `<br>  --db-subnet-group-description &quot;Subnet group for Mendix PostgreSQL&quot; `<br>  --subnet-ids subnet-default-a subnet-default-b subnet-default-c `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --no-cli-pager</pre><p>Prompt securely for the database password so it is not stored in PowerShell history:</p><pre>$dbSecurePassword = Read-Host &quot;Enter the PostgreSQL password&quot; -AsSecureString<br>$dbPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto(<br>  [Runtime.InteropServices.Marshal]::SecureStringToBSTR($dbSecurePassword)<br>)<br><br>aws rds create-db-instance `<br>  --db-instance-identifier mendix-postgres `<br>  --db-instance-class db.t3.micro `<br>  --engine postgres `<br>  --allocated-storage 20 `<br>  --master-username mendixadmin `<br>  --master-user-password $dbPassword `<br>  --db-name mendixdb `<br>  --db-subnet-group-name mendix-rds-subnet-group `<br>  --vpc-security-group-ids sg-default `<br>  --no-publicly-accessible `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --no-cli-pager<br><br>$dbPassword = $null<br>$dbSecurePassword = $null</pre><p>Important: Floci API metadata may advertise 172.20.0.6:7001, but Kubernetes must connect to the actual PostgreSQL container on port 5432. Inspect the generated container and attach it to the fixed network.</p><pre>$RdsContainer = docker ps -a --format &quot;{{.Names}}&quot; |<br>  Where-Object { $_ -like &quot;floci-rds-*&quot; } |<br>  Select-Object -First 1<br><br>docker network connect --ip 172.20.0.3 floci_default $RdsContainer</pre><h3>Create the PostgreSQL Kubernetes service</h3><pre>kubectl create namespace mendix-floci<br>kubectl create service clusterip floci-rds --tcp=5432:5432 -n mendix-floci<br>kubectl patch service floci-rds -n mendix-floci --type=merge --patch &#39;{\&quot;spec\&quot;:{\&quot;selector\&quot;:null}}&#39;</pre><pre>@&quot;<br>apiVersion: discovery.k8s.io/v1<br>kind: EndpointSlice<br>metadata:<br>  name: floci-rds-external<br>  namespace: mendix-floci<br>  labels:<br>    kubernetes.io/service-name: floci-rds<br>addressType: IPv4<br>ports:<br>  - name: 5432-5432<br>    protocol: TCP<br>    port: 5432<br>endpoints:<br>  - addresses: [&quot;172.20.0.3&quot;]<br>    conditions:<br>      ready: true<br>&quot;@ | kubectl apply -f -</pre><p>The EndpointSlice port name must exactly match the generated Service port name 5432-5432. A different name can cause the Service DNS test to fail even when the direct IP succeeds.</p><pre>kubectl run rds-service-test -n mendix-floci `<br>  --image=busybox:1.36 --restart=Never --rm -i `<br>  --command -- nc -zvw5 floci-rds.mendix-floci.svc.cluster.local 5432</pre><h3>Create S3 storage</h3><pre>aws s3api create-bucket `<br>  --bucket mendix-floci-files `<br>  --endpoint-url http://localhost:4566 `<br>  --region us-east-1 `<br>  --no-cli-pager<br><br>kubectl create service clusterip floci-s3 --tcp=4566:4566 -n mendix-floci<br>kubectl patch service floci-s3 -n mendix-floci --type=merge --patch &#39;{\&quot;spec\&quot;:{\&quot;selector\&quot;:null}}&#39;</pre><pre>@&quot;<br>apiVersion: discovery.k8s.io/v1<br>kind: EndpointSlice<br>metadata:<br>  name: floci-s3-external<br>  namespace: mendix-floci<br>  labels:<br>    kubernetes.io/service-name: floci-s3<br>addressType: IPv4<br>ports:<br>  - name: 4566-4566<br>    protocol: TCP<br>    port: 4566<br>endpoints:<br>  - addresses: [&quot;172.20.0.6&quot;]<br>    conditions:<br>      ready: true<br>&quot;@ | kubectl apply -f -</pre><h3>Register the namespace and install Mendix</h3><p>Keep the existing Portal cluster registration if it represents this lab. Create or reuse the Kubernetes namespace mendix-floci, then add that namespace in Mendix on Kubernetes Cluster Manager. Use the cluster type Kubernetes because the actual node is K3s.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ISzYUjU3XpQVNXDl.png" /></figure><p><em>Mendix namespace installation page. Namespace identifiers and secrets must remain redacted.</em></p><h3>Run the namespace installer</h3><pre>.\mxpc-cli.exe installer -n mendix-floci -i &lt;NAMESPACE_ID&gt; -s &lt;NAMESPACE_SECRET&gt;</pre><p>In the installer, complete Base Installation. Verify that the Agent and Operator become healthy.</p><pre>kubectl get pods -n mendix-floci -o wide</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QqbH6OAVY7WnrGZX.png" /></figure><p><em>The namespace is connected after the Mendix Agent and Operator are running.</em></p><h3>Install ingress-nginx and connect ngrok</h3><h4>Install ingress-nginx</h4><pre>helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx<br>helm repo update<br><br>helm install ingress-nginx ingress-nginx/ingress-nginx `<br>  --namespace ingress-nginx `<br>  --create-namespace `<br>  --set controller.service.type=NodePort `<br>  --set controller.service.nodePorts.http=30080 `<br>  --set controller.service.nodePorts.https=30443 `<br>  --set controller.ingressClassResource.default=true<br><br>kubectl get pods -n ingress-nginx -o wide<br>kubectl get ingressclass</pre><p>Expected result: ingress-nginx-controller is 1/1 Running and the nginx IngressClass exists.</p><h3>Reserve and connect the ngrok domain</h3><p>Reserve the free domain completable-noncommemorational-terica.ngrok-free.dev in ngrok. Configure the Cloud Endpoint to forward to <a href="https://default.internal/">https://default.internal</a>. The public ngrok endpoint terminates TLS; Kubernetes ingress TLS remains disabled in this lab.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Hrtsvkdv9gmRTmn3.png" /></figure><p><em>Reserved ngrok public Cloud Endpoint.</em></p><p>Start a local port-forward and keep the process running:</p><pre>kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8080:80</pre><p>In a second PowerShell window, start the ngrok agent from its installation directory:</p><pre>.\ngrok.exe http 8080 --url https://default.internal</pre><p>If ERR_NGROK_334 appears, an older ngrok process already owns the endpoint. Inspect and stop only that stale process, then run the correct command again.</p><pre>Get-CimInstance Win32_Process |<br>  Where-Object { $_.Name -eq &quot;ngrok.exe&quot; } |<br>  Select-Object ProcessId, CommandLine</pre><h3>Configure Mendix plans and registry</h3><h4>Database plan</h4><ul><li><strong>Name:</strong> floci-rds-postgres</li><li><strong>Host:</strong> floci-rds.mendix-floci.svc.cluster.local</li><li><strong>Port:</strong> 5432</li><li><strong>Strict TLS:</strong> Off for the local emulator</li><li><strong>Database name:</strong> postgres</li><li><strong>Authentication:</strong> static</li><li><strong>Username:</strong> mendixadmin</li><li><strong>Password:</strong> Securely created RDS administrator password</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YFK8P7NBkNdDCAyr.png" /></figure><p><em>The PostgreSQL database plan validates successfully with the configured master username.</em></p><h4>S3 storage plan</h4><ul><li><strong>Name:</strong> floci-s3-storage</li><li><strong>Type:</strong> amazon-s3</li><li><strong>Endpoint:</strong> <a href="http://floci-s3.mendix-floci.svc.cluster.local:4566/">http://floci-s3.mendix-floci.svc.cluster.local:4566</a></li><li><strong>Bucket prefix:</strong> mendix-floci-files</li><li><strong>IRSA:</strong> Off</li><li><strong>Share bucket:</strong> Off</li><li><strong>Credentials:</strong> Use local emulator credentials only and mask them in screenshots</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QJ3BSmHZ6JLy7f-Q.png" /></figure><p><em>The Floci S3 storage plan validates through the Kubernetes service.</em></p><h4>Ingress configuration</h4><ul><li><strong>Ingress type:</strong> kubernetes-ingress</li><li><strong>Domain name:</strong> completable-noncommemorational-terica.ngrok-free.dev</li><li><strong>Path:</strong> /</li><li><strong>Enable TLS:</strong> Off — ngrok provides public HTTPS</li><li><strong>Custom Ingress Class:</strong> On</li><li><strong>Ingress Class Name:</strong> nginx</li><li><strong>Set class as annotation:</strong> Off</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SFNiXvQ6LtiAv3TO.png" /></figure><p><em>Ingress uses the reserved ngrok hostname and nginx class.</em></p><h4>GitHub Container Registry</h4><p>Create a GitHub personal access token with read:packages and write:packages. Never put the token directly in a published command or screenshot.</p><ul><li><strong>Registry type:</strong> generic</li><li><strong>Pull URL:</strong> ghcr.io</li><li><strong>Push URL:</strong> ghcr.io</li><li><strong>Registry name:</strong> sukhvindra-singh/mendix-resources</li><li><strong>Authentication:</strong> On</li><li><strong>User:</strong> sukhvindra-singh</li><li><strong>Password:</strong> GitHub personal access token — keep it masked</li><li><strong>Default service account:</strong> Enable <strong>Add credentials to pull secrets</strong></li></ul><p>Use only owner/repository in Registry Name. Do not enter a tag template in that field; Mendix creates the environment-specific tag.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SGrOIiJBMfPLYK3M.png" /></figure><p><em>Corrected GHCR configuration. The token remains masked.</em></p><h4>Evaluate and apply the configuration</h4><p>Evaluate Configuration should report Valid configuration for Storage Plan, Database Plan, Ingress, and Registry. Then select Write YAML and Apply Configuration. Treat the generated YAML as sensitive because it can contain credentials.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sWFb0-9tXLbPx3Z_.png" /></figure><p><em>All four namespace resources pass configuration evaluation.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ocy0jlwaKdBicArV.png" /></figure><p><em>The installer successfully applies all namespace configuration.</em></p><h3>Create a package and development environment</h3><h4>Build a deployment package</h4><blockquote>1. Open the app in Mendix Portal and go to Deployment, Environments, Deployment Packages.</blockquote><blockquote>2. Select Create Deployment Package.</blockquote><blockquote>3. Choose the main branch and the required revision.</blockquote><blockquote>4. Enter the semantic version and select Build this revision.</blockquote><blockquote>5. Wait for the package to show a green completed indicator.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lrBsoZcKxR73CZaq.png" /></figure><p><em>Select the main branch for the deployment package.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2Ti1b8eoZgKbScBS.png" /></figure><p><em>Select the required main-branch revision.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rgF_ImZYyTicgD4x.png" /></figure><p><em>Review the version and build the selected revision.</em></p><h4>Create the Development environment</h4><blockquote>1. Select Create Environment and choose the newly completed package.</blockquote><blockquote>2. Keep the generated lowercase environment ID. The verified ID was a0y77t7f.</blockquote><blockquote>3. Set Environment Name and Purpose to Development.</blockquote><blockquote>4. Select namespace mendix-floci on floci-mendix-cluster.</blockquote><blockquote>5. Enter a valid Mendix subscription secret only if you have a licensed runtime. Never use a GitHub token in this field.</blockquote><blockquote>6. Choose XS resources, floci-rds-postgres, and floci-s3-storage.</blockquote><blockquote>7. Create the environment and wait for Build and Runtime to become green.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EmW86SEZQQSH_84W.png" /><figcaption>Development environment identity and namespace selection. The subscription secret is masked.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_OWJnPskolOcNRMv.png" /><figcaption><em>XS runtime resources with the verified database and storage plans.</em></figcaption></figure><h4>Fix the free ngrok hostname</h4><p>Mendix normally prefixes the namespace domain with the environment ID. A free ngrok reserved domain covers the exact hostname, not an arbitrary environment subdomain. Set spec.appURL to the hostname only. Do not include <a href="http://,/">http://,</a> <a href="https://,/">https://,</a> or a trailing slash; Kubernetes rejects a scheme as an invalid Ingress host.</p><p>Use the generated environment ID shown by MendixApp:</p><pre>kubectl get mendixapp -n mendix-floci</pre><p>Apply the hostname-only override:</p><pre>kubectl patch mendixapp a0y77t7f `<br>  -n mendix-floci `<br>  --type=merge `<br>  --patch &#39;{\&quot;spec\&quot;:{\&quot;appURL\&quot;:\&quot;completable-noncommemorational-terica.ngrok-free.dev\&quot;}}&#39;</pre><p>The Operator should reconcile the Ingress and status. If it repeatedly restores the environment prefix, use the controlled sequence below.</p><pre>kubectl scale deployment mendix-operator -n mendix-floci --replicas=0<br><br>kubectl patch ingress a0y77t7f -n mendix-floci --type=json `<br>  --patch &#39;[{\&quot;op\&quot;:\&quot;replace\&quot;,\&quot;path\&quot;:\&quot;/spec/rules/0/host\&quot;,\&quot;value\&quot;:\&quot;completable-noncommemorational-terica.ngrok-free.dev\&quot;}]&#39;<br><br>kubectl patch mendixapp a0y77t7f -n mendix-floci --subresource=status `<br>  --type=merge `<br>  --patch &#39;{\&quot;status\&quot;:{\&quot;appURL\&quot;:\&quot;http://completable-noncommemorational-terica.ngrok-free.dev/\&quot;}}&#39;<br><br>kubectl patch mendixapp a0y77t7f -n mendix-floci --type=merge `<br>  --patch &#39;{\&quot;spec\&quot;:{\&quot;appURL\&quot;:\&quot;completable-noncommemorational-terica.ngrok-free.dev\&quot;}}&#39;<br><br>kubectl scale deployment mendix-operator -n mendix-floci --replicas=1</pre><p>Wait for the Operator to become ready, refresh Mendix Portal, and confirm the Network, Storage, Database, Service Account, Build, and Runtime indicators are green.</p><pre>Invoke-WebRequest `<br>  -Uri &quot;https://completable-noncommemorational-terica.ngrok-free.dev/&quot; `<br>  -UseBasicParsing</pre><p>Expected result: StatusCode 200 and StatusDescription OK.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MWzeUXKrFB64PMCy.png" /></figure><p><em>Verified final environment: infrastructure, build, and runtime checks are green, and the fixed URL is displayed.</em></p><p>The optional Licensed Runtime counter can remain 0 of 1 when no commercial runtime subscription is activated. It does not invalidate this local demonstration when the runtime is healthy and the application returns HTTP 200.</p><h3>Troubleshoot GHCR image pulls</h3><h4>Symptom</h4><p>The runtime pod reports ErrImagePull or ImagePullBackOff. Pod events contain failed to authorize and 401 Unauthorized for ghcr.io. If imagePullSecrets is empty, Kubernetes attempted an anonymous pull from a private package.</p><h4>Diagnosis</h4><pre>kubectl describe pod &lt;RUNTIME_POD&gt; -n mendix-floci<br>kubectl get pod &lt;RUNTIME_POD&gt; -n mendix-floci -o jsonpath=&quot;{.spec.imagePullSecrets}&quot;<br>kubectl get secrets -n mendix-floci<br>kubectl get pod &lt;RUNTIME_POD&gt; -n mendix-floci -o jsonpath=&quot;{.spec.serviceAccountName}&quot;<br></pre><p>Expected secret: mendix-registry-generic-secret. The verified runtime used the default service account.</p><h4>Attach the pull secret</h4><p>This Windows-compatible command preserves the JSON quotes passed to kubectl:</p><pre>kubectl patch serviceaccount default -n mendix-floci --type=merge `<br>  --patch &#39;{\&quot;imagePullSecrets\&quot;:[{\&quot;name\&quot;:\&quot;mendix-registry-generic-secret\&quot;}]}&#39;</pre><p>Delete only the failed runtime pod. Its Deployment recreates it with the pull secret.</p><pre>kubectl delete pod &lt;RUNTIME_POD&gt; -n mendix-floci</pre><p>Expected progression: ErrImagePull, ContainerCreating, then 2/2 Running. Temporary readiness HTTP 500 responses can occur while the Mendix runtime initializes.</p><h4>Rotate the GHCR credential securely</h4><pre>$ghcrSecureToken = Read-Host &quot;Enter the new GitHub token&quot; -AsSecureString<br>$ghcrToken = [Runtime.InteropServices.Marshal]::PtrToStringAuto(<br>  [Runtime.InteropServices.Marshal]::SecureStringToBSTR($ghcrSecureToken)<br>)<br><br>kubectl create secret docker-registry mendix-registry-generic-secret `<br>  -n mendix-floci `<br>  --docker-server=ghcr.io `<br>  --docker-username=sukhvindra-singh `<br>  --docker-password=&quot;$ghcrToken&quot; `<br>  --dry-run=client -o yaml | kubectl apply -f -<br><br>$ghcrToken = $null<br>$ghcrSecureToken = $null</pre><h3>Restore the lab automatically after restart</h3><p>Docker containers and Kubernetes volumes persist, but ngrok and kubectl port-forward are host processes and do not reliably resume after Windows restarts. The verified startup script checks Docker Desktop, recreates the fixed network when absent, starts Floci/K3s/RDS, repairs fixed addresses, waits for Kubernetes and ingress, starts forwarding processes, and validates the public URL.</p><h3>Create the script</h3><p>Save the following as D:\Floci\scripts\Start-FlociLab.ps1. Adjust only ComposeFile or NgrokExe if the local paths differ.</p><pre>$ErrorActionPreference = &quot;Stop&quot;<br><br>$ComposeFile = &quot;D:\Developer-Knowledge-Hub\01-Inbox\Floci\compose.yml&quot;<br>$NgrokExe = &quot;C:\Users\sukhv\Downloads\ngrok-v3-stable-windows-amd64\ngrok.exe&quot;<br>$DockerNetwork = &quot;floci_default&quot;<br>$K3sContainer = &quot;floci-eks-mendix-floci-cluster&quot;<br>$KubeContext = &quot;floci-mendix&quot;<br>$Namespace = &quot;mendix-floci&quot;<br>$PublicDomain = &quot;completable-noncommemorational-terica.ngrok-free.dev&quot;<br>$PublicURL = &quot;https://$PublicDomain/&quot;<br>$LogDirectory = &quot;D:\Floci\scripts\logs&quot;<br>New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null<br><br>function Test-Docker {<br>  docker info *&gt; $null<br>  return ($LASTEXITCODE -eq 0)<br>}<br><br>function Start-ContainerIfStopped([string]$Name) {<br>  $exists = docker ps -a --filter &quot;name=^${Name}$&quot; --format &quot;{{.Names}}&quot;<br>  if ($exists) {<br>    $running = docker ps --filter &quot;name=^${Name}$&quot; --format &quot;{{.Names}}&quot;<br>    if (-not $running) { docker start $Name | Out-Null }<br>  }<br>}<br><br>function Set-FixedNetworkIP([string]$Name, [string]$RequiredIP) {<br>  $exists = docker ps -a --filter &quot;name=^${Name}$&quot; --format &quot;{{.Names}}&quot;<br>  if (-not $exists) { Write-Warning &quot;Container not found: $Name&quot;; return }<br>  $inspect = docker inspect $Name | ConvertFrom-Json<br>  $property = $inspect[0].NetworkSettings.Networks.PSObject.Properties[$DockerNetwork]<br>  if ($null -ne $property -and $property.Value.IPAddress -eq $RequiredIP) { return }<br>  $wasRunning = (docker inspect $Name --format &quot;{{.State.Running}}&quot;) -eq &quot;true&quot;<br>  if ($null -ne $property) {<br>    docker network disconnect -f $DockerNetwork $Name | Out-Null<br>    if ($LASTEXITCODE -ne 0) {<br>      throw &quot;Failed to disconnect $Name from $DockerNetwork.&quot;<br>    }<br>  }<br>  docker network connect --ip $RequiredIP $DockerNetwork $Name<br>  if ($LASTEXITCODE -ne 0) {<br>    throw &quot;Failed to connect $Name to $DockerNetwork using $RequiredIP.&quot;<br>  }<br>  if ($wasRunning) { docker start $Name | Out-Null }<br>}<br><br>if (-not (Test-Docker)) {<br>  Start-Process &quot;C:\Program Files\Docker\Docker\Docker Desktop.exe&quot;<br>  $ready = $false<br>  foreach ($attempt in 1..60) {<br>    Start-Sleep -Seconds 2<br>    if (Test-Docker) { $ready = $true; break }<br>  }<br>  if (-not $ready) { throw &quot;Docker Desktop did not become ready.&quot; }<br>}<br><br>docker network inspect $DockerNetwork *&gt; $null<br>if ($LASTEXITCODE -ne 0) {<br>  docker network create --driver bridge --subnet 172.20.0.0/16 `<br>    --gateway 172.20.0.1 $DockerNetwork | Out-Null<br>}<br><br>$previousErrorActionPreference = $ErrorActionPreference<br>$ErrorActionPreference = &quot;Continue&quot;<br>$composeOutput = docker compose -f $ComposeFile up -d 2&gt;&amp;1<br>$composeExitCode = $LASTEXITCODE<br>$ErrorActionPreference = $previousErrorActionPreference<br>$composeOutput | ForEach-Object { Write-Host $_ }<br>if ($composeExitCode -ne 0) {<br>  throw &quot;Docker Compose failed with exit code $composeExitCode.&quot;<br>}<br>Set-FixedNetworkIP &quot;floci-floci-1&quot; &quot;172.20.0.6&quot;<br><br>foreach ($attempt in 1..60) {<br>  $health = docker inspect floci-floci-1 `<br>    --format &quot;{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}&quot; 2&gt;$null<br>  if ($health -eq &quot;healthy&quot;) { break }<br>  Start-Sleep -Seconds 2<br>}<br><br>Start-ContainerIfStopped $K3sContainer<br>Set-FixedNetworkIP $K3sContainer &quot;172.20.0.4&quot;<br><br>$RdsContainer = docker ps -a --format &quot;{{.Names}}&quot; |<br>  Where-Object { $_ -like &quot;floci-rds-*&quot; } | Select-Object -First 1<br>if ($RdsContainer) {<br>  Start-ContainerIfStopped $RdsContainer<br>  Set-FixedNetworkIP $RdsContainer &quot;172.20.0.3&quot;<br>}<br><br>kubectl config use-context $KubeContext | Out-Null<br>$nodeReady = $false<br>$previousErrorActionPreference = $ErrorActionPreference<br>$ErrorActionPreference = &quot;Continue&quot;<br>try {<br>  foreach ($attempt in 1..150) {<br>    kubectl get nodes *&gt; $null<br>    if ($LASTEXITCODE -eq 0) {<br>      kubectl wait --for=condition=Ready node --all --timeout=10s *&gt; $null<br>      if ($LASTEXITCODE -eq 0) { $nodeReady = $true; break }<br>    }<br>    Start-Sleep -Seconds 2<br>  }<br>}<br>finally {<br>  $ErrorActionPreference = $previousErrorActionPreference<br>}<br>if (-not $nodeReady) {<br>  throw &quot;The Kubernetes node did not become ready within five minutes.&quot;<br>}<br><br>kubectl rollout status deployment/ingress-nginx-controller `<br>  -n ingress-nginx --timeout=180s<br><br>$portForward = Get-CimInstance Win32_Process | Where-Object {<br>  $_.CommandLine -match &quot;port-forward&quot; -and<br>  $_.CommandLine -match &quot;8080:80&quot;<br>}<br>if (-not $portForward) {<br>  Start-Process (Get-Command kubectl).Source `<br>    -ArgumentList @(&quot;port-forward&quot;,&quot;--address&quot;,&quot;127.0.0.1&quot;,<br>      &quot;-n&quot;,&quot;ingress-nginx&quot;,<br>      &quot;service/ingress-nginx-controller&quot;,&quot;8080:80&quot;) `<br>    -RedirectStandardOutput &quot;$LogDirectory\ingress-port-forward.log&quot; `<br>    -RedirectStandardError &quot;$LogDirectory\ingress-port-forward.error.log&quot; `<br>    -WindowStyle Hidden<br>  Start-Sleep -Seconds 5<br>}<br><br>$ngrok = Get-CimInstance Win32_Process | Where-Object {<br>  $_.CommandLine -match &quot;127.0.0.1:8080&quot; -and<br>  $_.CommandLine -match &quot;default.internal&quot;<br>}<br>if (-not $ngrok) {<br>  Get-Process ngrok -ErrorAction SilentlyContinue | Stop-Process -Force<br>  Start-Process $NgrokExe `<br>    -ArgumentList @(&quot;http&quot;,&quot;http://127.0.0.1:8080&quot;,<br>      &quot;--url&quot;,&quot;https://default.internal&quot;,<br>      &quot;--log&quot;,&quot;$LogDirectory\ngrok.log&quot;,&quot;--log-format&quot;,&quot;json&quot;) `<br>    -RedirectStandardOutput &quot;$LogDirectory\ngrok-output.log&quot; `<br>    -RedirectStandardError &quot;$LogDirectory\ngrok-error.log&quot; `<br>    -WindowStyle Hidden<br>  Start-Sleep -Seconds 8<br>}<br><br>$runtimeReady = $false<br>foreach ($attempt in 1..60) {<br>  $pods = kubectl get pods -n $Namespace -o json | ConvertFrom-Json<br>  $runtimePods = @($pods.items | Where-Object {<br>    $_.status.phase -eq &quot;Running&quot;<br>  })<br>  foreach ($pod in $runtimePods) {<br>    $statuses = @($pod.status.containerStatuses)<br>    if ($statuses.Count -gt 0 -and<br>        @($statuses | Where-Object { -not $_.ready }).Count -eq 0) {<br>      $runtimeReady = $true<br>      Write-Host &quot;Mendix runtime is ready: $($pod.metadata.name)&quot;<br>      break<br>    }<br>  }<br>  if ($runtimeReady) { break }<br>  Start-Sleep -Seconds 10<br>}<br><br>$available = $false<br>if ($runtimeReady) {<br>  foreach ($attempt in 1..12) {<br>    try {<br>      $response = Invoke-WebRequest -Uri $PublicURL -UseBasicParsing -TimeoutSec 20<br>      if ($response.StatusCode -eq 200) { $available = $true; break }<br>    } catch { }<br>    Start-Sleep -Seconds 10<br>  }<br>}<br><br>if (-not $available) { throw &quot;Public Mendix URL did not return HTTP 200.&quot; }<br>Write-Host &quot;Floci Mendix lab is ready: $PublicURL&quot; -ForegroundColor Green<br>kubectl get pods -n $Namespace</pre><h3>Validate the final script</h3><p>The final restart-safe version contains three important corrections. Set-FixedNetworkIP disconnects only when a container is already attached. Docker Compose and the Kubernetes readiness loop temporarily tolerate expected native stderr while retaining explicit exit-code checks. The port-forward binds to 127.0.0.1 and ngrok targets <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>, avoiding the IPv6 localhost failure at ::1. The script waits up to 10 minutes for the runtime before validating the public URL.</p><pre>$syntaxErrors = $null<br>[System.Management.Automation.Language.Parser]::ParseFile(<br>  &quot;D:\Floci\scripts\Start-FlociLab.ps1&quot;,<br>  [ref]$null,<br>  [ref]$syntaxErrors<br>) | Out-Null<br>$syntaxErrors</pre><p>No output means the PowerShell syntax is valid. Run the script once before registering it.</p><pre>powershell.exe -NoProfile -ExecutionPolicy Bypass `<br>  -File &quot;D:\Floci\scripts\Start-FlociLab.ps1&quot;</pre><h3>Create the hidden VBS launcher</h3><p>Save this file as D:\Floci\scripts\Start-FlociLab.vbs. WScript launches the PowerShell recovery script with window style 0, waits for its exit code, and records all startup output without leaving a visible terminal open.</p><pre>Set shell = CreateObject(&quot;WScript.Shell&quot;)<br><br>command = &quot;powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command &quot;&quot;&amp; &#39;D:\Floci\scripts\Start-FlociLab.ps1&#39; *&gt; &#39;D:\Floci\scripts\logs\scheduled-task.log&#39;&quot;&quot;&quot;<br><br>exitCode = shell.Run(command, 0, True)<br><br>WScript.Quit exitCode</pre><h3>Run automatically at Windows sign-in</h3><pre>$taskAction = New-ScheduledTaskAction `<br>  -Execute &quot;wscript.exe&quot; `<br>  -Argument &#39;&quot;D:\Floci\scripts\Start-FlociLab.vbs&quot;&#39;<br><br>$taskTrigger = New-ScheduledTaskTrigger `<br>  -AtLogOn `<br>  -User $env:USERNAME<br>$taskTrigger.Delay = &quot;PT2M&quot;<br><br>$taskSettings = New-ScheduledTaskSettingsSet `<br>  -StartWhenAvailable `<br>  -ExecutionTimeLimit ([TimeSpan]::Zero) `<br>  -MultipleInstances IgnoreNew `<br>  -Hidden<br><br>$taskPrincipal = New-ScheduledTaskPrincipal `<br>  -UserId &quot;$env:USERDOMAIN\$env:USERNAME&quot; `<br>  -LogonType Interactive `<br>  -RunLevel Highest<br><br>Register-ScheduledTask `<br>  -TaskName &quot;Start Floci Mendix Lab&quot; `<br>  -Action $taskAction `<br>  -Trigger $taskTrigger `<br>  -Settings $taskSettings `<br>  -Principal $taskPrincipal `<br>  -Description &quot;Restores the Floci Mendix lab two minutes after Windows sign-in&quot; `<br>  -Force<br><br># Disable the obsolete task that opened a visible PowerShell window.<br>Disable-ScheduledTask -TaskName &quot;Mendix Local Startup&quot;<br><br>Start-ScheduledTask -TaskName &quot;Start Floci Mendix Lab&quot;<br>Start-Sleep -Seconds 30<br>Get-ScheduledTaskInfo -TaskName &quot;Start Floci Mendix Lab&quot; |<br>  Select-Object LastRunTime, LastTaskResult, NextRunTime</pre><p>Verified final result on 13 September 2026: LastTaskResult was 0 after an actual Windows restart. Docker starts at sign-in, the recovery task begins after a two-minute delay, the VBS launcher keeps PowerShell hidden, and the IPv4 port-forward and ngrok tunnel run without visible windows. The Mendix runtime reached 2/2 Running, Agent and Operator reached 1/1 Running, and the public URL returned HTTP 200.</p><h3>Final validation and operating notes</h3><p>CheckExpected resultdocker inspect floci-floci-1Healthy; floci_default=172.20.0.6docker inspect floci-rds-*floci_default=172.20.0.3docker inspect K3s containerfloci_default=172.20.0.4kubectl get nodesOne Ready control-plane nodekubectl get pods -n mendix-flociAgent 1/1, Operator 1/1, runtime 2/2kubectl get pods -n ingress-nginxController 1/1 RunningMendix PortalNetwork, Storage, Database, Service Account, Build, Runtime greenInvoke-WebRequest public URLHTTP 200 OKScheduled taskLastTaskResult 0</p><h3>Normal startup behavior</h3><ul><li>The Kubernetes API and containers can take several minutes to become ready after Docker Desktop starts.</li><li>A runtime pod can temporarily report readiness HTTP 500 while Mendix initializes.</li><li>The public URL is unavailable until both kubectl port-forward and the ngrok agent are running.</li><li>Use 127.0.0.1 explicitly for both port-forward and ngrok; localhost can resolve to IPv6 ::1 and cause a refused private-leg connection.</li><li>The exact free ngrok hostname supports one environment at a time. Multiple environment subdomains require a wildcard-capable domain or separate endpoints.</li><li>The startup script writes host-process logs under D:\Floci\scripts\logs. Task Scheduler may remain “<strong>Running</strong>” while the script waits; LastTaskResult becomes 0 after completion.</li><li>Keep Mendix Local Startup disabled. It is the obsolete duplicate task that opened a visible Administrator PowerShell window.</li></ul><h3>Safe recovery order</h3><blockquote>1. Run D:\Floci\scripts\Start-FlociLab.ps1.</blockquote><blockquote>2. Confirm the three fixed Docker addresses.</blockquote><blockquote>3. Confirm the floci-mendix context and Ready node.</blockquote><blockquote>4. Confirm ingress-nginx, Agent, Operator, and runtime pods.</blockquote><blockquote>5. Inspect only the failing component logs; never publish full secrets or unredacted custom resource YAML.</blockquote><blockquote>6. Validate the public URL with Invoke-WebRequest.</blockquote><h4>Read more</h4><ul><li><a href="https://docs.mendix.com/developerportal/deploy/private-cloud/">Mendix on Kubernetes</a></li><li><a href="https://docs.mendix.com/developerportal/deploy/standard-operator/">Running the Mendix Operator in Standard Mode</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0ca099ca0115" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/deploy-mendix-on-a-local-floci-kubernetes-lab-0ca099ca0115">Deploy Mendix on a Local Floci Kubernetes Lab</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fire and Forget: Why Mendix Needed a Broker]]></title>
            <link>https://medium.com/mendix/fire-and-forget-why-mendix-needed-a-broker-49693fcb5b7b?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/49693fcb5b7b</guid>
            <category><![CDATA[business-event]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[tips]]></category>
            <dc:creator><![CDATA[Vishnu Prasath T A]]></dc:creator>
            <pubDate>Tue, 13 Oct 2026 11:20:43 GMT</pubDate>
            <atom:updated>2026-10-13T11:20:27.350Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Fire and Forget: Why Mendix Needed a Broker (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*BRSykB39eiFYytILt7yo6g.png" /><figcaption>Fire and Forget: Why Mendix Needed a Broker</figcaption></figure><h4>Three ways to get one app to tell another app something happened. They are not interchangeable.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W0aNYGJMRga9-QsEZbReZQ.png" /></figure><h3>The scenario</h3><p>An <strong>e-commerce platform</strong> cancels an order. Three other systems need to know:</p><ul><li><strong>Shipping</strong> — stop the shipment</li><li><strong>Notifications</strong> — email the customer</li><li><strong>Analytics</strong> — log the cancellation</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1NNiPNQEW8YgAh2DwXlpDw.jpeg" /></figure><h3>Option 1 — API calls</h3><pre>Order app → POST /shipping/cancel      → waits for 200 OK<br>Order app → POST /notifications/send   → waits for 200 OK<br>Order app → POST /analytics/log        → waits for 200 OK</pre><p><strong>Example:</strong> the Order app’s cancellation microflow calls three REST endpoints, one after another, each with the order ID in the request body. If the Notifications service is mid-deploy and returns a 503, the whole cancellation flow either fails or has to retry that one call — while the customer is sitting on a “cancelling your order…” spinner.</p><ul><li>Order app must know all three endpoints, by name, in advance</li><li>All three must be online <strong>right now</strong></li><li>Add a Refunds service later → go edit the Order app’s cancellation microflow</li><li>One slow responder → the whole chain slows down</li></ul><p><strong>Tightly coupled. Synchronous. Fragile at scale.</strong></p><h3>Option 2 — RabbitMQ</h3><pre>Order app → publishes to &quot;order_exchange&quot;<br>             routing key: &quot;order.cancelled&quot;<br>             payload: {&quot;orderId&quot;: &quot;4471&quot;, &quot;reason&quot;: &quot;customer_request&quot;}</pre><p><strong>Example:</strong> the Order app publishes once to the exchange, with that routing key. A shipping_queue and a notifications_queue are both bound to order.cancelled. Both receive a copy. If the Notifications service happens to be down for maintenance, the message just sits in notifications_queue — nothing is lost, nothing retries on the Order app&#39;s side, and the Order app already moved on the moment it published.</p><ul><li>Order app doesn’t know who’s listening, or how many</li><li>Consumers subscribe independently, by binding a queue to the exchange</li><li>Add a Refunds consumer later → bind a new queue with the same routing key. Order app’s code: untouched</li><li>A down consumer doesn’t block the publisher — the message just waits</li></ul><p><strong>Loosely coupled. Fire-and-forget. The broker is self-hosted.</strong></p><h3>Option 3 — Mendix Business Events</h3><pre>Order app → &quot;Publish business event&quot;<br>             Subject: &quot;Order cancelled&quot;<br>             Event data: $CancelledOrder (orderId, reason)<br>             → Mendix Event Broker → subscriber apps</pre><p><strong>Example:</strong> a Shipping app, built separately in Mendix, subscribes to the OrderCancelled event. Mendix auto-generates a Handle_BE_OrderCancelled microflow in that app. The moment the Order app&#39;s microflow publishes and commits successfully, the Shipping app&#39;s handler fires — no polling, no manual &quot;check if anything&#39;s new&quot; step on either side.</p><ul><li>Same loose-coupling idea as RabbitMQ, without touching Java or Docker</li><li>Subscriber microflows fire <strong>automatically</strong> the instant the event lands</li><li>Publishing rolls back automatically if the publishing microflow’s transaction fails</li></ul><p><strong>Loosely coupled and Push-based. Mendix runs the broker.</strong></p><h3>The catch with Business Events</h3><ul><li><strong>Mendix apps only.</strong> A non-Mendix system — a Java backend, a .NET service, a third-party SaaS webhook — cannot publish directly into it.</li><li><strong>Needs a paid Event Broker license</strong> to run in Mendix Cloud production.</li><li><strong>No self-hosting option</strong> for the broker piece — the infrastructure is Mendix’s, not the developer’s.</li></ul><h3>Side by side</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EJlcbkGgZ3l-w_gXPlorMw.jpeg" /></figure><h3>Which one, when</h3><ul><li><strong>API call</strong> — a response is genuinely needed back, right now, from one specific system</li><li><strong>RabbitMQ</strong> — external or non-Mendix systems are involved, or the broker needs to be self-hosted</li><li><strong>Business Events</strong> — pure Mendix-to-Mendix, with no interest in building or running broker infrastructure</li></ul><h4>Read More</h4><p><a href="https://docs.mendix.com/appstore/services/event-broker/">Mendix Event Broker</a></p><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=49693fcb5b7b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/fire-and-forget-why-mendix-needed-a-broker-49693fcb5b7b">Fire and Forget: Why Mendix Needed a Broker</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Setting Up the Event Broker for Mendix Business Events]]></title>
            <link>https://medium.com/mendix/quick-hack-series-part-6-setting-up-the-event-broker-for-mendix-business-events-part-2-6004f5736ca0?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/6004f5736ca0</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[tips]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[event-broker]]></category>
            <dc:creator><![CDATA[Gurumoorthy J]]></dc:creator>
            <pubDate>Thu, 08 Oct 2026 11:18:59 GMT</pubDate>
            <atom:updated>2026-10-08T11:18:58.319Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Setting Up the Event Broker for Mendix Business Events : Quick Hack Series Part 6 (Continued) —( Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*X3wxfmu7UrCRYkeV-Ru03w.png" /><figcaption>Setting Up the Event Broker for Mendix Business Events : Quick Hack Series Part 6 (Continued)</figcaption></figure><h4>Quick Hack Series Part 6 (Continued)</h4><h4>In my <a href="https://medium.com/@gurumoorthysutha/quick-hack-series-part-5-getting-started-with-mendix-business-events-publishing-part-1-cdf1985eafef">previous post</a> on Business Events, we created a Business Event Service and published our first event from a microflow. But an event with nowhere to go isn’t very useful; that’s where the <strong>Event Broker</strong> comes in.</h4><p>The Event Broker is the piece that actually moves your events between apps. It sits in the middle, receives what gets published, and delivers it to anyone subscribed. In this part, we’ll set up a <strong>local Event Broker using Docker</strong>, so you can model, publish, and test the full round trip entirely on your own workstation before touching Mendix Cloud or a licensed broker.</p><blockquote>Note: you can still get your own Kafka cluster and use it for on-prem also.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v_n8_WuPefp2wDphzqA1ww.png" /></figure><h3>Why You Need This Before You Can Test Anything</h3><p>Studio Pro lets you define publishers and subscribers without a broker running — the modeling works fine. But the moment you actually <strong>run</strong> your app and hit that Publish Event activity, it needs somewhere to send the message. Locally, that “somewhere” is a Kafka broker running in Docker.</p><h4>Prerequisites</h4><ul><li>Docker Desktop installed and running</li><li>Git (to clone the setup repo)</li><li>A Mendix app with at least one Business Event Service already modeled (see Part 1 if you haven’t done this yet)</li></ul><h4>Step 1: Clone the Event Broker Tools Repository</h4><p>Mendix publishes an official helper repo that spins up Kafka and Zookeeper locally with a single command:</p><pre>git clone https://github.com/mendix/event-broker-tools.git</pre><p>This gives you a local-setup folder containing a docker-compose.yml that&#39;s pre-configured for Mendix Business Events modeling.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s6x8bF_J2MDAxYFeY1e7mA.png" /></figure><h4>Step 2: Start the Local Broker</h4><p>Navigate into the local-setup folder and run:</p><pre>docker-compose up</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QZZtZioOmF6HXOqM3UP9xQ.png" /></figure><p>Docker will pull the required images (Zookeeper and Kafka) and start both containers. You should see something like this in your terminal once it’s up:</p><pre>[+] Running 2/2<br> ✔ Container zk     Running<br> ✔ Container kafka   Running</pre><p>Leave this terminal open — this is your local broker running in the foreground. You’ll see periodic controller log lines (leader election checks) every few minutes; that’s completely normal steady-state Kafka behavior, not an error.</p><blockquote><strong><em>Tip:</em></strong><em> If you see </em><em>InvalidReceiveException warnings early on referencing a Docker network IP, don&#39;t worry — that&#39;s typically just Kafka rejecting a malformed probe against the port, not something from your Mendix app.</em></blockquote><h4>Step 3: Point Studio Pro at the Local Broker</h4><p>Back in Studio Pro, the Business Events module reads two constants to know where to send and receive events:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/665/1*p-49dFK5KtgB_ew9Qj4OFw.png" /></figure><ol><li>Open the BusinessEvents module and open the UseMe folder -&gt; Local; there you will see a constant called ChannelName. Set it to ‘local’.</li><li>Open the Security module and set the ServerUrl to localhost:9092</li></ol><p>This is the default when Docker Desktop runs natively on Windows or macOS — no VM IP lookup needed for most setups)</p><h4>Step 4: Run and Test</h4><p>Start your Mendix app in Studio Pro using this configuration, then trigger the microflow that publishes your event (from Part 1’s PBE_LDMScript example, or whatever entity you&#39;ve modeled).</p><p>To confirm the event actually landed on the broker, you can watch the topic directly from your terminal:</p><pre>docker exec kafka /bin/kafka-console-consumer --topic local --from-beginning --bootstrap-server kafka:19092</pre><p>Note the port here is different from what you set in Studio Pro — 9092 is the listener exposed to your host machine, while 19092 is Kafka&#39;s internal listener used for container-to-container traffic (in this case, the console consumer running inside the same Docker network).</p><p>If everything’s wired up correctly, you’ll see your event’s JSON payload — including the CloudEvents-standard headers we touched on in Part 1 — show up in this terminal the moment your microflow commits the published entity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*4wv5KU_q-5C1rB7aMxvFtQ.png" /></figure><h4>What’s Next</h4><p>With the broker running locally, you’re set up to test publishing end-to-end. In <strong>Part 3</strong>, we’ll build the subscriber side — importing the AsyncAPI contract exported from your publishing app, and wiring up the auto-generated Handle_BE microflow to actually react to the event.</p><p><strong>Give this a try, and let me know how it goes — drop a comment if you hit any snags getting your local broker running!</strong></p><p><strong>Until next time, keep building and keep hacking!</strong></p><h4>Read more</h4><ul><li><a href="https://docs.mendix.com/appstore/services/event-broker/">Mendix Event Broker</a></li><li><a href="https://docs.mendix.com/appstore/services/business-events/">Mendix Business Events</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6004f5736ca0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/quick-hack-series-part-6-setting-up-the-event-broker-for-mendix-business-events-part-2-6004f5736ca0">Setting Up the Event Broker for Mendix Business Events</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mendix in Docker, One Command]]></title>
            <link>https://medium.com/mendix/mendix-in-docker-one-command-781154324dc6?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/781154324dc6</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[tips]]></category>
            <dc:creator><![CDATA[Vishnu Prasath T A]]></dc:creator>
            <pubDate>Fri, 02 Oct 2026 11:44:18 GMT</pubDate>
            <atom:updated>2026-10-02T11:44:17.422Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Mendix in Docker, One Command (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*G_F-LBOoGrDjHtaYVum8Gw.png" /><figcaption>Mendix in Docker, One Command</figcaption></figure><h3>How One npm Command (And a Lot of Stubborn Debugging) Turned My Terminal Into a Headless Mendix Studio</h3><h3>The itch 🤔</h3><p>If you’ve used Mendix, you know Studio Pro — the big, friendly visual editor where you click your way to an app. It’s great. But it’s also a <em>window you have to open</em>, a GUI you have to drive by hand.</p><p>I had a different idea:</p><blockquote><em>What if my AI assistant could build, check, and run a Mendix app entirely from the command line — and I never had to open Studio Pro at all?</em></blockquote><p><strong><em>Spoiler:</em></strong> it can. And the journey to get there was equal parts “wow, this actually works” and “why is this build hanging for 39 minutes?” 😅</p><p>Grab a coffee — this one’s a ride!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qVQproiQL7qvEc5crTpQiA.png" /><figcaption>npx mx-studio-automate</figcaption></figure><h3>First, a myth to bust 🧨</h3><p>When people hear “Mendix without Studio Pro,” they assume I’m <em>faking</em> or <em>emulating</em> Mendix. Nope.</p><p>Studio Pro is really just a dashboard wrapped around real engines:</p><ul><li>🖱️ Click in the domain model / pages → the model engine that reads &amp; writes the .mpr</li><li>🔴 See red error markers → mxbuild / mx check</li><li>▶️ Hit Run Locally → builds the app + spins up a runtime + a database</li></ul><p>My setup just drives those same engines from the terminal — the <em>real</em> mxbuild.exe, the <em>real</em> Mendix runtime. Two steering wheels, one engine.</p><blockquote><em>“It’s not a simulator. It’s the same Mendix machinery — just headless.”</em></blockquote><h3>The cast of characters 🎭</h3><p>To go GUI-free, my AI agent needs four tools working together:</p><ul><li>🛠️ mxcli — edits the Mendix model from the command line</li><li>🔎 mxbuild — the error checker (same one Studio Pro uses)</li><li>🐳 Docker — runs the app + a Postgres database in containers</li><li>🔬 Chrome DevTools — lets the agent verify the running UI</li></ul><p>The problem? Setting all of that up by hand, on a fresh machine, is a <em>chore</em>. So I packaged it.</p><h3>Enter: mx-studio-automate ✨</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ak0QybQBfB_RXTUGpLVmUg.png" /><figcaption>One command checks (and fixes) your whole environment.</figcaption></figure><p>One command:</p><pre>npx mx-studio-automate</pre><p>It scans your machine, auto-installs the safe stuff, and gives you copy-paste instructions for the heavy stuff (like Docker, which needs admin rights). It even wires up the AI agent’s config so it’s ready immediately.</p><pre>mx-studio-automate  v0.3.0<br>✔  mxcli            found   v1.4.0<br>✔  mxbuild          found   11.10.0<br>✔  JDK 21           found   21.0.11<br>✔  Docker           found   29.3.1<br>✔  Chrome DevTools  found<br>✔  AI agent config  found<br>🎉  All set!</pre><p>Safe to re-run any time — it only ever fills the gaps.</p><blockquote><em>❓ Reader check: How long does setting up a new dev environment usually take you — minutes, or a “clear your afternoon” kind of thing? 👇</em></blockquote><h3>The headline trick: build and run, no Studio Pro 🚀</h3><pre>npx mx-studio-automate --run</pre><p>Behind the scenes it does the whole Mendix deployment dance:</p><ol><li>Generates a Docker stack (app + Postgres)</li><li>Builds the app package with mxbuild</li><li>Boots it all in Docker</li><li>Hands you a live URL</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IzL2PSvwJaOj77pVkH5vaQ.png" /><figcaption>A real Mendix app, running in Docker, launched from one terminal command.</figcaption></figure><p>And because builds can be slow and silent, I added a live loader so you always know it’s alive (and won’t rage-quit mid-build):</p><pre>⠹  Building app package… 1m 12s — please don&#39;t close this window</pre><p>Then, for the edit→see loop, there’s --reload — a hot reload that pushes your changes into the <em>already-running</em> app in seconds, no cold restart:</p><pre>npx mx-studio-automate --reload          # rebuild + reload<br>npx mx-studio-automate --reload --css    # styling only, instant</pre><blockquote><em>💡 Tip: After the first </em><em>--run, you never cold-start again. Edit → </em><em>--reload → refresh browser. That&#39;s the whole loop.</em></blockquote><h3>A little terminal eye-candy 🎨</h3><p>Because if you’re going to stare at a CLI all day, it might as well be pretty. The intro draws itself in — mx as a faint outline, studio in crisp white, automate in Mendix blue:</p><pre> _ __ ___ __  __<br>| &#39;_ ` _ \ \/ /<br>| | | | | |&gt;  &lt;<br>|_| |_| |_/_/\_\<br>    _             _  _<br> ___| |_ _   _  __| (_) ___<br>/ __| __| | | |/ _` | |/ _ \<br>\__ \ |_| |_| | (_| | | (_) |<br>|___/\__|\__,_|\__,_|_|\___/<br>             _                        _<br>  __ _ _   _| |_ ___  _ __ ___   __ _| |_ ___<br> / _` | | | | __/ _ \| &#39;_ ` _ \ / _` | __/ _ \<br>| (_| | |_| | || (_) | | | | | | (_| | ||  __/<br>\__,_|\__,_|\__\___/|_| |_| |_|\__,_|\__\___|</pre><blockquote><em>🎬 GIF — Record the intro animation (mx → studio → automate revealing top-to-bottom) and drop a short looping GIF here. Tools: ScreenToGif (Windows) / Kap (macOS). </em>Caption:<em> “Yes, I spent an embarrassing amount of time on a terminal banner. Worth it.”</em></blockquote><h3>So… should you use it? 🧭</h3><p>If you’re a Mendix developer who:</p><ul><li>💻 lives in the terminal,</li><li>🤖 wants an AI agent to drive your project,</li><li>🐳 likes running apps in Docker, and</li><li>🙅 would rather not open a heavy IDE just to check for errors —</li></ul><p>…then give it a spin:</p><pre>npx mx-studio-automate</pre><p>It’s open source, MIT-licensed, and on npm. ⭐</p><h3>What I learned 📚</h3><ul><li>The “magic” of low-code tools is just real tooling with a nice UI — and you can absolutely reach the tooling directly.</li><li>A good CLI is honest: do the safe magic, but tell the user clearly when <em>they</em> need to act.</li><li>Half of shipping a dev tool is debugging other people’s environments — spaces in paths, stale cookies, version twins, hidden prompts.</li><li>And a little terminal polish goes a long way. 💙</li></ul><h3>👋 Your turn</h3><p>Have you ever ditched a GUI for the command line and never looked back? Or is there a tool you wish had a headless mode? Drop it in the responses — I read every one.</p><p><em>If this was useful, a few 👏 claps help more people find it. Thanks for reading!</em></p><p>Read more</p><ul><li><a href="https://docs.mendix.com/developerportal/deploy/docker-deploy/">Docker Buildpack</a></li><li><a href="https://docs.mendix.com/developerportal/deploy/docker-deploy-pad/">Reference Guide for Docker Deployment</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=781154324dc6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/mendix-in-docker-one-command-781154324dc6">Mendix in Docker, One Command🐳</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Top Generative AI Features in Mendix You Should Start Using Today]]></title>
            <link>https://medium.com/mendix/top-generative-ai-features-in-mendix-you-should-start-using-today-4ab13459511b?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/4ab13459511b</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Aravindh Saminathan]]></dc:creator>
            <pubDate>Thu, 24 Sep 2026 10:01:08 GMT</pubDate>
            <atom:updated>2026-09-24T10:01:08.381Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sneHw8JrP9QaXnu7tm54-g.png" /></figure><p><strong>The GenAI Build Gets Serious</strong></p><p>A focused guide to the release features that make AI-enabled applications more governable, more connected, and easier to build.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*DgYtRZO9R2-TmR9sokVfbQ.png" /></figure><h3>What is GenAI? A quick primer</h3><p>Generative artificial intelligence, or GenAI, is a class of AI that can create new content or take action from patterns learned in data. It can generate text, summarize documents, classify information, answer questions, create images or code, and support decisions through natural-language interaction.</p><p>In a business application, GenAI is most useful when it is connected to the right context and the right action. A model may generate an answer, but the application still needs to provide trusted data, apply access rules, call approved tools, and record what happened. That is why enterprise GenAI is broader than a chatbot: it combines models, knowledge, business logic, user experience, and governance.</p><p><strong>A USEFUL MENTAL MODEL:</strong></p><pre>GenAI supplies the reasoning and content-generation layer. <br>Mendix supplies the application model, workflow, data, integrations, <br>and controls that turn that capability into a business process.</pre><h3>What GenAI is available in Mendix 11.13.0?</h3><h4>The Mendix GenAI toolbox</h4><p>Mendix 11.13.0 brings several GenAI capabilities together. Some are platform services, some are development assistants, and some are reusable modules or connectors. The right choice depends on whether you are building an AI-assisted development workflow, a user-facing GenAI feature, or an autonomous agent that can use business tools.</p><p><strong>Maia Make:</strong></p><pre>AI-assisted development in Studio Pro. <br>In 11.13, Maia Make can use full expression error details to help <br>resolve validation problems and improve iteration quality.</pre><p><strong>Maia agent skills:</strong></p><pre>Contextual guidance for selected modules. Skill.md files in GenAI Commons, <br>Agent Commons, Conversational UI, and the Mendix Cloud GenAI Connector <br>help Maia understand those modules more specifically.</pre><p><strong>Agent Editor and Agents Kit 2.1:</strong></p><pre>A foundation for creating and configuring agentic applications, <br>including model, knowledge-base, and microflow-tool connections.</pre><p><strong>Azure AI Foundry support:</strong></p><pre>A model-provider option in the Agent Editor. <br>Teams can select Azure AI and connect agents to text-generation models <br>through their existing Azure environment.</pre><p><strong>GenAI Resource Packs:</strong></p><pre>A managed way to monitor GenAI consumption. Mendix 11.13 adds Model and <br>Key filters across GenAI Units, input and output tokens, and API calls.</pre><p><strong>GenAI Commons:</strong></p><pre>Reusable building blocks for GenAI-enabled applications, <br>helping teams avoid rebuilding common patterns for every project.</pre><p><strong>Agent Commons:</strong></p><pre>Reusable components and patterns for agentic application scenarios, <br>including support for agent health validation and <br>agent-related capabilities.</pre><p><strong>Conversational UI:</strong></p><pre>Reusable user-interface capabilities for conversational experiences,<br>connecting users to GenAI-backed interactions inside a Mendix application.</pre><p><strong>Mendix Cloud GenAI Connector:</strong></p><pre>A connector for integrating Mendix applications with GenAI services and <br>using cloud-based GenAI capabilities within application workflows.</pre><p><strong>Data Importer with Maia:</strong></p><pre>A native Studio Pro capability that can use an example CSV row to help <br>configure import mapping and create the necessary entity structure, <br>accelerating data preparation for AI use cases.</pre><h3>At a glance, Mendix makes GenAI more operational</h3><p>Mendix 11.13.0 is an important step in the platform’s GenAI story because it focuses on the parts of AI adoption that become unavoidable after the first demo: visibility, provider choice, agent health, reusable skills, and dependable developer workflows.</p><p>The release adds Model and Key filters to GenAI Resource Pack consumption views, brings Azure AI Foundry into the Agent Editor through Agents Kit 2.1, gives agent teams more support through module-specific Maia skills, and adds health checks that surface missing models, knowledge bases, or microflow tools before an agent version is used in production.</p><p>It also improves the surrounding development loop. Maia Make can work with full expression error details, the Data Importer is native in Studio Pro with Maia support, and module updates can preserve local customizations. Together, the features point toward a practical message: GenAI should be built as a governed business capability, not treated as a disconnected experiment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/857/1*WfsSmVsZCYhqT_ugmoN1hQ.jpeg" /></figure><h3><strong>GenAI operations</strong></h3><h4>AI consumption becomes explainable</h4><p>The first sign of a mature GenAI platform is not a more impressive prompt. It is a better answer to the question: where did the usage come from? In 11.13, the Consumption page for GenAI Resource Packs adds Model and Key filters.</p><p>The filters apply across GenAI Units, input and output tokens, and API calls. A team can select a model to understand its share of consumption, or use a resource key to attribute usage to the application or integration behind it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/629/1*Rm_r_N0wUxYC2ZE_OvzR9g.png" /><figcaption><em>GenAI governance is easier when usage can be traced to a model, key, application, or integration.</em></figcaption></figure><h4><strong>Why this changes the operating conversation</strong></h4><p>Shared AI infrastructure needs shared visibility.</p><p>When several apps use the same GenAI Resource Pack, a single total is not enough. The new filters can help teams investigate spikes, compare model usage, prepare internal chargeback views, and make more informed decisions about model selection and budgets.</p><blockquote><strong>Practical Starting Point</strong></blockquote><blockquote>Create a simple monthly review: top models, top resource keys, total tokens, and unexplained changes. Treat that view as the GenAI equivalent of an application operations dashboard.</blockquote><h3><strong>Agents Kit 2.1</strong></h3><h4>Agents get a broader model-provider path</h4><p>Agents Kit 2.1 adds Azure AI Foundry support in the Agent Editor. Teams can select Azure AI as the provider from the Configuration panel and connect an agent to Azure’s text-generation models.</p><p>For enterprises with existing Azure infrastructure, this is more than a connector checkbox. It gives AI builders a way to align agent development with an established cloud environment, identity model, procurement path, and internal governance process.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/566/1*9DJKHplSz41UetN3mfWusw.png" /><figcaption><em>Agent orchestration becomes an enterprise architecture decision: models, tools, people, and business processes need to work together.</em></figcaption></figure><h4>Which model provider should power which business capability?</h4><p>Avoid treating provider choice as a one-time platform decision. Compare models by task, data sensitivity, latency, cost, and operational ownership. The goal is not to make every agent use the same model; it is to make the choice deliberate and observable.</p><h3><strong>Maia and agentic applications</strong></h3><h4>AI-assisted development gets more contextual</h4><p>Mendix 11.13.0 adds Skill.md files to the GenAI Commons, Agent Commons, Conversational UI, and Mendix Cloud GenAI Connector modules. These files enable tailored Maia support so the assistant can better understand and guide users in the context of those modules.</p><p>That context matters because generic coding assistance often stops at syntax. In a model-driven platform, useful help needs to understand domain entities, microflows, module conventions, connector responsibilities, and the relationship between the visual model and the runtime behavior.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/1*gFujrJYTHCmUVDW9L6W6rA.png" /><figcaption><em>Contextual AI assistance is most useful when it can connect intent to the platform’s models, modules, and development conventions.</em></figcaption></figure><h4><strong>The developer benefit</strong></h4><p>Less time translating platform context into prompts.</p><p>Module-specific skills can help Maia provide guidance that is closer to the vocabulary and structures developers are already using. The result is not a replacement for architectural judgment; it is a shorter path from a question to a platform-aware answer.</p><h3><strong>Agent reliability</strong></h3><h4>Unhealthy agents are easier to find before production</h4><p>11.13 adds a scheduled health check on the agent overview page. It gives developers a clearer view of whether a version intended for production is missing a connected model, knowledge base, or microflow tool.</p><p>The check is also used when validating a version as In Use. That creates a useful guardrail at the moment an agent moves toward active use. Instead of discovering a broken association only inside version details or after a user reaches the agent, teams can surface the problem earlier.</p><ul><li>Check every model connection before a version is marked In Use.</li><li>Confirm that the knowledge base expected by the prompt flow is present and reachable.</li><li>Validate microflow tools as part of the agent’s release checklist.</li><li>Decide where an additional health check belongs in your app, such as an After Start Up action.</li></ul><blockquote><strong>Production principle</strong></blockquote><blockquote>An agent should be treated like a software release with dependencies, validation, and observable health — not like a prompt that happens to be available.</blockquote><h3><strong>Faster AI-assisted iteration</strong></h3><h4>Maia Make can see the real expression error</h4><p>Maia Make can now access full expression error details. Instead of working from a vague validation signal, Maia can use the exact issue to help resolve the problem proactively.</p><p>That shifts the developer’s attention from debugging mechanics back to business logic. In a visual development environment, this is especially valuable because the generated or edited logic may involve several layers: an expression, an entity relationship, a variable type, and a microflow context.</p><h4><strong>What to measure</strong></h4><p>Track time from validation error to successful run.</p><p>Teams evaluating the impact of Maia Make should measure more than generation speed. Look at time-to-resolution, number of manual corrections, repeated errors, and whether developers can explain why the final expression works.</p><h3><strong>Data importer + Maia</strong></h3><h4>Data ingestion becomes part of the GenAI loop</h4><p>The Data Importer is now fully native within Studio Pro and includes Maia support. A developer can provide Maia with an example row from a CSV file, and Maia can help set up the importer and map the CSV table into the necessary entities.</p><p>For GenAI applications, this matters because data preparation is often the step that slows down the journey from an idea to a useful AI experience. Whether the data becomes knowledge, reference content, customer context, or structured business records, a faster import path can improve experimentation without hiding the underlying model decisions.</p><blockquote><strong>Important boundary</strong></blockquote><blockquote>Use Maia to accelerate mapping, but review entity names, data types, validation rules, ownership, and sensitive fields before loading real business data.</blockquote><h3>Mendix 11.13.0 treats GenAI as a platform capability</h3><p>The GenAI story in Mendix 11.13.0 is not only about what an agent can generate. It is about what a team can see, validate, connect, and improve around that agent. Model and Key filters support governance. Azure AI Foundry adds provider flexibility. Tailored Maia skills add context. Health checks add an operational guardrail. Better error details and data import support make the build loop faster.</p><p>Teams that adopt these features thoughtfully can move beyond isolated AI demos. They can build agentic applications that fit business processes, use enterprise infrastructure, and remain understandable to the people responsible for running them.</p><h3><strong>Final thought</strong></h3><p>The real GenAI advantage is not having an answer. It is having a trustworthy path from question to action, with the controls to know when that path is working.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4ab13459511b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/top-generative-ai-features-in-mendix-you-should-start-using-today-4ab13459511b">Top Generative AI Features in Mendix You Should Start Using Today</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Managing Security for Page URLs and Deep Links in Mendix]]></title>
            <link>https://medium.com/mendix/managing-security-for-page-urls-and-deep-links-in-mendix-99f5ba7ed456?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/99f5ba7ed456</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[application-security]]></category>
            <category><![CDATA[tips]]></category>
            <dc:creator><![CDATA[Aishwarya Salunke]]></dc:creator>
            <pubDate>Tue, 22 Sep 2026 12:40:01 GMT</pubDate>
            <atom:updated>2026-09-22T12:40:00.131Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Managing Security for Page URLs and Deep Links in Mendix: Managing Security the right way (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*VMBTPYzVKLJ_oJVi5bvFxw.png" /><figcaption>Managing Security for Page URLs and Deep Links in Mendix: Managing Security the right way</figcaption></figure><h4>Managing Security the right way</h4><h4><strong>Sharing a direct link to a specific record or screen feels like a small convenience feature, until someone asks a genuinely important question: can a user access that link and see something they shouldn&#39;t?</strong></h4><p>This post covers how security actually works for page URLs and deep links in Mendix, the real difference between the two, and one specific gap worth knowing about before relying on either.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yqWYThv7lja-Norjm1InhA.png" /></figure><h3>What a Page URL and a Deep Link Actually Are</h3><p>A page URL is a direct, shareable link to a specific page in a Mendix app. You configure it in that page’s own properties, giving the page a custom, readable URL instead of relying purely on in-app navigation. A deep link, now built natively into Mendix as a microflow URL, works similarly but points to a microflow instead of a page, so custom logic can run first and decide what to show before the user lands on a page.</p><h4><strong>The practical difference</strong></h4><p>A page URL takes a user straight to a page. A deep link runs a microflow first, which then decides what happens next, whether that is showing a specific page, redirecting somewhere else, or running some logic based on the link’s parameters.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oAdsQa3M261s23p5M4VEzw.png" /></figure><h3>How security works for page URLs and deep links</h3><ul><li><strong>Same security system for both: </strong>page URLs and deep links (microflow URLs) both go through Mendix’s normal role-based access rules. Neither one is a separate or lesser security path.</li><li><strong>Access is checked on the destination, not the URL:</strong> the actual protection lives on the page’s access rules or the microflow’s logic, not on how the link looks or how hard it is to guess.</li><li><strong>Two possible outcomes after the check: </strong>a user either has the right role and the page opens normally, or they don’t, and Mendix redirects them to login (for logged-in-only content) or denies access outright.</li><li><strong>Anonymous access works the same way for both:</strong> if a page or microflow is deliberately configured to allow anonymous users, both page URLs and deep links will honor that; if it’s not, both will block it.</li><li><strong>A “hidden” link is not a security boundary: </strong>an obscure or hard-to-guess URL feels safer, but it provides zero real protection. Anyone with the link who lacks the right role still gets blocked, and anyone with the right role can reach it however they find it.</li><li><strong>Strict page URL checking only covers page URLs: </strong>This Studio Pro setting catches security misconfigurations, but it works only for pages with custom URLs. It cannot see or validate deep links because they are resolved at runtime, not known at design time.</li><li><strong>Deep links carry more manual responsibility:</strong> since strict checks can’t catch mistakes here, the microflow behind a deep link needs its own access rules to be double-checked manually rather than relying on an automatic warning.</li><li><strong>Review externally shared links specifically: </strong>anything sent in an email, embedded in a notification, or otherwise shared outside the app deserves a deliberate access-rule check, since these are the links most likely to end up somewhere unexpected.</li></ul><h3>Yes, Page URLs Can Be Customized</h3><p>Page URLs are fully customizable. You are not stuck with a generated, meaningless string.</p><p>In the page’s properties, you set the actual URL text yourself. It also supports parameters so that a link can point to a specific record, such as an order or a customer, instead of just the general page.</p><p>This makes links genuinely readable and shareable, whether that’s a link emailed to a colleague or embedded in a notification.</p><h4>Read more</h4><ul><li><a href="https://docs.mendix.com/refguide/page-properties/#url">Page Properties</a></li><li><a href="https://docs.mendix.com/refguide/mobile/using-mobile-capabilities/deep-links/">Deep Links</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=99f5ba7ed456" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/managing-security-for-page-urls-and-deep-links-in-mendix-99f5ba7ed456">Managing Security for Page URLs and Deep Links in Mendix</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting Started with Mendix Business Events Publishing]]></title>
            <link>https://medium.com/mendix/quick-hack-series-part-5-getting-started-with-mendix-business-events-publishing-part-1-cdf1985eafef?source=rss----874212944ee7---4</link>
            <guid isPermaLink="false">https://medium.com/p/cdf1985eafef</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[tips]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[mendix]]></category>
            <category><![CDATA[microservices]]></category>
            <dc:creator><![CDATA[Gurumoorthy J]]></dc:creator>
            <pubDate>Tue, 22 Sep 2026 12:31:19 GMT</pubDate>
            <atom:updated>2026-09-22T12:31:18.507Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Getting Started with Mendix Business Events Publishing: Quick Hack Series Part 5 (Banner Image)" src="https://cdn-images-1.medium.com/max/1024/1*OwiTevIuJGgzo0AjnizGIQ.png" /><figcaption>Getting Started with Mendix Business Events Publishing: Quick Hack Series Part 5</figcaption></figure><h4>Quick Hack Series Part 5</h4><h4>If you’ve ever needed two Mendix apps to talk to each other without tightly coupling them together, Business Events might be exactly what you’re looking for.</h4><p>Think of it as a mailing list for your apps: one app publishes an event when something important happens, and any number of other apps can subscribe and react, all without a single direct API call between them.</p><p>In this guide, we’ll walk through what Business Events are, when to use them, and how to implement a publisher and subscriber in Studio Pro from scratch.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*23obGmBj987vxPiIuIUX7g.png" /></figure><h3>What Are Business Events?</h3><p>Business events are like a mailing list to share event notifications between apps. The key difference between business events and traditional communication between apps, such as REST or web services, is that there is no direct communication between the apps. An event broker sits in between and handles delivery.</p><p>A classic example: one app uploads a payment receipt while another app processes the outgoing payment in the company’s ledger. Or, a customer places an order, and separately, apps handle shipment scheduling, invoicing, and stock reordering, all triggered off the same event, with zero coupling between those apps.</p><p>Let&#39;s dive into the implementation!</p><h3><strong>Step 1: Install the Mendix Business Events Module</strong></h3><p>To work with business events, import the Mendix Business Events service into your app from the Marketplace.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cWYvwadQDARmJsMBTj4eew.png" /></figure><h3><strong>Step 2: Create a Business Event Service (Publisher Side)</strong></h3><p>In the app that will <strong>publish</strong> the event:</p><ol><li>Right-click a module in your app tree.</li><li>Go to <strong>Add other → Business event service → Create a new business event service</strong>.</li><li>Give your service document a clear name (e.gBE_OrderStatusUpdateService).</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sk8Rc7rOfcG51hK2dPoYZQ.png" /></figure><p>This opens the Business Event Service document, where you’ll define:</p><ol><li><strong>General</strong> — the Service name and Event name prefix.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1021/1*-wGoQYuQuVm437y44JSOAg.png" /></figure><p>2. <strong>In Business Event Definitions</strong> — click <strong>Add</strong> to add a new event where the Event name and Description will be there, so other teams/apps know what this service is about. Then <strong>Attributes-&gt;</strong>click Add to define what data the event carries. Keep in mind: changes here later could lead to breaking changes if the entity is already consumed elsewhere by other apps.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/967/1*aVkaJv4FA2EKSYNO0RIRtg.png" /></figure><p>3.<strong> Other apps can</strong> — decide whether other apps can subscribe, publish, or both to this service. Select Publish events and subscribe to events, then click <strong>Done</strong> to create the event.</p><p>Under <strong>This business event service implements</strong>, Studio Pro shows you two panels side by side — <strong>Publish</strong> and <strong>Subscribe</strong>:</p><ul><li>On the <strong>Publish</strong> side, the LDMScript event maps to a published entity, PBE_LDMScript — this is the object your microflow will fill in and hand off to the Publish Event activity.</li><li>On the <strong>Subscribe</strong> side, the same LDMScript event maps to a consumed entity, CBE_LDMScript, with an auto-generated handler microflow, HandleBE_LDMS.Note: when the event is received, this auto-generated microflow will be triggered.</li></ul><p>It’s entirely possible, as in this example, for one service document to define both a publish and a subscribe side for the same event, which is handy when you want to test the full round trip within a single app before splitting publisher and subscriber across separate apps.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*4eZacYq_fIkMXsNe7gpAmw.png" /></figure><p>Under the hood, this service document generates an AsyncAPI 2.2.0 contract. A few things worth noting if you ever inspect or hand off the YAML:</p><ul><li>The channel is identified by a generated GUID (e.g., c11743e61aca4bfda14eb1c4b92549f0), with both a publish and subscribe operation defined against it.</li><li>The message payload schema (LDMScriptPayload) is exactly what you defined in the Attributes tab — in this case, just StatusString: string, maxLength 200.</li><li>Every message carries a set of <strong>CloudEvents-standard headers</strong> (ce_specversion, ce_id, ce_source, ce_type, ce_time, etc.) — this is what lets Business Events interoperate with other CloudEvents-compatible tooling, including the AWS/Azure bridges mentioned later.</li></ul><h3>Step 3: Publish the Event from a Microflow</h3><p>Once your service is defined, drop a <strong>Publish Event</strong> activity into the microflow where the business action happens.</p><p>For our LDMScript example, the flow typically looks like this:</p><ol><li><strong>Create/retrieve</strong> a PBE_LDMScript object (this is the published entity Studio Pro generated for you in Step 2).</li><li><strong>Change Object</strong> — set StatusString to whatever status you want to broadcast (e.g., &quot;Script started&quot;, &quot;Script completed&quot;, &quot;Script failed: timeout&quot;).</li><li>Add the <strong>Publish Event</strong> activity, passing in the PBE_LDMScript object.</li></ol><p>A key benefit here: publishing is part of the same transaction as your other database changes. If your microflow fails and rolls back, the event is not sent — so if your script-handling logic errors out before reaching the Publish Event activity, you don’t end up with a stray “in progress” status floating around with no corresponding real state.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*0HBDuEebVSXFhq79AzBllg.png" /></figure><p>We have successfully created and published a Business Event. Since this is a broad topic, I’ve split this series into three parts:</p><ul><li><strong>Part 1:</strong> Creating and Publishing a Business Event <em>(this article)</em></li><li><strong>Part 2:</strong> Setting up the Event Broker in both <strong>Mendix Cloud</strong> and <strong>on-premises</strong> environments.</li><li><strong>Part 3:</strong> Creating subscribers to consume the published Business Events.</li></ul><p><strong>I hope this helps. Give this feature a try and let me know what you think! Drop a comment below and share whether you found this feature useful and worth trying.</strong></p><p><strong>Until next time, keep building and keep hacking!</strong></p><h4>Read more</h4><ul><li><a href="http://docs.mendix.com/appstore/services/business-events/">Mendix Business Events</a></li><li><a href="https://docs.mendix.com/refguide/business-event-services/">Business Event Services</a></li></ul><p><strong><em>From the Publisher -</em></strong></p><p><em>Inspired by this article to bring your ideas to life with Mendix? Sign up for a </em><a href="https://signup.mendix.com/?utm_medium=content_syndication&amp;utm_source=medium.com&amp;utm_id=11172331"><em>free account</em></a><em>! You’ll get instant access to the </em><a href="https://academy.mendix.com/link/home"><em>Mendix Academy,</em></a><em> where you can start building your skills.</em></p><p><em>For more articles like this one, visit our </em><a href="https://medium.com/mendix"><em>Medium page</em></a><em>. And you can find a wealth of instructional videos on our </em><a href="https://www.youtube.com/c/MendixCommunity/community"><em>community YouTube page</em></a><em>.</em></p><p><em>Speaking of our community, join us in our </em><a href="https://join.slack.com/t/mendixcommunity/shared_invite/zt-hwhwkcxu-~59ywyjqHlUHXmrw5heqpQ"><em>Slack community channel</em></a><em>. We’d love to hear your ideas and insights!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cdf1985eafef" width="1" height="1" alt=""><hr><p><a href="https://medium.com/mendix/quick-hack-series-part-5-getting-started-with-mendix-business-events-publishing-part-1-cdf1985eafef">Getting Started with Mendix Business Events Publishing</a> was originally published in <a href="https://medium.com/mendix">Mendix Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>