<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"  xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:georss="http://www.georss.org/georss" xmlns:photo="http://www.pheed.com/pheed/">
 <channel>
  <title>sintinella</title>
  <description><![CDATA[]]></description>
  <link>https://www.pilowed.ovh/</link>
  <language>fr</language>
  <dc:date>2026-07-21T19:35:52+02:00</dc:date>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="alternate" href="https://www.pilowed.ovh/xml/atom.xml" type="text/xml" />
  <item>
   <guid isPermaLink="false">tag:https://www.pilowed.ovh,2026:rss-97418040</guid>
   <title>What quietly breaks when you don't update your app (and why you never notice on GoodBarber)</title>
   <pubDate>Tue, 21 Jul 2026 08:36:41 +0200</pubDate>
   <dc:language>fr</dc:language>
   <dc:creator>PIERRE MEDORI</dc:creator>
   <dc:subject><![CDATA[Débuter avec WM]]></dc:subject>
   <description>
   <![CDATA[
   An app that nobody updates does not stay the way you left it. It slowly loses store visibility, push reach, and eventually its place on the App Store and Google Play, without a single line of your content changing. Here is what actually breaks, why it happens to healthy apps, and what GoodBarber absorbs so that keeping yours alive takes one habit: updating it.     <div><b>An untouched app does not stay frozen. It rots</b></div>
     <div style="position:relative; text-align : center; padding-bottom: 1em;">
      <img src="https://www.pilowed.ovh/photo/art/default/97418040-67845382.jpg?v=1784624123" alt="What quietly breaks when you don't update your app (and why you never notice on GoodBarber)" title="What quietly breaks when you don't update your app (and why you never notice on GoodBarber)" />
     </div>
     <div>
      <div style="background:#f5f7fa;border:1px solid #e2e8f0;border-radius:10px;padding:18px 22px;margin:0 0 24px;"><p style="margin:0;"><strong>The short version.</strong> A mobile app that is not updated does not stay frozen: it decays. Push notifications quietly stop landing, new users stop finding it, and the stores eventually hide or remove it. On GoodBarber, the platform absorbs every OS and store change and ships the fix with your next update, so a year of mobile churn reaches you as a release note. The one thing you still have to do: update regularly.</p></div><p>Your app works today. Leave it untouched for a year: it will still open, still look right, still do its job on your own phone. Nothing in your dashboard warns you. That is the trap.</p><p>Because while your app stood still, everything underneath it moved. Apple and Google shipped new operating systems, rewrote store rules, retired old plumbing. You notice months later, through symptoms that look like a marketing problem: downloads sag, push campaigns reach fewer people, a loyal user writes that the app misbehaves on their new phone. The decay is real, and it has nothing to do with the quality of your content.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>What breaks in silence when an app is never updated</b></div>
     <div>
      <p>Four things degrade on their own, and each one shows up in your numbers long before it shows up in an error message.</p><p><strong>Your app disappears from the stores</strong></p><p>The stores actively hide and remove apps that stop updating. This is written policy, not a rumor. On Google Play, an app must target a recent Android version to stay fully visible; Google raises that bar every year, and an app more than two years behind stops being shown to new users on current devices (<a href="https://support.google.com/googleplay/android-developer/answer/11926878" target="_blank">Google Play's target API level policy</a>). Apple runs the cleanup from the other side: its <a href="https://developer.apple.com/support/app-store-improvements/" target="_blank">App Store Improvements program</a> removes apps that have not been updated for three years and fall under a minimal download threshold, after a 90 day notice. From your side, it just looks like downloads drifting down for no reason, while the <a href="https://www.goodbarber.com/blog/aso-guide-how-to-increase-your-downloads-on-the-app-store-and-google-play-a1501/" target="_blank">ASO work you invested in</a> quietly stops paying.</p><p><strong>Your push notifications stop landing</strong></p><p>Push reach decays even when you do everything right. Every uninstall, phone change and device restore kills subscriber tokens; a living app constantly renews its audience, an abandoned one only loses it. And the pipes themselves get replaced: Apple shut down its legacy push protocol in March 2021, and apps whose delivery chain was never migrated simply stopped delivering. You experience it as open rates sliding quarter after quarter. You blame your copywriting; it was never the copywriting.</p><p><strong>Every autumn, a new OS ships new bugs</strong></p><p>Each year, Apple and Google release major OS versions, and apps never rebuilt against them inherit glitches on day one: layouts shift, permission prompts change, features silently stop working. When Apple retired UIWebView in 2020, every app still built on it had a hard deadline to rebuild or die. The cruelest part is who sees it first: your most engaged users update their phones earliest, so your best audience meets the bugs before anyone else.</p><p><strong>The day you finally need to publish, you can't</strong></p><p>Store requirements pile up while an app sleeps, and all of them block the next submission. Since July 2022, Google Play requires a completed Data safety declaration. Since May 2024, Apple requires privacy manifests describing what an app and its components access. Neither existed when many apps were first published. So the day you finally need to ship a change, a new logo, updated legal terms, the submission bounces off requirements that accumulated while you looked away. The longer the sleep, the taller the wall.</p><table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%"><thead><tr><th>What you notice</th><th>What actually happened</th></tr></thead><tbody><tr><td>Downloads drift down, ASO stops paying</td><td>The stores stopped showing your app to new users</td></tr><tr><td>Push open rates slide</td><td>Subscriber tokens died and were never renewed</td></tr><tr><td>Glitches on your best users' new phones</td><td>A new OS shipped and the app was never rebuilt for it</td></tr><tr><td>An urgent update gets rejected</td><td>Store requirements accumulated while the app slept</td></tr></tbody></table>
     </div>
     <br style="clear:both;"/>
     <div><b>Why this happens to healthy apps</b></div>
     <div>
      <p>Your app did not change. The ground under it did. Apple and Google each ship a major OS every year and tighten store requirements on the same rhythm: the Android version bar moves annually, privacy declarations arrived in 2022 and 2024, push protocols get rebuilt every few years. Together they form a treadmill that never stops, and an app standing still on a treadmill moves backwards.</p><p>Our engineering team wrote up a decade of these changes in <a href="https://dev.to/goodbarber/no-code-at-scale-why-the-real-engineering-challenge-is-the-treadmill-not-the-editor-275o" target="_blank">a dedicated article on dev.to</a>, and ran the autopsy of <a href="https://dev.to/goodbarber/what-breaks-when-nobody-touches-your-app-for-three-years-2dgm" target="_blank">what breaks when nobody touches an app for three years</a>. The short version: staying published is not a one time achievement. It is a subscription to change.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>What GoodBarber absorbs so you never see any of it</b></div>
     <div>
      <p>GoodBarber's answer to the treadmill is structural: the platform runs it so you don't. When Google raises the Android version bar, when Apple adds a manifest requirement, when a push protocol is retired, GoodBarber absorbs the change once, at the platform level, for the thousands of live apps it hosts. The fix rolls into your app the next time you publish an update: your binary is rebuilt on demand, against the current requirements, and submitted to the stores.</p><p>The same goes for your notifications. GoodBarber operates the push pipeline end to end and delivers several million notifications per week across its apps; token handling, protocol migrations and certificate renewals have never been your job. Even the paperwork is generated rather than filled in: your privacy declarations are derived from the features you actually activated, so what your app declares matches what it contains.</p><p>Submission itself is a service, not a fight. Apple rejects roughly 42% of the first submissions handled by GoodBarber's publishing team, Apple's own baseline over the last 12 months, and the team recovers 91% of those rejections without the app owner lifting a finger. With <a href="https://www.goodbarber.com/app-publishing-service/" target="_blank">GoodBarber Takes Care</a>, an update is something you trigger, not something you battle. And all of it lives inside <a href="https://www.goodbarber.com/pricing/" target="_blank">the subscription you already pay</a>: hosting, push infrastructure, store compliance, the whole maintenance treadmill. That is the difference between building an app and running one, the same line we drew for <a href="https://www.goodbarber.com/blog/ai-app-builders-can-build-an-app-can-they-run-one-a1560/" target="_blank">AI app builders</a>.</p><blockquote>You didn't buy an app editor. You bought someone who keeps your app alive.</blockquote>
     </div>
     <br style="clear:both;"/>
     <div><b>The one thing you still have to do</b></div>
     <div>
      <p>GoodBarber cannot do the last step for you. The fixes travel inside your updates, and an update reaches the stores when you decide to publish it, because every new version must be submitted for review. The platform prepares everything; you provide the trigger.</p><p>So the habit that keeps a GoodBarber app healthy is unglamorous: publish an update regularly, even when nothing visible changed. A quiet update is not an empty update. It carries months of platform work into your users' hands, renews your standing with both stores, and resets every clock described above. It takes minutes in your back office.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Is your app at risk? A 60 second self-check</b></div>
     <div>
      <p>Run through these six questions; every yes matches a symptom described above.</p><ul><li>Is your last store update more than 12 months old?</li><li>Have downloads drifted down with no change in your marketing?</li><li>Do push campaigns reach fewer devices than they did a year ago?</li><li>Have you never filled in, or never revisited, Google Play's Data safety section and Apple's privacy declarations?</li><li>Have you skipped testing your app on the latest iOS and Android versions?</li><li>Are there unread warning emails from App Store Connect or the Google Play Console?</li></ul><p>One yes means your app is drifting. Two or more mean it is at risk. The fix is the same in every case: ship an update.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>FAQ</b></div>
     <div>
      <p><strong>Do I need to update my app if nothing changed?</strong></p><p>Yes. Even if your content and design have not moved, the stores and operating systems around your app change every year: visibility rules, privacy requirements, push protocols, new OS versions. Regular updates keep an app visible, compliant and stable. On GoodBarber, each update also carries every platform-level fix shipped since your previous one.</p><p><strong>Can my app be removed from the App Store or Google Play for being outdated?</strong></p><p>Yes. Apple removes apps that have not been updated for three years and fall under a minimal download threshold, after a 90 day notice. Google Play stops showing apps that target an Android version more than two years old to new users on current devices. Both policies are public and actively enforced.</p><p><strong>Does GoodBarber update my app automatically?</strong></p><p>GoodBarber automatically maintains everything around your app: platform code, hosting, push infrastructure and store requirements are kept current by its engineering team. The store update itself ships when you trigger it, because every new version must be submitted to Apple and Google for review. You publish regularly; the platform makes sure each update carries every accumulated fix.</p><p><strong>How often should I update my mobile app?</strong></p><p>Publish a store update at least once a year, and ideally every few months. Apple and Google each ship a major OS yearly and tighten store requirements on the same rhythm, so a yearly update is the floor for staying visible and compliant. Frequent updates also signal to both stores that your app is actively maintained.</p><p><strong>Why did my app's downloads or push delivery suddenly drop?</strong></p><p>For an app that has not been updated in a long time, the usual causes are store visibility rules and push token decay. Google Play stops showing outdated apps to new users, which erodes downloads, and push subscriber tokens die with every uninstall, phone change and device restore. Regular updates reset both.</p><p><strong>The fix takes minutes, not a migration.</strong> If your app runs on GoodBarber, open your back office and publish an update today: it ships with every platform improvement accumulated since your last one, and <a href="https://www.goodbarber.com/app-publishing-service/" target="_blank">the publishing team</a> can handle the submission end to end. If your app lives somewhere nobody maintains it, <a href="https://www.goodbarber.com/pricing/" target="_blank">see what a subscription that includes the maintenance covers</a>.</p>
     </div>
     <br style="clear:both;"/>
   ]]>
   </description>
   <photo:imgsrc>https://www.pilowed.ovh/photo/art/imagette/97418040-67845382.jpg</photo:imgsrc>
   <link>https://www.pilowed.ovh/What-quietly-breaks-when-you-don-t-update-your-app-and-why-you-never-notice-on-GoodBarber_a10007.html</link>
  </item>

  <item>
   <guid isPermaLink="false">tag:https://www.pilowed.ovh,2026:rss-97417728</guid>
   <title>Not all MCP servers are equal: BaaS MCP vs application MCP</title>
   <pubDate>Tue, 21 Jul 2026 08:10:54 +0200</pubDate>
   <dc:language>fr</dc:language>
   <dc:creator>PIERRE MEDORI</dc:creator>
   <dc:subject><![CDATA[Débuter avec WM]]></dc:subject>
   <description>
   <![CDATA[
   Every platform now advertises an MCP server, and the label tells you almost nothing. Two servers can carry the same three letters and hand an AI agent completely different powers: one gives it your database, the other gives it your live app. Here is the difference between a BaaS MCP and an application MCP, and why that altitude decides what an agent can actually do for you.     <div><b>“Has an MCP server” is the wrong question</b></div>
     <div style="position:relative; text-align : center; padding-bottom: 1em;">
      <img src="https://www.pilowed.ovh/photo/art/default/97417728-67845075.jpg?v=1784624309" alt="Not all MCP servers are equal: BaaS MCP vs application MCP" title="Not all MCP servers are equal: BaaS MCP vs application MCP" />
     </div>
     <div>
      <div style="background:#f5f7fa;border:1px solid #e2e8f0;border-radius:10px;padding:18px 22px;margin:0 0 24px;"><p style="margin:0;"><strong>The short version.</strong> An MCP server is only as useful as what it exposes. BaaS platforms such as Back4app and Supabase expose their backend: database tables, schemas, queries, cloud code. GoodBarber's MCP server exposes the operations of a live mobile app: publish an article, schedule a push, update the catalog, read the stats. 150 domain-typed tools at the time of writing, feature-gated, scoped to one app by OAuth, with a verified read-back on every write. Same protocol, very different altitude.</p></div><p>The Model Context Protocol has won fast. Introduced by Anthropic in November 2024 and donated to the Linux Foundation a year later, <a href="https://modelcontextprotocol.io/" target="_blank">MCP</a> is now the standard way to hand tools to an AI agent, with more than 9,400 public servers listed in the official MCP Registry in 2026. Which means the phrase “we have an MCP server” has quietly become a checkbox. Every platform can tick it, and the tick tells you nothing.</p><p>The questions that matter sit one level deeper. What does the server let an agent see? What does it let an agent change? And when the agent writes, what stands between a well-phrased prompt and a broken production system? The answers depend far less on the protocol, which is the same for everyone, than on the altitude at which a platform plugs into it.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Two altitudes: MCP for your database, MCP for your app</b></div>
     <div>
      <p>Backend-as-a-Service platforms plug MCP into their infrastructure layer. Back4app's MCP server, as its <a href="https://www.back4app.com/docs/mcp" target="_blank">documentation</a> describes it in July 2026, lets an agent create and manage Parse apps, define database schemas, query and modify objects through the Parse REST API, manage users and permissions, and deploy cloud code. Supabase's official MCP server points the same way: list tables, execute SQL, run migrations, manage branches and Edge Functions. These are real, useful capabilities. They are also unmistakably backend-shaped: what the agent reads and writes are rows, schemas and deployments. Call it MCP for your database.</p><p>GoodBarber plugs MCP in at a different altitude: the application itself. GoodBarber's MCP server exposes the operations of a finished, published mobile app: publish an article, schedule a push notification, create a product with its variants, update an order, read the analytics. The agent never sees a table. It sees the same product-level actions the app's owner sees in the back office. Call it MCP for your app.</p><blockquote>A BaaS MCP hands an agent the keys to your data. An application MCP lets an agent run your product, safely.</blockquote><p>Side by side:</p><table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%"><thead><tr><th></th><th>BaaS MCP server</th><th>Application MCP server</th></tr></thead><tbody><tr><td>What the agent sees</td><td>Tables, schemas, rows, cloud functions</td><td>Articles, push campaigns, products, orders, stats</td></tr><tr><td>A typical tool</td><td>Run a SQL query, create a database class</td><td><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">cms_create_article</code>, <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_create_push_broadcast</code></td></tr><tr><td>A write is</td><td>A raw data mutation</td><td>A product action, run through the application layer</td></tr><tr><td>Guardrails</td><td>Read-only modes, project scoping</td><td>Feature gating, per-app OAuth, verified read-back on every write</td></tr><tr><td>What you still build</td><td>The entire app around the backend</td><td>Nothing: the native app, hosting and store pipeline already exist</td></tr><tr><td>Built for</td><td>Developers in AI coding tools</td><td>Any operator, technical or not, in any MCP client</td></tr><tr><td>Examples</td><td>Back4app, Supabase</td><td>GoodBarber</td></tr></tbody></table>
     </div>
     <br style="clear:both;"/>
     <div><b>Why the altitude changes everything</b></div>
     <div>
      <p>Same protocol, same JSON, same agents on the other end. Four things change completely.</p><p><strong>Semantics: the agent knows what it is doing</strong></p><p>A backend tool speaks data. An application tool speaks intent. When an agent's tool is a raw SQL query, the agent knows it is inserting a row; whether that row makes sense as a product, a subscriber or a campaign is entirely the prompt's problem. When an agent calls <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_create_push_broadcast</code> on GoodBarber's server, the tool's name, its typed schema and its constraints already encode what a push campaign is. There is far less room to be confidently wrong, because the domain knowledge lives in the tool, not in the prompt.</p><p><strong>Safety: where the guardrails live</strong></p><p>Good BaaS MCP servers do ship controls, and they matter: Supabase, for instance, offers a read-only mode and project scoping. But at database altitude, a permitted write is still a raw mutation. Nothing checks that the new row respects the invariants your application enforces everywhere else.</p><p>GoodBarber's MCP server enforces its guardrails at the product level, on the server side. Feature gating: a tool only exists if the matching feature is active in the app, so an app without push configured exposes no push tools at all. Per-app OAuth scope: every session is bound to one authenticated app, an agent connected to app A cannot see or touch app B, and agencies connect each client app separately. Verified writes: every write returns a server-side flag requiring the agent to read the object back and confirm the result before moving on. Hallucinated success is the failure mode agents are most prone to; GoodBarber's answer is to make verification part of the server's contract rather than a best practice left to the prompt.</p><p><strong>Completeness: a database is not a product</strong></p><p>An agent with full control of your backend still controls no product. The mobile app around that backend remains yours to design, build, connect, submit to the App Store and Google Play, and maintain: exactly the gap we mapped in <a href="https://www.goodbarber.com/blog/ai-app-builders-can-build-an-app-can-they-run-one-a1560/" target="_blank">AI app builders can build an app. Can they run one?</a> An application MCP starts on the other side of that gap. The app already exists: compiled native iOS and Android builds plus a PWA, with hosting, CMS, push infrastructure and payments included rather than assembled from separate subscriptions. The agent operates a live product from day one, and there is nothing left to build around it.</p><p><strong>Operators: who can actually use it</strong></p><p>Back4app's MCP documentation lists the clients it is built for: Cursor, Windsurf, VS Code, Claude Code. Developer tools, reasonably, because driving a backend safely requires a developer's judgment. An application MCP moves the interface up to plain language. A shop owner can ask Claude to reprice a product, a publisher can ask ChatGPT to publish the morning's article and schedule the push, a club manager can ask for last month's downloads, and none of them needs an IDE. GoodBarber built its MCP surface for that operator, the same person its no-code back office was built for, and it works from any MCP client, <a href="https://www.goodbarber.com/blog/zapier-mcp-goodbarber-drive-your-app-with-an-ai-agent-a1457/" target="_blank">including automation platforms like Zapier</a>.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>What GoodBarber's MCP server exposes</b></div>
     <div>
      <p>GoodBarber runs a hosted, production MCP server: nothing to install, nothing to self-host. You plug the endpoint into your MCP client, sign in with OAuth 2, and the session is scoped to your app from the first call.</p><p>The inventory is public and machine-readable. The <a href="https://mcp.goodbarber.dev/.well-known/mcp/server-card.json" target="_blank">server card</a> lists 150 domain-typed tools at the time of writing (July 2026), namespaced by what they operate: tools prefixed <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">cms_</code> cover content (articles, events, maps, photos, videos, podcasts, including scheduled publication), <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">shop_</code> tools cover commerce (products and variants, collections, orders, promo codes, customers), and <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_</code> tools cover the running of the app (push broadcasts, analytics, memberships). The card is the contract: when the platform grows, the card grows, and connected agents pick up the new tools automatically. On top of the server, GoodBarber publishes <a href="https://github.com/goodbarber/goodbarber-skills" target="_blank">44 open-source Claude Skills</a> that wrap common workflows as tested recipes, part of the same <a href="https://www.goodbarber.com/blog/your-goodbarber-app-is-now-ai-agent-ready-44-skills-for-claude-code-cursor-and-any-mcp-client-a1520/" target="_blank">agent-ready platform</a> push.</p><p>Just as deliberate is what the server does not expose. Design and layout stay in the builder, where GoodBarber's design system can protect them; pushing visual design through text-shaped tools does not produce good apps. And agent ready does not mean the human left the room: you grant the scope, you set the policies, and the server verifies what the agent does. Details and per-client setup live on the <a href="https://www.goodbarber.com/mcp/" target="_blank">MCP page</a>.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>When a BaaS MCP server is the right choice</b></div>
     <div>
      <p>If you are a developer building custom software, with your own data model, your own business logic and your own frontend, a BaaS MCP server is exactly the right tool, and the good ones are genuinely good. Back4app's gives your coding agent a real Parse backend to build against; Supabase's does the same for Postgres, with scoping controls that show the category maturing. GoodBarber is not that tool and does not try to be: it will not host your custom backend, and it is built for content apps and mobile commerce, not for arbitrary software.</p><p>These are two altitudes for two different jobs, not two competitors on one axis. The practical test: if your project needs an agent that can touch raw data structures, you want a BaaS MCP. If it needs an agent that can run a live mobile app, you want an application MCP.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Which MCP server does your project need?</b></div>
     <div>
      <ul><li><strong>You are building custom software</strong> and want an agent working on your schema, data and cloud code: choose a <strong>BaaS MCP server</strong> such as Back4app or Supabase.</li><li><strong>You want an agent to operate a real mobile app</strong> in production, across content, catalog, push notifications, orders and analytics: choose an <strong>application MCP server</strong>. That is what GoodBarber runs.</li><li><strong>The app's day-to-day operator does not code</strong>: an application MCP is the only altitude that works in plain language from mainstream clients like Claude and ChatGPT.</li><li><strong>You need both</strong>: some teams run them side by side, a BaaS MCP for the custom system a developer maintains, GoodBarber's MCP server for the mobile app the business operates. The protocol is the same; only the altitude differs.</li></ul>
     </div>
     <br style="clear:both;"/>
     <div><b>FAQ</b></div>
     <div>
      <p><strong>What is the difference between a BaaS MCP server and an application MCP server?</strong></p><p>A BaaS MCP server exposes backend infrastructure to an agent: database tables, schemas, queries, cloud functions. An application MCP server exposes the operations of a finished product. GoodBarber's MCP server lets an agent publish content, schedule push notifications, manage a catalog and read analytics on a live mobile app, without ever touching raw data structures.</p><p><strong>Does GoodBarber's MCP server give an agent access to my database?</strong></p><p>No. GoodBarber's MCP server exposes product operations, not SQL. An agent works with articles, products, orders, push campaigns and stats through domain-typed tools, and every call runs through the same application layer as the back office, so business rules and validations apply. Raw table access is never on the menu.</p><p><strong>Is an MCP server on a backend enough to run a mobile app?</strong></p><p>No. A backend MCP server operates the data layer, and the app around it still has to be designed, built, connected, submitted to the App Store and Google Play, and maintained. An application MCP server operates an app that already exists. That is the difference between managing rows and running a product.</p><p><strong>How does GoodBarber keep agent writes safe?</strong></p><p>Through three server-enforced layers. Feature gating: a tool only exists if the matching feature is active in the app. Per-app OAuth scope: an agent connected to one app cannot reach another. Verified writes: after every write, the server requires the agent to read the object back and confirm the result. Safety lives on the server, not in the prompt.</p><p><strong>What is the best MCP server for a no-code mobile app?</strong></p><p>Judge any candidate on three criteria: tools that speak the app's language rather than raw SQL, authentication scoped to a single app, and server-enforced verification on writes. GoodBarber's MCP server checks all three, with 150 domain-typed tools at the time of writing and a public server card listing every one of them, so you can verify the inventory instead of taking the claim on faith.</p><p><strong>See the altitude difference for yourself.</strong> <a href="https://www.goodbarber.com" target="_blank">Start a free trial</a>, build your app, then plug its MCP endpoint into Claude, ChatGPT or any MCP client: connecting an agent to a live app takes about two minutes. The <a href="https://www.goodbarber.com/mcp-complete-guide/" target="_blank">complete MCP guide</a> covers setup client by client.</p>
     </div>
     <br style="clear:both;"/>
   ]]>
   </description>
   <photo:imgsrc>https://www.pilowed.ovh/photo/art/imagette/97417728-67845075.jpg</photo:imgsrc>
   <link>https://www.pilowed.ovh/Not-all-MCP-servers-are-equal-BaaS-MCP-vs-application-MCP_a10006.html</link>
  </item>

  <item>
   <guid isPermaLink="false">tag:https://www.pilowed.ovh,2026:rss-97367904</guid>
   <title>AI app builders can build an app. Can they run one?</title>
   <pubDate>Thu, 16 Jul 2026 17:04:00 +0200</pubDate>
   <dc:language>fr</dc:language>
   <dc:creator>PIERRE MEDORI</dc:creator>
   <dc:subject><![CDATA[Débuter avec WM]]></dc:subject>
   <description>
   <![CDATA[
   An AI app builder can show you a working screen an hour after you have the idea. That part is real, and it is genuinely useful. The question that decides whether you have an app or a demo comes later: who owns it, who publishes it to the stores, and who runs it every week once real users show up. Here is the honest split between building and running, and where AI actually belongs on each side.     <div><b>Can AI app builders build a full app? And can they run one?</b></div>
     <div style="position:relative; text-align : center; padding-bottom: 1em;">
      <img src="https://www.pilowed.ovh/photo/art/default/97367904-67818771.jpg?v=1784214054" alt="AI app builders can build an app. Can they run one?" title="AI app builders can build an app. Can they run one?" />
     </div>
     <div>
      <div style="background:#f5f7fa;border:1px solid #e2e8f0;border-radius:10px;padding:18px 22px;margin:0 0 24px;"><p style="margin:0;"><strong>The short version.</strong> AI app builders are excellent at prototypes and stop short of production, where ownership, authentication, real data, store publishing and maintenance live. GoodBarber takes the opposite path: it ships a real native app to the App Store and Google Play, then lets AI agents operate that app in natural language through its MCP server. Prototype with AI. Ship and run with GoodBarber.</p></div><p>Someone asked exactly that in <a href="https://www.reddit.com/r/nocode/comments/1ucoiu6/can_ai_app_builders_really_create_a_full_app_if/" target="_blank">r/nocode</a> in June 2026, and the replies are worth reading for how they split. Almost nobody argues the tools are useless. Almost nobody argues they are enough. The considered answers converge on the same line: yes for a prototype, not yet for production. Two people in the thread report shipping real apps to Google Play and the App Store with AI help and no development background, and both describe the same experience: it worked, and it took months.</p><p>The most useful reply does not answer the question. It replaces it. The gap, one commenter observed, is no longer whether AI can build an app. It is whether AI can build an app that is ready for real customers.</p><p>That is the right question, and it deserves its full form. Everyone has spent two years asking whether AI can <em>build</em> an app. Almost nobody has asked whether AI can <em>run</em> one. Building is a burst of work that ends. Running is work that never ends. Most of the disappointment around AI app builders comes from buying the first and needing the second. This article is about both halves.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>What AI app builders genuinely get right</b></div>
     <div>
      <p>Skip the caricature. These tools are good, and pretending otherwise is how you lose credibility with anyone who has used one.</p><p>They collapse the distance between an idea and something you can look at. You describe a product, and minutes later there is a screen you can click, show to a colleague, and react to. The entry cost is close to zero. When you are still asking whether an idea deserves your next six months, that speed is not a gimmick. It is the whole point, and it is hard to beat.</p><p>They also killed the excuse. You can no longer say the idea died because finding out was too expensive.</p><p>“The UI is usually the easy part now,” as one reply in that r/nocode thread put it, before listing where people actually stall: authentication, payments, permissions, integrations, deployment, and the backend details real users depend on.</p><p>That is the uncomfortable implication for everyone selling app creation, ourselves included. If a working interface is now a prompt away, the interface is no longer where the difficulty lives. Generating a screen is solved. What was never the hard part just got easier, and what was always the hard part did not move.</p><p>This is why the comparison conversation has shifted. <a href="https://www.goodbarber.com/vs/" target="_blank">Put GoodBarber next to any of the prompt-to-app generators</a>, and the interesting differences are not in what appears on screen in the first ten minutes. They are in everything that happens after.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Where the honest limits show up</b></div>
     <div>
      <p>We have written the long version elsewhere, so here is the map rather than the tour. Between a prompt-generated prototype and an app your users download, five things recur.</p><p><strong>Ownership.</strong> If you cannot inspect, export and genuinely own the underlying project, you are renting a result you cannot reason about. The moment something breaks in a way the prompt cannot fix, you are stuck.</p><p><strong>Authentication and persistent state.</strong> Real accounts, sessions, permissions and data that survives a refresh are a different engineering problem from rendering a screen. This is the most reported failure point by a wide margin, and it is the one that turns a convincing demo into a rebuild.</p><p><strong>Real data and edge cases.</strong> Production is mostly the unglamorous remainder: the empty state, the duplicate order, the user on a bad connection, the row that should not exist. Demos never contain these. Users produce them on day one.</p><p><strong>Store publishing.</strong> This is the one the discussion consistently underestimates, because it is invisible from the web. A browser preview is not an app. iOS and Android want signed native binaries, store metadata, permission declarations, privacy disclosures, and a review process with opinions of its own. Apple rejected roughly 42% of the first submissions our own publishing team handled over the last twelve months.</p><p><strong>Maintenance.</strong> Someone owns this code in six months. If it was generated rather than designed, and regenerating a section quietly rewrites the parts that worked, that someone has a problem that compounds.</p><p>The most grounded account in that r/nocode thread comes from a carpenter, not a developer, who did get an app onto Google Play with AI assistance. The prompt, he says, was the easy part. The real work was refining features, fixing bugs, testing, gathering feedback and handling app store requirements. It took months and, by his own count, probably thousands of prompts. That is a success story. It is also a precise description of a job AI did not remove.</p><p>If you want the full treatment of these, with the numbers, we mapped <a href="https://www.goodbarber.com/blog/vibe-coding-is-magic-in-the-demo-is-your-app-really-production-ready-a1558/" target="_blank">the seven walls between a prototype and the stores</a> and, specifically for mobile, <a href="https://www.goodbarber.com/blog/what-vibe-coding-tools-forget-to-tell-you-about-mobile-apps-a1530/" target="_blank">what vibe coding tools forget to tell you</a>. This article is about what comes after you accept that list.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>What running an app looks like when the platform is built for it</b></div>
     <div>
      <p>Ask what your app needs on an ordinary Tuesday, six months after launch. Almost none of it is generation. It is publishing an article. Sending a push to the right segment. Fixing a price. Reading yesterday's numbers. That workload is the part nobody demos, prompt-to-app tools do not cover it by design, and it is where GoodBarber's answer has two halves, both load-bearing.</p><p><strong>Half one: the output is a real app.</strong> GoodBarber compiles native binaries, iOS in Swift and Android in Kotlin, not a web view in a wrapper. The same configuration also produces a Progressive Web App. Hosting, database, CMS, push notifications, analytics and payment processing are included in the subscription rather than assembled from four other vendors with four other bills. That is not a philosophical preference. It is what lets someone who does not code publish, operate and update the app, and it is why apps built this way are downloaded every 4 seconds across 152 countries.</p><p><strong>Half two: the app is operable by AI agents.</strong> GoodBarber runs a hosted, production Model Context Protocol server, so any MCP-aware assistant, Claude, Cursor, ChatGPT or another, can operate a live GoodBarber app in natural language. You connect the endpoint to your AI client, sign in with OAuth, and Tuesday becomes one sentence:</p><blockquote><em>“Publish the draft announcement, schedule the launch push for 6 p.m., drop the featured product to €29, and tell me how last week went.”</em></blockquote><p>Here is what that sentence becomes on the wire, in the server's own tool names:</p><ol><li><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">cms_create_article</code> publishes the announcement in the app's CMS.</li><li><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_create_push_broadcast</code> schedules the 6 p.m. push.</li><li><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">shop_update_product</code> writes the new price to the live catalog.</li><li><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_list_page_views</code> and <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">classic_list_downloads</code> read last week back into a plain-language summary.</li></ol><p>Then the detail that separates production from party trick: after every write, the server requires a verification read-back. The agent re-fetches the article it created, the push it scheduled, the price it changed, and confirms each against what you asked; if a call fails, it reports the failure instead of improvising around it. That policy is enforced server-side, not left to the agent's good manners. The full, machine-readable inventory of tools is public, on the <a href="https://mcp.goodbarber.dev/.well-known/mcp/server-card.json" target="_blank">server card</a>: content, push, analytics, memberships, shop, orders, promo codes, customers. What it deliberately does not cover is design and layout, which stay in the builder where a design system can protect them. On top of the server, GoodBarber publishes <strong>44 ready-to-use Claude Skills</strong> in an <a href="https://github.com/goodbarber/goodbarber-skills" target="_blank">open-source repository</a>, so common workflows come as tested recipes rather than prompts you have to invent.</p><p>The details are on the <a href="https://www.goodbarber.com/mcp/" target="_blank">MCP page</a> and in <a href="https://www.goodbarber.com/mcp-complete-guide/" target="_blank">the complete guide</a>.</p><p>One clarification worth making, because the category is loud and imprecise. <strong>Agent ready does not mean the human left the room.</strong> Every action is scoped to your app, an agent connected to one app cannot reach another, and the server verifies after each write. You still design the app, set the policies, and review what the agent does. The door is open for agents to act on your behalf. That is different from claiming the app runs itself, and we are not going to claim that.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Prototype with AI. Ship and run with GoodBarber.</b></div>
     <div>
      <p>The honest recommendation is not “stop using AI builders.” It is to use each tool for the job it is good at.</p><p>Use an AI app builder to find out whether your idea is worth pursuing. That loop is fast, cheap, and better than anything that existed three years ago. Once the answer is yes, move the idea onto something built to survive contact with real users, real stores and real Tuesdays.</p><p>Moving over does not mean giving up the prompt, either. GoodBarber kept it, scoped to the place where it earns its keep: the feature that does not exist yet. Describe a custom section to the <a href="https://www.goodbarber.com/blog/ai-extension-builder-build-sections-with-ai-no-code-required-a1492/" target="_blank">AI Extension Builder</a> (in Beta) and it writes the code and renders it live, in your app. It can even <a href="https://www.goodbarber.com/blog/ai-extension-builder-upload-your-own-files-a1546/" target="_blank">work from your own files</a>: drop in your logo and your data, and the generated section uses them instead of stand-ins. The difference with a prompt-to-app generator is everything around the prompt: the section plugs into GoodBarber's APIs and inherits the platform's hosting, design system, native compilation and store pipeline. The prompt writes what is unique to you; the platform carries what has to be engineered. Prompt only where it is needed, a platform everywhere it counts: the best of both worlds, without assembling anything.</p><p>Be equally honest about where that stops. GoodBarber is built for content apps and mobile commerce. It does not build games, and it is not the right tool for recreating a complex multi-sided marketplace like Airbnb or Booking.com, where the whole product is custom business logic. If that is what you are building, no app builder is your answer, and you should hear that from us rather than discover it in month four. If you are shipping content, community or a mobile storefront, it is exactly the right shape. Our guide to <a href="https://www.goodbarber.com/blog/best-app-builders-for-mobile-apps-a-guide-for-2025-a1419/" target="_blank">the best no-code app builders in 2026</a> shows how the category compares.</p><blockquote>An AI app builder is judged on what it generates. A production app is judged on what happens next: who owns it, who publishes it, who updates it on a Tuesday, and who answers when it breaks.</blockquote><p>Prototype with AI. Ship and run with GoodBarber. Those are not competing sentences. They are a sequence.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>FAQ</b></div>
     <div>
      <p><strong>Can an AI app builder build a full app if you cannot code?</strong></p><p>It can build a working prototype, often a convincing one. Where it stops is production: owning and inspecting the project, authentication, data that persists correctly, edge cases, publishing signed native binaries to the App Store and Google Play, and maintaining the result over time. For validating an idea, yes. For an app real users depend on, not on its own.</p><p><strong>What are the limitations of AI app builders for a mobile app?</strong></p><p>Most are strong web-first code generators and fast at producing a working interface. The mobile-specific gaps: they output web projects rather than compiled native iOS and Android binaries, and they stop at generation, so hosting, database, store submission, push notifications and daily operation are yours to assemble and run. Our <a href="https://www.goodbarber.com/vs/" target="_blank">comparison pages</a> walk through the differences feature by feature.</p><p><strong>What is the best no-code app builder for AI agents in 2026?</strong></p><p>The useful criterion is whether the platform exposes the app's operations to an agent through an open protocol, not whether it uses AI to generate the app. GoodBarber runs a production Model Context Protocol server that lets Claude, Cursor, ChatGPT and other MCP-aware clients operate a live app by natural language, plus 44 open-source Claude Skills for common workflows. Check any candidate's server card before believing a claim.</p><p><strong>Can an AI agent actually run my app for me?</strong></p><p>It can do the operating work: publishing content, scheduling pushes, updating products and prices, processing orders, reading analytics. It does not replace you as the operator. You set the policies, review the actions, and stay responsible for the app. GoodBarber's term is agent ready: the door is open for agents to act on your behalf, not that the app is autonomous.</p><p><strong>Do I have to choose between AI speed and a real production app?</strong></p><p>No, and framing it as a choice is the mistake. Use AI builders for the phase where speed is the whole value, which is finding out whether the idea is worth building. Use a platform built for the lifecycle once the answer is yes. GoodBarber puts AI on its own side of that line too: the AI Extension Builder creates custom sections by prompt, and the MCP server makes the live app operable by conversation.</p><p><strong>Ready to see the other half?</strong> <a href="https://www.goodbarber.com" target="_blank">Start a free trial</a>, build the idea you prototyped last weekend, and connect your AI client to your app's MCP endpoint. The prototype took an afternoon. Running it should not take a developer.</p>
     </div>
     <br style="clear:both;"/>
   ]]>
   </description>
   <photo:imgsrc>https://www.pilowed.ovh/photo/art/imagette/97367904-67818771.jpg</photo:imgsrc>
   <link>https://www.pilowed.ovh/AI-app-builders-can-build-an-app-Can-they-run-one_a10005.html</link>
  </item>

  <item>
   <guid isPermaLink="false">tag:https://www.pilowed.ovh,2026:rss-97124573</guid>
   <title>How to test GoodBarber Custom Code with a logged-in user</title>
   <pubDate>Thu, 25 Jun 2026 16:32:00 +0200</pubDate>
   <dc:language>fr</dc:language>
   <dc:subject><![CDATA[Débuter avec WM]]></dc:subject>
   <description>
   <![CDATA[
   Need your GoodBarber Custom Code to behave differently for a logged-in user — show premium content, greet a member by name, hide a section from anonymous visitors? The App API gives you the current user through gb.user.getCurrent(). But the back-office preview has no real login, so for Membership apps that call always lands in the error path. This guide explains how the current user behaves in the preview for every app type, and gives you a copy-paste way to test as a logged-in member.     <div><b>A quick refresher: gb.user.getCurrent()</b></div>
     <div style="position:relative; text-align : center; padding-bottom: 1em;">
      <img src="https://www.pilowed.ovh/photo/art/default/97124573-67669390.jpg?v=1782397785" alt="How to test GoodBarber Custom Code with a logged-in user" title="How to test GoodBarber Custom Code with a logged-in user" />
     </div>
     <div>
      <p>The GoodBarber App API lets your Custom Code ask "who is using the app right now?" through one method:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">gb.user.<span style="color:#d2a8ff">getCurrent</span>(
    (user) =&gt; {
        <span style="color:#8b949e">// A user is logged in.</span>
        <span style="color:#8b949e">// `user` is a GBUser object — read its attributes here.</span>
        console.<span style="color:#d2a8ff">log</span>(user.email);
    },
    (error) =&gt; {
        <span style="color:#8b949e">// No user is logged in.</span>
        console.<span style="color:#d2a8ff">log</span>(<span style="color:#a5d6ff">`</span><span style="color:#a5d6ff">Response status: </span><span style="color:#79c0ff">${</span>error.code<span style="color:#79c0ff">}</span><span style="color:#a5d6ff">`</span>);
        console.<span style="color:#d2a8ff">log</span>(<span style="color:#a5d6ff">`</span><span style="color:#a5d6ff">Response message: </span><span style="color:#79c0ff">${</span>error.message<span style="color:#79c0ff">}</span><span style="color:#a5d6ff">`</span>);
    }
);</div><p>It takes <strong>two callbacks</strong>: a success callback (called with a <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code> object when someone is logged in) and an error callback (called when nobody is logged in). It's callback-based — it does <strong>not</strong> return a value or a Promise.</p><p><strong>The <em>GBUser</em> object changes shape per app type</strong></p><p>The <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code> model carries an <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version</code> property that tells you which kind of app produced it:</p><table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%"><thead><tr><th><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version</code></th><th>App type</th></tr></thead><tbody><tr><td><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">1</code></td><td>Content app <strong>+ Authentication</strong> extension</td></tr><tr><td><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">2</code></td><td><strong>eCommerce</strong> app</td></tr><tr><td><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">3</code></td><td>Content app <strong>+ Membership</strong> extension</td></tr></tbody></table><p>The list of attributes depends on that version. For a <strong>Membership</strong> app (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 3</code>), a <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code> looks like this:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">{
    id: <span style="color:#79c0ff">123</span>,
    api_version: <span style="color:#79c0ff">3</span>,
    login: <span style="color:#a5d6ff">"member@example.com"</span>,
    email: <span style="color:#a5d6ff">"member@example.com"</span>,
    username: <span style="color:#a5d6ff">"John Doe"</span>,
    firstname: <span style="color:#a5d6ff">"John"</span>,
    lastname: <span style="color:#a5d6ff">"Doe"</span>,
    picture_url: <span style="color:#a5d6ff">"https://example.com/picture.jpg"</span>,
    access_levels: [<span style="color:#a5d6ff">"premium"</span>]   <span style="color:#8b949e">// 👈 the key field for Membership</span>
}</div><p>The <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> array is what makes Membership special: it lists the access levels the user currently holds. That's almost always what your Custom Code branches on ("does this user have <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">premium</code>? then show the bonus content").</p><p>In practice, your code reads <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> to decide what to show:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">gb.user.<span style="color:#d2a8ff">getCurrent</span>(
    (user) =&gt; {
        <span style="color:#ff7b72">if</span> (user.access_levels.<span style="color:#d2a8ff">includes</span>(<span style="color:#a5d6ff">"premium"</span>)) {
            console.<span style="color:#d2a8ff">log</span>(<span style="color:#a5d6ff">"Member has premium — show the premium content"</span>);
        } <span style="color:#ff7b72">else</span> {
            console.<span style="color:#d2a8ff">log</span>(<span style="color:#a5d6ff">"Logged in, but no premium — show the upgrade prompt"</span>);
        }
    },
    (error) =&gt; {
        console.<span style="color:#d2a8ff">log</span>(<span style="color:#a5d6ff">"Nobody logged in — show the login prompt"</span>);
    }
);</div><p>Keep this in mind — it's exactly this code the mock below will feed.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>How the current user behaves in the preview</b></div>
     <div>
      <p>The preview in the back office is a sandbox. It renders your app, but it has <strong>no login mechanism</strong> — there's no way to actually authenticate a real user inside it.</p><p>To keep development comfortable anyway, GoodBarber <strong>injects a fake user</strong> for some app types so that <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent()</code> returns <em>something</em> you can work with:</p><table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%"><thead><tr><th>App type</th><th>In the preview, <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent()</code>…</th></tr></thead><tbody><tr><td><strong>Authentication</strong> add-on (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 1</code>)</td><td>✅ Returns a <strong>fake user</strong> automatically — your success callback fires.</td></tr><tr><td><strong>eCommerce</strong> app (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 2</code>)</td><td>✅ Returns a <strong>fake customer</strong> automatically — your success callback fires.</td></tr><tr><td><strong>Membership</strong> extension (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 3</code>)</td><td>❌ Returns <strong>nothing</strong> — your <strong>error</strong> callback fires with <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">"There's no user logged in the app."</code></td></tr></tbody></table><p>So if your app uses <strong>Authentication</strong> or <strong>eCommerce</strong>, you can test your logged-in logic in the preview right away — a fake user is handed to you for free, no setup needed.</p><p>If your app uses the <strong>Membership</strong> extension, it's different: <strong>no fake user is injected.</strong> If your success callback never fires in the preview and you keep landing in the error path, that's expected — there simply is no current user to return, and unlike the other two app types, none is faked for you.</p><p>The rest of this article focuses on that Membership case, because it's the one that needs a bit of work. You have two ways to handle it.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Option 1 — Test in the MyGoodBarber app (real conditions)</b></div>
     <div>
      <p>The most faithful way to test is to run your app inside the <strong>MyGoodBarber</strong> app (available on iOS and Android). It loads your real app, with the real login flow and the real backend. You log in as an actual member, and <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent()</code> returns your real <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code> with your real <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code>.</p><p>Use this when you want to validate the <em>whole</em> flow end-to-end before publishing. It's the closest thing to production.</p><p>The downside: it's a slower feedback loop. You can't iterate on a CSS tweak or a conditional branch as fast as you can in the preview. That's where Option 2 comes in.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Option 2 — Mock getCurrent() in the preview</b></div>
     <div>
      <p>For fast iteration, you can <strong>temporarily replace</strong> <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent</code> with your own version that hands back a fake member of your choosing. Your real logic stays exactly the same — your Custom Code still calls <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent(success, error)</code> like normal. You're only swapping out <em>what the method does</em> while you're testing.</p><p><strong>Step 1 — Drop in the mock at the top of your code</strong></p><p>Add this block at the very beginning of your Custom Code's JavaScript, before any call to <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent()</code>:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em"><span style="color:#8b949e">// ⚠️ PREVIEW TEST ONLY — remove (or set to false) before publishing!</span>
<span style="color:#ff7b72">const</span> PREVIEW_TESTING = <span style="color:#79c0ff">true</span>;

<span style="color:#ff7b72">if</span> (PREVIEW_TESTING &amp;&amp; <span style="color:#ff7b72">typeof</span> gb !== <span style="color:#a5d6ff">"undefined"</span> &amp;&amp; gb.user) {
    gb.user.getCurrent = <span style="color:#ff7b72">function</span> (successCallback, errorCallback) {
        <span style="color:#ff7b72">const</span> fakeUser = {
            id: <span style="color:#a5d6ff">"123"</span>,
            api_version: <span style="color:#79c0ff">3</span>,
            login: <span style="color:#a5d6ff">"member@example.com"</span>,
            email: <span style="color:#a5d6ff">"member@example.com"</span>,
            username: <span style="color:#a5d6ff">"Test Member"</span>,
            firstname: <span style="color:#a5d6ff">"Test"</span>,
            lastname: <span style="color:#a5d6ff">"Member"</span>,
            picture_url: <span style="color:#a5d6ff">""</span>,
            access_levels: [<span style="color:#a5d6ff">"premium"</span>]   <span style="color:#8b949e">// 👈 change this to test different cases</span>
        };
        <span style="color:#d2a8ff">successCallback</span>(fakeUser);
    };
}</div><blockquote>💡 <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">"premium"</code> is just an example. Use the <strong>real access level identifiers configured in your app</strong> — otherwise your conditions won't match anything.</blockquote><p>You might wonder: can't my code just detect the preview and mock only there? Unfortunately, no — there's no reliable signal exposed to your Custom Code that says "this is the preview" (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.platform()</code> returns <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">"web"</code> in the preview, exactly like a real PWA in production), and from <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent</code> alone the preview is indistinguishable from a genuinely logged-out user (both hit the error callback). That's why we use a flag you flip <strong>by hand</strong>: it's explicit, and it can't be triggered by accident in production.</p><p>That's it. From now on, anywhere in your Custom Code where you call:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">gb.user.<span style="color:#d2a8ff">getCurrent</span>(onUserFound, onNoUser);</div><p>…your <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">onUserFound</code> callback receives the fake member above — exactly as if a real <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">premium</code> member were logged in. <strong>You don't change your business logic at all</strong>; you only added the mock block on top.</p><p><strong>Step 2 — Test the cases that matter</strong></p><p>The whole point of Membership code is reacting to <em>different</em> users. Just edit the mock to cover each scenario:</p><p><strong>A subscribed member (has access levels):</strong></p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">access_levels: [<span style="color:#a5d6ff">"premium"</span>]</div><p><strong>A logged-in user with no subscription:</strong></p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">access_levels: []</div><p><strong>Several access levels at once:</strong></p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">access_levels: [<span style="color:#a5d6ff">"free"</span>, <span style="color:#a5d6ff">"premium"</span>, <span style="color:#a5d6ff">"vip"</span>]</div><p><strong>Nobody logged in at all</strong> — here you mock the <em>error</em> path instead of the success one:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">gb.user.getCurrent = <span style="color:#ff7b72">function</span> (successCallback, errorCallback) {
    <span style="color:#d2a8ff">errorCallback</span>({ code: <span style="color:#79c0ff">1</span>, message: <span style="color:#a5d6ff">"There's no user logged in the app."</span> });
};</div><p>Flip between these to make sure your Custom Code behaves correctly in every state — not just the happy path.</p><p><strong>Step 3 (optional) — Mock <em>gb.membership.getAccessLevels()</em> too</strong></p><p>Some Membership code reads access levels through the dedicated Membership method rather than the user object:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em">gb.membership.<span style="color:#d2a8ff">getAccessLevels</span>(
    (access_levels) =&gt; { console.<span style="color:#d2a8ff">log</span>(access_levels); },
    (error) =&gt; { console.<span style="color:#d2a8ff">log</span>(error.message); }
);</div><p>If you use it, mock it the same way:</p><div style="white-space:pre-wrap;overflow-wrap:anywhere;background:#0d1117;border:1px solid #30363d;border-radius:10px;padding:16px 18px;margin:16px 0;line-height:1.6;color:#c9d1d9;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono',monospace;font-size:0.88em"><span style="color:#ff7b72">if</span> (PREVIEW_TESTING &amp;&amp; <span style="color:#ff7b72">typeof</span> gb !== <span style="color:#a5d6ff">"undefined"</span> &amp;&amp; gb.membership) {
    gb.membership.getAccessLevels = <span style="color:#ff7b72">function</span> (successCallback, errorCallback) {
        <span style="color:#d2a8ff">successCallback</span>([<span style="color:#a5d6ff">"premium"</span>]);
    };
}</div>
     </div>
     <br style="clear:both;"/>
     <div><b>⚠️ Before you publish: turn the mock off</b></div>
     <div>
      <p>This is the one rule you cannot skip. The mock is a development crutch — <strong>it must never reach production.</strong> If you ship it, every user of the app will be treated as your fake <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">premium</code> member, regardless of what they've actually paid for.</p><p>Two safe habits:</p><ol><li>Keep everything behind the single <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">PREVIEW_TESTING</code> flag and set it to <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">false</code> before publishing.</li><li>Better yet, <strong>delete the mock block entirely</strong> once you've finished testing.</li></ol><p>When <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">PREVIEW_TESTING</code> is <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">false</code> (or the block is gone), <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent</code> falls back to GoodBarber's real implementation, and your Custom Code works against actual logged-in members.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Further reading</b></div>
     <div>
      <ul><li><a href="https://app.goodbarber.dev/v2/documentation/#tag/user-methods/operation/gb.user.getCurrent" target="_blank"><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent</code></a> — retrieve the current logged-in user.</li><li><a href="https://app.goodbarber.dev/v2/documentation/#tag/user-models/operation/GBUser" target="_blank"><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code></a> — the user model and how its attributes change per <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version</code>.</li><li><a href="https://app.goodbarber.dev/v2/documentation/#tag/membership-methods/operation/gb.membership.getAccessLevels" target="_blank"><code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.membership.getAccessLevels</code></a> — read access levels directly (available only with the Memberships add-on).</li></ul>
     </div>
     <br style="clear:both;"/>
     <div><b>Recap</b></div>
     <div>
      <ul><li>In the back-office preview, there is <strong>no real login</strong>.</li><li>For <strong>Authentication</strong> and <strong>eCommerce</strong> apps, GoodBarber injects a fake user automatically, so testing as a logged-in user just works.</li><li>For the <strong>Membership</strong> extension, <strong>no fake user is provided</strong> — <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">getCurrent()</code> hits the error callback.</li><li>To test fast in the preview, <strong>temporarily override <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent</code></strong> (and <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.membership.getAccessLevels</code> if you use it) to return a fake member with the <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> you want to test.</li><li>For a real, end-to-end check, run your app inside the <strong>MyGoodBarber</strong> app.</li><li><strong>Always remove the mock before publishing.</strong></li></ul>
     </div>
     <br style="clear:both;"/>
     <div><b>FAQ</b></div>
     <div>
      <p><strong>Why does <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent()</code> return an error in the preview for my Membership app?</strong></p><p>Because the back-office preview has no login mechanism, and for Membership apps (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 3</code>) GoodBarber does not inject a fake user. With nobody logged in, the method calls your error callback with <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">"There's no user logged in the app."</code> — this is expected behavior, not a bug.</p><p><strong>Why does the same code work in the preview for an Authentication or eCommerce app?</strong></p><p>For Authentication (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 1</code>) and eCommerce (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">api_version: 2</code>) apps, GoodBarber automatically injects a fake user (or fake customer) in the preview, so your success callback fires without any setup.</p><p><strong>How do I test a logged-in member without publishing my app?</strong></p><p>Either run your app inside the MyGoodBarber app (iOS/Android) to test under real conditions, or temporarily override <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent</code> in your Custom Code to return a fake member with the <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> you want to test.</p><p><strong>What is <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> in the <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">GBUser</code> object?</strong></p><p>It's an array of the access levels a Membership user currently holds (for example <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">["premium"]</code>). Your Custom Code typically branches on it to decide what content to show. An empty array (<code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">[]</code>) means a logged-in user with no active subscription.</p><p><strong>Does <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">gb.user.getCurrent()</code> return a Promise?</strong></p><p>No. It's callback-based: you pass a success callback and an error callback. It does not return a value, so you can't <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">await</code> it.</p><p><strong>What happens if I forget to remove the mock before publishing?</strong></p><p>Every user of your app will be treated as the fake member you hard-coded — they'd all get, say, <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">premium</code> access regardless of what they actually paid for. Always set <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">PREVIEW_TESTING</code> to <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">false</code> or delete the mock block before you publish.</p><p>Ready to try it? Open the <strong>Custom Code</strong> section in your GoodBarber back office, paste the mock block at the top of your JavaScript, and set the <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">access_levels</code> for the case you want to test. When everything behaves, flip <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">PREVIEW_TESTING</code> to <code style="background:#eef0f3;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:0.88em">false</code> (or delete the block) and publish. For the full reference, see the <a href="https://app.goodbarber.dev/v2/documentation/" target="_blank">App API documentation</a>.</p>
     </div>
     <br style="clear:both;"/>
   ]]>
   </description>
   <photo:imgsrc>https://www.pilowed.ovh/photo/art/imagette/97124573-67669390.jpg</photo:imgsrc>
   <link>https://www.pilowed.ovh/How-to-test-GoodBarber-Custom-Code-with-a-logged-in-user_a93.html</link>
  </item>

  <item>
   <guid isPermaLink="false">tag:https://www.pilowed.ovh,2026:rss-96982713</guid>
   <title>AI Content Publishing: Run Your App's Editorial Calendar with an Agent</title>
   <pubDate>Mon, 15 Jun 2026 11:53:00 +0200</pubDate>
   <dc:language>fr</dc:language>
   <dc:creator>PIERRE MEDORI</dc:creator>
   <dc:subject><![CDATA[Débuter avec WM]]></dc:subject>
   <description>
   <![CDATA[
   Publishers, creators and associations didn't get into the work to live in a CMS. AI content publishing changes the deal: an agent runs your app's editorial calendar — publishing articles, scheduling them, posting events to the agenda, firing the push — while you do the actual work. Here it is on a live app, step by step, and where the line sits between what the agent does and what stays yours.     <div><b>The content calendar that eats your week</b></div>
     <div style="position:relative; text-align : center; padding-bottom: 1em;">
      <img src="https://www.pilowed.ovh/photo/art/default/96982713-67587005.jpg?v=1781517074" alt="AI Content Publishing: Run Your App's Editorial Calendar with an Agent" title="AI Content Publishing: Run Your App's Editorial Calendar with an Agent" />
     </div>
     <div>
      <p>Picture a two-person ocean-conservation nonprofit. One runs operations, one runs the field work. Between them they also run an app: a news feed, a list of causes, an events agenda, push notifications to a few thousand supporters.</p><p>Every week, the same routine. Write up the weekend's cleanup, format it, pick a category, decide what publishes now and what waits for the campaign date, add the next meetup to the agenda, schedule a push so people show up. None of it is hard. All of it is time — taken from the cause. No-code tools made each step easier; they never made the person optional. That is the part an agent changes.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>How to automate your app's content calendar with an agent</b></div>
     <div>
      <p>Running your app like a newsroom means you stop operating the CMS by hand and start briefing an editor who does it for you. You describe the week in plain language; the agent carries it out across your app; you review.</p><p>This works because every GoodBarber app is <a href="https://www.goodbarber.com/blog/your-app-now-on-voice-command-introducing-goodbarber-s-mcp-server-a1490/" target="_blank">agent-ready</a>: it exposes its operations through a public Model Context Protocol server — 150 of them, 61 for the CMS alone — so an assistant you already use, like Claude, can <a href="https://www.goodbarber.com/blog/mcp-server-manage-your-app-s-content-by-conversation-a1508/" target="_blank">manage your content by conversation</a> instead of you clicking through a dashboard. So we tried it. Not on a mockup — on a live app.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>A real editorial week: an MCP editorial workflow</b></div>
     <div>
      <p>We connected Claude to a live demo app for an ocean-conservation nonprofit and gave it one brief:</p><blockquote>"Publish this weekend's Calvi cleanup recap now. Prepare our Plastic Free July campaign piece and schedule it for July 1 at 8am. And put the June 21 volunteer cleanup on the agenda."</blockquote><p>Here is what it did, in order.</p><p><strong>It learned the newsroom first.</strong> Before writing a word, the agent listed the app's content sections — <em>About us</em>, <em>Our causes</em> — pulled up the events agenda, and read the existing articles. An agent about to publish on your behalf orients itself the way a new editor would.</p><p><strong>It published the recap — live.</strong> The cleanup story went into <em>Our causes</em>, with a deck and SEO metadata, status <em>published</em>. Online immediately, at its own URL, in the feed supporters were already reading.</p><p><strong>It scheduled the campaign.</strong> The Plastic Free July piece did not go live. The agent set it to <em>scheduled</em> with a publication date of July 1, 08:00. It now sits in the queue and publishes itself on the morning of the campaign — nobody has to remember a button at 8am.</p><p><strong>It updated the agenda.</strong> The June 21 volunteer cleanup landed on the events calendar with its start time, three-hour window, and the Calvi venue — slotting in among the gala, the kitesurf race, and the rest of the season.</p><p><strong>And the platform made it prove its work.</strong> Every write came back flagged for verification, so the agent re-read the scheduled queue and the live article before reporting back.</p><p>One more sentence closes the loop: <em>"schedule the launch push for July 1 at 8am."</em> The same MCP surface <a href="https://www.goodbarber.com/blog/the-goodbarber-mcp-server-goes-further-create-push-notifications-with-ai-a1514/" target="_blank">sends the notifications</a> — a broadcast with a send-at time — so the campaign publishes and the supporters hear about it in the same motion.</p><p>Three sentences of brief. A week of content calendar, handled.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>The agent publishes; you stay editor-in-chief</b></div>
     <div>
      <p>This is where the worry usually lands: if the agent does all that, what's left for me? The answer is the part that was always the real job.</p><p>The agent takes the mechanics — formatting, timing, the queue, the push. You keep the judgment — what's worth publishing, what the campaign says, which event matters. That division is enforced, not just promised: the platform flags every write for verification, and you can have the agent stage everything as a draft for you to approve before a single item goes live. Nothing publishes that you didn't green-light.</p><p>So it isn't "the agent runs the app instead of you." It's the agent doing the doing, while you keep the deciding. You stop being the one clicking publish; you stay the one who says what gets published. For a two-person nonprofit, that's the difference between a week in the tool and a week on the cause.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>How to start</b></div>
     <div>
      <p>If you run a content app, you already have the newsroom. To hand it an editor: connect your AI assistant to your app's MCP endpoint — the address lives in your back-office — or start from the <a href="https://github.com/goodbarber/goodbarber-skills" target="_blank">44 ready-made Claude Skills</a> that wrap these workflows. Then brief it the way you'd brief a colleague.</p><p>Want to see it on your own content first? <a href="https://www.goodbarber.com/pricing/" target="_blank">Start a free Content App trial</a>, connect an assistant, and give it a week to run.</p>
     </div>
     <br style="clear:both;"/>
     <div><b>Frequently asked questions</b></div>
     <div>
      <p><strong>How do I automate my app's content calendar?</strong></p><p>Connect an MCP-aware AI assistant (like Claude) to your GoodBarber app's MCP endpoint, then brief it in plain language: what to publish now, what to schedule, what to put on the agenda, and when to push. The agent calls the same CMS operations the back-office uses and carries out the week for you.</p><p><strong>Can an AI agent schedule blog posts and push notifications?</strong></p><p>Yes. Through the MCP server, an agent can create an article or event with a future publication date — it stays out of the feed until then and publishes itself — and queue a push notification with a send-at time, so a campaign and its alert go live together.</p><p><strong>What is an MCP editorial workflow?</strong></p><p>It's running your app's editorial work — publishing, scheduling, agenda, push — through the Model Context Protocol instead of by hand. You instruct an AI assistant; it calls the app's CMS operations directly; you review and approve. No copy-pasting between a draft and a dashboard.</p><p><strong>Can AI publish to a mobile app's CMS without code?</strong></p><p>Yes. GoodBarber exposes 61 CMS operations over MCP — create and update articles, build and reorder their content, manage events, handle photos and videos — all callable in natural language by an assistant, scoped to your app, with no code and no separate integration to build.</p>
     </div>
     <br style="clear:both;"/>
   ]]>
   </description>
   <photo:imgsrc>https://www.pilowed.ovh/photo/art/imagette/96982713-67587005.jpg</photo:imgsrc>
   <link>https://www.pilowed.ovh/AI-Content-Publishing-Run-Your-App-s-Editorial-Calendar-with-an-Agent_a78.html</link>
  </item>

 </channel>
</rss>
