<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thomas Hansen</title>
    <description>The latest articles on DEV Community by Thomas Hansen (@polterguy).</description>
    <link>https://dev.to/polterguy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F829923%2F04782b3f-244f-42af-a2bb-cd3277828def.png</url>
      <title>DEV Community: Thomas Hansen</title>
      <link>https://dev.to/polterguy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/polterguy"/>
    <language>en</language>
    <item>
      <title>Why Claude Is 10x Cheaper When It Builds on Magic Cloud</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Thu, 06 Aug 2026 07:05:32 +0000</pubDate>
      <link>https://dev.to/polterguy/why-claude-is-10x-cheaper-when-it-builds-on-magic-cloud-4n5</link>
      <guid>https://dev.to/polterguy/why-claude-is-10x-cheaper-when-it-builds-on-magic-cloud-4n5</guid>
      <description>&lt;p&gt;Everyone optimizes the wrong variable.&lt;/p&gt;

&lt;p&gt;Cheaper models.&lt;br&gt;
Shorter prompts.&lt;br&gt;
Compressed context.&lt;/p&gt;

&lt;p&gt;That all helps a little.&lt;/p&gt;

&lt;p&gt;But look at Anthropic's rate card instead, and one asymmetry jumps out: output tokens cost 5x input tokens on every current model. Claude Fable 5 is $10 per million tokens in, and &lt;strong&gt;$50 per million tokens out&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which means the most expensive thing your AI agent does is write code as output.&lt;/p&gt;

&lt;p&gt;Magic is architected so it doesn't.&lt;/p&gt;

&lt;p&gt;And rather than argue this in the abstract, we let Claude build a complete full-stack app on our &lt;a href="https://hyperlambda.dev" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt; cloudlet — while measuring everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rate card, straight from Anthropic
&lt;/h2&gt;

&lt;p&gt;These are Anthropic's official API prices, per million tokens, fetched from their pricing documentation on August 6, 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Fable 5&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5 / 4.8&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5 (intro, through Aug 31)&lt;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6 / Sonnet 5 (from Sep 1)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things are worth staring at.&lt;/p&gt;

&lt;p&gt;First, the output multiple is universal. Every tier charges 5x more for what the model writes than for what it reads.&lt;/p&gt;

&lt;p&gt;Second, Anthropic's newer tokenizer — used by Claude 4.7 and later — produces roughly 30% more tokens for the same text. Round-tripping source code through a model's context literally got more expensive this year.&lt;/p&gt;

&lt;p&gt;Prompt caching and the Batch API can discount those rates. But a discount on waste is still waste. The interesting question is why the tokens are being spent at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a coding agent's tokens actually go
&lt;/h2&gt;

&lt;p&gt;A conventional coding agent building a backend runs a loop.&lt;/p&gt;

&lt;p&gt;Read files. That is input.&lt;br&gt;
Write code. That is output, at 5x.&lt;br&gt;
Read the error. Input again.&lt;br&gt;
Rewrite. Output again.&lt;br&gt;
Re-read to verify. Input again.&lt;/p&gt;

&lt;p&gt;Every debug iteration compounds, and the compounding happens at the most expensive rate on the card. The model is not reasoning in most of those moments. It is acting as a very costly transport layer for source code.&lt;/p&gt;

&lt;p&gt;I have written before about &lt;a href="https://hyperlambda.dev/blog/how-hyperlambda-can-cut-ai-agent-costs-by-75-to-90-percent" rel="noopener noreferrer"&gt;how Hyperlambda changes these economics&lt;/a&gt; and &lt;a href="https://hyperlambda.dev/blog/how-magic-cuts-backend-build-cost-by-80-percent-in-agentic-workflows" rel="noopener noreferrer"&gt;measured roughly 80 percent savings on a Fable-priced build&lt;/a&gt;. This article is about the mechanism underneath those numbers — and a fresh build with its own receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built to prove it
&lt;/h2&gt;

&lt;p&gt;We asked Claude to build &lt;strong&gt;Token Ledger&lt;/strong&gt;: an LLM spend tracker.&lt;/p&gt;

&lt;p&gt;Yes, that is deliberately meta. Claude built a token-cost dashboard while its own token cost was being metered.&lt;/p&gt;

&lt;p&gt;The deliverable: a SQLite database with three linked tables — providers, models, and a usage log — seeded with Anthropic's actual rate card from the table above. Fifteen HTTP endpoints, every one of them role-secured. Two aggregation endpoints feeding charts. And a designed, dark, authenticated dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnjtj6p6gm2rznc8d8hka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnjtj6p6gm2rznc8d8hka.png" alt="Token Ledger dashboard — KPI cards, spend by model, spend by day, recent usage table" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look at the dashboard's own numbers for a moment. The second KPI card reads "output share of spend: 37%" — on a realistic mixed workload, over a third of the bill is output tokens. And the spend-by-model chart shows Fable 5 dwarfing everything else, because at $50 per million output tokens, it does.&lt;/p&gt;

&lt;p&gt;The app is arguing the article's thesis from inside the screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The build ledger
&lt;/h2&gt;

&lt;p&gt;Wall-clock time was measured with timestamps, not estimated.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Live secured backend — database, schema, seed data, 15 endpoints&lt;/td&gt;
&lt;td&gt;222 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete working app, including the hand-written frontend&lt;/td&gt;
&lt;td&gt;431 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend lines of code generated&lt;/td&gt;
&lt;td&gt;669&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend lines of code hand-written&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude output tokens spent on backend code&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the entire article.&lt;/p&gt;

&lt;p&gt;The backend was produced by twelve calls to Magic's CRUD generator and three calls to its SQL endpoint generator. Each call is a compact declarative argument — a table name, a column list, a role restriction, an SQL statement. Around a hundred tokens each, roughly 1,500 tokens of arguments in total.&lt;/p&gt;

&lt;p&gt;Not one of the 669 generated lines passed through Claude's output stream at $50 per million tokens. The platform wrote them, server-side, using the same battle-tested generators the Magic dashboard uses.&lt;/p&gt;

&lt;p&gt;Honest scope on the numbers: the 222 seconds include reading the platform's guides and setting up the design tokens. Screenshots and end-to-end verification came after the 431-second mark and included two pauses waiting for human tool approval, so they are excluded from the build figures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffin4gjhfuelei5qhmvxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffin4gjhfuelei5qhmvxy.png" alt="Token Ledger login — role-secured entry to the dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That login screen is not decoration. Every endpoint behind it is gated by Magic's built-in RBAC — no hand-rolled JWT handling anywhere, because there is no hand-written backend anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five mechanisms
&lt;/h2&gt;

&lt;p&gt;Why does this architecture starve the token meter? Five reasons, each visible in the build above.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Declarative calls replace emitted code
&lt;/h3&gt;

&lt;p&gt;One CRUD-generator call is roughly a hundred output tokens of arguments. It produces a complete endpoint — paging, sorting, filtering, validation, auth — of sixty to a hundred and twenty lines. Streaming the equivalent as source code is thousands of output tokens, usually across multiple attempts. In this build, 1,500 tokens of arguments bought 669 lines of backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Code generation happens server-side
&lt;/h3&gt;

&lt;p&gt;When something bespoke is needed, Magic's Hyperlambda Generator takes a plain-English prompt and writes the file on the server. The code never enters Claude's output stream or its input stream. Claude pays for a sentence, not a source file. And here is the stronger version of that point: this particular build needed &lt;strong&gt;zero&lt;/strong&gt; generator calls. The declarative tools covered the entire backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Code never round-trips through context
&lt;/h3&gt;

&lt;p&gt;Magic's operating rules forbid the agent from reading generated Hyperlambda back. Verification goes through live HTTP invocation and the OpenAPI spec. A conventional coding agent re-reads its files constantly — every read is input tokens, every edit is output tokens. On Magic, that loop is not discouraged. It is structurally impossible.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. No debug spirals
&lt;/h3&gt;

&lt;p&gt;The generators are deterministic. There is no generate, error, paste-the-stacktrace, regenerate cycle — the invisible multiplier on every agent bill. This build's complete bug ledger: one entry, a headless-browser viewport quirk while taking &lt;em&gt;screenshots&lt;/em&gt;. Zero bugs in 669 generated backend lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. One-call grounding
&lt;/h3&gt;

&lt;p&gt;At session start, one call returns who the agent is, what backend it is on, and its full operating instructions. One more call returns the exact list of capabilities that exist on the instance. Compare that with an agent grepping directories and reading files to discover what a codebase can do — all of it billed as input, none of it producing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The accounting: same app, two architectures
&lt;/h2&gt;

&lt;p&gt;Take the same deliverable — the Token Ledger backend, fifteen secured endpoints — and price both paths at Anthropic's current rates.&lt;/p&gt;

&lt;p&gt;The Magic column is this build. The coding-agent column is a calibrated estimate for the same result via a conventional file-editing agent — scaffold, routes, auth, validation, and the customary debug loops — consistent with the roughly 140,000-versus-25,000-token gap &lt;a href="https://hyperlambda.dev/blog/how-magic-cuts-backend-build-cost-by-80-percent-in-agentic-workflows" rel="noopener noreferrer"&gt;measured in the July benchmark&lt;/a&gt;, with the backend-code share broken out.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude on Magic (measured shape)&lt;/th&gt;
&lt;th&gt;Claude with generic tooling (estimate)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens spent on backend code&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;~30,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total output tokens, backend slice&lt;/td&gt;
&lt;td&gt;~2,000&lt;/td&gt;
&lt;td&gt;~35,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total input tokens, backend slice&lt;/td&gt;
&lt;td&gt;~30,000&lt;/td&gt;
&lt;td&gt;~180,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost at Fable 5 ($10 / $50)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ $0.40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ $3.55&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost at Opus 5 ($5 / $25)&lt;/td&gt;
&lt;td&gt;≈ $0.20&lt;/td&gt;
&lt;td&gt;≈ $1.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost at Sonnet 4.6 ($3 / $15)&lt;/td&gt;
&lt;td&gt;≈ $0.12&lt;/td&gt;
&lt;td&gt;≈ $1.07&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Call it roughly 9x on this app, and the estimate columns are labeled as exactly that — estimates. The ratio is not a constant of nature. It is a consequence of one design decision: source code, the most expensive thing a model can emit, never enters the token stream.&lt;/p&gt;

&lt;p&gt;And notice what happens as the app grows. A CRUD-generator argument is about a hundred tokens whether the table has three columns or thirty. Hand-written code is not. The gap widens with size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where 10x holds — and where it is 5x
&lt;/h2&gt;

&lt;p&gt;Now the honest fine print.&lt;/p&gt;

&lt;p&gt;The July benchmark measured roughly 80 percent — 5x — across a full session, because a real session also contains reasoning, planning, schema decisions, and verification, and those do not compress. The frontend in this build was hand-written by the agent, at normal output rates, and took as long as the entire backend.&lt;/p&gt;

&lt;p&gt;The 10x figure belongs to the code-emission slice of the work: the backend, the endpoints, the auth, the data layer. On backend-heavy agentic workloads that slice dominates, and the blended number climbs toward it. On reasoning-heavy work, expect the 5x, not the 10x.&lt;/p&gt;

&lt;p&gt;Both numbers are worth having. Neither requires exaggeration.&lt;/p&gt;

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

&lt;p&gt;The standard advice for cutting Claude costs is to pick a smaller model, cache your prompts, and batch your jobs. All fine. All discounts on the same architecture.&lt;/p&gt;

&lt;p&gt;Magic changes the architecture. The agent stops being a code emitter paying $50 per million tokens for the privilege, and becomes an operator of a platform that already knows how to build backends — declaratively, server-side, with security enforced by the runtime instead of regenerated per project.&lt;/p&gt;

&lt;p&gt;We measured it: a live, role-secured, fifteen-endpoint backend in 222 seconds, 669 lines generated, zero lines through the token meter.&lt;/p&gt;

&lt;p&gt;Claude is a great engineer. Stop paying it by the line.&lt;/p&gt;

&lt;p&gt;Magic is MIT-licensed and open source — the repository is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, with documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hyperlambda.dev/blog/why-claude-is-10x-cheaper-when-it-builds-on-magic-cloud" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>lowcode</category>
      <category>backend</category>
    </item>
    <item>
      <title>Break my AI Sandbox and make $100 - Psst, nobody's done it yet!</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sat, 01 Aug 2026 10:10:45 +0000</pubDate>
      <link>https://dev.to/polterguy/break-my-ai-sandbox-and-make-100-psst-nobodys-done-it-yet-2b9n</link>
      <guid>https://dev.to/polterguy/break-my-ai-sandbox-and-make-100-psst-nobodys-done-it-yet-2b9n</guid>
      <description>&lt;p&gt;I have a standing offer: find a verified security bug in Magic's backend — the C# code or the Hyperlambda runtime — and I'll pay you $100.&lt;/p&gt;

&lt;p&gt;Nobody has collected.&lt;/p&gt;

&lt;p&gt;$100 is obviously not the point. Companies pay 100 times that for bounties on software with a fraction of the attack surface. The point is that I'm willing to put money on the architecture, publicly, permanently — because the architecture is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The runtime is the security boundary
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools work like this: the model generates free-form code, and you &lt;em&gt;hope&lt;/em&gt; it generated something safe. The model is the security boundary. Which means every prompt injection, every hallucination, every "ignore previous instructions" is a potential breach.&lt;/p&gt;

&lt;p&gt;Hyperlambda inverts this. The AI generates code, but the &lt;em&gt;runtime&lt;/em&gt; decides what executes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hyperlambda is not free-form code. It's a declarative structure that parses into an AST, and the runtime validates that AST before anything runs.&lt;/li&gt;
&lt;li&gt;Slots are whitelisted. If a slot isn't on the whitelist for the current context, it doesn't execute. Period. The AI can hallucinate whatever it wants — the runtime says no.&lt;/li&gt;
&lt;li&gt;RBAC is enforced at &lt;em&gt;execution time&lt;/em&gt;, not generation time. It doesn't matter what code was generated or by whom. If your JWT doesn't carry the role, the invocation is refused.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the AI writes something it shouldn't run, the runtime says no. That single sentence is the difference between a demo and something a regulated company can ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;I don't expect you to take my word for it. In April I let Claude Code — one of the strongest code-analysis agents available — loose on the entire Magic codebase with explicit instructions to break it.&lt;/p&gt;

&lt;p&gt;It found real issues. All hardening, none sandbox escapes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No cap on request body size, allowing a memory-exhaustion DoS. Fixed.&lt;/li&gt;
&lt;li&gt;Missing timeouts that left the server exposed to Slowloris-style slow-drip attacks. Fixed.&lt;/li&gt;
&lt;li&gt;An edge case in path resolution that needed an explicit traversal guard. Fixed.&lt;/li&gt;
&lt;li&gt;A debug statement leaking information to the console. Removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's what it &lt;em&gt;couldn't&lt;/em&gt; do, after crawling roughly 9,000 commits accumulated over some 7 years:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No SQL injection. Every database access goes through parameterized ADO.NET.&lt;/li&gt;
&lt;li&gt;No password extraction. BCrypt with per-user salts.&lt;/li&gt;
&lt;li&gt;No secrets leakage. AES-GCM for storage.&lt;/li&gt;
&lt;li&gt;No auth bypass. Standard JWT, correctly implemented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No sandbox escape.&lt;/strong&gt; Every attempt to execute something outside the whitelisted slots was refused by the runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full write-up is here: &lt;a href="https://hyperlambda.dev/blog/claude-code-tried-to-break-magic-cloud-and-mostly-ended-up-confirming-its-security" rel="noopener noreferrer"&gt;Claude Code tried to break Magic Cloud, and mostly ended up confirming its security&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fou4in3lslsgm8p3bhrmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fou4in3lslsgm8p3bhrmi.png" alt="The Hyperlambda playground" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why free-form codegen can't make this offer
&lt;/h2&gt;

&lt;p&gt;Think about what it would take for an AI agent platform built on free-form code generation to make the same offer.&lt;/p&gt;

&lt;p&gt;They'd be paying out daily. When the model is the boundary, one clever prompt is a breach. The industry's answer so far has been layers of prompt-level guardrails — instructions asking the model to please behave. That's not security. That's etiquette.&lt;/p&gt;

&lt;p&gt;When the runtime is the boundary, the model's behavior becomes almost irrelevant to your security posture. The model can be jailbroken, poisoned, or just plain wrong — and the blast radius is a refused invocation and a log entry.&lt;/p&gt;

&lt;p&gt;This is why I can put a standing bounty on it. The security claim isn't "our AI is well-behaved." The claim is "the runtime refuses everything that isn't explicitly allowed." That's a falsifiable, testable claim — so go test it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to collect
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://playground.hyperlambda.dev" rel="noopener noreferrer"&gt;playground.hyperlambda.dev&lt;/a&gt; and hammer it. Or self-host — the whole thing is MIT licensed, so you can read every line of the code you're attacking.&lt;/li&gt;
&lt;li&gt;Find a verified bug in the backend C# or Hyperlambda code. Sandbox escape, RBAC bypass, executing a non-whitelisted slot — anything that breaks the security model.&lt;/li&gt;
&lt;li&gt;Send it to me. I verify it, I fix it, I pay you $100, and I'll publicly credit you for the find.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prompt-level shenanigans against the AI itself don't count — making a chatbot say something silly is not a runtime breach. The claim under test is the runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're evaluating AI agent platforms
&lt;/h2&gt;

&lt;p&gt;Ask every vendor you're talking to one question: &lt;em&gt;what happens when the AI generates something it shouldn't?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the answer involves the words "the model is trained to" or "our system prompt instructs" — you're buying etiquette, not security. If the answer is a deterministic runtime mechanism you can read the source code of, you're buying engineering.&lt;/p&gt;

&lt;p&gt;Magic has been running in production since 2020. It's MIT licensed. The code is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, and the docs are at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Break it and make $100. Psst — nobody's done it yet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hyperlambda.dev/blog/break-my-ai-sandbox-and-make-100-psst-nobodys-done-it-yet" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Turn Your Legacy SQL Server Database into a Modern Full Stack App in Minutes</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 31 Jul 2026 20:42:35 +0000</pubDate>
      <link>https://dev.to/polterguy/turn-your-legacy-sql-server-database-into-a-modern-full-stack-app-in-minutes-dff</link>
      <guid>https://dev.to/polterguy/turn-your-legacy-sql-server-database-into-a-modern-full-stack-app-in-minutes-dff</guid>
      <description>&lt;p&gt;The app in the screenshots below took 7 minutes to build.&lt;/p&gt;

&lt;p&gt;Not a mockup. A login screen backed by JWT authentication, a client manager reading and writing through a role-secured CRUD API, and an Emails tab that dispatches real messages over SMTP. The backend was produced by wrapping a database in generated CRUD endpoints, plus one English sentence handed to the Hyperlambda Generator for the send-email endpoint.&lt;/p&gt;

&lt;p&gt;I have published the receipts for builds like this before, so this article is not another ledger.&lt;/p&gt;

&lt;p&gt;It is about the part of those 7 minutes that usually gets lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database was the boring part
&lt;/h2&gt;

&lt;p&gt;Nothing in the build depended on the database being new.&lt;/p&gt;

&lt;p&gt;The CRUD generator does not care where a schema came from. It reads metadata — tables, columns, types, keys — and every Microsoft SQL Server database on earth exposes exactly that. The database in this demo was created seconds before the endpoints were. Yours carries twenty years of history, three generations of developers, and foreign keys that encode how your business actually works.&lt;/p&gt;

&lt;p&gt;Same metadata. Same generator. Same 7 minutes.&lt;/p&gt;

&lt;p&gt;That is the entire point. The demos always run on fresh databases because demos need reproducibility — but the machinery only ever sees the schema, and your ERP on SQL Server has a better schema than any demo. The hard part of a full stack app — modelling the business correctly — is the part you finished years ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  What got built
&lt;/h2&gt;

&lt;p&gt;The front door. JWT authentication against the platform's built-in auth — no auth library, no password hashing code, no session plumbing anywhere in the app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wtogq0y3nf3edi6zpw7.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wtogq0y3nf3edi6zpw7.webp" alt="The login screen — JWT authentication handled by the platform, zero auth code in the application" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The client manager. Search, add, edit, delete, and per-client notes — every operation travelling through generated CRUD endpoints, each one gated on a role before any logic runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fues7ht7wxkmuioyg2mae.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fues7ht7wxkmuioyg2mae.webp" alt="The client manager — search, status badges and per-client notes over generated CRUD endpoints" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the one endpoint that is not a table projection: composing an email to a client, dispatched through the platform's SMTP integration. That endpoint was described in a single English sentence and generated in seconds — the application never saw a mail-provider credential, because there is none in the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnhf7119skgmcsch2cvnl.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnhf7119skgmcsch2cvnl.webp" alt="The Emails tab — a generated endpoint looks up the client and dispatches through platform SMTP" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The recipe
&lt;/h2&gt;

&lt;p&gt;Four moves.&lt;/p&gt;

&lt;p&gt;Connect the database. Magic speaks to SQL Server through the standard .NET data provider — it is one more client, nothing installed inside the database, no schema changes.&lt;/p&gt;

&lt;p&gt;Wrap the tables. The CRUD generator reads the schema and emits endpoints — read, create, update, delete, count — with authentication and role-based access control already wired in.&lt;/p&gt;

&lt;p&gt;Describe what CRUD cannot do. "Look up this client's email address and send them a message" is one sentence, and the Hyperlambda Generator turns it into a working, role-gated endpoint.&lt;/p&gt;

&lt;p&gt;Serve the frontend. The same system that serves the API serves static files, so the app's HTML, CSS and JavaScript went live the moment they were written. One host, no CORS, no separate deployment.&lt;/p&gt;

&lt;p&gt;The full walkthrough — scoped database users, read-only starts, connecting an agent over MCP — is its own article: &lt;a href="https://hyperlambda.dev/blog/create-an-ai-agent-from-your-sql-server-or-mysql-database-step-by-step" rel="noopener noreferrer"&gt;Create an AI Agent From Your SQL Server or MySQL Database, Step by Step&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  No agent required
&lt;/h2&gt;

&lt;p&gt;This build ran through an AI agent over MCP, but the CRUD wrap does not need one. The dashboard's Backend Generator does the same thing point-and-click: pick the database, tick the tables, choose which roles may call what, and click Generate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdhzs9il7h0x3nl9ybua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdhzs9il7h0x3nl9ybua.png" alt="The Backend Generator — pick a database, tick tables, choose roles, and generate the CRUD API from the dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same generated endpoints, same enforcement, no conversation required. The agent is a convenience, not a dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  "But my database is legacy"
&lt;/h2&gt;

&lt;p&gt;Legacy means load-bearing, not obsolete — I have made that argument at length in &lt;a href="https://hyperlambda.dev/blog/supabase-for-sql-server-and-mysql-magic-brings-the-supabase-experience-to-legacy-databases-on-premise" rel="noopener noreferrer"&gt;Supabase for SQL Server and MySQL&lt;/a&gt;, so here is the short version.&lt;/p&gt;

&lt;p&gt;You connect through a scoped database user, so the platform can never do more than the credentials the DBA granted. You can start read-only, which turns "what if something writes the wrong thing" into a non-question for day one. And the whole stack runs in two containers you place yourself — same rack, same VLAN, same firewall the auditors already approved. The database does not change, and the data does not leave.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fine print
&lt;/h2&gt;

&lt;p&gt;Seven minutes was measured for this schema, at this size. Your 200-table ERP will take longer — but the added time goes into decisions, not code: which tables deserve exposure, which operations each table gets, which roles may call them. Those are judgment calls a DBA is already equipped to make, and they were never the expensive part.&lt;/p&gt;

&lt;p&gt;The frontend is where human taste still spends its time. Generated backends are uniform; good interfaces are not.&lt;/p&gt;

&lt;p&gt;And writes deserve the same respect they have always deserved. Start read-only, prove the surface, then grant writes table by table. The speed changes nothing about the discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question worth asking
&lt;/h2&gt;

&lt;p&gt;The question is no longer whether your organisation can afford to modernise the systems built on SQL Server. It is whether wrapping one of them in a secured API and a working app is still a project at all — or just an afternoon.&lt;/p&gt;

&lt;p&gt;Magic is MIT-licensed and open source at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, with documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sqlserver</category>
      <category>dotnet</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>46,000 Lines of Angular, Gone in a Weekend</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Mon, 27 Jul 2026 07:14:31 +0000</pubDate>
      <link>https://dev.to/polterguy/46000-lines-of-angular-gone-in-a-weekend-2nal</link>
      <guid>https://dev.to/polterguy/46000-lines-of-angular-gone-in-a-weekend-2nal</guid>
      <description>&lt;p&gt;I replaced the entire Magic Cloud dashboard this week. Forty-six thousand lines of Angular — HTML, TypeScript and CSS — gone, and in its place a React application of fifteen and a half thousand lines that does more than the thing it replaced.&lt;/p&gt;

&lt;p&gt;Twenty hours of coding. Thirty hours in total, counting my own reviewing, testing and swearing.&lt;/p&gt;

&lt;p&gt;I know exactly what that job costs when you do it by hand, because I have already done it by hand. In 2021 I rewrote this same dashboard the traditional way. A senior developer worked on it for a month and a half. Then I picked it up and worked on it for months more. Call it a three-month job for two experienced developers who knew the domain cold.&lt;/p&gt;

&lt;p&gt;That comparison is the only reason this article is worth writing. Anyone can claim an AI wrote a lot of code quickly. Very few people have the same application, built twice, by the same author, with the same requirements — where the only variable that changed is the tooling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn3l7uxktp24ybspfna8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn3l7uxktp24ybspfna8l.png" alt="The new Magic Cloud dashboard, showing KPI cards, the MCP agent banner and the Chatbot Wizard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The ledger
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Then&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Angular&lt;/td&gt;
&lt;td&gt;React 18 + Vite + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;~46,000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15,497&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files&lt;/td&gt;
&lt;td&gt;many hundreds&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime dependencies&lt;/td&gt;
&lt;td&gt;the Angular universe&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production build&lt;/td&gt;
&lt;td&gt;tens of MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;856 KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;minutes&lt;/td&gt;
&lt;td&gt;~1 second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to write&lt;/td&gt;
&lt;td&gt;~3 months, two people&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30 hours, one person supervising&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A word on that line-count comparison, because it is the kind of number people rightly poke at. Angular splits a single component across a &lt;code&gt;.ts&lt;/code&gt; file, an &lt;code&gt;.html&lt;/code&gt; template and an &lt;code&gt;.scss&lt;/code&gt; stylesheet. React folds all three into one &lt;code&gt;.tsx&lt;/code&gt;. Counting the old TypeScript against the new TypeScript would flatter me dishonestly, so both sides count everything: markup, logic and styling. Forty-six thousand against fifteen and a half.&lt;/p&gt;

&lt;p&gt;The dependency line matters more than it looks. The whole application runs on React, React-DOM, React Router, CodeMirror, SignalR, &lt;code&gt;marked&lt;/code&gt; and DOMPurify. That is the entire third-party surface. There is no state management library, no component library, no CSS framework, no build plugin zoo. When your dependency list fits in one sentence, upgrades stop being events.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually ran
&lt;/h2&gt;

&lt;p&gt;I drove Claude — Fable for the bulk of the work, Opus for the parts that needed more thinking. The model wrote essentially all of the code. My job was to babysit: sanity-check what came back, test it in a browser, catch the things that were confidently wrong, and decide what to build next.&lt;/p&gt;

&lt;p&gt;The loop that made it work was not "describe the feature and hope." It was: screenshot the old Angular screen, build the new one, screenshot the new one, compare them, fix the gap. Verification happened against rendered pages, not against source code. That distinction matters, because a model reading old Angular source will faithfully reproduce old Angular mistakes. A model looking at what the screen actually does will build what the screen actually does.&lt;/p&gt;

&lt;p&gt;Below is what came out of that loop, screen by screen — because the interesting claim is not that thirty hours produced &lt;em&gt;code&lt;/em&gt;, it is that thirty hours produced &lt;em&gt;this much working software&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Login
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc18yybx3aa2lvp0rgfee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc18yybx3aa2lvp0rgfee.png" alt="The Magic login screen with backend selector, magnetic link and Google sign-in" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard talks to any Magic backend, so the first thing it needs is which one. The backend selector remembers every cloudlet you have ever signed into and keeps a separate JWT for each, so switching between them does not mean signing in again.&lt;/p&gt;

&lt;p&gt;Underneath the password field are two things the Angular version never had. &lt;strong&gt;Magnetic link&lt;/strong&gt; sends a temporary sign-in link to your email — it doubles as passwordless login, and it only appears if the backend actually has SMTP configured, because offering it otherwise is a dead end. &lt;strong&gt;Continue with Google&lt;/strong&gt; signs you in over OIDC against whatever providers the backend has registered. Both were built during this port, not ported into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard
&lt;/h2&gt;

&lt;p&gt;The landing screen answers "what is this cloudlet, and is anything wrong with it" in one glance: version, endpoint count, users, tasks, log items.&lt;/p&gt;

&lt;p&gt;Two panels below that are new. The first announces that &lt;strong&gt;your cloudlet is an AI agent&lt;/strong&gt; — with the MCP plugin installed, the URL shown there hands any MCP-capable agent your endpoints as callable tools. Claude, or anything else speaking the protocol, can discover and invoke them directly.&lt;/p&gt;

&lt;p&gt;The second is the &lt;strong&gt;Chatbot Wizard&lt;/strong&gt;, which runs the other direction: give it a website, pick a model and a persona, and the backend crawls the site, turns what it finds into training data, and gives you an embeddable chatbot grounded in your own content. The crawl takes minutes and reports progress over a SignalR channel, so the feedback window opens &lt;em&gt;before&lt;/em&gt; the job starts — a socket that connects late misses the first messages. You can close the window; the crawl carries on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyper IDE
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy4gyvqeifietyxqeejq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy4gyvqeifietyxqeejq9.png" alt="Hyper IDE with a Hyperlambda file open, a dirty tab marker, and the slot autocomplete popup showing" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The file manager and code editor for everything on your server, and the component that absorbed the most work.&lt;/p&gt;

&lt;p&gt;The tree browses the whole backend file system. Files open as &lt;strong&gt;tabs&lt;/strong&gt;, several at once, and each tab tracks whether it is dirty — a dot appears on the tab and beside the path in the header the moment you change something, and navigating away asks before discarding it. The editor runs a Hyperlambda mode ported from the old dashboard, so slot invocations are coloured correctly, and &lt;strong&gt;Ctrl+Space completes against the backend's actual vocabulary&lt;/strong&gt; — the list of slots is fetched from the server you are connected to, and cached per backend, because two cloudlets with different plugins know different slots. That is the popup in the screenshot above, listing the &lt;code&gt;log.*&lt;/code&gt; slots this particular cloudlet knows about.&lt;/p&gt;

&lt;p&gt;Executing a file is smarter than it was. If the file is a real HTTP endpoint — it ends in &lt;code&gt;.get.hl&lt;/code&gt;, &lt;code&gt;.post.hl&lt;/code&gt; and friends, and lives under &lt;code&gt;/modules/&lt;/code&gt; or &lt;code&gt;/system/&lt;/code&gt; — the IDE invokes it as an endpoint, with arguments, and shows you the status code and response headers. Only files that are not endpoints get evaluated directly. You can upload and download files, preview HTML, XML, images, JavaScript and CSS straight from &lt;code&gt;/etc/www/&lt;/code&gt;, and press F1 on any selection to ask the AI what it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6t19orvr900t3aradjg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6t19orvr900t3aradjg0.png" alt="The Hyperlambda Playground with a data.read example and its result pane" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hyperlambda, executed on your server, without saving anything first. Input on the left, result on the right, F5 to run. It is the scratchpad you reach for when you want to know what a slot actually returns, and it saves snippets when the scratch turns out to be worth keeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  SQL Studio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv8edktw394ihvetbktuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv8edktw394ihvetbktuy.png" alt="SQL Studio with a query written against the chinook database" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two tabs over the same three selectors: database type, connection string, database.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;SQL&lt;/strong&gt; tab is a query editor with syntax colouring, Ctrl+Space completion over your real tables and columns, saved snippets, &lt;code&gt;.sql&lt;/code&gt; import, CSV export of results, and a Safe mode toggle that caps what a careless query can do. Selecting part of the text executes only the selection.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Designer&lt;/strong&gt; tab is the one I am quietest about and proudest of. It renders every table in the database as a card — primary keys, column types, nullability, and the foreign keys spelled out underneath — and lets you add tables, add columns and wire up relations without writing DDL. It will also hand you the DDL for a single table or the whole database if you would rather write it yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faxumu6rdhk27fpq2rqvf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faxumu6rdhk27fpq2rqvf.png" alt="The SQL Studio Designer tab rendering chinook tables as schema cards with foreign keys" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Databases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9s05kbp1hmn30e308nes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9s05kbp1hmn30e308nes.png" alt="The Databases screen listing SQLite databases with table counts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create SQLite databases, back them up, restore them from an uploaded backup, delete the ones you no longer need — and, on the second tab, connect to external MySQL, PostgreSQL and SQL Server instances. Everything else in the dashboard then treats those exactly like a local database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generator
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w0appui4pdnq6dbm3qf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w0appui4pdnq6dbm3qf.png" alt="The Generator screen with chinook tables selected and CRUD options" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point it at a database, tick the tables, and it writes you a complete CRUD backend: POST, GET, PUT and DELETE per table, with paging, sorting, aggregates, distinct and search endpoints if you want them. You choose which roles may call what, whether writes are logged, how long GET responses may be cached, and whether existing files may be overwritten. The second tab wraps a custom SQL statement in an endpoint of its own.&lt;/p&gt;

&lt;p&gt;This is the part that turns a schema into a secured API in seconds, and it is why the backend is rarely where the time goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoints
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiynm5x308yn6yxywlahh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiynm5x308yn6yxywlahh.png" alt="The Endpoints screen with modules expanded showing HTTP verb badges" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every endpoint on the backend, grouped by module, with its HTTP verb. Open one and you get a form built from its actual arguments — fill them in, invoke it, and see the status code, the response headers and the body rendered according to its content type.&lt;/p&gt;

&lt;p&gt;It handles files in both directions now, which it did not before: endpoints that accept &lt;code&gt;multipart/form-data&lt;/code&gt; get a proper file picker with image thumbnails inline, and endpoints that return files offer them as downloads. Each module will also hand you its OpenAPI specification, which is how you point an external tool — or an agent — at a subset of your API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Users and roles
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t8ynapnt41vwmcjaext.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t8ynapnt41vwmcjaext.png" alt="The Users and roles screen listing users with their roles" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Who may reach your backend, and what they may do. Create users, assign roles, change passwords, lock accounts. Roles are the same objects the Generator gates endpoints with and the same ones inside the JWT, so this screen is the authorisation surface for the entire platform in one table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task Manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9e9s9d90o5ep4t6idixq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9e9s9d90o5ep4t6idixq.png" alt="The Task Manager listing scheduled Hyperlambda tasks" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hyperlambda that runs on a schedule or on demand — backups, cleanup jobs, crawls, alerts. Tasks can repeat on an interval, fire once at a fixed date, or follow a custom repetition pattern, and you can execute any of them immediately to see what happens. Executing asks first, because a task named &lt;code&gt;delete-old-log-items&lt;/code&gt; means it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Machine Learning
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmoamj1a6gwo0no8fpis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmoamj1a6gwo0no8fpis.png" alt="The Machine Learning screen listing models with import, vectorise and embed actions" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The largest single screen in the application, at two thousand lines. Models define which LLM answers, at what temperature, with what system message and what threshold. Training data is the content those models answer from — crawled from a site, uploaded as files, or written by hand. Vectorising turns it into embeddings; embedding hands you the snippet that drops the finished chatbot onto a web page. A history tab shows what people actually asked it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugins
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwm5jiqxhfbkmi4pv2cx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwm5jiqxhfbkmi4pv2cx.png" alt="The Plugins screen showing available Bazar modules" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Bazar: MCP, OAuth, OpenAI, Ollama, HuggingFace, Shopify, HubSpot, NetSuite, scraping, charts, and a couple of dozen more. One click installs a module into your cloudlet, endpoints and all. You can also install your own from a ZIP file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Profile
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F33razafuptqnwwr9eomz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F33razafuptqnwwr9eomz.png" alt="The Profile screen with details, password change and access token generation" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your name, your email, your password — and &lt;strong&gt;access tokens&lt;/strong&gt;, which is the part that matters operationally. Generate a long-lived JWT for a service account, a CI pipeline or an integration, scoped to the roles you pick and expiring on a date you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Log
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feq9bs6yumty8jrqli6ik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feq9bs6yumty8jrqli6ik.png" alt="The Log screen listing backend log entries by type and time" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What your backend has been doing, newest first, filterable, with severity on every row. It is where you go when something did not work, and the generated CRUD endpoints write to it automatically when you ask them to log writes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What got better, not just moved
&lt;/h2&gt;

&lt;p&gt;If this had been a straight translation I would not have bothered writing about it. The features that did not exist in the Angular version, all built inside those same thirty hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OIDC login&lt;/strong&gt; — sign in with Google or any registered provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File upload and download through the Endpoints screen&lt;/strong&gt;, with inline image previews&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dirty-file tracking&lt;/strong&gt; across Hyper IDE, SQL Studio and the Playground&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple files open at once&lt;/strong&gt;, as tabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-backend support&lt;/strong&gt; with a separate JWT per cloudlet and shareable &lt;code&gt;?backend=&lt;/code&gt; links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magnetic-link login&lt;/strong&gt; for passwordless sign-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The MCP agent banner&lt;/strong&gt; and the &lt;strong&gt;Chatbot Wizard&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Previewing&lt;/strong&gt; HTML, XML, images, JavaScript and CSS from &lt;code&gt;/etc/www/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI support agent on F1&lt;/strong&gt;, answering from the Hyperlambda and Magic documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The bug ledger
&lt;/h2&gt;

&lt;p&gt;Two rules make this kind of build survivable: the model writes, and a human reviews everything before it lands. Here is what the review caught.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React's StrictMode caused three separate bugs.&lt;/strong&gt; It deliberately runs effects twice in development, which broke an image preview (the object URL was revoked before the image loaded), killed a SignalR connection (started and stopped in the same tick), and made two stacked dialogs land on the same z-index. All three were the same root cause wearing different hats, and all three were found by looking at the screen, not the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model invented a slot that does not exist.&lt;/strong&gt; It used &lt;code&gt;date.add&lt;/code&gt; for date arithmetic. There is no such slot. The fix was &lt;code&gt;math.add&lt;/code&gt; with a &lt;code&gt;time&lt;/code&gt; node — the pattern already used elsewhere in the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It invented a role, too.&lt;/strong&gt; It gated the dashboard on an &lt;code&gt;admin&lt;/code&gt; role. The backend has 159 endpoints and every one of them checks &lt;code&gt;root&lt;/code&gt;. Caught during review, renamed everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A mail endpoint was built with the wrong node shape&lt;/strong&gt;, which produced a runtime error rather than an email. &lt;strong&gt;A magnetic link took three attempts&lt;/strong&gt; to redirect correctly, because the token was being stripped from the URL before a second render could read it. &lt;strong&gt;An expired token walked straight into the dashboard&lt;/strong&gt;, because expiry was being checked without asking the server whether the token was still valid.&lt;/p&gt;

&lt;p&gt;And two mistakes the model made about its own work, which I include because they are the most instructive of the lot. It told me one screen had no confirmation dialog before running a destructive task — it had searched the code in a way that could not have found the guard, which was sitting six lines above what it read. And it told me a screenshot I had pushed did not exist, when the file was recoverable the whole time. Both were confidently wrong, and both were wrong in the same direction: &lt;em&gt;reporting an absence after looking in the wrong place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nothing on this list shipped. But the list is the honest cost of the method, and anyone telling you their AI build had no such list is not counting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this actually demonstrates
&lt;/h2&gt;

&lt;p&gt;It would be easy to read this as "AI writes code fast." That is not the finding, and it is not what changed.&lt;/p&gt;

&lt;p&gt;The expensive part of the 2021 rewrite was never typing. It was reading the old implementation to work out what a screen did in the edge cases, holding forty-odd screens' worth of behaviour in your head, and checking parity one control at a time. That is the part that compressed. The model does not get bored on screen thirty-one, and it does not skip the tedious parts of the Machine Learning page because the Dashboard was more fun.&lt;/p&gt;

&lt;p&gt;What did not change is who is responsible. I reviewed everything. I found the invented slot, the invented role, and the token that should not have been trusted. The ratio moved; the accountability did not. Thirty hours with a competent reviewer is not the same thing as thirty hours unattended, and I would not claim otherwise.&lt;/p&gt;

&lt;p&gt;Three months to thirty hours, on the same application, by the same person. That is the number I would want to see from someone else before I believed any of this, so it is the number I am publishing.&lt;/p&gt;

&lt;p&gt;Magic is MIT-licensed and open source — the repository is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, with documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>react</category>
      <category>angular</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Everything Supabase Does Not Have, in One Video: An AI Agent Builds a Role-Secured CRM</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 24 Jul 2026 13:05:35 +0000</pubDate>
      <link>https://dev.to/polterguy/everything-supabase-does-not-have-in-one-video-an-ai-agent-builds-a-role-secured-crm-1oen</link>
      <guid>https://dev.to/polterguy/everything-supabase-does-not-have-in-one-video-an-ai-agent-builds-a-role-secured-crm-1oen</guid>
      <description>&lt;p&gt;Supabase is a good product. I have written about it &lt;a href="https://hyperlambda.dev/blog/magic-cloud-the-self-hosted-supabase-alternative-built-for-ai-agents" rel="noopener noreferrer"&gt;approvingly&lt;/a&gt;, I have shown how to &lt;a href="https://hyperlambda.dev/blog/how-to-run-ai-agents-on-your-existing-supabase-database-without-migrating-anything" rel="noopener noreferrer"&gt;run AI agents on top of an existing Supabase database&lt;/a&gt;, and none of that changes today.&lt;/p&gt;

&lt;p&gt;But there is a list of things Supabase does not have. Not "does worse" — does not have. And instead of writing that list as a feature matrix, I recorded a video where every item on it gets used, in one conversation, by an AI agent building a complete CRM from a single prompt.&lt;/p&gt;

&lt;p&gt;The prompt was one paragraph: create an app named crm6 — a database with three tables, a CRUD web API, the ability to send emails to contacts, and a modern frontend, with the whole API restricted to users in the "guest" role. The agent — Claude, connected over Magic's MCP server — did the rest. This article walks through what it built, and points out, at each step, the capability it leaned on that Supabase does not ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  What got built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An SQLite database with three tables — contacts, deals, and activities — with foreign keys, defaults, and seed data.&lt;/li&gt;
&lt;li&gt;Sixteen HTTP endpoints: full GET/POST/PUT/DELETE plus record counts for every table, and a send-email endpoint — every one of them restricted to the "guest" role.&lt;/li&gt;
&lt;li&gt;Email dispatch that looks up a contact by id and sends through the platform's SMTP integration.&lt;/li&gt;
&lt;li&gt;A designed frontend — JWT login against Magic's built-in auth, a KPI dashboard with a pipeline chart, searchable contacts with an email composer, a drag-and-drop deals kanban, and an activities list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2x6fklqwsuoyunyyplfm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2x6fklqwsuoyunyyplfm.jpg" alt="The crm6 dashboard — KPI cards, pipeline by stage, upcoming activities" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total hand-written backend code: zero lines. The CRUD layer was produced by the crudifier — twelve declarative calls, 722 lines of generated Hyperlambda, each call returning in well under a second. The send-email endpoint was generated from a plain-English prompt in 7.6 measured seconds. The only thing authored line by line was the frontend, and the agent wrote that too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the build
&lt;/h2&gt;

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

&lt;p&gt;Now the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A backend that generates itself
&lt;/h2&gt;

&lt;p&gt;Supabase gives you PostgREST: a generic REST reflection of your schema. That is genuinely useful, and it is also where it ends. The moment you need an endpoint that is not a table projection — "look up this contact's email address and send them a message, and throw if the contact does not exist" — you are writing an edge function by hand, in TypeScript, with your own error handling, and deploying it yourself.&lt;/p&gt;

&lt;p&gt;On Magic the agent described that endpoint in one English sentence, and the Hyperlambda Generator produced it, saved it, and put it on the wire — role-gated like everything else — in 7.6 seconds. The backend is not a reflection of the schema. It is generated, customizable code, produced from intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Access control the agent cannot code its way out of
&lt;/h2&gt;

&lt;p&gt;This is the structural one, and the reason the video is possible at all.&lt;/p&gt;

&lt;p&gt;Supabase's security model is row-level security: SQL policies you write per table, per app. When an AI agent generates your application code, every generated query and every generated function has to correctly respect those policies — and the service-role key that bypasses them is sitting right there in the environment. The security boundary lives inside generated code, which means every generation is a fresh chance to get it wrong.&lt;/p&gt;

&lt;p&gt;Magic enforces access at execution time, in the runtime. Every endpoint in this build declares that it requires the "guest" role, and the check runs before any endpoint logic — the agent's generated code never gets the option of forgetting it. After the build, anonymous requests against the CRUD layer and the email endpoint were fired as verification: 401, access denied, every time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwugjbbep5xnmjepmcgny.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwugjbbep5xnmjepmcgny.jpg" alt="Magic-auth login — the JWT ticket comes from the platform, not from hand-rolled auth code" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is why you can hand an agent production credentials on this platform and watch it work. The platform, not the prompt, decides what those credentials can do. Supabase has nothing equivalent — not because their engineers are not capable, but because their architecture places authorization inside the application, and the application is now written by a probabilistic author.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A native MCP server
&lt;/h2&gt;

&lt;p&gt;Everything in the video happens over one MCP connection. Creating the database, generating endpoints, uploading files, verifying the result — the agent operates the platform through the same tool surface you are using when you talk to your own Magic cloudlet from Claude.&lt;/p&gt;

&lt;p&gt;Supabase has MCP as an add-on for development workflows. Magic's MCP server is the platform: every capability, scoped to the authenticated user's roles, with the agent able to generate new tools for itself when the existing ones do not fit. There is no "integration" step in the video because there is nothing to integrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Email as a platform primitive
&lt;/h2&gt;

&lt;p&gt;The CRM sends email to contacts. On Supabase that feature means an edge function, a third-party mail API, an API key to manage, and retry logic you own forever. On Magic, SMTP is configured once at platform level, and the generated endpoint simply sends — the agent never saw a mail-provider credential, because there is none in the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61njx0ohe9mhgkmgvdlj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61njx0ohe9mhgkmgvdlj.jpg" alt="Composing an email to a contact — one guest-gated endpoint, zero mail-provider plumbing" width="798" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A web server
&lt;/h2&gt;

&lt;p&gt;The frontend in the video is served by the same system that serves the API. The agent wrote three files — HTML, CSS, JavaScript — into the platform's file system, and they were live at their URL the moment they were written. No Vercel, no Netlify, no storage-bucket-pretending-to-be-a-website, no CORS configuration between your frontend host and your backend host, because there is only one host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rr0zqx9c51an8nc70u9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rr0zqx9c51an8nc70u9.jpg" alt="The deals kanban — drag a card between stages and the deal updates through the guest-gated API" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase Storage holds files. It is not a web root, and Supabase does not want to be your web server. Magic is one deployable unit that is your database, your API, your auth, your mail, and your frontend host — which is precisely what lets one agent in one conversation ship the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The boring ones that add up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JWT auth with ticket rotation built in&lt;/strong&gt; — the frontend logs in against the platform's auth endpoint and refreshes its ticket on a ten-minute window. No auth library was installed anywhere in this build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task scheduling, logging, and a server-side file system&lt;/strong&gt; — not used heavily in the video, but they are the reason the agent never had to leave the platform for anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT license, one container, nothing gated&lt;/strong&gt; — the entire stack in the video is the open-source product. There is no hosted-only feature making the demo prettier than your deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8054vzxpibzy5mrtxn9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8054vzxpibzy5mrtxn9.jpg" alt="Contacts with search, status badges, and per-row actions — generated CRUD underneath" width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Supabase has that Magic does not
&lt;/h2&gt;

&lt;p&gt;Fairness cuts both ways, and this list is real: realtime subscriptions over Postgres replication, the depth of the Postgres extension ecosystem, client SDKs for every framework under the sun, and a community large enough that every question you will ever have is already answered somewhere. If your product is built around live-updating Postgres data and your team's velocity comes from that ecosystem, Supabase remains the right call — I said so in &lt;a href="https://hyperlambda.dev/blog/magic-cloud-the-self-hosted-supabase-alternative-built-for-ai-agents" rel="noopener noreferrer"&gt;the comparison article&lt;/a&gt;, and it still holds.&lt;/p&gt;

&lt;p&gt;But none of those close the gap the video demonstrates. They make Supabase a better database platform. They do not make it a system an AI agent can safely operate end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The point
&lt;/h2&gt;

&lt;p&gt;The interesting question in 2026 is no longer "which backend has the better dashboard." It is: when the next developer on your team is an agent with a prompt, what can it actually do — and what stops it from doing what it should not?&lt;/p&gt;

&lt;p&gt;In this build the answer was: everything, and the runtime. A database, sixteen role-secured endpoints, email dispatch, and a designed, working frontend, from one paragraph of intent — with every operation bounded by execution-time RBAC the agent could not generate its way around. That combination — generation, enforcement, MCP, mail, and hosting in one self-hosted, MIT-licensed unit — is the system that has everything Supabase does not.&lt;/p&gt;

&lt;p&gt;Magic is open source at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;, and hosted cloudlets at &lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;ainiro.io&lt;/a&gt; if you would rather not run it yourself.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://hyperlambda.dev/blog/everything-supabase-does-not-have-in-one-video-an-ai-agent-builds-a-role-secured-crm" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>ai</category>
      <category>backend</category>
      <category>opensource</category>
    </item>
    <item>
      <title>78% of Enterprise AI Teams Now Run MCP Agents in Production — Here's Why Most of Them Are Doing It Wrong</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Thu, 23 Jul 2026 10:27:11 +0000</pubDate>
      <link>https://dev.to/polterguy/78-of-enterprise-ai-teams-now-run-mcp-agents-in-production-heres-why-most-of-them-are-doing-it-109g</link>
      <guid>https://dev.to/polterguy/78-of-enterprise-ai-teams-now-run-mcp-agents-in-production-heres-why-most-of-them-are-doing-it-109g</guid>
      <description>&lt;p&gt;Seventy-eight percent of enterprise AI teams now run MCP-backed agents in production, and &lt;a href="https://andrew.ooo/answers/mcp-model-context-protocol-enterprise-adoption-july-2026/" rel="noopener noreferrer"&gt;28% of the Fortune 500 operate their own MCP servers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The ecosystem has passed &lt;a href="https://tech-insider.org/ie/model-context-protocol-mcp-update-2026/" rel="noopener noreferrer"&gt;10,000 servers, with SDK downloads running at roughly 97 million per month&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Less than two years after &lt;a href="https://www.anthropic.com/news/model-context-protocol" rel="noopener noreferrer"&gt;Anthropic open-sourced the protocol&lt;/a&gt;, MCP is no longer the interesting experiment. It is the default way AI agents reach company data.&lt;/p&gt;

&lt;p&gt;That is the good news.&lt;/p&gt;

&lt;p&gt;The bad news is that adoption happened faster than security maturity. Most of those production deployments were stood up in the demo era — a shared API key in a config file, every tool exposed to every caller — and never hardened afterwards.&lt;/p&gt;

&lt;p&gt;They work. They also hand an autonomous agent the keys to company data with less access control than you would accept for a summer intern.&lt;/p&gt;

&lt;h2&gt;
  
  
  From experiment to infrastructure
&lt;/h2&gt;

&lt;p&gt;The timeline is worth appreciating, because it explains the problem.&lt;/p&gt;

&lt;p&gt;MCP went from novelty to infrastructure in record time. Every major vendor now ships servers — &lt;a href="https://www.microsoft.com/en-us/power-platform/blog/2026/07/06/dataverse-july2026/" rel="noopener noreferrer"&gt;Microsoft alone offers a catalog of 60+ MCP servers across Copilot, Copilot Studio, and Azure AI Foundry&lt;/a&gt;. And in five days, on July 28th, &lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/" rel="noopener noreferrer"&gt;the largest specification revision since MCP launched becomes the official spec, starting a 12-month deprecation clock for older protocol versions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A protocol with a formal deprecation policy is not an experiment anymore. It is plumbing.&lt;/p&gt;

&lt;p&gt;And here is the thing about plumbing: experiments don't get attacked. Infrastructure does.&lt;/p&gt;

&lt;p&gt;When 28% of the Fortune 500 runs something, that something becomes a target. The security posture that was fine for a weekend demo — because nothing valuable was behind it — is now sitting in front of CRMs, ERPs, financial data, and customer records.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three ways teams are doing it wrong
&lt;/h2&gt;

&lt;p&gt;I have looked at a lot of MCP deployments over the last year, and the failures cluster into three patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Over-broad tool exposure
&lt;/h3&gt;

&lt;p&gt;The most common mistake is the simplest one: the server hands every connected agent every tool it has.&lt;/p&gt;

&lt;p&gt;Read the database? Sure. Drop the database? Also sure. Same catalog, same caller, no distinction.&lt;/p&gt;

&lt;p&gt;This violates the oldest rule in security — least privilege — and it does so at the worst possible layer, because the caller is a language model. &lt;a href="https://securityboulevard.com/2026/07/securing-model-context-protocol-the-future-proof-blueprint-for-2026/" rel="noopener noreferrer"&gt;Every serious treatment of MCP security published this year&lt;/a&gt; lands on the same conclusion: the tool catalog an agent sees must be scoped to what that agent's &lt;em&gt;user&lt;/em&gt; is allowed to do, not to what the server is capable of.&lt;/p&gt;

&lt;p&gt;If the agent can enumerate a destructive tool, some prompt, someday, will convince it to call that tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Bolted-on or absent authentication
&lt;/h3&gt;

&lt;p&gt;The second failure is authentication that isn't really authentication.&lt;/p&gt;

&lt;p&gt;A long-lived API key pasted into a JSON config is not identity. It is a password that never rotates, shared by everyone who copies the config, tied to no user, and invisible to your identity provider.&lt;/p&gt;

&lt;p&gt;The protocol itself has moved past this. The MCP team just promoted its &lt;a href="https://www.infoq.com/news/2026/07/mcp-ema-enterprise-auth/" rel="noopener noreferrer"&gt;Enterprise-Managed Authorization extension to stable status&lt;/a&gt;, which routes MCP server access through the organization's identity provider — with support already shipped by Anthropic across Claude, Claude Code, and Cowork, by Visual Studio Code, and server-side by Asana, Atlassian, Canva, Figma, Linear, and Supabase.&lt;/p&gt;

&lt;p&gt;When the protocol's own answer to "who is calling?" is &lt;em&gt;your IdP&lt;/em&gt;, a shared bearer secret in a dotfile is no longer a pragmatic shortcut. It is technical debt with a blast radius.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Trusting the conversation
&lt;/h3&gt;

&lt;p&gt;The third failure is the subtle one, and it is the one that makes MCP security genuinely different from API security.&lt;/p&gt;

&lt;p&gt;An agent is a confused deputy by construction. It reads tool results, web pages, emails, documents — and every one of those inputs is a potential instruction channel. Prompt injection through tool output is not a theoretical attack; it is the standard attack.&lt;/p&gt;

&lt;p&gt;Which means one thing, architecturally: &lt;strong&gt;you cannot firewall a conversation.&lt;/strong&gt; No system prompt, no guardrail phrasing, no "please only use tools responsibly" preamble will hold. If the security check lives in the prompt, the security check is a suggestion.&lt;/p&gt;

&lt;p&gt;The permission decision has to live on the server, at the endpoint, enforced on every call regardless of what the model believes it is doing. I have written before that &lt;a href="https://hyperlambda.dev/blog/agentic-ai-without-permission-boundaries-is-just-malware-with-ux" rel="noopener noreferrer"&gt;agentic AI without permission boundaries is just malware with UX&lt;/a&gt; — MCP at enterprise scale is exactly where that stops being a slogan and starts being an incident report.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doing it right looks like
&lt;/h2&gt;

&lt;p&gt;The fix is not exotic. It is three principles, each one mapping to a failure above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity, not shared secrets.&lt;/strong&gt; Every MCP session belongs to a real user, authenticated against real identity infrastructure, with a token that expires. Per-user, revocable, auditable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role-gated tool catalogs.&lt;/strong&gt; The &lt;code&gt;tools/list&lt;/code&gt; an agent receives is filtered by the caller's roles before the agent ever sees it. The agent cannot be talked into calling a tool it cannot enumerate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-side enforcement as the last line.&lt;/strong&gt; Even if the catalog leaks, even if the model hallucinates a tool name, the endpoint itself checks authorization on every invocation. The prompt proposes; the server disposes.&lt;/p&gt;

&lt;p&gt;This is how &lt;a href="https://hyperlambda.dev/blog/magic-now-supports-mcp-server-integration-for-ai-agents" rel="noopener noreferrer"&gt;Magic Cloud's MCP server&lt;/a&gt; is built, and it is worth describing not as a product pitch but as a worked example of the pattern — because Magic did not add security &lt;em&gt;to&lt;/em&gt; MCP. The MCP layer inherits it.&lt;/p&gt;

&lt;p&gt;Every MCP tool in Magic is an HTTP endpoint with its own authorization requirement. The access token is a real JWT tied to a real Magic user with real roles — the same auth system that protects the API protects the MCP surface, because they are the same surface. When an agent connects, the tool list it receives is the list of endpoints its user's roles permit, nothing more. And when it invokes a tool, the role check runs server-side, before any endpoint logic, on every single call.&lt;/p&gt;

&lt;p&gt;There is no separate "MCP security model" to configure, drift, or forget. If a user cannot call an endpoint over HTTP, their agent cannot call it over MCP. One contract, enforced once, in one place.&lt;/p&gt;

&lt;p&gt;That is what &lt;a href="https://hyperlambda.dev/blog/claude-code-tried-to-break-magic-cloud-and-mostly-ended-up-confirming-its-security" rel="noopener noreferrer"&gt;held up when a frontier coding agent spent a session actively trying to break it&lt;/a&gt; — and it is the same boundary that makes it safe to let &lt;a href="https://hyperlambda.dev/blog/a-complete-crm-in-one-conversation-60-seconds-of-backend-six-cents-of-tokens" rel="noopener noreferrer"&gt;an agent build an entire role-secured CRM in one conversation&lt;/a&gt;: the platform, not the prompt, decides what the agent can touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The window is closing
&lt;/h2&gt;

&lt;p&gt;Here is why this matters &lt;em&gt;now&lt;/em&gt; rather than eventually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/" rel="noopener noreferrer"&gt;The July 28th spec release starts a 12-month deprecation clock&lt;/a&gt;. Every team running MCP in production will touch their stack in the next year whether they want to or not — to move off deprecated protocol versions if nothing else.&lt;/p&gt;

&lt;p&gt;That migration is the natural moment to fix what the demo era left behind. Swap the shared key for identity-backed tokens. Scope the tool catalog by role. Push the permission check down to the server where it belongs. Doing it as part of a migration you already have to do is cheap. Doing it after an agent with a wide-open catalog gets injected by a poisoned tool result is not.&lt;/p&gt;

&lt;p&gt;Being in the 78% is no longer the differentiator. Everyone is in the 78%.&lt;/p&gt;

&lt;p&gt;The differentiator is being in the minority that can answer, precisely and per-user, the only question that matters once agents are in production:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What exactly can this agent do, and who said so?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Magic is MIT-licensed and open source — the repository is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, with documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hyperlambda.dev/blog/78-percent-of-enterprise-ai-teams-now-run-mcp-agents-in-production-heres-why-most-of-them-are-doing-it-wrong" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
    </item>
    <item>
      <title>From Zero to Production Backend with HTTPS in One Copy-Paste: Magic Cloud on DigitalOcean</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Tue, 21 Jul 2026 07:21:28 +0000</pubDate>
      <link>https://dev.to/polterguy/from-zero-to-production-backend-with-https-in-one-copy-paste-magic-cloud-on-digitalocean-2jn1</link>
      <guid>https://dev.to/polterguy/from-zero-to-production-backend-with-https-in-one-copy-paste-magic-cloud-on-digitalocean-2jn1</guid>
      <description>&lt;p&gt;Modern deployment orthodoxy is very clear about what you need to run a backend in production: a Kubernetes cluster, a CI/CD pipeline, a &lt;em&gt;"platform team"&lt;/em&gt;, an observability stack, and a cloud bill with a comma in it. Preferably also a DevOps engineer to babysit all of the above, because none of it babysits itself.&lt;/p&gt;

&lt;p&gt;Here's what you actually need: one $12 droplet, and one copy-paste.&lt;/p&gt;

&lt;p&gt;Everything below deploys a complete production backend - API, admin UI, database, and automatic HTTPS - and the only &lt;em&gt;"pipeline"&lt;/em&gt; involved is Ctrl+C, Ctrl+V.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The deployment is a text file. The text file is the tutorial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What you're actually getting
&lt;/h2&gt;

&lt;p&gt;Before the steps, let's be precise about what comes out the other end, because &lt;em&gt;"simple"&lt;/em&gt; usually means &lt;em&gt;"toy"&lt;/em&gt; and this isn't one.&lt;/p&gt;

&lt;p&gt;One droplet, running one Docker container. The container holds the &lt;a href="https://hyperlambda.dev/" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; backend - an ASP.NET Core API on an internal port, never publicly exposed - which also serves its own compiled Angular admin UI. No nginx for the frontend, no separate frontend service, no second container to keep in sync. In front of it sits &lt;a href="https://caddyserver.com" rel="noopener noreferrer"&gt;Caddy&lt;/a&gt;, which obtains and renews free Let's Encrypt certificates for your domain automatically. An internal SQLite database is created on first boot, and later you can connect MySQL, PostgreSQL, or SQL Server through the UI.&lt;/p&gt;

&lt;p&gt;Your data lives in four named Docker volumes - databases and uploads, config (including your JWT secret), installed modules, and your own files. These survive upgrades, reboots, and container rebuilds. This is the part enterprise vendors charge you a retainer to explain, and here it's just... four volumes.&lt;/p&gt;

&lt;p&gt;This walkthrough follows the &lt;a href="https://github.com/polterguy/magic/blob/master/docs/deploy-digitalocean.md" rel="noopener noreferrer"&gt;official DigitalOcean deployment doc&lt;/a&gt; in the repository - that's the canonical reference if you want every detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: The copy-paste
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.digitalocean.com/droplets/new" rel="noopener noreferrer"&gt;Create a droplet&lt;/a&gt;. Pick &lt;strong&gt;Ubuntu 24.04&lt;/strong&gt; and a plan with &lt;strong&gt;at least 2 GB RAM&lt;/strong&gt; - 4 GB is the comfortable choice. Why does a backend this lean want that much memory? It doesn't. The Angular production build during first boot does, because frontend tooling in 2026 remains a gas that expands to fill all available RAM. The deployment script even creates a 4 GB swap file specifically so cheap droplets don't get OOM-killed mid-build. That's the level of &lt;em&gt;"it just works"&lt;/em&gt; we're going for: the script assumes the worst and handles it.&lt;/p&gt;

&lt;p&gt;Now the actual deployment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://github.com/polterguy/magic/blob/master/.do/cloud-init.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;.do/cloud-init.yaml&lt;/code&gt;&lt;/a&gt; from the repository&lt;/li&gt;
&lt;li&gt;Edit &lt;strong&gt;one line&lt;/strong&gt; - &lt;code&gt;DOMAIN=&lt;/code&gt; - to the domain you'll be using&lt;/li&gt;
&lt;li&gt;Copy the entire file, and paste it into &lt;strong&gt;Advanced Options / User Data&lt;/strong&gt; on the droplet creation form&lt;/li&gt;
&lt;li&gt;Create the droplet&lt;/li&gt;
&lt;li&gt;Point your domain's &lt;strong&gt;DNS A record&lt;/strong&gt; at the droplet's IP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. That's the deployment. The cloud-init file installs Docker, clones the repository, builds the all-in-one image, and starts it behind Caddy with all four volumes wired up. You configured a production environment by editing one line in a text file, which is one line more configuration than I'd prefer, but I can live with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Wait, and why waiting is fine
&lt;/h2&gt;

&lt;p&gt;First boot takes &lt;strong&gt;15 to 20 minutes&lt;/strong&gt;, and your domain answers only when it's done. Most of that time is the Angular production build, which is slow by nature and unbothered by your schedule.&lt;/p&gt;

&lt;p&gt;I'm giving this its own section because every tutorial skips it, and every reader hits it. During those minutes your domain &lt;strong&gt;refuses connections&lt;/strong&gt;. If you're behind Cloudflare, you'll see a 521. Your reflex will be that something broke. Nothing broke - this is the expected state, not a failure. Caddy retries certificate issuance on its own, so HTTPS comes up by itself within minutes of DNS propagating.&lt;/p&gt;

&lt;p&gt;If you can't stand not watching, SSH in and follow along:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/cloud-init-output.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the log goes quiet and the build is done, your domain serves the login screen. Over HTTPS. With a real certificate you never requested, configured, or renewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Log in and rotate the keys
&lt;/h2&gt;

&lt;p&gt;Browse to &lt;code&gt;https://your-domain/&lt;/code&gt; and log in with &lt;strong&gt;root&lt;/strong&gt; / &lt;strong&gt;root&lt;/strong&gt;. The frontend loads the setup wizard automatically, which walks you through changing your root password, optionally adding your OpenAI API key for the AI features, and optionally configuring additional database connections.&lt;/p&gt;

&lt;p&gt;The detail worth pausing on: when you change the password, the system also &lt;strong&gt;replaces the default JWT secret&lt;/strong&gt; with a freshly generated one and persists it to the config volume. Most platforms put &lt;em&gt;"rotate your secrets"&lt;/em&gt; in a hardening checklist you'll read never. This one does it as a side effect of the one thing every human does anyway - changing the default password. Security that happens by default beats security that happens by discipline, every single time.&lt;/p&gt;

&lt;p&gt;Because config and data are persistent volumes, your new password, your JWT secret, and your database all survive reboots and upgrades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2: Upgrading later
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"Sure, deploying is easy - but what about maintaining it?"&lt;/em&gt; - the standard objection to every simple setup. Here's the entire maintenance story. SSH in and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/magic
git pull
docker build &lt;span class="nt"&gt;-f&lt;/span&gt; .do/Dockerfile.backend &lt;span class="nt"&gt;-t&lt;/span&gt; magic &lt;span class="nb"&gt;.&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; magic
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; magic &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="nt"&gt;--network&lt;/span&gt; magicnet &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; magic_files_etc:/magic/files/etc &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; magic_files_data:/magic/files/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; magic_files_config:/magic/files/config &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; magic_files_modules:/magic/files/modules &lt;span class="se"&gt;\&lt;/span&gt;
  magic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caddy keeps running untouched, certificates and all. And the content rules on container start are deliberately boring: the frontend folder is &lt;em&gt;overwritten&lt;/em&gt; from the new image - overwrite only, your own web files are never deleted. Platform folders come fresh with every upgrade. Everything else - data, config, modules, your files - is copied from the image only if missing, and &lt;strong&gt;never touched if it exists&lt;/strong&gt;. Your data outlives every container you'll ever run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Time for the section you knew was coming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one-copy-paste path:&lt;/strong&gt; $12/month for 1 vCPU / 2 GB, or ~$24/month for the comfortable 4 GB plan. Add 20% if you want droplet backups. Worst realistic case: &lt;strong&gt;under $30/month, all-in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The orthodox path:&lt;/strong&gt; a minimal managed Kubernetes setup starts around $150-300/month before you've deployed anything, and that's the cheap part - the expensive part is the human who understands it. Even a fraction of one DevOps engineer's time costs more per month than a &lt;em&gt;decade&lt;/em&gt; of this droplet.&lt;/p&gt;

&lt;p&gt;And the AI part - the &lt;a href="https://ainiro.io/natural-language-api" rel="noopener noreferrer"&gt;Hyperlambda Generator&lt;/a&gt;, which writes backend endpoints from plain English - currently costs &lt;strong&gt;nothing&lt;/strong&gt;. The repository lists future pricing at $49 per 1,000 requests, but today there's no payment wall at all. So the complete stack, AI code generation included, runs at the price of three coffees a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest version
&lt;/h2&gt;

&lt;p&gt;One droplet is one droplet. There's no high availability, no autoscaling, and if the datacenter region has a genuinely bad day, so does your backend until you restore from backup. If you're running payment infrastructure for millions of users, this is not your architecture, and I won't pretend otherwise.&lt;/p&gt;

&lt;p&gt;But here's the uncomfortable truth for the orthodoxy: the overwhelming majority of business backends fit comfortably inside one droplet of this size, and always will. Droplet backups exist. Restores work. And you can graduate to the complicated architecture &lt;em&gt;when you have the problem it solves&lt;/em&gt; - not preemptively, because a conference talk scared you into cosplaying Google.&lt;/p&gt;

&lt;p&gt;Until that day, your entire DevOps department is a text file with one edited line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hyperlambda.dev/" rel="noopener noreferrer"&gt;Get started with Magic Cloud&lt;/a&gt;, grab the code &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;, or &lt;a href="https://ainiro.io/contact-us" rel="noopener noreferrer"&gt;talk to us&lt;/a&gt; if you'd rather we deploy it with you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hyperlambda.dev/blog/magic-cloud-digitalocean-one-copy-paste" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your 20-Year-Old SQL Server Database is a Better AI Agent Than Anything OpenAI Sells You</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sat, 18 Jul 2026 08:25:37 +0000</pubDate>
      <link>https://dev.to/polterguy/your-20-year-old-sql-server-database-is-a-better-ai-agent-than-anything-openai-sells-you-574i</link>
      <guid>https://dev.to/polterguy/your-20-year-old-sql-server-database-is-a-better-ai-agent-than-anything-openai-sells-you-574i</guid>
      <description>&lt;p&gt;Your ERP runs on SQL Server. Your line-of-business app runs on MySQL. Your data is clean, your uptime is measured in years, and your DBA could restore the whole thing blindfolded. And every AI vendor on earth is telling you the first step towards &lt;em&gt;"AI transformation"&lt;/em&gt; is migrating away from all of it.&lt;/p&gt;

&lt;p&gt;That's not a technical requirement. That's a sales tactic.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;They don't want your database in the AI conversation, because your database doesn't pay them rent&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Migration Industrial Complex
&lt;/h2&gt;

&lt;p&gt;Watch any AI agent demo from the last two years. It runs on fresh Postgres, in somebody else's cloud, on a schema that was created 45 seconds before the recording started. Nobody demos on the SQL Server 2008 instance that's been running your order flow since before the iPhone existed - because their tooling &lt;em&gt;can't&lt;/em&gt;, and admitting that would ruin the pitch.&lt;/p&gt;

&lt;p&gt;So instead they've built an entire industry around convincing you that your database is the problem. The consultants call it &lt;em&gt;"data modernization"&lt;/em&gt;. The SaaS vendors call it &lt;em&gt;"onboarding"&lt;/em&gt;, which is a cute word for &lt;em&gt;"upload your customer records to our servers and pray"&lt;/em&gt;. The system integrators call it a &lt;em&gt;"6 to 18 month transformation project"&lt;/em&gt;, and they invoice accordingly.&lt;/p&gt;

&lt;p&gt;A typical migration project for a real production database runs anywhere from &lt;strong&gt;$250,000 to $1.2 million&lt;/strong&gt;, takes 9 to 18 months, and carries genuine risk of breaking the business it was supposed to &lt;em&gt;"transform"&lt;/em&gt;. And here's the punchline: at the end of it, you still don't have an AI agent. You have the same data in a different database, and a fresh invoice.&lt;/p&gt;

&lt;p&gt;Meanwhile, the actual thing you wanted - an AI agent that can answer questions about your customers, your orders, and your tickets - never required moving anything at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts are not permissions
&lt;/h2&gt;

&lt;p&gt;Now, the other camp will tell you migration is unnecessary because you can &lt;em&gt;"just let the LLM write SQL against production"&lt;/em&gt;. These people are even more dangerous than the consultants, because at least the consultants only steal your money.&lt;/p&gt;

&lt;p&gt;Handing a language model a raw database connection and a system prompt saying &lt;em&gt;"please only read, don't drop anything"&lt;/em&gt; is not security. It's a horoscope. Prompts are suggestions. The model can be confused, jailbroken, or simply wrong - and your production database will happily execute whatever it produces, because your production database was never asked for its opinion.&lt;/p&gt;

&lt;p&gt;The correct answer is the one your database has been screaming at you since the 90s.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;RBAC, not prompts. Permissions, not vibes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With &lt;a href="https://ainiro.io/magic-cloud" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt;, the architecture is boring on purpose. You create a scoped database user - ordinary DBA hygiene, enforced by SQL Server or MySQL itself. Magic connects as one more client, reads your schema, and generates secured CRUD endpoints for exactly the tables you select, each one wired with authentication and role-based access control. Its native MCP server then exposes those endpoints as tools to Claude, or any MCP-capable agent.&lt;/p&gt;

&lt;p&gt;The agent never sees a connection string. It never writes SQL. It gets a toolbox, filtered by the roles it authenticated with, and an endpoint outside its roles doesn't refuse politely - it &lt;em&gt;does not execute&lt;/em&gt;. Underneath even that sits the scoped database user, enforced by the one component in your stack you already trust completely.&lt;/p&gt;

&lt;p&gt;Three layers of enforcement, zero layers of prompt engineering. If you want the full step-by-step - scoped user, connection, CRUD generation, MCP - I wrote a &lt;a href="https://hyperlambda.dev/blog/create-an-ai-agent-from-your-sql-server-or-mysql-database-step-by-step" rel="noopener noreferrer"&gt;detailed practical guide over at hyperlambda.dev&lt;/a&gt;. The whole path is an afternoon, and your database remains completely unchanged throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hyperlambda Generator, or why hallucinations bounce off
&lt;/h2&gt;

&lt;p&gt;Generated CRUD covers 80% of what an agent needs. For the rest - the weird reporting join, the custom workflow, the endpoint nobody predicted - you use the &lt;a href="https://ainiro.io/natural-language-api" rel="noopener noreferrer"&gt;Hyperlambda Generator&lt;/a&gt;. Describe the endpoint in plain English, and a fine-tuned LLM writes the Hyperlambda for you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"But LLMs hallucinate!"&lt;/em&gt; Yes, they do. Which is exactly why we didn't build this the way everybody else builds it.&lt;/p&gt;

&lt;p&gt;First, the model isn't guessing at some general-purpose language with a billion Stack Overflow answers of varying quality. Hyperlambda is a small, constrained runtime, and the generator was fine-tuned specifically for it. Smaller surface, radically fewer ways to be wrong.&lt;/p&gt;

&lt;p&gt;Second - and this is the part the &lt;em&gt;"agentic coding"&lt;/em&gt; crowd hasn't figured out yet - the platform is self-describing at runtime. Every capability the runtime has can be enumerated and queried as ground truth on the actual server the code will run on. The generator doesn't &lt;em&gt;recall&lt;/em&gt; what the platform can do from training data that might be stale; the platform &lt;em&gt;tells&lt;/em&gt; it. Hallucinated capabilities become structurally impossible to ship, because a capability that doesn't exist has nowhere to execute.&lt;/p&gt;

&lt;p&gt;Third, generated code runs inside the whitelisting system. The runtime maintains an explicit list of what code in a given context is allowed to touch, enforced at the interpreter level. So even in the worst case - a confused generation, a hostile prompt, whatever - the code physically cannot reach beyond its whitelist. It can't hand the &lt;code&gt;guest&lt;/code&gt; role your PII, because the interpreter refuses to execute the attempt.&lt;/p&gt;

&lt;p&gt;Compare that to a coding agent free-styling Python against your production connection string, and tell me again which database is &lt;em&gt;"legacy"&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Let's put the two paths side by side, for the identical outcome - an AI agent operating on your existing business data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The migration path:&lt;/strong&gt; $250K to $1.2M, 9 to 18 months, a rewritten integration landscape, retrained staff, and a risk profile that keeps your CTO awake. And the agent work hasn't even started yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Magic path:&lt;/strong&gt; $0 to start. &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic is open source&lt;/a&gt; - clone it, Docker it, run it forever, including fully on-premise behind the same firewall your auditors already approved. One container next to your database, one afternoon of work, and the data never leaves your network. No per-seat tax, no per-row upload pricing, no rent.&lt;/p&gt;

&lt;p&gt;That's not a 10% optimization. That's an entire budget line evaporating, plus a year of calendar time you get back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest version
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend this makes every database problem disappear. If your schema is genuinely rotten, an AI agent on top of it will give you fast, well-secured answers derived from rotten data - garbage in, garbage out, now with better latency. And start read-only. A read-only agent over real business data is already massively useful, and it turns &lt;em&gt;"what if the agent writes something wrong"&lt;/em&gt; into a non-question for day one. Grant writes table by table, when you're ready, as deliberate decisions - the same way your DBA has granted everything else for twenty years.&lt;/p&gt;

&lt;p&gt;Which is really the whole point. The security model that protects your business from an over-eager AI agent isn't some new invention you need to learn. It's the one sitting in your database already, ignored by every vendor whose business model depends on you abandoning it.&lt;/p&gt;

&lt;p&gt;Your &lt;em&gt;"legacy"&lt;/em&gt; database isn't the thing holding your AI strategy back. It's the only part of your AI strategy that was finished before you started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ainiro.io/magic-cloud" rel="noopener noreferrer"&gt;Get started with Magic Cloud&lt;/a&gt;, or &lt;a href="https://ainiro.io/contact-us" rel="noopener noreferrer"&gt;talk to us&lt;/a&gt; if you'd rather we show you on your own stack.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>sql</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Create an AI Agent From Your SQL Server or MySQL Database, Step by Step</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 17 Jul 2026 09:56:29 +0000</pubDate>
      <link>https://dev.to/polterguy/create-an-ai-agent-from-your-sql-server-or-mysql-database-step-by-step-239i</link>
      <guid>https://dev.to/polterguy/create-an-ai-agent-from-your-sql-server-or-mysql-database-step-by-step-239i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Keep the database. Add the agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your data lives in SQL Server or MySQL, you have mostly been left out of the AI agent conversation. The demos run on fresh Postgres in someone's cloud. The tooling assumes a greenfield stack. And the databases that actually run your business — the ERP on SQL Server, the line-of-business MySQL nobody is allowed to touch — get treated as a problem to migrate away from rather than an asset to build on.&lt;/p&gt;

&lt;p&gt;This article is the practical counter to that. By the end of it, you will have a working AI agent that can read and operate on your existing SQL Server or MySQL database — through secured, generated endpoints, with the database itself completely unchanged.&lt;/p&gt;

&lt;p&gt;No migration. No schema changes. Nothing installed inside the database. The whole path is: scope a database user, connect Magic, generate endpoints, connect the agent over MCP. Each step takes minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture in one paragraph
&lt;/h2&gt;

&lt;p&gt;Magic connects to your existing database as one more client — the same way any application would. On top of that connection, its CRUD generator reads the schema and generates HTTP endpoints per table, each with authentication and role-based access control wired in. Magic's native MCP server then exposes those endpoints as tools, and any MCP-capable agent — Claude, Codex, Qoder — operates on your data through them. The agent never touches the database directly. Between it and your tables sit three enforced layers: the scoped database user, the runtime's role checks on every endpoint, and the whitelisting system underneath. All of it runs wherever you need it to — including fully on-premise, on the same network segment as the database.&lt;/p&gt;

&lt;p&gt;Now the steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Create a scoped database user for Magic
&lt;/h2&gt;

&lt;p&gt;Do this first, not eventually. It is the layer everything else stands on, and it is enforced by the database engine itself — the one component in this whole stack you already trust completely.&lt;/p&gt;

&lt;p&gt;On SQL Server, create a login and a database user for Magic, and grant it exactly the access the agent layer should have. If the agent should only work with three tables, grant SELECT on three tables and nothing else. Add INSERT or UPDATE per table when you are ready for writes.&lt;/p&gt;

&lt;p&gt;On MySQL, same idea: create a dedicated user and GRANT it the specific privileges on the specific tables.&lt;/p&gt;

&lt;p&gt;One practical caveat before you lock this down completely: the endpoint generation in step three depends on reading the schema — tables, columns, types, and keys, the metadata your database exposes through its information schema views. A user scoped down to SELECT on three tables may not be able to see enough of that metadata for the generator to do its job. The pragmatic answer is a temporary, less restricted user with metadata read access, used only while generating the endpoints — then switch Magic's connection to the tightly scoped user for everything that runs afterwards. Generation is a one-time act you perform deliberately; the scoped user is what the agent lives with.&lt;/p&gt;

&lt;p&gt;This is ordinary DBA hygiene, and that is precisely the point. You are not learning a new security model to give an agent access to your data — you are using the one your database has had for decades. If Magic's credentials can only read three tables, nothing generated on top of them can do more than that, no matter how confused any layer above ever gets.&lt;/p&gt;

&lt;p&gt;Starting read-only is the conservative default, and I recommend it. A read-only agent over real business data is already genuinely useful — and it turns the scariest question in this whole exercise ("what if the agent writes something wrong?") into a non-question for day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Connect the database to Magic
&lt;/h2&gt;

&lt;p&gt;Magic deploys as one Docker container for the backend and one for the dashboard. For an on-premise database, run them inside the same network perimeter — the connection never has to cross your firewall.&lt;/p&gt;

&lt;p&gt;Add your database as a connection in Magic, using the credentials from step one. Magic speaks to SQL Server and MySQL through the standard .NET data providers, so the connection string is the same shape your existing applications already use.&lt;/p&gt;

&lt;p&gt;That is the entire integration. Magic is now a client of your database — nothing more. Your existing applications, integrations, and reports continue exactly as before, because nothing about the database changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Generate CRUD endpoints for the tables that matter
&lt;/h2&gt;

&lt;p&gt;Point Magic's CRUD generator at the connected database and it reads the schema — tables, columns, types, keys — and generates Hyperlambda HTTP endpoints for the tables you select: read, create, update, delete, and count, each as its own endpoint, each with authentication and role-based access control already in place.&lt;/p&gt;

&lt;p&gt;Two decisions are worth actual thought here, and they are both decisions a DBA is well equipped to make.&lt;/p&gt;

&lt;p&gt;Which tables become capabilities. Not the whole schema. The agent needs the tables that answer real questions and support real workflows — customers, orders, tickets. Internal bookkeeping tables can stay unexposed.&lt;/p&gt;

&lt;p&gt;Which operations each table gets. If you scoped the database user read-only in step one, generate read and count endpoints and the two layers agree with each other. When you later grant writes at the database level, generate the matching endpoints then.&lt;/p&gt;

&lt;p&gt;If your database carries queries that do not fit CRUD — the reporting join across six tables, the aggregate someone runs every Monday — wrap them with the SQL endpoint generator: you write the SQL, define its arguments, and it becomes one more secured endpoint. Legacy databases have earned their weird queries; this is how they become tools instead of tribal knowledge.&lt;/p&gt;

&lt;p&gt;Then test the endpoints the ordinary way, over HTTP, before any AI enters the picture. List records. Fetch one. If something about the exposure feels wrong — a field that should not be visible, a table that should not be writable — this is where the correction costs nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Connect your agent over MCP
&lt;/h2&gt;

&lt;p&gt;Magic includes a native MCP server. Connect Claude — or any MCP-capable agent — to it, authenticating as a Magic user with specific roles.&lt;/p&gt;

&lt;p&gt;This step is where the earlier decisions pay off. The agent does not receive a database connection, and it does not receive a SQL surface. It receives tools: the endpoints you generated, filtered by the roles of the user it authenticated as. An endpoint outside its roles does not execute. Not "is instructed not to" — does not.&lt;/p&gt;

&lt;p&gt;That distinction is the difference between this architecture and the "just let the model write SQL against production" demos. Prompts are not permissions. A runtime that refuses to execute is a permission. I have written about this at length in &lt;a href="https://hyperlambda.dev/blog/why-secure-ai-code-execution-requires-runtime-whitelisting-not-prompt-filtering" rel="noopener noreferrer"&gt;the runtime whitelisting article&lt;/a&gt;, so here I will just note what it means practically: the worst a confused agent produces on this stack is a failed call, and underneath even that failure sits the scoped database user from step one, enforced by SQL Server or MySQL itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5. Give it real work
&lt;/h2&gt;

&lt;p&gt;The agent is now connected to your actual business data, so test it with actual business tasks — not trivia.&lt;/p&gt;

&lt;p&gt;Ask it to look up a customer and summarise their order history. Ask which tickets are open past their deadline. Ask it to cross-reference two tables the way a colleague would ask a DBA. If you exposed writes, have it create a record, then verify the row in the database yourself.&lt;/p&gt;

&lt;p&gt;Two things tend to happen in this phase. First, the agent is more useful than expected, because it is grounded in real data rather than improvising. Second, you immediately get ideas for the two or three custom SQL endpoints that would make it dramatically better — which is exactly the right feedback loop. Add them, and the agent's toolbox grows without its permissions growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you have at the end
&lt;/h2&gt;

&lt;p&gt;A twenty-year-old database, unchanged, now has: a secured HTTP API over the tables that matter, an AI agent that operates through that API inside role boundaries, and a clean growth path — more tables, more custom endpoints, writes when you are ready — where every expansion is a deliberate grant rather than an accident.&lt;/p&gt;

&lt;p&gt;And because every layer of this runs in containers you place yourself, the entire stack — database, API layer, MCP server — can live on-premise, behind the same firewall, in the same network segment the auditors already approved. The agent connects in; the data never leaves.&lt;/p&gt;

&lt;p&gt;The pattern generalises past the first agent, too. The same endpoints serve embeddable chatbots, scheduled tasks that run against the data and send email, and — through the Hyperlambda Generator — agents that describe new endpoints in plain language and have them generated inside the same permission model. The first agent is rarely the last thing you build on this surface.&lt;/p&gt;

&lt;p&gt;Magic is MIT-licensed and open source — the repository is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, with documentation at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does the AI agent get direct access to my SQL Server or MySQL database?
&lt;/h3&gt;

&lt;p&gt;No, and that is the core of the design. The agent talks to Magic over MCP and only ever invokes generated endpoints, each gated by roles at execution time. The database only ever sees Magic's scoped credentials from step one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I do this without allowing any writes?
&lt;/h3&gt;

&lt;p&gt;Yes — and it is the recommended starting point. A read-only database user plus read-only generated endpoints gives you a useful question-answering agent over live business data with no write path at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does my database need to be reachable from the internet?
&lt;/h3&gt;

&lt;p&gt;No. Run Magic's containers inside the same network as the database. The database port never needs external exposure — the MCP surface is the only thing you choose to make reachable, and it sits behind authentication.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I have to write Hyperlambda?
&lt;/h3&gt;

&lt;p&gt;No. The CRUD generator emits it, and the SQL endpoint generator wraps SQL you already know how to write. The generated code is readable and editable when you want to customise, but the path in this article involves authoring none of it by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hyperlambda.dev/blog/supabase-for-sql-server-and-mysql-magic-brings-the-supabase-experience-to-legacy-databases-on-premise" rel="noopener noreferrer"&gt;Supabase for SQL Server and MySQL: Magic Brings the Supabase Experience to Legacy Databases, On-Premise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hyperlambda.dev/blog/from-sql-database-to-ai-agent-in-minutes" rel="noopener noreferrer"&gt;From SQL Database to AI Agent in Minutes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hyperlambda.dev/blog/how-to-run-ai-agents-on-your-existing-supabase-database-without-migrating-anything" rel="noopener noreferrer"&gt;How to Run AI Agents on Your Existing Supabase Database (Without Migrating Anything)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hyperlambda.dev/blog/magic-now-supports-mcp-server-integration-for-ai-agents" rel="noopener noreferrer"&gt;Magic now supports MCP server integration for AI agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The first LLM on earth that cannot hallucinate</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:02:22 +0000</pubDate>
      <link>https://dev.to/polterguy/the-first-llm-on-earth-that-cannot-hallucinate-44cj</link>
      <guid>https://dev.to/polterguy/the-first-llm-on-earth-that-cannot-hallucinate-44cj</guid>
      <description>&lt;p&gt;Yes, the headline is bait. No, it's not a lie.&lt;/p&gt;

&lt;p&gt;Every AI vendor on the planet claims their model "reduces hallucinations." Reduction is a percentage. &lt;em&gt;Cannot&lt;/em&gt; is an architecture. This article is about the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a hallucination actually is when a model writes code
&lt;/h2&gt;

&lt;p&gt;When an LLM writes Python or JavaScript, an invented API call is syntactically perfect. &lt;code&gt;pandas.read_excel_fast()&lt;/code&gt;, &lt;code&gt;express.validateJWT()&lt;/code&gt;, a package that never existed — the model produces them with total confidence, and the language happily accepts them. The code compiles. It passes a glance-level review. It fails at the worst possible moment: at runtime, in production, against real data.&lt;/p&gt;

&lt;p&gt;This is the dirty secret of free-form code generation: &lt;strong&gt;a general-purpose language has an infinite vocabulary.&lt;/strong&gt; Any name the model dreams up is grammatically valid code, indistinguishable from the real thing until it runs.&lt;/p&gt;

&lt;p&gt;The industry's answer? Review everything, trust nothing. Every generated line gets a human pass before production — which quietly hands back the time the AI was supposed to save you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Close the vocabulary
&lt;/h2&gt;

&lt;p&gt;Our generator doesn't emit free-form source code. It emits Hyperlambda — a language where code &lt;em&gt;is&lt;/em&gt; an execution tree, and every executable node is an invocation of a &lt;strong&gt;slot&lt;/strong&gt;: a named capability registered in the runtime.&lt;/p&gt;

&lt;p&gt;The crucial property: &lt;strong&gt;the set of slots is finite.&lt;/strong&gt; There is a registry. A capability either exists in it or it doesn't. The model cannot invent a capability — it can only &lt;em&gt;name&lt;/em&gt; one. And names are checkable.&lt;/p&gt;

&lt;p&gt;In a free-form language, a hallucinated function is valid code. In a closed-vocabulary language, a hallucinated slot is a &lt;em&gt;detectable lie&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Statically prove every instruction exists
&lt;/h2&gt;

&lt;p&gt;Detection is a slot called &lt;code&gt;[hyperlambda.verify-slots]&lt;/code&gt;. You hand it a piece of Hyperlambda, and it walks &lt;strong&gt;every node in executable statement position&lt;/strong&gt; — the root level, plus the body of every body-bearing slot it encounters, resolved from slot &lt;em&gt;signature metadata&lt;/em&gt; rather than hardcoded names, to any nesting depth — and checks each invocation against the registry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hyperlambda.verify-slots:@"strings.reverse:Hello world"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model made &lt;code&gt;strings.reverse&lt;/code&gt; up. The verdict:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hyperlambda.verify-slots:bool:false
   :strings.reverse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;false&lt;/code&gt;, plus the &lt;em&gt;exact names&lt;/em&gt; of everything that doesn't exist, as structured data. Not a stack trace three weeks later. Not an incident report. A named, mechanical, pre-execution verdict, delivered in milliseconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: The model never gets a vote
&lt;/h2&gt;

&lt;p&gt;Now wire the two together. Our Hyperlambda generator runs inside a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; — the model produces an execution tree from a natural-language prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove&lt;/strong&gt; — &lt;code&gt;verify-slots&lt;/code&gt; walks every executable statement and checks it against the registry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject and retry&lt;/strong&gt; — if anything doesn't exist, the &lt;em&gt;exact missing names&lt;/em&gt; go straight back into the generation context, and the model tries again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship only on &lt;code&gt;true&lt;/code&gt;&lt;/strong&gt; — code leaves the loop only when the verdict is a mechanical, binary yes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing about this depends on the model behaving. The model can hallucinate all it wants &lt;em&gt;inside&lt;/em&gt; the loop — what comes &lt;em&gt;out&lt;/em&gt; of the loop provably invokes only capabilities that exist. Hallucinated code is structurally unable to ship.&lt;/p&gt;

&lt;p&gt;You don't have to trust the model. The machine checks its homework.&lt;/p&gt;

&lt;p&gt;If you'd rather watch than read, here's the whole thing in action:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The fine print, up front
&lt;/h2&gt;

&lt;p&gt;Big claims deserve precise edges, so here's exactly where this one begins and ends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guaranteed:&lt;/strong&gt; no invented capability ever executes. Every instruction in production logic provably exists on the runtime it runs on. This entire &lt;em&gt;class&lt;/em&gt; of failure — the hallucinated API, the phantom package, the made-up function — is eliminated, not reduced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not claimed:&lt;/strong&gt; proven-to-exist is not proven-to-be-wise. Whether logic &lt;em&gt;should&lt;/em&gt; run is a separate question, and it gets a separate answer: a per-role whitelist enforced at the execution boundary itself, so even perfectly valid code can only touch the capabilities your RBAC policy explicitly names. And whether the logic is &lt;em&gt;correct&lt;/em&gt; for your business is what tests are for — same as code written by humans, who, it should be said, also occasionally invoke functions that don't exist.&lt;/p&gt;

&lt;p&gt;The point isn't that generated code becomes magically perfect. The point is that the trust boundary moves from the prompt to the runtime — from "hope the model behaved" to "the runtime refuses everything else."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I think this is the actual answer
&lt;/h2&gt;

&lt;p&gt;The whole industry is trying to fix hallucination inside the model: better training, better prompts, better RAG. That's fighting probability with probability. A model is a sampler; you can shrink the error rate, but you can't sample your way to &lt;em&gt;cannot&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A closed vocabulary plus a static proof gets you &lt;em&gt;cannot&lt;/em&gt; — with boring, deterministic, thirty-year-old computer science. No new model required.&lt;/p&gt;

&lt;p&gt;The runtime underneath all of this is &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; — MIT-licensed, open source, self-hostable. Audit the verifier yourself; it's a couple hundred lines of C# that walks a tree and asks a &lt;code&gt;HashSet&lt;/code&gt; some questions. The best security arguments are the ones you can read.&lt;/p&gt;

&lt;p&gt;And that's the whole trick, honestly. The first LLM on earth that cannot hallucinate isn't a smarter LLM.&lt;/p&gt;

&lt;p&gt;It's a dumber runtime that refuses to be impressed.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Magic Cloud vs Supabase: what an MIT-licensed backend does differently</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sat, 11 Jul 2026 19:41:42 +0000</pubDate>
      <link>https://dev.to/polterguy/magic-cloud-vs-supabase-what-an-mit-licensed-backend-does-differently-1go3</link>
      <guid>https://dev.to/polterguy/magic-cloud-vs-supabase-what-an-mit-licensed-backend-does-differently-1go3</guid>
      <description>&lt;p&gt;I want to say this up front: Supabase is a good product. This is not a takedown. But I keep meeting developers who like Supabase's model and still can't use it — because of one of a handful of hard constraints that no amount of Supabase configuration removes.&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt;, an MIT-licensed, self-hosted backend platform. Below are the differences that actually matter — specifically the things Supabase users ask for and structurally can't get, and honestly, the places where Supabase remains the better pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;Magic Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Open-core, some features hosted-only&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/polterguy/magic/blob/master/LICENSE" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;, everything included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;&lt;a href="https://supabase.com/docs/guides/self-hosting" rel="noopener noreferrer"&gt;Community-supported compose stack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;First-class, one backend + one dashboard container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL (theirs)&lt;/td&gt;
&lt;td&gt;SQLite default; connects to &lt;em&gt;your existing&lt;/em&gt; MySQL, PostgreSQL, MSSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server-side logic&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://supabase.com/docs/guides/functions" rel="noopener noreferrer"&gt;Deno edge functions&lt;/a&gt;, separate deploy&lt;/td&gt;
&lt;td&gt;Generated endpoints, live instantly, no build step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access control&lt;/td&gt;
&lt;td&gt;Postgres RLS, written per app&lt;/td&gt;
&lt;td&gt;Execution-time RBAC enforced by the runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI story&lt;/td&gt;
&lt;td&gt;pgvector + client libraries&lt;/td&gt;
&lt;td&gt;Native RAG, chatbots, MCP server, endpoint generator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now the parts a table can't capture.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It connects to the database you already have
&lt;/h2&gt;

&lt;p&gt;This is the difference that decides most evaluations, so it goes first.&lt;/p&gt;

&lt;p&gt;Supabase &lt;em&gt;is&lt;/em&gt; a managed Postgres. You don't connect Supabase to your database — you migrate your data into theirs. If your data lives in a fifteen-year-old SQL Server, or a MySQL instance three other systems depend on, that migration is somewhere between painful and impossible.&lt;/p&gt;

&lt;p&gt;Magic points at any existing MySQL, PostgreSQL, SQL Server, or SQLite database and generates a complete, secured CRUD API on top of it. The data stays where it is. Nothing migrates. The CRUD generator reads your schema and emits one endpoint per operation per table, each with authentication and role checks already wired in.&lt;/p&gt;

&lt;p&gt;For teams with legacy databases, this isn't a feature comparison — it's the whole decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Backend logic without a separate runtime
&lt;/h2&gt;

&lt;p&gt;Supabase's answer to "I need server-side logic" is edge functions: Deno, a separate deploy artifact, its own toolchain, and cold starts. It works, but it's a second system bolted onto the first.&lt;/p&gt;

&lt;p&gt;In Magic, an endpoint is a file on the server. Create the file, the endpoint is live. No build, no deploy pipeline, no cold start — after first execution the compiled AST is cached and subsequent calls execute in roughly 100–200 milliseconds.&lt;/p&gt;

&lt;p&gt;The runtime language is &lt;a href="https://hyperlambda.dev" rel="noopener noreferrer"&gt;Hyperlambda&lt;/a&gt;, and before that triggers an objection: you're not expected to write it. It's generated — by the CRUD generator, or by the Hyperlambda Generator, which compiles plain-English prompts into working endpoints. Think of it like the SQL your ORM emits. Readable, editable, rarely hand-authored.&lt;/p&gt;

&lt;p&gt;A side effect worth more than it sounds: since every endpoint is a plain-text file, &lt;strong&gt;your entire backend is version-controllable with git, as-is&lt;/strong&gt;. Supabase's server-side logic lives inside the database as RLS policies and triggers, and extracting it into reviewable migrations is its own discipline. Magic's answer is &lt;code&gt;git add&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sending email is a platform primitive
&lt;/h2&gt;

&lt;p&gt;Small one, but it's a perennial forum question: "how do I send email from Supabase?" The answer is always the same — you can't, beyond auth emails; go sign up for Resend or SendGrid and write an edge function.&lt;/p&gt;

&lt;p&gt;Magic has SMTP built in. Endpoints send mail, with MIME attachments, as a one-liner of generated code. Same story for task scheduling: where Supabase offers &lt;a href="https://supabase.com/docs/guides/database/extensions/pg_cron" rel="noopener noreferrer"&gt;pg_cron&lt;/a&gt; (which runs SQL), Magic has persisted, schedulable tasks that execute arbitrary backend logic — the "every Monday, call this API and email the report" job that SQL-only cron can't express.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The AI layer is a platform, not a column type
&lt;/h2&gt;

&lt;p&gt;Supabase's AI story is pgvector plus client libraries: here's a vector column, build your RAG pipeline yourself.&lt;/p&gt;

&lt;p&gt;Magic ships the pipeline. Website crawling, vectorization, RAG-backed machine-learning types, an embeddable chatbot widget, and AI functions — configured from the dashboard, no glue code. If the goal is "a chatbot trained on our docs, on our infrastructure," that's a dashboard task, not a sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The part I think matters most: agents can safely operate it
&lt;/h2&gt;

&lt;p&gt;Both platforms now have &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; servers, so both let AI agents &lt;em&gt;talk to&lt;/em&gt; the backend. The difference is what happens when agents &lt;em&gt;build on&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;Supabase's security model is row-level security: SQL policies, written per application. When a human writes the app, RLS works well. When an AI agent generates the app, every generated endpoint and query has to correctly respect those policies — the security boundary lives inside the generated code, and every generation is a fresh chance to get it wrong. A service-role key where an anon key belonged. A query that sidesteps a policy. The model doesn't have to be malicious, just wrong once.&lt;/p&gt;

&lt;p&gt;Magic inverts this. Hyperlambda executes as an AST, and every node must bind to a slot the runtime exposes. Permissions are enforced at execution time: endpoints declare which roles may invoke them, and the whitelisting system controls which slots code in a given context can bind to &lt;em&gt;at all&lt;/em&gt;. If a capability isn't whitelisted, generated code cannot call it — not "is instructed not to," but structurally cannot. The worst a bad generation can do is fail.&lt;/p&gt;

&lt;p&gt;That means an agent connected over MCP can generate new endpoints, create databases, and wire up logic — and everything it produces runs inside the same runtime-enforced boundaries as human-written code. Security is a property of the platform, implemented once in C#, instead of a property each generated app has to reimplement. I've written up the architecture in detail &lt;a href="https://hyperlambda.dev/blog/why-secure-ai-code-execution-requires-runtime-whitelisting-not-prompt-filtering" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In one reproducible session, an agent given a single natural-language prompt created a database, generated a public API, wired email notifications, deployed a chatbot widget and landing page, and verified every step over HTTP — and when the platform rejected a malformed widget, the agent read the built-in guides over MCP and fixed its own mistake. No human in the loop between prompt and working system.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Nothing is gated
&lt;/h2&gt;

&lt;p&gt;Magic is MIT-licensed end to end. There's no enterprise edition, no hosted-only dashboard features, no open-core split where the self-hosted version quietly lacks SSO or log drains. The hosted &lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;cloudlets at AINIRO&lt;/a&gt; run the same code you can deploy yourself from the &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; — because there's nothing to gate.&lt;/p&gt;

&lt;p&gt;Self-hosting is the primary deployment model, not a community afterthought: one Docker container for the backend, one for the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Supabase is still the right choice
&lt;/h2&gt;

&lt;p&gt;Credibility requires this section, so here it is, unhedged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need Postgres specifically.&lt;/strong&gt; Extensions, replication, a team fluent in it. Supabase's all-in bet on Postgres is a genuine strength; Magic treats databases as pluggable, which is more flexible but less deep on any single engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You rely on the ecosystem.&lt;/strong&gt; Client SDKs for every framework, enormous community, a tutorial for everything. Magic's community is smaller. If your velocity comes from copy-pasting battle-tested Supabase snippets, weigh that honestly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want realtime and storage-with-CDN out of the box.&lt;/strong&gt; Realtime subscriptions and storage buckets are Supabase strengths without a direct Magic equivalent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want a managed service and were never going to self-host.&lt;/strong&gt; Supabase's hosted product is genuinely good. Most of this article's argument is about the self-hosted path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summing up
&lt;/h2&gt;

&lt;p&gt;If your constraints include an existing database, real self-hosting, MIT licensing, or AI agents building and operating backend functionality, Magic Cloud solves problems Supabase structurally can't. If your constraints are Postgres depth and ecosystem gravity, stay with Supabase — sincerely.&lt;/p&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;github.com/polterguy/magic&lt;/a&gt;, the docs at &lt;a href="https://docs.ainiro.io" rel="noopener noreferrer"&gt;docs.ainiro.io&lt;/a&gt;, and a longer evaluation-focused comparison at &lt;a href="https://hyperlambda.dev/blog/magic-cloud-the-self-hosted-supabase-alternative-built-for-ai-agents" rel="noopener noreferrer"&gt;hyperlambda.dev&lt;/a&gt;. Spin it up in Docker and point it at a database you already have — that first CRUD generation is the moment the difference clicks.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>backend</category>
      <category>ai</category>
      <category>supabase</category>
    </item>
    <item>
      <title>Save $171,032 Annually on your Company's Claude subscription!</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 10 Jul 2026 05:28:57 +0000</pubDate>
      <link>https://dev.to/polterguy/save-171032-annually-on-your-companys-claude-subscription-5epo</link>
      <guid>https://dev.to/polterguy/save-171032-annually-on-your-companys-claude-subscription-5epo</guid>
      <description>&lt;p&gt;I used &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; to generate a simple CRUD API, with an SQLite database, two tables, allowing me to manage tasks and clients. Basically a micro "Jira" thing.&lt;/p&gt;

&lt;p&gt;Then I asked it how much more tokens it would have used if it didn't have Magic, and its price estimate increased from ~$0.53 to ~$2.60, implying Magic saved me 82% of my tokens on one simple task. Notice, this was a 5 minute job ...&lt;/p&gt;

&lt;p&gt;Then I asked it how much this would translate into for a company with 25 employees, where each employee actively uses Claude, and the company is heavily using agentic AI. Its answer ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A company with 25 employees, would save $171,072 annually on average. That's a cost reduction of $570 per month, for every single employee you have.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frresjsl3x2fsbr3o535j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frresjsl3x2fsbr3o535j.png" alt="Claude savings" width="799" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition to this, comes 80% time savings, since Claude becomes 5x faster with Magic, new capabilities (Magic allows for direct deployment of solutions), etc, etc, etc.&lt;/p&gt;

&lt;p&gt;Psst, Magic is Open Source, can be installed on your own infra in 10 minutes, and you can find at at GitHub (link in the first paragraph).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
