<?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: Avenotech Team</title>
    <description>The latest articles on DEV Community by Avenotech Team (@avenotech).</description>
    <link>https://dev.to/avenotech</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%2F4111815%2Fa398afdf-e4b3-4af1-910b-0e726b7b7a25.png</url>
      <title>DEV Community: Avenotech Team</title>
      <link>https://dev.to/avenotech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avenotech"/>
    <language>en</language>
    <item>
      <title>Custom LMS Development: Cost, Timeline and When to Build vs Buy (2026)</title>
      <dc:creator>Avenotech Team</dc:creator>
      <pubDate>Wed, 21 Oct 2026 03:28:55 +0000</pubDate>
      <link>https://dev.to/avenotech/custom-lms-development-cost-timeline-and-when-to-build-vs-buy-2026-34ab</link>
      <guid>https://dev.to/avenotech/custom-lms-development-cost-timeline-and-when-to-build-vs-buy-2026-34ab</guid>
      <description>&lt;p&gt;Get three quotes for a custom LMS and you may well get three numbers that look like they belong to different products: $15,000, $90,000 and $300,000. None of the vendors has to be lying. "Custom LMS" means a branded prototype to one team, a working platform with reporting to another, and a multi-tenant system serving dozens of client organizations to a third.&lt;/p&gt;

&lt;p&gt;The short answer: a focused custom LMS MVP costs about $40,000 to $70,000 and takes three to four months. A full platform costs $120,000 to $300,000 and takes six to ten. Extending an open-source LMS such as Moodle starts around $15,000.&lt;/p&gt;

&lt;p&gt;Whether you should spend any of that depends on who you are, so two hypothetical buyers run through this guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The training buyer.&lt;/strong&gt; A 400-person logistics company that needs drivers and warehouse staff through safety training and onboarding, with proof of completion when an auditor asks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The product builder.&lt;/strong&gt; A startup selling certification courses to 30 corporate clients, each of which wants its own branding, its own reports and its own invoice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their right answers are opposite, and most LMS cost guides never say which one they're written for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At 500 learners, five years of a licensed LMS costs $6,000 to $15,000 at 2026 list prices. Buy.&lt;/li&gt;
&lt;li&gt;At 25,000 learners, building wins on cash only if the enterprise quote tops about 26 cents per learner per month.&lt;/li&gt;
&lt;li&gt;Build when the LMS is your product. Buy when it's plumbing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Do Custom LMS Development Quotes Range From $15K to $500K+?
&lt;/h2&gt;

&lt;p&gt;Because they price different things under the same name. Below about $15,000 you're buying a prototype. The middle of the range buys a production v1 with roles, assessments, reporting and a responsive front end. The top buys multi-tenancy, serious concurrency, deep integrations and the audit trail a regulator will ask for.&lt;/p&gt;

&lt;p&gt;Geography widens the spread. The same build costs two to three times more in San Francisco or London than in India or Eastern Europe, which is how identical scope gets priced at $60,000 by one vendor and $180,000 by another. The gap mostly reflects local salaries, so judge a team on its delivery record rather than its postcode.&lt;/p&gt;

&lt;p&gt;Quotes also leave out different things, and almost none include content migration, admin training, localization or the iteration after launch. Make every serious proposal spell out scope, exclusions, team and rates before you compare two of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Much Does It Cost to Build an LMS in 2026?
&lt;/h2&gt;

&lt;p&gt;Here's the LMS development cost picture we'd defend for 2026, split into the five scopes buyers actually choose between.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Typical cost&lt;/th&gt;
&lt;th&gt;Timeline&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extend an open-source LMS&lt;/td&gt;
&lt;td&gt;$15,000–$40,000&lt;/td&gt;
&lt;td&gt;6–12 weeks&lt;/td&gt;
&lt;td&gt;Moodle or Open edX with a custom theme, plugins, SSO and one or two integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVP or pilot&lt;/td&gt;
&lt;td&gt;$40,000–$70,000&lt;/td&gt;
&lt;td&gt;3–4 months&lt;/td&gt;
&lt;td&gt;Course delivery, enrollment, assessments, progress tracking, basic reporting, admin console, SCORM import&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-scope platform&lt;/td&gt;
&lt;td&gt;$70,000–$120,000&lt;/td&gt;
&lt;td&gt;5–6 months&lt;/td&gt;
&lt;td&gt;MVP plus custom roles and workflows, learning paths, certification logic, two or three integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full platform&lt;/td&gt;
&lt;td&gt;$120,000–$300,000&lt;/td&gt;
&lt;td&gt;6–10 months&lt;/td&gt;
&lt;td&gt;Virtual classroom, AI personalization, gamification, mobile apps, content authoring, several integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-tenant or enterprise&lt;/td&gt;
&lt;td&gt;$300,000+&lt;/td&gt;
&lt;td&gt;10 months and up&lt;/td&gt;
&lt;td&gt;Many organizations on one platform, white-labelling, per-tenant billing, two-way integrations, audit-grade compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Market ranges for a senior offshore or global mid-tier team in 2026. A US-only agency will quote above these for the same scope.&lt;/p&gt;

&lt;p&gt;Our two buyers land in very different rows. The training buyer's needs fit the first row at most, and possibly no build at all. The product builder starts at the MVP and, once clients ask for their own branding and reports, grows into the mid-scope row within a year.&lt;/p&gt;

&lt;h3&gt;
  
  
  What moves the number
&lt;/h3&gt;

&lt;p&gt;When we scope an LMS, these decide where in a band the quote lands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proprietary logic.&lt;/strong&gt; Courses, quizzes and certificates are well-trodden ground. Adaptive tests, custom scoring and unusual certification rules are where budgets grow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations.&lt;/strong&gt; Typically $5,000 to $25,000 each, depending on the quality of the other side's API. The expensive one is a two-way sync with a legacy system whose documentation is a wiki page and good intentions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time video.&lt;/strong&gt; Live classrooms need WebRTC infrastructure and bandwidth that scales with every learner. Recorded video on a CDN is a fraction of the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native mobile.&lt;/strong&gt; A responsive web application covers most corporate learners. Offline playback on iOS and Android roughly adds a second front end, so a &lt;a href="https://avenotech.com/services/custom-mobile-app-development" rel="noopener noreferrer"&gt;native mobile learning app&lt;/a&gt; gets scoped as its own line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI features.&lt;/strong&gt; They bring a cost line almost nobody budgets for: model API usage. Decide early whether AI runs on your API keys or on a vendor's markup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These ranges assume a team that has built learning platforms before. One learning SCORM sequencing on your budget lands at the top of each band.&lt;/p&gt;

&lt;h3&gt;
  
  
  The costs that arrive after the quote
&lt;/h3&gt;

&lt;p&gt;Migration from an old LMS is almost always under-scoped (the build steps below explain why), and admin training and translation sit outside most quotes too. Keep 15 to 20% of the build budget for the first 90 days after launch, because version one always meets reality.&lt;/p&gt;

&lt;p&gt;Then there's maintenance. A common rule of thumb is 15 to 20% of the build cost every year for hosting, security patches, dependency upgrades and monitoring. Owning the code means owning the upkeep, which is what makes some "expensive" SaaS contracts look reasonable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom LMS vs Off-the-Shelf: A Build vs Buy Framework That Survives the Meeting
&lt;/h2&gt;

&lt;p&gt;Most build-vs-buy content frames the decision as a feature comparison. The question that actually decides it is shorter: is the LMS your product, or is it plumbing?&lt;/p&gt;

&lt;p&gt;If the learning platform is how you make money (you sell courses, monetize certifications, white-label for partners, or the learning experience is your moat), forcing that into someone else's SaaS taxes you forever. Per-learner fees grow with your revenue, someone else's roadmap decides your features, and competitors can buy the identical platform. That's the product builder, and for them building a multi-tenant SaaS platform is the business itself rather than an IT purchase.&lt;/p&gt;

&lt;p&gt;If the LMS is administrative infrastructure (compliance training, onboarding, standard credentialing), you're in the business of running training programs, not operating software. That's the training buyer, and they should buy. The moment you own the code, you own the upgrades, the security patches, the hosting and every incident.&lt;/p&gt;

&lt;p&gt;Two other situations push toward building even when the LMS isn't the product. One is training people outside your company, such as customers, partners or franchisees, who need separate tenants, branding and often per-client billing. The other is a process no licensed tool can handle without permanent workarounds: certifications renewed against a regulator's rules, apprenticeships with on-the-job sign-off, or credentials that mix online modules with observed practice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ask in order&lt;/th&gt;
&lt;th&gt;If yes&lt;/th&gt;
&lt;th&gt;If no&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Is the LMS what you sell?&lt;/td&gt;
&lt;td&gt;Build a custom MVP&lt;/td&gt;
&lt;td&gt;Go to question 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Five-year license quote under $70k?&lt;/td&gt;
&lt;td&gt;Go to question 3&lt;/td&gt;
&lt;td&gt;Go to question 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Fits your workflow as is?&lt;/td&gt;
&lt;td&gt;Buy and configure it&lt;/td&gt;
&lt;td&gt;Go to question 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Does a hybrid cover it?&lt;/td&gt;
&lt;td&gt;Go hybrid&lt;/td&gt;
&lt;td&gt;Build, with an owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A build vs buy decision path for a custom LMS. Use a written quote, not a list price, for question 2; $70,000 is the top of the MVP range above. The hybrid options are described below.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three real paths in 2026
&lt;/h3&gt;

&lt;p&gt;The first is configurable SaaS, the fastest route to a working platform. Entry prices are modest (TalentLMS starts at $119 a month and has a free tier for 5 users), while enterprise platforms such as Docebo, Absorb and Cornerstone are priced on request. The trade is control, plus costs that grow with your success.&lt;/p&gt;

&lt;p&gt;The second is open source or a hybrid. Moodle is the open-source option most buyers already know, with registered sites in &lt;a href="https://stats.moodle.org/" rel="noopener noreferrer"&gt;237 countries&lt;/a&gt;; Open edX suits engineering teams building at scale, and Totara sits in between. Hybrids come in three shapes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extend Moodle or Open edX with your theme, plugins and integrations, which covers more "custom LMS" briefs than people expect.&lt;/li&gt;
&lt;li&gt;Build an LTI 1.3 tool instead of an LMS, if what you sell is a simulation, assessment or lab that can launch inside Canvas, Moodle or Blackboard.&lt;/li&gt;
&lt;li&gt;Go headless: keep a licensed LMS as the system of record and build your own front end on its API, once you've confirmed the API covers what you need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three spare you rebuilding enrollment, gradebooks and course playback. But open source with nobody to maintain it is the most expensive mistake in this category.&lt;/p&gt;

&lt;p&gt;The third is a full custom build, with complete control over roadmap, data, UX and architecture. It's justified when your learning workflow is proprietary, commercially differentiating or regulated in ways no platform supports, and only with a permanent owner, either your own engineers or a retained partner.&lt;/p&gt;




&lt;h2&gt;
  
  
  Build vs Buy in Numbers: License Math at 500 Learners
&lt;/h2&gt;

&lt;p&gt;Most build-vs-buy articles stop at "licensing fees add up." Here's by how much, using list prices published on each vendor's own pricing page in October 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Five-year cost at 500 active learners (2026 list prices)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Five-year cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MoodleCloud Medium&lt;/td&gt;
&lt;td&gt;$6K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TalentLMS Grow&lt;/td&gt;
&lt;td&gt;$14K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LearnWorlds Learning Center&lt;/td&gt;
&lt;td&gt;$15K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom LMS MVP (build only, low end)&lt;/td&gt;
&lt;td&gt;$40K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At this size licensing wins, and it isn't close: the custom row shows the build alone, before a single year of maintenance. This is the training buyer's answer. Their 400 staff fit comfortably inside a plan from TalentLMS, MoodleCloud or LearnWorlds, and the money a build would cost buys years of subscription plus someone to run the training. One detail if you rerun the math: TalentLMS counts active users, meaning people who log in that month, so a workforce that trains in bursts can cost less than its headcount suggests.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Custom LMS Development Pays Off: The Break-Even by Learner Count
&lt;/h2&gt;

&lt;p&gt;The 500-learner chart is the easy case. The decision gets interesting as learner numbers grow, because a license is priced per learner and a custom platform mostly isn't. Above about 1,000 learners, public pricing disappears and every serious vendor is quote-only, so rather than guess what a quote will say, work out the number it has to beat.&lt;/p&gt;

&lt;h3&gt;
  
  
  The worked example at 25,000 learners
&lt;/h3&gt;

&lt;p&gt;Take an organization with 25,000 learners and two routes it controls. These are illustrative assumptions, not quotes, so swap in your own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-hosted open source: $25,000 to install, theme and harden, plus about $2,000 a month for hosting and part-time administration.&lt;/li&gt;
&lt;li&gt;Custom build: a mid-scope platform hardened for that load at about $90,000, plus about $3,000 a month in hosting and 15 to 20% of the build a year in maintenance from year two.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over three years, open source comes to $25,000 plus 36 months at $2,000. The custom build comes to $90,000 plus 36 months at $3,000 plus two years of maintenance, which lands between $225,000 and $234,000.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;About $97K:&lt;/strong&gt; open source, three years&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About $230K:&lt;/strong&gt; custom build, three years&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;26¢:&lt;/strong&gt; per learner per month to break even&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The break-even is the license price that costs the same over those three years. Divide the custom total by three and you get $75,000 to $78,000 a year, or about 26 cents per learner per month across 25,000 learners. A quote above that means building costs less in cash; below it, licensing wins and the decision goes back to product versus plumbing. Open source stays lowest in cash, but its monthly figure leaves out the engineering time that plugin upgrades and fixes quietly consume.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the break-even moves with scale and time
&lt;/h3&gt;

&lt;p&gt;Run the same custom cost against different learner counts and the pattern becomes clear. Because the build is a fixed cost, the license price it has to beat falls as learners grow, and it falls further the longer you keep the platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License price per learner per month a custom build has to beat, by learner count&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Learners&lt;/th&gt;
&lt;th&gt;Over 3 years&lt;/th&gt;
&lt;th&gt;Over 5 years&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5K&lt;/td&gt;
&lt;td&gt;128¢&lt;/td&gt;
&lt;td&gt;111¢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10K&lt;/td&gt;
&lt;td&gt;64¢&lt;/td&gt;
&lt;td&gt;56¢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25K&lt;/td&gt;
&lt;td&gt;26¢&lt;/td&gt;
&lt;td&gt;22¢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50K&lt;/td&gt;
&lt;td&gt;13¢&lt;/td&gt;
&lt;td&gt;11¢&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now set those bars against what licenses already cost. Taken at the top of each plan, the published list prices above work out to roughly 12 to 46 cents per learner per month: about 12 cents for LearnWorlds at its 2,000-learner cap, 20 cents for MoodleCloud at 500 users and 46 cents for TalentLMS Grow at 500. Volume pricing normally brings the per-learner rate down at enterprise scale, but no vendor publishes by how much. Read against that range:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Up to about 10,000 learners,&lt;/strong&gt; a license would need to cost well over list price before building won on cash. Buy, unless the LMS is your product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Around 25,000 learners,&lt;/strong&gt; the break-even sits inside the range licenses already charge. This is a genuine toss-up, and the written quote decides it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From about 50,000 learners,&lt;/strong&gt; a license has to come in close to the lowest list rate we found, and lower still over five years. At that scale a custom platform is likely to cost less unless the vendor discounts hard, and the gap widens every year you keep it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest caveat cuts both ways: hosting is held at $3,000 a month in every bar. A 5,000-learner platform would cost less to host, which lowers its break-even, and a 50,000-learner one would cost more, which raises it. The direction of the pattern doesn't change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the break-even doesn't capture
&lt;/h3&gt;

&lt;p&gt;Three things sit outside the cash comparison, and they're usually what decides it for the product builder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Growth works differently. A per-learner license grows in step with every learner you add. A custom platform's main cost was paid once, and hosting grows far more slowly than headcount. If you expect to double your learners, the license bill doubles with them.&lt;/li&gt;
&lt;li&gt;Margin and ownership. When the LMS is what you sell, a per-learner fee comes out of the margin on every sale, and the roadmap belongs to the vendor. A platform you own can be white-labelled for clients, priced however you choose, and changed when a client asks.&lt;/li&gt;
&lt;li&gt;Risk sits on the other side. A build is paid for before the first learner logs in, it can run late, and it needs a permanent owner. Licensing moves those risks to the vendor, which is worth something real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two failure modes hide in all of this. The first is the double bill: outgrow a stopgap platform within two years and you pay twice, which is why a product builder whose direction is already clear does better with a focused custom MVP up front. The second is the maintenance vacuum, so decide who runs the platform before launch. Many teams keep a small dedicated offshore team on it after go-live rather than rebuilding that knowledge each time something breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Long Does It Take to Build an LMS?
&lt;/h2&gt;

&lt;p&gt;Three to four months for an MVP, five to six for a mid-scope platform, and six to ten for a full one. Any timeline you're handed before discovery is a hypothesis, because the things that set it (your HR system, your old LMS vendor, your compliance team) sit outside the development team's control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A 16-week custom LMS MVP, and what has to be true to leave each phase&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Weeks&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Exit criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Discovery and design&lt;/td&gt;
&lt;td&gt;1 to 5&lt;/td&gt;
&lt;td&gt;Map who assigns, completes and checks training. Count the courses and records to move. Prototype the key screens with one of your real courses.&lt;/td&gt;
&lt;td&gt;A real admin and a real learner have signed off the prototype&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Build and integrate&lt;/td&gt;
&lt;td&gt;5 to 12&lt;/td&gt;
&lt;td&gt;Course player, enrollment, quizzes, reports and SSO, demoed every two weeks. Integrations start against sandboxes early.&lt;/td&gt;
&lt;td&gt;A real course plays end to end with completion recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Test, migrate, pilot&lt;/td&gt;
&lt;td&gt;12 to 16&lt;/td&gt;
&lt;td&gt;Test your own SCORM packages, audit accessibility, rehearse the migration, then run one group through a full course.&lt;/td&gt;
&lt;td&gt;Migrated records reconcile and the pilot finishes cleanly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Integrations start inside the build phase rather than after it, which is what keeps an MVP inside four months.&lt;/p&gt;

&lt;p&gt;An enterprise build stretches every phase, with discovery taking four to eight weeks and integration and migration eight to sixteen, which is how large programs pass ten months. At any size, the biggest schedule risk is your existing content rather than the new code. A library built in different authoring tools over a decade always holds courses that misbehave in a new player, and testing a sample in week 2 costs almost nothing, whereas finding them in week 14 usually moves the launch date.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Build an LMS: A Step-by-Step Process
&lt;/h2&gt;

&lt;p&gt;Once you've decided to build, this is the order we'd follow. Each step exists because of a specific way LMS projects go wrong.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write down who assigns, who completes and who gets audited.&lt;/strong&gt; Who decides a driver needs forklift training, when it's due, who's reminded when it's late, and which report the auditor wants. Then put one of your real courses into the prototype, not placeholder text, to see what your content needs from a player.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try to break a licensed LMS first.&lt;/strong&gt; Run your three hardest training scenarios through a free tier or trial. If a licensed product handles all three, you've just saved the cost of a build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cut version one to what learners touch on day one.&lt;/strong&gt; Sort features into must, should, could and won't, and be strict about the last list. Scoping an MVP that proves learners will use it is how you avoid spending the full-platform budget on features nobody asked for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settle the decisions that are expensive to undo.&lt;/strong&gt; SCORM or xAPI, data residency, whose API keys the AI runs on, and above all the multi-tenancy decision if more than one organization will ever use the platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the first demo a real course, and test the leaver as well as the joiner.&lt;/strong&gt; Demo working software every two weeks and connect your systems early. Teams check that new hires get enrolled automatically; fewer check that leavers are deactivated, and on per-seat pricing they keep costing you money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate records with their original dates, then pilot.&lt;/strong&gt; Completion, certificate issue and expiry dates are what an auditor asks for. If a migration stamps every certificate with the import date, renewals fall due on the wrong day. Rehearse the migration once, then launch to one group before everyone.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Technical Details That Decide Whether It Works
&lt;/h2&gt;

&lt;p&gt;Two things trip up LMS builds that look fine on paper: the content standards your courses depend on, and the rules that apply if you sell to US schools.&lt;/p&gt;

&lt;h3&gt;
  
  
  SCORM, xAPI and LTI 1.3
&lt;/h3&gt;

&lt;p&gt;SCORM is still what most course libraries are packaged in, accounting for 92% of registrations on Rustici Software's SCORM Cloud in 2025, according to &lt;a href="https://rusticisoftware.com/blog/how-relevant-is-scorm-lets-check-the-scorm-cloud-data/" rel="noopener noreferrer"&gt;Rustici's February 2026 analysis&lt;/a&gt;. The trap is saved progress. SCORM 1.2 only guarantees 4,096 characters of it, against 64,000 in later SCORM 2004 editions (&lt;a href="https://scorm.com/scorm-explained/technical-scorm/run-time/run-time-reference/" rel="noopener noreferrer"&gt;SCORM run-time reference&lt;/a&gt;), so a long course that worked on your old LMS can lose learners' place on a stricter new one. Licensing a proven SCORM engine is usually faster than writing your own player.&lt;/p&gt;

&lt;p&gt;Add xAPI, now an &lt;a href="https://standards.ieee.org/ieee/9274.1.1/7321/" rel="noopener noreferrer"&gt;IEEE standard&lt;/a&gt;, only if you need to track learning outside courses. Build anything that plugs into Canvas or Moodle on LTI 1.3, since &lt;a href="https://www.1edtech.org/standards/lti/deprecation-notice-oauth-10a" rel="noopener noreferrer"&gt;1EdTech retired the security model behind LTI 1.1&lt;/a&gt; in 2021.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selling to US schools?
&lt;/h3&gt;

&lt;p&gt;Public schools and universities must meet WCAG 2.1 AA under the DOJ's &lt;a href="https://www.ada.gov/resources/2024-03-08-web-rule/" rel="noopener noreferrer"&gt;ADA Title II rule&lt;/a&gt;, by April 26, 2027 for larger entities and April 26, 2028 for smaller ones, and we build to WCAG 2.2 AA, which covers it. If learners are under 13, the FTC's &lt;a href="https://www.govinfo.gov/content/pkg/FR-2025-04-22/html/2025-05904.htm" rel="noopener noreferrer"&gt;amended COPPA Rule&lt;/a&gt; has applied since April 22, 2026. Projects like these usually grow into rostering and student records, so they're worth scoping as &lt;a href="https://avenotech.com/industries/education" rel="noopener noreferrer"&gt;custom education software development&lt;/a&gt; rather than as an LMS build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI Fits in a 2026 LMS Budget
&lt;/h2&gt;

&lt;p&gt;Add AI to version one only if AI is the product. Otherwise, design for it and ship it once the core is stable. Adoption is still early: 37% of US organizations with 100 or more employees used AI in their training in 2025, according to Training Magazine's &lt;a href="https://trainingmag.com/2025-training-industry-report/" rel="noopener noreferrer"&gt;2025 Training Industry Report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The features that hold up are narrow: semantic search across course content, drafts for course authors, and tutoring grounded in approved material. &lt;a href="https://avenotech.com/services/generative-ai-development" rel="noopener noreferrer"&gt;Generative AI features&lt;/a&gt; such as tutoring need an evaluation set built from real learner questions before any learner sees them. If you're adding AI to an LMS you already run, our guide to adding AI to an existing platform covers the pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Questions to Ask Before You Sign Anything
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What's excluded from this quote? Get migration, training, translation, compliance and post-launch support in writing. A vendor who won't list exclusions is telling you where your budget will go.&lt;/li&gt;
&lt;li&gt;Who owns the code and the IP? It matters the day you change partners or raise money.&lt;/li&gt;
&lt;li&gt;Who maintains it at 2 a.m.? An internal team, a retained partner, or nobody, which many buyers choose by accident.&lt;/li&gt;
&lt;li&gt;What's the exit cost? Export formats and contract terms. The platform you can leave is the platform you can negotiate with.&lt;/li&gt;
&lt;li&gt;How is AI costed? Per-seat markup, metered usage or your own account. Ask for a projected monthly AI bill in writing, not a demo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does it cost to build an LMS?
&lt;/h3&gt;

&lt;p&gt;A custom LMS MVP typically costs $40,000 to $70,000 in 2026, a mid-scope platform $70,000 to $120,000 and a full platform $120,000 to $300,000. Extending Moodle or Open edX costs $15,000 to $40,000. Budget 15 to 20% of the build a year for maintenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does custom LMS development take?
&lt;/h3&gt;

&lt;p&gt;Three to four months for an MVP, five to six for a mid-scope platform and six to ten for a full platform, with enterprise builds running ten months and up. Integration and data migration are the phases that slip most often.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it cheaper to build or buy an LMS?
&lt;/h3&gt;

&lt;p&gt;At 500 learners, buying wins: five years of TalentLMS, MoodleCloud or LearnWorlds costs $6,000 to $15,000 at 2026 list prices. At 25,000 learners, building costs less over three years only if the license quote tops about 26 cents per learner per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Moodle free to use?
&lt;/h3&gt;

&lt;p&gt;The software is open source and free to download, but running it isn't. Hosted MoodleCloud plans run from $170 a year for 50 users to $2,100 for 750 (MoodleCloud, October 2026), and self-hosting means paying for servers, patching and upgrades yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we move our existing SCORM courses into a custom LMS?
&lt;/h3&gt;

&lt;p&gt;Yes. SCORM was built to be portable and made up 92% of registrations on Rustici Software's SCORM Cloud in 2025 (Rustici Software, 2026). Test long courses during discovery; learner history and certificate dates are harder to move than the courses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;If you're the training buyer, buy, and spend what a build would cost on good courses and someone to run them.&lt;/p&gt;

&lt;p&gt;If you're the product builder, build, but small: a focused MVP that real learners use, on a multi-tenant architecture, with a named owner for the day after launch.&lt;/p&gt;

&lt;p&gt;If you're somewhere in between, get a written multi-year license quote at your real learner count this week and set it next to the break-even above. That one comparison settles more of these decisions than any feature list.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://avenotech.com/blog/custom-lms-development" rel="noopener noreferrer"&gt;Avenotech blog&lt;/a&gt;, where we write about software and AI for growing businesses. Prices and figures were checked in October 2026; vendor pricing changes, so confirm current numbers before you decide.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>saas</category>
      <category>webdev</category>
      <category>edtech</category>
    </item>
    <item>
      <title>AI Agent Frameworks Compared: LangGraph vs CrewAI vs AutoGen</title>
      <dc:creator>Avenotech Team</dc:creator>
      <pubDate>Tue, 13 Oct 2026 03:08:41 +0000</pubDate>
      <link>https://dev.to/avenotech/ai-agent-frameworks-compared-langgraph-vs-crewai-vs-autogen-2l2o</link>
      <guid>https://dev.to/avenotech/ai-agent-frameworks-compared-langgraph-vs-crewai-vs-autogen-2l2o</guid>
      <description>&lt;p&gt;Why is the most-starred framework in this comparison the one you shouldn't start a new project on in 2026?&lt;/p&gt;

&lt;p&gt;AutoGen holds roughly 60,400 GitHub stars, more than CrewAI's 57,100 and LangGraph's 39,800. It hasn't shipped a Python release in 320 days. Its last tagged version (python-v0.7.5) shipped on September 30, 2025. The repo hasn't had a commit pushed since April 15, 2026. And yet every "LangGraph vs CrewAI vs AutoGen" post being written right now is still treating it as a live option.&lt;/p&gt;

&lt;p&gt;That gap, between stars and production reality, is what this post is actually about. Not a feature matrix. Not a benchmark that can't be audited. The evidence of where each of these frameworks breaks when you run it at scale, who maintains it, and what it actually costs when things go wrong.&lt;/p&gt;

&lt;p&gt;Every fact here comes from the GitHub REST API, PyPI release history, official READMEs, vendor migration guides, and public issue trackers, all verified on 2026-08-16. Where evidence is one engineer's account rather than a measurement, it's labeled that way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AutoGen is in maintenance mode per its own README, and the Python package hasn't shipped a stable release in about 320 days. The successor is &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/a&gt;, GA since 2026-04-03. New projects should start there. AG2 is a real option for legacy codebases, and it's a fork, not a rebrand.&lt;/li&gt;
&lt;li&gt;Stars lie; installs are closer to the truth. AutoGen leads on stars (about 60K) and trails on monthly PyPI installs (about 1M). LangGraph has fewer stars (about 40K) and runs at about 71M installs, roughly 65x AutoGen. The gap survives every honest caveat.&lt;/li&gt;
&lt;li&gt;Treat the star-to-install ratio as a freshness signal in reverse. Stars accumulate at peak hype; installs track present-tense production dependence. A high ratio means a project was once exciting and now isn't load-bearing anywhere.&lt;/li&gt;
&lt;li&gt;Verified 2026-08-16 against LangGraph 1.2.11, CrewAI 1.15.16, AutoGen 0.7.5 and Microsoft Agent Framework 1.0. This category moves within weeks, so check those versions on PyPI before you act on any of it.&lt;/li&gt;
&lt;li&gt;Don't pick on star counts. Pick on what shipped, what broke, and what's still being maintained.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're scoping this for a real system rather than a spike, the framework choice is one input into &lt;a href="https://avenotech.com/services/ai-agent-development" rel="noopener noreferrer"&gt;building a production agent system&lt;/a&gt;, and it's rarely the input that decides whether the thing ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which agent framework should you use in 2026?
&lt;/h2&gt;

&lt;p&gt;The short answer, before the evidence.&lt;/p&gt;

&lt;p&gt;Pick &lt;strong&gt;LangGraph&lt;/strong&gt; if you need explicit, auditable control flow and durable state, and you can staff the persistence work it brings. Pick &lt;strong&gt;CrewAI&lt;/strong&gt; if you're prototyping multi-agent workflows fast and you accept that delegation is model-mediated. Don't start on &lt;strong&gt;AutoGen&lt;/strong&gt;: as of August 2026 its README carries a maintenance-mode banner directing new users elsewhere. If you're already on AutoGen, your target is &lt;strong&gt;Microsoft Agent Framework&lt;/strong&gt;, GA since April 2026, and the move is a rewrite rather than an upgrade. And if your workflow is three LLM calls in a loop, use &lt;strong&gt;no framework at all&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why that answer isn't the usual one
&lt;/h3&gt;

&lt;p&gt;Every framework here can call a tool and pass a message, so a feature matrix can't separate them. What separates them is what fails at scale: LangGraph breaks on checkpoint growth, CrewAI breaks on prompt-mediated delegation, AutoGen breaks on maintenance. The rest of this post is the evidence for each, with the tracker issues and post-mortems that document them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metric that should matter (but doesn't show up in comparison posts)
&lt;/h2&gt;

&lt;p&gt;Stars are a lagging indicator. They record what got bookmarked at peak hype, which for AutoGen was the v0.2 launch era in 2024. Stars accumulate indefinitely and are never removed, even when a project goes quiet. Installs are the opposite: a recurring production cost, paid every time CI runs or an image rebuilds.&lt;/p&gt;

&lt;p&gt;The numbers have completely decoupled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monthly PyPI installs, last 30 days&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;71.1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;20.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Framework&lt;/td&gt;
&lt;td&gt;1.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoGen&lt;/td&gt;
&lt;td&gt;1.1M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LangGraph ships roughly 71 million monthly PyPI installs. AutoGen ships about 1.08 million. That's 65x more installs for the framework with fewer stars. CrewAI sits at roughly 20.7 million monthly installs, real production usage by any reading, but a fraction of LangGraph's volume.&lt;/p&gt;

&lt;p&gt;A 65x gap in installs against a lead in stars is a strong signal about where the production load actually is. It's not a popularity contest. It's a load map.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub footprint: stars vs forks&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;th&gt;Forks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AutoGen&lt;/td&gt;
&lt;td&gt;60K&lt;/td&gt;
&lt;td&gt;9K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;57K&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;40K&lt;/td&gt;
&lt;td&gt;7K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Fw.&lt;/td&gt;
&lt;td&gt;13K&lt;/td&gt;
&lt;td&gt;2K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's the thing that makes it a procurement problem: PyPI counts include CI pipelines and container rebuilds, so they're not user counts. Treat them as a relative signal, not an absolute. And LangGraph benefits from being pulled in transitively by the wider LangChain ecosystem, which inflates its number relative to a standalone install. AutoGen has no such tailwind, and the gap is still enormous. A 65x gap survives both caveats. A 1.2x gap wouldn't.&lt;/p&gt;

&lt;p&gt;Release cadence tells the same story from a different angle. Days since the last release, as of 2026-08-16:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AG2:&lt;/strong&gt; 1 day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI and MS Agent Framework:&lt;/strong&gt; 2 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph:&lt;/strong&gt; 5 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AutoGen:&lt;/strong&gt; 320 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more cadence note before we get to the frameworks. CrewAI shipped 1.15.16 on August 14, 1.15.15 on August 12, 1.15.14 on August 8, and two releases on August 5. That's roughly ten releases in nineteen days. Whether that signals fast fixes or fast churn depends on how much you trust their release process, but either way, lock your version before you start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental models (and why the model matters)
&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;LangGraph&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;AutoGen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Stateful, controllable graphs&lt;/td&gt;
&lt;td&gt;Fast multi-agent prototypes&lt;/td&gt;
&lt;td&gt;Nothing new in 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latest stable&lt;/td&gt;
&lt;td&gt;1.2.11 (2026-08-11)&lt;/td&gt;
&lt;td&gt;1.15.16 (2026-08-14)&lt;/td&gt;
&lt;td&gt;0.7.5 (2025-09-30)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly PyPI installs&lt;/td&gt;
&lt;td&gt;71,095,727&lt;/td&gt;
&lt;td&gt;20,672,935&lt;/td&gt;
&lt;td&gt;1,082,331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Ambiguous, see below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration model&lt;/td&gt;
&lt;td&gt;Explicit graph, developer-defined edges&lt;/td&gt;
&lt;td&gt;Manager agent, prompt-mediated&lt;/td&gt;
&lt;td&gt;Group chat, speaker selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control flow&lt;/td&gt;
&lt;td&gt;Enforced by the graph&lt;/td&gt;
&lt;td&gt;Suggested by the prompt&lt;/td&gt;
&lt;td&gt;Suggested by the prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Checkpointed, persistent, JSON-shaped&lt;/td&gt;
&lt;td&gt;Task outputs plus optional memory&lt;/td&gt;
&lt;td&gt;Agent-held conversation history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default loop ceiling&lt;/td&gt;
&lt;td&gt;1,000 supersteps&lt;/td&gt;
&lt;td&gt;20 iterations per agent&lt;/td&gt;
&lt;td&gt;String-matched termination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance status&lt;/td&gt;
&lt;td&gt;Active (5 days since release)&lt;/td&gt;
&lt;td&gt;Active (2 days since release)&lt;/td&gt;
&lt;td&gt;Maintenance mode (320 days)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Our verdict&lt;/td&gt;
&lt;td&gt;Default choice for production&lt;/td&gt;
&lt;td&gt;Good for speed, verify delegation&lt;/td&gt;
&lt;td&gt;Migrate off&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Framework comparison as of 2026-08-16. Sources: GitHub REST API, PyPI, official documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangGraph&lt;/strong&gt; is a directed graph with a central state object. Agents are nodes. Edges define flow. Conditional edges handle branching. Reducers merge concurrent state updates. You draw the control flow; the LLM executes within it. The mental model is a state machine, and the framework enforces it in code.&lt;/p&gt;

&lt;p&gt;Built-in primitives: durable execution (checkpointing, resume from interruption), human-in-the-loop (interrupt the graph, collect input, resume), short-term and long-term memory. It's the most explicit of the three about where control lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrewAI&lt;/strong&gt; is a role-based team. Every agent carries a role, a goal, a backstory, and tools. A Crew executes tasks sequentially or hierarchically. In hierarchical mode, an auto-generated manager agent delegates and reviews. The runtime provides the hierarchy; the delegation decisions inside it are model-mediated rather than encoded as developer-defined conditional edges. Flows, a newer primitive, are event-driven pipelines that offer more predictable production control: one LLM call per step, no autonomous delegation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AutoGen&lt;/strong&gt;, in its current maintained mode, is a conversation-driven multi-agent runtime. Two-agent chats, group chats with an LLM-powered speaker selector, sequential and nested conversations. The successor, Microsoft Agent Framework, has the same patterns but a different architecture. AutoGen itself is not being developed.&lt;/p&gt;

&lt;p&gt;AutoGen's licence deserves a flag of its own, because it's a procurement problem rather than a technical one: GitHub detects the repo as CC-BY-4.0, the README describes a dual CC-BY-4.0 and MIT arrangement, and PyPI reports MIT. Your legal team will not enjoy that conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where LangGraph breaks in production
&lt;/h2&gt;

&lt;p&gt;The failure point isn't the API. It isn't the tooling either.&lt;/p&gt;

&lt;p&gt;It's the checkpointer, and specifically, what happens to your Postgres instance when nobody has planned for checkpoint growth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tadeodonegana.com/posts/scaling-langgraph-postgres-checkpointer/" rel="noopener noreferrer"&gt;Tadeo Donegana Braunschweig&lt;/a&gt;, an engineer at Tiendanube, published the clearest public account of this in April 2026. At more than 120,000 conversations per week, his team's checkpoint tables grew without bound. The open-source checkpointer ships no native TTL. An average conversation produced roughly 93 rows across four checkpoint tables after just two messages and three tool calls.&lt;/p&gt;

&lt;p&gt;Two messages, and your database is ninety-three rows heavier.&lt;/p&gt;

&lt;p&gt;In staging, &lt;code&gt;checkpoint_blobs&lt;/code&gt; alone hit 56 MB after a single week of traffic. His summary: operational databases should store operational state, not historical exhaust.&lt;/p&gt;

&lt;p&gt;This isn't one team's unlucky configuration. On the LangGraphJS tracker, issue &lt;a href="https://github.com/langchain-ai/langgraphjs/issues/1138" rel="noopener noreferrer"&gt;#1138&lt;/a&gt;, "How do I keep data in Postgres checkpointer database from growing unbounded?", was opened in April 2025 and is still open. LangChain's own documentation suggests running a cron job to delete old checkpoints. That's a clear statement about where lifecycle management lives.&lt;/p&gt;

&lt;p&gt;The vendor shipped a fix, and it's worth reading the numbers carefully because they get misquoted. PR &lt;a href="https://github.com/langchain-ai/langgraph/pull/7586" rel="noopener noreferrer"&gt;#7586&lt;/a&gt; introduced &lt;code&gt;DeltaChannel&lt;/code&gt;, which stores a small sentinel value plus replay instructions instead of re-serializing the full accumulated state at every step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint storage for a 500-turn thread&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;add_messages (default)&lt;/td&gt;
&lt;td&gt;221 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeltaChannel, snapshots every 50&lt;/td&gt;
&lt;td&gt;10.53 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeltaChannel, no snapshots&lt;/td&gt;
&lt;td&gt;1.98 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The default reducer writes more than a hundred times what the tightest &lt;code&gt;DeltaChannel&lt;/code&gt; configuration does, and the middle row is the setting most teams actually want.&lt;/p&gt;

&lt;p&gt;Three caveats before you bank on it. It landed in &lt;a href="https://github.com/langchain-ai/langgraph/releases/tag/1.2.0" rel="noopener noreferrer"&gt;LangGraph 1.2.0&lt;/a&gt; on 2026-05-12, it's marked beta, and it's opt-in: upgrading does nothing until you actually annotate the channels you want it on. Bloat already written to your tables stays written.&lt;/p&gt;

&lt;p&gt;Here's where it gets expensive for teams that didn't budget the operational work. LangGraph's checkpoint packages (&lt;code&gt;checkpoint&lt;/code&gt;, &lt;code&gt;checkpoint-postgres&lt;/code&gt;, &lt;code&gt;checkpoint-sqlite&lt;/code&gt;) version separately from core. If you pin core and float the checkpointers, you've secured the wrong half of the stack. Budget the persistence work before launch, not after&lt;/p&gt;

&lt;p&gt;Braunschweig's three fixes generalise. Move checkpoint table creation into Alembic migrations rather than calling LangGraph's &lt;code&gt;setup()&lt;/code&gt;, so your schema is version-controlled like everything else. Run recurring TTL deletion, paired with a weekly job that archives history to object storage if you need it for analysis. And checkpoint selectively: persist only the supervisor graph and keep sub-graphs stateless. None of this is exotic work, which is exactly why it gets skipped when an agent prototype &lt;a href="https://avenotech.com/blog/add-ai-to-existing-app" rel="noopener noreferrer"&gt;gets bolted onto a product that already exists&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The typed-state complaint
&lt;/h3&gt;

&lt;p&gt;Separate from persistence, there's a recurring ergonomics objection about state typing, and it needs stating carefully because the strong version of it is wrong. &lt;code&gt;StateGraph&lt;/code&gt; accepts a real schema: &lt;code&gt;TypedDict&lt;/code&gt;, a dataclass, or a Pydantic &lt;code&gt;BaseModel&lt;/code&gt; if you want recursive validation. LangGraph is not untyped.&lt;/p&gt;

&lt;p&gt;The gap is one level up. LangChain's own documentation notes that the higher-level &lt;code&gt;create_agent&lt;/code&gt; factory does not support Pydantic state schemas, and the factory is where most teams start. So the typing is available on the API you graduate to, not the one you begin on. One engineer on Hacker News &lt;a href="https://news.ycombinator.com/item?id=44307883" rel="noopener noreferrer"&gt;put the frustration this way&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My experience with langgraph is you spend so much time just fixing stupid runtime type errors because the state of every graph is a stupid JSON blob with very minimal typing, and it's so hard figuring out how data moves through the system."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's one account. But it's not floating free of evidence, and the evidence points at the same seam. Issue &lt;a href="https://github.com/langchain-ai/langgraph/issues/5891" rel="noopener noreferrer"&gt;#5891&lt;/a&gt; (&lt;code&gt;TypeError: Type is not msgpack serializable: Send&lt;/code&gt;) is a &lt;code&gt;create_react_agent&lt;/code&gt; bug, which is exactly the factory path that can't take a Pydantic schema. Issue &lt;a href="https://github.com/langchain-ai/langgraph/issues/740" rel="noopener noreferrer"&gt;#740&lt;/a&gt; (&lt;code&gt;InvalidUpdateError&lt;/code&gt; on state writing) names the same root cause: state shape discovered at runtime rather than at definition time.&lt;/p&gt;

&lt;p&gt;The practical read: LangGraph gives you the tools to keep state contracts honest, and it doesn't force you to use them. The risk isn't missing typing, it's contracts drifting across nodes because nothing made you declare them. Define the schema explicitly at the boundaries that matter, and most of this class of bug disappears.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where LangGraph is actually strong
&lt;/h3&gt;

&lt;p&gt;Explicit node structure makes execution topology predictable: the graph decides which nodes run and in what order, rather than the model deciding for itself. Token usage is a separate question, and it stays dependent on prompt size, retrieved context, tool outputs, retries and model behaviour. Predictable structure is not a predictable bill, which is why the cost section below argues what it does.&lt;/p&gt;

&lt;p&gt;What the structure does buy you is auditability. LangGraph's control flow is enforced in code, not suggested in a prompt, so when a compliance reviewer asks which agent can call which tool under what condition, you can point at an edge instead of a paragraph of instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where CrewAI breaks in production
&lt;/h2&gt;

&lt;p&gt;Delegation.&lt;/p&gt;

&lt;p&gt;Not as a theoretical concern, but as a documented, reproducible failure mode that's been sitting in the issue tracker for over a year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 15,759-token incident.&lt;/strong&gt; &lt;a href="https://towardsdatascience.com/why-crewais-manager-worker-architecture-fails-and-how-to-fix-it/" rel="noopener noreferrer"&gt;Partha Sarkar&lt;/a&gt; documented this in detail: a three-agent support crew (triage, technical, billing) running in hierarchical mode received a purely technical query. The manager invoked all three agents, including billing. The billing agent's response then overwrote the correct technical answer. The run consumed 38 seconds and 15,759 tokens to produce roughly 200 tokens of output. Nothing errored.&lt;/p&gt;

&lt;p&gt;Root cause: hierarchical mode doesn't enforce conditional branching or true delegation. The manager decides, and when the model's judgment wobbles, the control flow wobbles with it. Look at what the failing workload actually was: routing a support question to the right specialist is &lt;a href="https://avenotech.com/services/chatbot-development" rel="noopener noreferrer"&gt;ordinary chatbot routing&lt;/a&gt;, and it's the case a multi-agent crew is supposed to handle best. His fix was to replace the built-in manager with a custom manager agent carrying explicit step-wise instructions. After that change, technical-only runs took 24 seconds and about 10,000 tokens. You recover roughly a third of the cost by hand-rolling the orchestration the framework was supposed to handle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three delegation bugs in eleven months
&lt;/h3&gt;

&lt;p&gt;They all show the same theme. Issue &lt;a href="https://github.com/crewAIInc/crewAI/issues/2606" rel="noopener noreferrer"&gt;#2606&lt;/a&gt; (April 2025): manager passes dicts while the schema expects strings. Issue &lt;a href="https://github.com/crewAIInc/crewAI/issues/4783" rel="noopener noreferrer"&gt;#4783&lt;/a&gt; (March 2026): manager executes tasks with its own tools and never delegates, collapsing hierarchical into sequential. Closed as &lt;code&gt;not_planned&lt;/code&gt;. Issue &lt;a href="https://github.com/crewAIInc/crewAI/issues/3925" rel="noopener noreferrer"&gt;#3925&lt;/a&gt; (November 2025): with English task descriptions the manager delegates correctly; with Japanese descriptions the manager answers alone without delegating. Reproducible in both directions.&lt;/p&gt;

&lt;p&gt;Sit with what that last one implies. The control flow of a production system changed because the natural language of its task descriptions changed. No framework that enforces orchestration in code can exhibit that behaviour, which makes #3925 the cleanest available proof that CrewAI's hierarchy is a request written into the prompt, not a rule the runtime enforces. If you run CrewAI in a non-English market, make this your regression test before you ship. Comment counts are not an engagement signal on this repo&lt;/p&gt;

&lt;p&gt;One methodology note from reading the tracker directly, because it changes how you should read any CrewAI issue thread. CrewAI's highest-comment issues (#4877 at 271 comments, #5802 at 98, #4560 at 97, #5888 at 82) all carry zero reactions, which is an odd shape for genuinely contested threads. Reading #5802 explains it: the issue author repeatedly pitches their own product, and one commenter opens with "Hey! I'm Hermes Agent, an autonomous coding AI agent. I saw this issue and thought I could help." Use reactions and maintainer replies instead. In 2026 that's a general lesson about evaluating open source, not a knock on CrewAI specifically.&lt;/p&gt;

&lt;h3&gt;
  
  
  The open security issue
&lt;/h3&gt;

&lt;p&gt;Issue &lt;a href="https://github.com/crewAIInc/crewAI/issues/5057" rel="noopener noreferrer"&gt;#5057&lt;/a&gt;, "Memory content injected into system prompt without sanitization enables indirect prompt injection," has been open since March 2026 and was last updated in July. Mechanically, &lt;code&gt;lite_agent.py&lt;/code&gt; concatenates retrieved memories straight into the system prompt. Anything written to memory inherits system-level instruction authority. It's rated Medium and cites the OWASP Agentic Security Index. Nearly five months on, it's still open. If you use CrewAI memory with any user-influenced content, apply the recommended mitigation (moving memory out of the system prompt and into user messages) before you ship.&lt;/p&gt;

&lt;h3&gt;
  
  
  The release cadence as a risk
&lt;/h3&gt;

&lt;p&gt;CrewAI shipped its 1.0.0 rewrite on October 20, 2025, with breaking changes. Since then, the pace has been relentless, roughly a release every two days. That means your pinned version is end-of-life within weeks. It also means bugs get fixed fast. Weigh both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where CrewAI is actually strong
&lt;/h3&gt;

&lt;p&gt;For teams that need to ship a multi-agent prototype quickly, CrewAI's higher-level abstractions are genuine. The role/goal/backstory model means you can get a working crew running in hours. The 20.7 million monthly installs reflect real production usage. And if something breaks, there's a good chance a fix is already in the next release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AutoGen breaks (and why "migrate off" is the right starting point)
&lt;/h2&gt;

&lt;p&gt;AutoGen is in maintenance mode. That's the sentence that should end the discussion for anyone starting a new project. But it's worth understanding what that means in practice, because there are teams already running on it who need to know the shape of their exit.&lt;/p&gt;

&lt;p&gt;The README carries a maintenance-mode banner verbatim: "AutoGen is now in maintenance mode. It will not receive new features or enhancements and is community managed going forward. New users should start with Microsoft Agent Framework." Last tagged release: python-v0.7.5, September 30, 2025. Last repo push: April 15, 2026. That's roughly ten and a half months without a release, and no archive banner marks the repo, so at a glance the project doesn't look dead. It just is.&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%2F23l3j8ktbq4e5vh5vpfl.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%2F23l3j8ktbq4e5vh5vpfl.jpg" alt="A person in a dark suit standing at a large monitor showing a glowing circular data dashboard, with a lit city skyline through the window behind them" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Migrating off AutoGen is an architecture review, not a dependency bump. The behaviour that changes underneath you is invisible until a user reports it.&lt;/p&gt;

&lt;p&gt;The lineage is worth knowing. Original authors Chi Wang and Qingyun Wu left Microsoft in November 2024 and forked the project to AG2 (&lt;code&gt;ag2ai/ag2&lt;/code&gt;), now at v1.0.x under Apache-2.0. Microsoft shipped &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/a&gt; (MAF) 1.0 GA on April 3, 2026, developed by the core AutoGen and Semantic Kernel teams. MAF ships for Python and .NET under MIT, supports A2A and MCP interop, and has stable APIs with an LTS commitment. Official migration guides exist for AutoGen to MAF and Semantic Kernel to MAF.&lt;/p&gt;

&lt;h3&gt;
  
  
  The migration is a rewrite, and one change is silent
&lt;/h3&gt;

&lt;p&gt;Microsoft's own &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen/" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt; reads as a from-scratch guide, not an upgrade guide. &lt;code&gt;AssistantAgent&lt;/code&gt; becomes &lt;code&gt;Agent&lt;/code&gt;, and the state semantics invert underneath the rename. &lt;code&gt;AssistantAgent&lt;/code&gt; maintained conversation history as part of its state. &lt;code&gt;Agent&lt;/code&gt; is stateless and does not maintain history between invocations. Nothing errors when you port the code. Your agent doesn't throw an error, it just stops remembering, and you discover it from a customer complaint.&lt;/p&gt;

&lt;p&gt;There's a second inversion in the same rename. &lt;code&gt;AssistantAgent&lt;/code&gt; is single-turn unless you raise &lt;code&gt;max_tool_iterations&lt;/code&gt;. &lt;code&gt;Agent&lt;/code&gt; is multi-turn by default. So the migration turns one component from "remembers, but acts once" into "acts many times, but remembers nothing."&lt;/p&gt;

&lt;p&gt;Both inversions hide inside a port that looks like a rename (&lt;code&gt;the_silent_migration_bug.py&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# AutoGen: single-turn by default, and the agent holds the history
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AssistantAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What did I order?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;And when does it ship?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# remembers the first turn
&lt;/span&gt;
&lt;span class="c1"&gt;# Agent Framework: the port compiles, runs, and errors on nothing
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chat_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What did I order?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;And when does it ship?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# no memory of turn one
&lt;/span&gt;
&lt;span class="c1"&gt;# Nothing raised. The agent just answers the second question blind,
# and you find out when a customer complains. Thread state is now
# yours to carry explicitly between invocations.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One more gap to scope before you commit: AutoGen supports local code execution tools, and Microsoft's guide states that this feature is planned for future Agent Framework versions. Today it's a hole.&lt;/p&gt;

&lt;h3&gt;
  
  
  Termination by string matching
&lt;/h3&gt;

&lt;p&gt;AutoGen terminates when an LLM generates the exact token &lt;code&gt;TERMINATE&lt;/code&gt;. Because models are sloppy with exact tokens, they emit &lt;code&gt;terminate&lt;/code&gt;, &lt;code&gt;Terminate.&lt;/code&gt;, &lt;code&gt;Task terminated&lt;/code&gt;, or wrap it in markdown. None of those match, so the loop continues and you pay for every turn. Speaker selection fails the same way: if the selector's output doesn't exactly match an agent name, the same agent gets re-selected repeatedly, producing a single-agent infinite loop.&lt;/p&gt;

&lt;p&gt;Issue &lt;a href="https://github.com/microsoft/autogen/issues/12" rel="noopener noreferrer"&gt;#12&lt;/a&gt; ("force TERMINATE") dates to July 2023. On classic AutoGen, pair &lt;code&gt;max_consecutive_auto_reply&lt;/code&gt; with a token ceiling at your gateway before you deploy anything. Note that the knob doesn't carry over to Agent Framework, which is one more reason to treat the migration as a rewrite. And a framework in maintenance mode isn't shipping fixes for any of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  One honest caveat
&lt;/h3&gt;

&lt;p&gt;AG2 is a real option for teams on classic AutoGen with heavy investment and no appetite for a Microsoft-shaped migration. The original authors maintain it. It's at v1.0.x under Apache-2.0, actively released, with the classic API preserved in a separate &lt;code&gt;ag2-classic&lt;/code&gt; repo. It's a smaller ecosystem and a fork rather than a corporate-backed project, so weigh that accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What multi-agent orchestration actually costs
&lt;/h2&gt;

&lt;p&gt;Roughly 2.3x a sequential baseline, if you pick the most accurate pattern.&lt;/p&gt;

&lt;p&gt;Kulkarni and Kulkarni benchmarked multi-agent architectures on SEC filings (&lt;a href="https://arxiv.org/abs/2603.22651" rel="noopener noreferrer"&gt;arXiv:2603.22651&lt;/a&gt;, March 2026). Reflexive self-correcting loops achieved the highest field-level F1 (accuracy per extracted field) at 0.943, at 2.3x the cost of a sequential baseline. Hierarchical supervisor-worker reached F1 0.921 at 1.4x cost, the best cost-accuracy point in the study. A hybrid recovered 89% of the reflexive gains at 1.15x baseline cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relative cost of four orchestration patterns&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sequential&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;1.15x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hierarchical&lt;/td&gt;
&lt;td&gt;1.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflexive&lt;/td&gt;
&lt;td&gt;2.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those patterns map onto the frameworks directly. CrewAI's hierarchical process is the supervisor-worker row. LangGraph's cyclic graphs are how you build the reflexive loop. AutoGen's group chat is a third shape, less disciplined than either. Practically: if you're paying 2.3x for reflexion across every field in a document, you're overpaying, because the hybrid recovers most of the accuracy for a 15% premium.&lt;/p&gt;

&lt;h3&gt;
  
  
  None of these three will stop a run on spend
&lt;/h3&gt;

&lt;p&gt;One finding that should shape how you budget this: across LangGraph, CrewAI and Microsoft Agent Framework, every available control knob bounds structure. None bounds money.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Knob&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What it actually bounds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;max_iter&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Iterations per agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;max_retry_limit&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Retries, and it multiplies spend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;respect_context_window&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;Summarizes to stay under context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;recursion_limit&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;Supersteps per execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent Framework&lt;/td&gt;
&lt;td&gt;max_iterations&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Workflow iterations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every knob bounds structure. None bounds money. Sources: official CrewAI, LangGraph and Microsoft Agent Framework documentation, retrieved 2026-08-16.&lt;/p&gt;

&lt;p&gt;Two problems hide in that table.&lt;/p&gt;

&lt;p&gt;Default ceilings differ by 50x and nobody compares them. LangGraph allows 1,000 supersteps. MAF allows 100 workflow iterations. CrewAI allows 20 iterations per agent. CrewAI's looks tightest until you notice it's per-agent, so a five-agent crew's effective ceiling multiplies, and &lt;code&gt;max_retry_limit=2&lt;/code&gt; multiplies it again.&lt;/p&gt;

&lt;p&gt;A structural limit also treats a 200-token call and a 200,000-token long-context call as identical events. That's why teams file "we set &lt;code&gt;max_iter&lt;/code&gt;, why was the bill still huge?" tickets. You capped the number of steps, but your bill is counting tokens, and the two move independently. Watching it happen isn't an option either: CrewAI's usage metrics are strictly post-hoc, available after &lt;code&gt;kickoff()&lt;/code&gt; completes. The bill only shows up once the run has already finished and been paid.&lt;/p&gt;

&lt;p&gt;If spend is a hard constraint, put the cap at your gateway or proxy layer, where you can actually count tokens as they're spent.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to skip the framework entirely
&lt;/h2&gt;

&lt;p&gt;Sometimes the right agent framework is none.&lt;/p&gt;

&lt;p&gt;Gartner predicted that over 40% of agentic AI projects will be canceled by the end of 2027 (&lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;press release&lt;/a&gt;, June 2025). Cost, unclear business value, and inadequate risk controls are the leading reasons. Cost and risk controls are exactly the two things these frameworks don't give you natively.&lt;/p&gt;

&lt;p&gt;Anthropic Engineering's "&lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Building Effective AI Agents&lt;/a&gt;" makes the case most directly: the most successful implementations weren't using complex frameworks but simple, composable patterns. If your workflow is a fixed sequence of three LLM calls with a retry, a framework adds an abstraction layer, a dependency tree, and a migration risk for very little. Plenty of &lt;a href="https://avenotech.com/services/ai-development" rel="noopener noreferrer"&gt;production AI features&lt;/a&gt; never need orchestration at all, and finding that out early saves the migration you'd otherwise pay for later. Useful test: write the workflow as a plain function first. If that function reads cleanly, you don't need a framework. Once it starts accumulating retries, branches, and shared state, you do, and that's when agent development becomes an architecture problem rather than a library choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production reliability&lt;/td&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;Control flow enforced in code, not prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first working crew&lt;/td&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;Higher-level abstractions; fastest to prototype&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real production usage&lt;/td&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;71M monthly PyPI installs; LangGraph is load-bearing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release responsiveness&lt;/td&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;Ten releases in nineteen days; bugs get fixed fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licence clarity&lt;/td&gt;
&lt;td&gt;LangGraph / CrewAI (tie)&lt;/td&gt;
&lt;td&gt;Both MIT; AutoGen reports three different answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost controls&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None of the three halts a run on spend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational burden&lt;/td&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;LangGraph's checkpointer needs lifecycle management upfront&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise support path&lt;/td&gt;
&lt;td&gt;Microsoft Agent Framework&lt;/td&gt;
&lt;td&gt;GA April 2026, stable APIs, LTS commitment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overall for new projects&lt;/td&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;Best control-to-risk ratio for production work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Verdict by dimension, as of 2026-08-16.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose LangGraph if&lt;/strong&gt; you need explicit, auditable control flow; you need durable execution or human-in-the-loop steps; your workflow has real branching and shared state; and your team will own the persistence work. Budget that work upfront: checkpoint TTL deletion, selective persistence on the supervisor graph only, and pinning the checkpoint packages separately from core. Its persistence is your problem, not the vendor's.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose CrewAI if&lt;/strong&gt; you're shipping a multi-agent prototype this quarter, you want higher-level abstractions, and you can absorb the operational risk. Pin your version. Write delegation assertions into your test suite. Apply the #5057 memory mitigation before user content touches agent memory. Ten releases in nineteen days means your pinned version is end-of-life within weeks, so plan the upgrade cadence rather than discovering it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't start on AutoGen if&lt;/strong&gt; you're picking a framework today and have no legacy investment holding you there. If you're already on it, scope the MAF migration as a rewrite, put the stateless &lt;code&gt;Agent&lt;/code&gt; behavior at the top of your test plan, and know that local code execution is a feature gap in MAF today. Its termination depends on string-matching a literal token, so pair &lt;code&gt;max_consecutive_auto_reply&lt;/code&gt; with a token ceiling until you're off it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Microsoft Agent Framework if&lt;/strong&gt; you're a Microsoft shop, you're migrating off AutoGen or Semantic Kernel, or a vendor-backed support path with an LTS commitment is what gets the project approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose no framework if&lt;/strong&gt; your workflow is a few deterministic LLM calls and a plain function with retries is still readable. Write the function. Add a retry. Only reach for a framework when the function stops being readable.&lt;/p&gt;

&lt;p&gt;The AutoGen lesson isn't that Microsoft abandoned a project. It's that a framework stuck at v0.x was never really a product: it's a research prototype that happened to get famous. Check the maintenance status, the release cadence, and the maintainer's roadmap before you commit. Everything in this post was accurate on 2026-08-16. For this kind of tool, that's not a long shelf life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is AutoGen deprecated?
&lt;/h3&gt;

&lt;p&gt;Not formally archived, but effectively yes. The README carries a maintenance-mode banner. Last stable Python release: autogen-agentchat 0.7.5 on 2025-09-30, about 320 days before 2026-08-16. The repo remains publicly readable and community-managed. Microsoft recommends Agent Framework for new projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between AutoGen and AG2?
&lt;/h3&gt;

&lt;p&gt;AG2 is a fork, not a rebrand. Original AutoGen authors Chi Wang and Qingyun Wu left Microsoft in November 2024 and forked the project. AG2 reached v1.0.0 in late July 2026. The classic autogen.* API lives in a separate ag2-classic repo, so 'move to AG2' is a migration. AutoGen stays with Microsoft under a mixed CC-BY-4.0/MIT licence situation; AG2 is Apache-2.0.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does LangGraph handle its own database cleanup?
&lt;/h3&gt;

&lt;p&gt;No. The open-source Postgres checkpointer ships no native TTL. LangChain's docs recommend a cron job to delete old checkpoints. LangGraph issue #1138 (open since 2025-04-29) reports around 100 rows per graph traversal across three tables with no maintainer resolution. Plan TTL deletion and archival before launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I cap how much an agent run costs?
&lt;/h3&gt;

&lt;p&gt;Not within LangGraph, CrewAI or Microsoft Agent Framework. All three expose structural limits (recursion_limit at 1000, max_iter at 20 per agent, max_iterations at 100) but none halts execution on spend. CrewAI's usage metrics are post-hoc, available only after kickoff() returns. Enforce budgets at your API gateway or proxy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is multi-agent worth the cost over a single agent?
&lt;/h3&gt;

&lt;p&gt;Depends on the accuracy you need. On SEC filings, reflexive loops hit F1 0.943 at 2.3x sequential cost; hierarchical hit 0.921 at 1.4x; a hybrid recovered 89% of the reflexive gains at 1.15x (arXiv:2603.22651, March 2026). Start hybrid. Escalate to reflexive only where accuracy pays for itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I trust framework star counts?
&lt;/h3&gt;

&lt;p&gt;Treat them as a freshness signal in reverse. Stars accumulate at peak hype. Installs track present-tense production dependence. A high star-to-install ratio means a project was once exciting and now isn't load-bearing anywhere. AutoGen's ratio is the worst of the three by an order of magnitude, and the release cadence (320 days since last release) agrees.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://avenotech.com/blog/langgraph-vs-crewai-vs-autogen" rel="noopener noreferrer"&gt;Avenotech blog&lt;/a&gt;, where we write about shipping AI and mobile products to production. Figures were verified on August 16, 2026; check current versions before you act on them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>langchain</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
