<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog &#8902; Asterisk</title>
	<atom:link href="https://www.asterisk.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.asterisk.org/blog/</link>
	<description></description>
	<lastBuildDate>Thu, 02 Apr 2026 12:24:12 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://www.asterisk.org/wp-content/uploads/favicon.ico</url>
	<title>Blog &#8902; Asterisk</title>
	<link>https://www.asterisk.org/blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Welcome New, and Returning, Asterisk Users!</title>
		<link>https://www.asterisk.org/welcome-new-and-returning-asterisk-users/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Thu, 02 Apr 2026 12:24:12 +0000</pubDate>
				<category><![CDATA[Project General]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[improvement]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10400</guid>

					<description><![CDATA[<p>I&#8217;ve noticed a trend of people and companies looking at moving away from other projects towards Asterisk. For those returning to Asterisk after some time, many have this vision in their mind of Asterisk from many years ago, so I thought I&#8217;d put together a blog post going through some items to show how the [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/welcome-new-and-returning-asterisk-users/">Welcome New, and Returning, Asterisk Users!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="10400" class="elementor elementor-10400" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-76e6646e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="76e6646e" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-24022c4d" data-id="24022c4d" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3754dee1 elementor-widget elementor-widget-text-editor" data-id="3754dee1" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>I&#8217;ve noticed a trend of people and companies looking at moving away from other projects towards Asterisk. For those returning to Asterisk after some time, many have this vision in their mind of Asterisk from many years ago, so I thought I&#8217;d put together a blog post going through some items to show how the Asterisk of today isn&#8217;t like it was.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-af65174 elementor-widget elementor-widget-heading" data-id="af65174" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Predictable Release Schedule</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-06098df elementor-widget elementor-widget-text-editor" data-id="06098df" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">Asterisk has an incredibly predictable, reliable, and documented release schedule. Every 4-6 weeks we do release candidates of all currently supported branches. If, after testing, no issues are encountered &#8212; prompting more release candidates a week later &#8212; we do the full releases.</p>
<p data-spacing="double">Yearly, in October, we do a new major release with the release candidate having occurred the month prior. This <a href="https://docs.asterisk.org/About-the-Project/Asterisk-Versions/">predictability</a> is great for planning for users of Asterisk, as you can work it in to your own scheduling. (At the end of the post is the current timeline for Asterisk version 20 LTS.)</p>								</div>
				</div>
				<div class="elementor-element elementor-element-0ceb875 elementor-widget elementor-widget-heading" data-id="0ceb875" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">LTS Releases and Standard Releases</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-43974fe elementor-widget elementor-widget-text-editor" data-id="43974fe" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">There are both long term supported and standard releases of Asterisk.</p>
<p data-spacing="double">A long term supported release provides four (4) years of bug fixes with one (1) year afterwards of security fixes. Combined, that&#8217;s <strong>five (5) years of security support for each new LTS release</strong>.</p>
<p data-spacing="double">A standard release provides one (1) year of bug fixes and one (1) year of security releases. A standard release allows us to have more time for testing of major changes that we don&#8217;t feel comfortable immediately placing in a long term supported release. In practice, they are still extremely stable and many people try them out and use them in production.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-0b42184 elementor-widget elementor-widget-heading" data-id="0b42184" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Security Releases</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-c9cf786 elementor-widget elementor-widget-text-editor" data-id="c9cf786" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">We do security releases as needed based on the security reports we receive. Sometimes these releases may include just a single fix, or potentially multiple. Security releases are based on the last release and only include changes to resolve the security issues. They do not include any other changes, making them safer to update to.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-ea2e4af elementor-widget elementor-widget-heading" data-id="ea2e4af" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Stability</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-619cd39 elementor-widget elementor-widget-text-editor" data-id="619cd39" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">A huge focus over numerous years has been on the stability of Asterisk. In prior times people would avoid upgrading, be it between minor or major versions, due to issues encountered. This is no longer the case for the vast majority of users. Many upgrade without a second thought. <strong>Stability has become the norm for Asterisk.</strong> This includes at both low and high usage &#8211; such as with thousands of endpoints and concurrent channels.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-40b1a6d elementor-widget elementor-widget-heading" data-id="40b1a6d" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Performance</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-5ba1c7c elementor-widget elementor-widget-text-editor" data-id="5ba1c7c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">Performance has also been a focus of Asterisk. Asterisk can now scale beyond what it could before, to <strong>thousands of endpoints and concurrent channels</strong> as mentioned before. As always, you need to do proper testing for your usage as there are numerous variables that can change performance characteristics. This continues to be a focus.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-1e1bf06 elementor-widget elementor-widget-heading" data-id="1e1bf06" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">New Features and Functionality in Current Branches</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-4e987ac elementor-widget elementor-widget-text-editor" data-id="4e987ac" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">Previously &#8212; for many years &#8212; Asterisk would not allow new features or functionality in current branches. This meant that people had to wait for the next major release in order to get new things.</p>
<p data-spacing="double"><strong>This is no longer the case.</strong></p>
<p data-spacing="double">We now accept new features and functionality in current branches, as long as they do not break existing functionality and are backwards compatible. This gets the functionality to users fairly quickly &#8212; within 4-6 weeks, according to our release process.</p>
<p data-spacing="double">One recent example of new functionality in current branches is our highly sought after <a href="https://docs.asterisk.org/Configuration/Channel-Drivers/WebSocket/">Media Over Websockets</a> implementation for easier AI integrations with Asterisk. The MOW work was <a href="https://github.com/asterisk/asterisk/releases">officially included on October 15th, 2025</a>, for releases 23.0.0, 22.6.0, 21.11.0 and 20.16.0.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-cd4ea60 elementor-widget elementor-widget-heading" data-id="cd4ea60" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Certified Branches</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-680a897 elementor-widget elementor-widget-text-editor" data-id="680a897" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Certified Branches (CBs) are for users who desire stability with only security updates and limited bug fixes, with no new features or functionality. These CBs start as mature, well-tested branches of the current LTS Release. Many household name, large commercial enterprises choose CBs for their in-house deployments.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-e896dc8 elementor-widget elementor-widget-heading" data-id="e896dc8" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Community Support</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-f7dae05 elementor-widget elementor-widget-text-editor" data-id="f7dae05" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">The Asterisk community forum located at <a href="https://community.asterisk.org/">https://community.asterisk.org/</a> is a vibrant and active place with both contributors and users alike. You can post a question or comment and usually there will be a response, perhaps even from myself. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f920.png" alt="🤠" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>								</div>
				</div>
				<div class="elementor-element elementor-element-93eb24e elementor-widget elementor-widget-heading" data-id="93eb24e" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Testing 1-2-3</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-039e93f elementor-widget elementor-widget-text-editor" data-id="039e93f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">The Asterisk testsuite is a project that has over one thousand (1,000+) tests covering various parts of Asterisk. From simple things, like registering a phone, to more complex scenarios like attended transfers, there is <strong>test coverage that is run on pull requests to ensure that things don&#8217;t break.</strong> We continue to add to and extend the testsuite as changes occur. This bolsters our confidence in the merging of changes and is another way we reduce issues experienced by users.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-dfcac04 elementor-widget elementor-widget-heading" data-id="dfcac04" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Code Review in Groups of Two</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-5d381a1 elementor-widget elementor-widget-text-editor" data-id="5d381a1" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">All contributions, including from myself, undergo code review. Before being merged they generally need to have at least two (2) people who have reviewed the contribution and approved it. This can slow down how fast contributions are merged and included but we have a strong focus on quality and stability. <strong>We do not want to release code that has issues or cause failures for our users<em>. We strive to minimize issues.</em></strong></p>								</div>
				</div>
				<div class="elementor-element elementor-element-2bba852 elementor-widget elementor-widget-heading" data-id="2bba852" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">ARI</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-4569dfe elementor-widget elementor-widget-text-editor" data-id="4569dfe" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">We&#8217;ve talked about ARI a lot in <a href="https://www.asterisk.org/topics/ari/">previous blog posts</a>, but it stands for <strong>Asterisk REST Interface</strong>. It is a method by which telephony applications can be written in any language supporting HTTP and Websockets. It provides fundamental building blocks (such as bridging and channel control) that can be used to implement such things as call queues or even Voice AI functionality. If you&#8217;re wanting more control over Asterisk to build your own applications or integrate in one, <a href="https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/">check out ARI</a>.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-26ade69 elementor-widget elementor-widget-heading" data-id="26ade69" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Continued Development to Meet Industry Needs</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-f8d7bbb elementor-widget elementor-widget-text-editor" data-id="f8d7bbb" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double"><strong>Development of Asterisk is not stagnate.</strong> It is driven based on the needs of the community, what contributors contribute, what Sangoma needs, and also the industry as a whole. These culminate in the changes we release every 4-6 weeks and our yearly major release.</p>
<p data-spacing="double">From an industry perspective, a great example of such a change would be <a href="https://www.asterisk.org/asterisk-geolocation-capabilities/">our Geolocation E911 support</a>. We perceived this as an upcoming fundamental requirement several years ago for some users and implemented it. We continue to do this as things evolve and change, ensuring that users have access to the functionality when they need it.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-c4dcf1f elementor-widget elementor-widget-heading" data-id="c4dcf1f" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Library Usage</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-85b3b7c elementor-widget elementor-widget-text-editor" data-id="85b3b7c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p data-spacing="double">As a project, we take a balanced approach to the usage of outside libraries:</p>
<ul>
<li data-spacing="double">We use outside libraries where it makes sense, but <b>we don&#8217;t fork them</b>.</li>
<li data-spacing="double">We try to keep our required dependencies to a reasonable level.</li>
<li data-spacing="double">We support linking against system libraries but provide a bundled mechanism that downloads and builds the upstream releases with our own patches applied (only if needed).</li>
<li data-spacing="double">We contribute these patches where they make sense and work with upstream to get them included.</li>
</ul>
<p><strong>An example of this is the <a href="https://github.com/pjsip/pjproject">PJSIP library</a>.</strong> We don&#8217;t have our own fork but instead download their releases and apply our patches. This ensures that we don&#8217;t diverge from upstream libraries, which eliminates the maintenance overhead and ensures that any patches we do make are shared with the wider upstream library users.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-7b46481 elementor-widget elementor-widget-heading" data-id="7b46481" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Asterisk 20 Timeline</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-5aff016 elementor-widget elementor-widget-text-editor" data-id="5aff016" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Asterisk 20 is a Long Term Supported (LTS) release. This timeline shows what happened until now (October 2025) and <em>what the future should hold.</em></p>								</div>
				</div>
				<div class="elementor-element elementor-element-0fe2266 uael-timeline--center uael-timeline-responsive-tablet uael-timeline-arrow-center elementor-widget elementor-widget-uael-timeline" data-id="0fe2266" data-element_type="widget" data-e-type="widget" data-widget_type="uael-timeline.default">
				<div class="elementor-widget-container">
					<div class="uael-timeline-wrapper uael-timeline-node">
	
	<div class="uael-timeline-main">
		<div class="uael-days">
												<div class="elementor-repeater-item-dd98229 uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-right">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-right">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >July 20, 2022</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">Branched</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>The UPGRADE.txt file is <a href="https://github.com/asterisk/asterisk/commit/a818b05ca18a97e6f61a8257d24a61d0fe2d65ee">changed</a> from 19.0.0 to 20.0.0 in version control system.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >July 20, 2022</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-102f0e3 uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-left">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-left">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >September 14, 2022</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">RC1</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>Release Candidate 1 is the <a href="https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-20.0.0-rc1.tar.gz">first version 20 tarball</a> for users to try out themselves.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >September 14, 2022</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-b245b3a uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-right">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-right">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >September 28, 2022</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">RC2</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>Release Candidate 2</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >September 28, 2022</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-3c3a395 uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-left">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-left">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >October 19, 2022</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">Released</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>First Official Release as <a href="https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-20.0.0.tar.gz">20.0.0 tarball</a>.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >October 19, 2022</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-b9ec60e uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-right">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-right">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >March 18, 2024</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">Certified Branch testing begins</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>Asterisk version 20.7.0 is released. This version begins undergoing additional rigorous testing as it will become a Certified Branch.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >March 18, 2024</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-e1d8a23 uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-left">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-left">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >July 18, 2024</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">Certified Branch released</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>The <a href="https://downloads.asterisk.org/pub/telephony/certified-asterisk/asterisk-certified-20.7-cert1.tar.gz">first certified branch release tarball</a> is based on version 20.7.0.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >July 18, 2024</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-a3293de uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-right">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-right">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >October 19, 2026</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">Security Fix Only</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>Anticipated date that version 20 will stop receiving standard bug fixes.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >October 19, 2026</div></div>
									</div>
								</div>
													</div>
					</div>
																	<div class="elementor-repeater-item-f0b7359 uael-timeline-field animate-border out-view">
						<div class="uael-timeline-widget uael-timeline-left">
							<div class="uael-timeline-marker">
								<span class="timeline-icon-new out-view-timeline-icon">
									<i aria-hidden="true" class="fa fa-calendar"></i>								</span>
							</div>

							<div class="uael-day-new uael-day-left">
								<div class="uael-events-new">
																		<div class="uael-events-inner-new">
																					<div class="uael-timeline-date-hide uael-date-inner"><div class="inner-date-new"><p >October 19, 2027</p></div>
											</div>
																				<div class="uael-content">
																																	<div class="uael-timeline-heading-text">
												<h3 class="uael-timeline-heading">End Of Life</h3>
											</div>
																																																								<div class="uael-timeline-desc-content"> <p>Anticipated date that version 20 will no longer receive fixes of any kind.</p></div>
																																</div>
																							<div class="uael-timeline-arrow"></div>
																				</div>
																	</div>
							</div>
															<div class="uael-timeline-date-new">
									<div class="uael-date-new"><div class="inner-date-new"><div >October 19, 2027</div></div>
									</div>
								</div>
													</div>
					</div>
										</div>
		<div class="uael-timeline__line">
			<div class="uael-timeline__line__inner"></div>
		</div>
	</div>
</div>

				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div>
		<p>The post <a href="https://www.asterisk.org/welcome-new-and-returning-asterisk-users/">Welcome New, and Returning, Asterisk Users!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Taskpool + PJSIP Has Landed!</title>
		<link>https://www.asterisk.org/taskpool-pjsip-has-landed/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Tue, 24 Feb 2026 16:46:47 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Asterisk 20]]></category>
		<category><![CDATA[Asterisk 22]]></category>
		<category><![CDATA[Asterisk 23]]></category>
		<category><![CDATA[PJSIP]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[developme]]></category>
		<category><![CDATA[improvement]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[pjsip]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10925</guid>

					<description><![CDATA[<p>Last year I wrote about a new API I created, taskpool, and how stasis was moved over to it. If you haven&#8217;t read that post you can do so here: Taskpool: A Hunch Turned Performance Improvement I&#8217;m happy to say that PJSIP has now been moved over to the same API! This was a journey [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/taskpool-pjsip-has-landed/">Taskpool + PJSIP Has Landed!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Last year I wrote about a new API I created, taskpool, and how stasis was moved over to it. If you haven&#8217;t read that post you can do so here:</p>
<blockquote class="wp-embedded-content" data-secret="YcCKqfmgRV"><p><a href="https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/">Taskpool: A Hunch Turned Performance Improvement</a></p></blockquote>
<p><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Taskpool: A Hunch Turned Performance Improvement&#8221; &#8212; Asterisk" src="https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/embed/#?secret=qpxtP4GtS6#?secret=YcCKqfmgRV" data-secret="YcCKqfmgRV" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<p>I&#8217;m happy to say that PJSIP has now been moved over to the same API! This was a journey that involved multiple revisions and attempts, but as of the latest releases (20.18.0, 22.8.0, 23.2.0) it has shipped. Let&#8217;s talk about the two aspects that made it complex.</p>
<h1>Taskpool Execution In Taskpool</h1>
<p>Almost everything in PJSIP executes within a taskprocessor. This means that there are cases where the code will queue a task on a taskprocessor from within a taskprocessor &#8211; sometimes synchronously. With the prior threadpool implementation this was perfectly acceptable as a new thread could be created if none were available and things would go on. With taskpool this is not the case. It may not be configured to allow unbound growth of threads. As a result taskpool had to be made more intelligent about where tasks execute in this scenario, such as allowing them to be executed within the current thread. This was done for PJSIP but is available to all taskpool API users, and happens transparently without knowledge of the API user.</p>
<h1>Pausing A Taskprocessor</h1>
<p>In certain scenarios in Asterisk we have a process called masquerade that essentially replaces the contents of one channel with that of another. It&#8217;s commonly involved in certain transfer scenarios or AMI Redirect cases. To accomplish this PJSIP has to pause the taskprocessor handling the SIP dialog and SIP session so that no further actions occur on it, and it is free to manipulate the channel in a more substantial manner. With threadpool since new threads could be created if none were available the easiest way to do so was to just block the thread until told to unpause. With taskpool blocking a task like that is not allowed as another thread may not be available to handle things, blocking everything. Taskpool takes a different approach and instead doesn&#8217;t block the thread but stops handling any tasks queued to the taskprocessor handling the SIP dialog and SIP session. Essentially there is no longer a thread handling the taskprocessor. After the taskprocessor is unpaused it is given back to the taskpool and a thread resumes handling the tasks. This ensures no thread is blocked waiting for a taskprocessor to be unpaused.</p>
<h1>The Impact</h1>
<p>Just like stasis from a user perspective only the configuration options changed and defaults were updated to better reflect the actual requirements of most users so few people will need to touch it &#8211; just upgrading your Asterisk will gain you this improvement. On my system the impact to CPU usage is about a 5-10% reduction. It&#8217;s not as much as stasis, but every bit helps!</p>
<p>The post <a href="https://www.asterisk.org/taskpool-pjsip-has-landed/">Taskpool + PJSIP Has Landed!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Taskpool: A Hunch Turned Performance Improvement</title>
		<link>https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Wed, 26 Nov 2025 08:37:01 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[core]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[improvement]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10250</guid>

					<description><![CDATA[<p>Asterisk is made up of many different modules that each usually use different APIs provided by Asterisk itself or other libraries. One that has seen use over the last 10 years has been the threadpool API. Threadpool The threadpool API provides common methods for a configurable pool of threads that can be used to do [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/">Taskpool: A Hunch Turned Performance Improvement</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p data-spacing="double" data-pm-slice="1 1 []">Asterisk is made up of many different modules that each usually use different APIs provided by Asterisk itself or other libraries. One that has seen use over the last 10 years has been the threadpool API.</p>
<h2 data-spacing="double" data-pm-slice="1 1 []">Threadpool</h2>
<p data-spacing="double">The threadpool API provides common methods for a configurable pool of threads that can be used to do work. It&#8217;s arbitrary what the work is allowing it to be used in different ways. The two heaviest users of it have been PJSIP and Stasis for their threading models, heavily focusing on dispatching work to be done in an asynchronous manner. The threadpool is convenient for this because it can be configured to have a fixed number of threads or to grow and shrink as needed.</p>
<p data-spacing="double">Based on trends I&#8217;ve seen for awhile (such as posts and comments about the stasis/pool and stasis/pool-control taskprocessors) I had a hunch that the cost of using the threadpool API was high. After looking at the implementation I became more convinced of this. The threadpool API has a <strong>single queue of work for all tasks</strong> and uses a second separate management queue to manage the pool itself. Each pushing of a task to the threadpool results in 2 tasks being queued, instead of one. The actual task to be worked and a task to manage the threadpool (grow it, wake up a waiting thread). If the threadpool can&#8217;t respond fast enough to tasks being added or there is a fixed number of threads allowed then the single queue of work can grow and grow. This is what causes the stasis/pool taskprocessor messages that some people have seen.</p>
<p data-spacing="double">This led me to writing some efficiency tests to see how much work the threadpool implementation can do. In the efficiency tests the work is minimal which helps isolate the results to just the time spent in the threadpool implementation.  There are two tests with the first one being the pushing of a large number of tasks that then get executed by threadpool threads. The second test uses multiple serializers which then also get executed by threadpool threads. These tests both execute for 30 seconds with 50 threads and aim to essentially flood the threadpool with as much use as possible over that time.</p>
<p data-spacing="double">Running the efficiency tests gave the following results on my development system:</p>
<p data-spacing="double"><strong>Threadpool Push: 22,809,319 tasks executed (760,310 per second)</strong></p>
<p data-spacing="double"><strong>Threadpool Serializer Push: 16,590,999 tasks executed (553,033 per second)</strong></p>
<p data-spacing="double"><strong>As you can see the serializer usage incurs an approximate 27% penalty on my system.</strong></p>
<p data-spacing="double">These results and usage allowed me to better understand the activity in the threadpool. I came to the conclusion that the threadpool API is really good for medium to long running tasks, but is inefficient for short to medium duration tasks. The overhead of managing the threadpool itself just isn&#8217;t worth it.</p>
<h2 data-spacing="double">Taskpool</h2>
<p data-spacing="double">I decided to come up with an API specifically focused on short to medium duration tasks, taking into account all I had learned from threadpool as well as usage of tasks in general. This new API is called taskpool.</p>
<p data-spacing="double">Taskpool is effectively a pool of taskprocessors that can be used to execute tasks but shares the configurability of the threadpool API. It can have a fixed number of taskprocessors or it can grow and shrink as needed. A substantial difference to threadpool is that there is <strong>no single queue of work</strong>. Instead when a task is pushed it is immediately allocated to a specific taskprocessor and queued directly on it. There is also <strong>no separate management queue</strong> that manages the taskpool. If the taskpool needs to grow it is done when pushing a task. If it needs to shrink this is done asynchronously in the background using a periodic scheduled item.</p>
<p data-spacing="double">You might immediately think &#8220;but taskprocessors have issues!&#8221;. I want to set the record straight. <strong>Taskprocessors themselves are actually pretty efficient.</strong> The users of the taskprocessor API are really the fundamental cause of taskprocessor issues. If they are slow or don&#8217;t use taskprocessors efficiently, then a symptom is taskprocessor issues.</p>
<p data-spacing="double">As part of implementing taskpool I wrote efficiency tests that are equivalent to the threadpool efficiency tests to give a comparison. Running these tests on my development system yielded the following results:</p>
<p data-spacing="double"><strong>Taskpool Push: 61,255,016 tasks executed (2,041,833 per second) &#8211; 2.69x more tasks executed than threadpool</strong></p>
<p data-spacing="double"><strong>Taskpool Serializer Push: 48,997,697 tasks executed (1,633,256 per second) &#8211; 2.95x more tasks executed than threadpool</strong></p>
<p data-spacing="double"><strong>For taskpool the serializer usage penalty is actually less, approximately 20%.</strong></p>
<p data-spacing="double">These results were just from my system and having others run them for comparison has shown cases of even better results &#8211; as high as <strong>20x</strong>. It&#8217;s very dependent on the system itself and CPU but no matter what it is an improvement for everyone. This is a great demonstration of how the usage of taskprocessors can make a huge difference in performance. Throughout all of this no changes have been made to taskprocessors themselves. I explored doing so but did not find any changes that would improve them.</p>
<h2 data-spacing="double">So Where Is Taskpool Being Used Right Now?</h2>
<p data-spacing="double">The current major user of taskpool is stasis for message dispatching as of <strong>Asterisk</strong> <strong>20.17.0, 22.7.0, and 23.1.0</strong>. It has been changed over internally to use taskpool with the only user facing change being the configuration changing to taskpool (with threadpool options still being supported). For power users who have examined &#8220;core show taskprocessors&#8221; this has also changed for stasis with the pool and pool-control taskprocessors being removed and replaced with stasis taskpool ones.</p>
<p data-spacing="double">Early reports have shown that this has improved CPU usage a noticeable amount (anywhere from <strong>20-30% less CPU usage</strong>) and solved performance issues for people which is great to hear. If you&#8217;re interested in using it all you have to do is update to one of the versions listed above or newer. There&#8217;s nothing else to do.</p>
<p>The post <a href="https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/">Taskpool: A Hunch Turned Performance Improvement</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sangoma Trunking Module</title>
		<link>https://www.asterisk.org/sangoma-trunking-module/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Wed, 29 Oct 2025 09:08:35 +0000</pubDate>
				<category><![CDATA[Asterisk 20]]></category>
		<category><![CDATA[Asterisk 21]]></category>
		<category><![CDATA[Asterisk 22]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[feature]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10163</guid>

					<description><![CDATA[<p>Sangoma provides two SIP trunking services which are available to customers, SIPStation which is a great solution for the everyday user and VoIP Innovations which is for more heavy users. These two services use vastly different platforms and have vastly different configuration. In Sangoma products such as FreePBX and Switchvox we provide an easy mechanism [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/sangoma-trunking-module/">Sangoma Trunking Module</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Sangoma provides two SIP trunking services which are available to customers, SIPStation which is a great solution for the everyday user and VoIP Innovations which is for more heavy users. These two services use vastly different platforms and have vastly different configuration. In Sangoma products such as FreePBX and Switchvox we provide an easy mechanism to automatically configure trunks using a token/keycode available from each service. This is now available in Asterisk through the res_pjsip_config_sangoma module. This binary module uses the sorcery configuration mechanism (which is a great example of how sorcery allows things that one might not expect) to hook in and automatically configure PJSIP with trunks.</p>
<p>To make the module available you need to select it in &#8220;make menuselect&#8221; under the &#8220;Resource Modules&#8221; category, far at the bottom under &#8220;External&#8221;.</p>
<p><img fetchpriority="high" decoding="async" src="https://www.asterisk.org/wp-content/uploads/Screenshot-From-2025-06-18-10-41-30-300x207.png" alt="" width="300" height="207" class="alignnone size-medium wp-image-10164" srcset="https://www.asterisk.org/wp-content/uploads/Screenshot-From-2025-06-18-10-41-30-300x207.png 300w, https://www.asterisk.org/wp-content/uploads/Screenshot-From-2025-06-18-10-41-30-768x530.png 768w, https://www.asterisk.org/wp-content/uploads/Screenshot-From-2025-06-18-10-41-30.png 995w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Once selected the module will be downloaded and installed as part of the installation process, just like can be done for the DPMA module. You still need to configure the module, however, with the specific details. You can find documentation on this on the <a href="https://sangomakb.atlassian.net/wiki/spaces/SSTAF/pages/504201217/SIP+Trunking+and+Fax+-+Sangoma+PJSIP+Configuration+module+for+Asterisk">Sangoma Knowledge Base wiki article</a>.</p>
<p>Something important to note is this module only supports PJSIP. The old chan_sip module is not supported.</p>
<p>I did a quick webinar about the trunking module:</p>
<p><a href="https://youtu.be/Ss4X5Ek6lLI?si=o548CSPi7JBALTPK"><img decoding="async" src="https://www.asterisk.org/wp-content/uploads/Screenshot-2025-10-29-at-10.24.18-AM-300x169.png" alt="" width="300" height="169" class="alignnone size-medium wp-image-10525" srcset="https://www.asterisk.org/wp-content/uploads/Screenshot-2025-10-29-at-10.24.18-AM-300x169.png 300w, https://www.asterisk.org/wp-content/uploads/Screenshot-2025-10-29-at-10.24.18-AM-1024x578.png 1024w, https://www.asterisk.org/wp-content/uploads/Screenshot-2025-10-29-at-10.24.18-AM-768x434.png 768w, https://www.asterisk.org/wp-content/uploads/Screenshot-2025-10-29-at-10.24.18-AM.png 1512w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>You can view it <a href="https://youtu.be/Ss4X5Ek6lLI?si=o548CSPi7JBALTPK">here</a>.</p>
<p>The post <a href="https://www.asterisk.org/sangoma-trunking-module/">Sangoma Trunking Module</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Asterisk 18 Now End of Life, Asterisk 21 Security Fix Only</title>
		<link>https://www.asterisk.org/asterisk-18-now-end-of-life-asterisk-21-security-fix-only/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Tue, 21 Oct 2025 07:54:44 +0000</pubDate>
				<category><![CDATA[Asterisk 18]]></category>
		<category><![CDATA[Asterisk 21]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[asterisk bugs]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10489</guid>

					<description><![CDATA[<p>Time Moves Ever Forward! Two versions of Asterisk have now transitioned to new support status, check them out below! 🚫 Asterisk 18 Has Reached End of Life Asterisk 18 was a Long Term Supported (LTS) release that is now officially End of Life (EOL). This means it will no longer receive updates of any kind, [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/asterisk-18-now-end-of-life-asterisk-21-security-fix-only/">Asterisk 18 Now End of Life, Asterisk 21 Security Fix Only</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Time Moves Ever Forward!</h2>
<p>Two versions of Asterisk have now transitioned to new support status, check them out below!</p>
<h3><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f6ab.png" alt="🚫" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Asterisk 18 Has Reached End of Life</h3>
<p><span>Asterisk 18 was a Long Term Supported (LTS) release that is now officially <strong>End of Life (EOL)</strong>. This means it will no longer receive updates of any kind, including security patches or bug fixes. If you&#8217;re still running Asterisk 18, it&#8217;s time to plan your upgrade to a supported version to ensure your system remains secure and functional.</span></p>
<p>Please consider reviewing the details on what&#8217;s new and what&#8217;s changed between major versions since 18:</p>
<ul>
<li><a href="https://github.com/asterisk/asterisk/blob/19.0.0/UPGRADE.txt">Asterisk 19.0.0 UPGRADE.txt</a></li>
<li><a href="https://github.com/asterisk/asterisk/blob/20.0.0/UPGRADE.txt">Asterisk 20.0.0 UPGRADE.txt</a></li>
<li><a href="https://github.com/asterisk/asterisk/blob/21.0.0/ChangeLogs/ChangeLog-21.0.0.md">Asterisk 21.0.0 ChangeLog</a></li>
<li><a href="https://github.com/asterisk/asterisk/blob/22.0.0/ChangeLogs/ChangeLog-22.0.0.md">Asterisk 22.0.0 ChangeLog</a></li>
<li><a href="https://github.com/asterisk/asterisk/blob/23.0.0/ChangeLogs/ChangeLog-23.0.0.md">Asterisk 23.0.0 ChangeLog</a></li>
</ul>
<p>Of particular note is the <a href="https://www.asterisk.org/asterisk-21-module-removal-chan_sip/">removal of <strong>chan_sip</strong> in Asterisk 21</a> &#8212; and, therefore, all later versions like 22 and 23 &#8212; in favor of <strong>chan_pjsip</strong>. Check your dial plan e.g. extensions.conf file for lines containing:</p>
<pre>  Dial(SIP/...)</pre>
<p>Because if you find them, then there&#8217;s going to be more work to do in Asterisk 22, as you convert to:</p>
<pre>  Dial(PJSIP/...)</pre>
<p>&#8230;and make additional necessary changes in other <a href="https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/">configuration related to PJSIP</a>.</p>
<h3><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f6e1.png" alt="🛡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Asterisk 21 Enters Security Fix Only Status</h3>
<p><span>Asterisk 21 is a standard release that has transitioned to <strong>Security Fix Only (SFO)</strong> status. While it will continue to receive critical security patches for one more year (until October 2026), no new features or non-security updates will be released.</span></p>
<h3><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Stay Supported, Stay Secure</h3>
<p><span>We strongly encourage all users to upgrade to a currently supported version of Asterisk. Staying up to date ensures you benefit from the latest features, performance enhancements, and &#8212; most importantly &#8212; security protections.</span></p>
<p><span>To help you plan your upgrade, check out the <a href="https://docs.asterisk.org/Operation/Maintenance-and-Upgrades/Updating-or-Upgrading-Asterisk/">related documentation</a> and the official <a href="https://docs.asterisk.org/About-the-Project/Asterisk-Versions/">Asterisk Versions page</a> which includes detailed support timelines and lifecycle information.</span></p>
<p><span>Let’s keep your toolkit for telephony applications robust and secure &#8212; upgrade today!</span></p>
<p>The post <a href="https://www.asterisk.org/asterisk-18-now-end-of-life-asterisk-21-security-fix-only/">Asterisk 18 Now End of Life, Asterisk 21 Security Fix Only</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AstriCon 2026 Is Happening!</title>
		<link>https://www.asterisk.org/astricon-2026-is-happening/</link>
		
		<dc:creator><![CDATA[Joshua C. Colp]]></dc:creator>
		<pubDate>Wed, 08 Oct 2025 11:11:45 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[community]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10420</guid>

					<description><![CDATA[<p>Greetings all! As you may have seen from email, forum, and social media publications we will indeed be having an AstriCon 2026 event on March 5th and 6th of next year. New this year is we will be having it as part of the SCALE event. This is a large open source event with tons [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/astricon-2026-is-happening/">AstriCon 2026 Is Happening!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Greetings all!</p>
<p>As you may have seen from email, forum, and social media publications we will indeed be having an AstriCon 2026 event on March 5th and 6th of next year. New this year is we will be having it as part of the <a href="https://www.socallinuxexpo.org/scale/23x/">SCALE event</a>. This is a large open source event with tons of additional content and other events. Even if you have a colleague or employee that is not focused on Asterisk, you may find other content that is right up their alley to enjoy! If you&#8217;d like to speak please apply through our <a href="https://forms.office.com/pages/responsepage.aspx?id=UdUG1xUY8kmbChyvDYkb3jp68BUIWO5CulVlBlDiNl1UNFlHRUlETzk5NDZMTDhaQ0tDVVJDMFpKVS4u&amp;route=shorturl">call for speakers form</a>. Even if you think what you have to say isn&#8217;t interesting enough, submit anyway! We&#8217;ll gladly consider it.</p>
<p>Thanks!</p>
<p>The post <a href="https://www.asterisk.org/astricon-2026-is-happening/">AstriCon 2026 Is Happening!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Exchanging media between Asterisk and apps has just gotten easier!</title>
		<link>https://www.asterisk.org/asterisk-media-over-websockets/</link>
		
		<dc:creator><![CDATA[George Joseph]]></dc:creator>
		<pubDate>Tue, 09 Sep 2025 18:00:10 +0000</pubDate>
				<category><![CDATA[ARI]]></category>
		<category><![CDATA[Asterisk 20]]></category>
		<category><![CDATA[Asterisk 21]]></category>
		<category><![CDATA[Asterisk 22]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[improvement]]></category>
		<category><![CDATA[interoperability]]></category>
		<category><![CDATA[RTP]]></category>
		<category><![CDATA[WebSocket]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10211</guid>

					<description><![CDATA[<p>Exchanging media between Asterisk and external apps has fairly involved for a few reasons, the main one being that RTP, the primary protocol for exchanging media, has some specific requirements that are particularly problematic for languages like Python and Javascript. It has a binary packet header with things like timestamps, sequence numbers, source identifiers, etc. [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/asterisk-media-over-websockets/">Exchanging media between Asterisk and apps has just gotten easier!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Exchanging media between Asterisk and external apps has fairly involved for a few reasons, the main one being that RTP, the primary protocol for exchanging media, has some specific requirements that are particularly problematic for languages like Python and Javascript. It has a binary packet header with things like timestamps, sequence numbers, source identifiers, etc. and it requires that packets be sent with specific lengths and at a very specific interval, usually 20ms. All in all, not very friendly. The increased popularity of using AI as customer service agents has presented us some additional challenges that required us to re-think how the media exchange process works.</p>
<p>Users of Asterisk&#8217;s ARI interface are no strangers to using WebSockets to receive call processing events. Additionally, there have been recent enhancements that allow ARI application developers to use the same WebSocket they receive events on to make REST calls. This can eliminate the need to use HTTP for making call control requests. We&#8217;ve now taken WebSocket capabilities one step further by allowing media to be exchanged via WebSockets as well using a new channel module &#8220;chan_websocket&#8221;.</p>
<h3>Features of chan_websocket:</h3>
<ul>
<li>The channel driver is codec agnostic for the most part. The most popular codecs are fully supported. This means that you won&#8217;t have to do any transcoding between Asterisk and your AI engine.</li>
<li>Secure connections are supported.</li>
<li>You can send bulk data to Asterisk, like a file or a response from an AI agent, and the channel driver will take care of breaking that audio up into appropriately sized frames.</li>
<li>Along with breaking the audio up into correctly sized frames, the channel driver will also time them appropriately so you don&#8217;t have to do it yourself. Additionally, the channel driver will automatically insert silence to maintain the timing if your app doesn&#8217;t send any audio.</li>
<li>There&#8217;s a control path available on the websocket that allows you to issue commands like &#8220;ANSWER&#8221;, &#8220;HANGUP&#8221; and &#8220;PAUSE_MEDIA&#8221;.</li>
<li>You can receive media related events over the control path like being told that a large chunk of audio you sent to Asterisk has been fully played to a caller.</li>
<li>The channel driver can accept incoming websocket connections from your app as well as make outgoing connections to your app. This can help overcome NAT issued and can enable better failover opportunities.</li>
<li>Although the driver is targeted at ARI ExternalMedia users, it&#8217;s not tied to ARI and can be used directly from the Dial dialplan app.</li>
</ul>
<h3>More info:</h3>
<p>Full information is available on the <a href="https://docs.asterisk.org/Configuration/Channel-Drivers/WebSocket/">Asterisk Documentation</a> website and there are code samples in the GitHub <a href="https://github.com/asterisk/asterisk-websocket-examples">asterisk/asterisk-websocket-examples</a> repository.</p>
<h3>Availability:</h3>
<p>The new channel driver is currently available in the master, 20, 21, 22 and 23 branches on <a href="https://github.com/asterisk/asterisk">GitHub</a> and is included in the latest <a href="https://github.com/asterisk/asterisk/releases/tag/20.16.0-rc1">20.16.0-rc1</a>, <a href="https://github.com/asterisk/asterisk/releases/tag/21.11.0-rc1">21.11.0-rc1</a> <a href="https://github.com/asterisk/asterisk/releases/tag/22.6.0-rc1">22.6.0-rc1</a> and <a href="https://github.com/asterisk/asterisk/releases/tag/23.0.0-rc1">23.0.0-rc1</a> release candidates.</p>
<p>The post <a href="https://www.asterisk.org/asterisk-media-over-websockets/">Exchanging media between Asterisk and apps has just gotten easier!</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AstriDevCon July 2025</title>
		<link>https://www.asterisk.org/astridevcon-july-2025/</link>
		
		<dc:creator><![CDATA[George Joseph]]></dc:creator>
		<pubDate>Wed, 13 Aug 2025 16:00:36 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Project General]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[contributing]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10208</guid>

					<description><![CDATA[<p>An AstriDevCon video conference was held on July 20, 2025 with about 15 attendees.  You can get a recap of the event at AstriDevCon July 2025 Recap and listen to the audio-only recording at https://downloads.asterisk.org/astridevcon/2025/ &#160;</p>
<p>The post <a href="https://www.asterisk.org/astridevcon-july-2025/">AstriDevCon July 2025</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>An AstriDevCon video conference was held on July 20, 2025 with about 15 attendees.  You can get a recap of the event at <a href="https://docs.asterisk.org/Development/Roadmap/AstriDevCon-2025-July/">AstriDevCon July 2025 Recap</a> and listen to the audio-only recording at <a href="https://downloads.asterisk.org/astridevcon/2025/">https://downloads.asterisk.org/astridevcon/2025/</a></p>
<p>&nbsp;</p>
<p>The post <a href="https://www.asterisk.org/astridevcon-july-2025/">AstriDevCon July 2025</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Asterisk Voicebridge</title>
		<link>https://www.asterisk.org/asterisk-voicebridge/</link>
		
		<dc:creator><![CDATA[Mike Bradeen]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 16:11:05 +0000</pubDate>
				<category><![CDATA[ai]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[ARI]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=10221</guid>

					<description><![CDATA[<p>If you were able to join us for Astricon in February 2025, you may have caught a Voice AI demo using external media given by the Asterisk Development team.  Good news, the source code for the application used in that demo is now available here! So how does it work?  The AsteriskVoiceBridge is an ARI [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/asterisk-voicebridge/">Asterisk Voicebridge</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you were able to join us for <a href="https://www.youtube.com/watch?v=WkGEKucDgeA&amp;list=PLighc-2vlRgSpA7t5uGeSZPDsnWcOhRqz">Astricon in February 2025</a>, you may have caught a <a href="https://youtu.be/Zvcw-POX6qw?si=58fb_jLRf3Mb0ItQ">Voice AI demo</a> using external media given by the Asterisk Development team.  Good news, the source code for the application used in that demo is now available <a href="https://github.com/asterisk/asteriskvoicebridge">here</a>!</p>
<p>So how does it work?  The <a href="https://github.com/asterisk/asteriskvoicebridge">AsteriskVoiceBridge</a> is an <a href="https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/">ARI</a> application written in Go that connects <a href="https://www.asterisk.org/">Asterisk</a>, <a href="https://deepgram.com/">Deepgram</a> and <a href="https://platform.openai.com/docs/guides/realtime">OpenAI</a> to create a real time voice application.  The basic structure of the application looks like this:</p>
<p><img decoding="async" src="https://www.asterisk.org/wp-content/uploads/Speech-ai-asterisk-model_small-1.png" alt="" width="1431" height="833" class="alignnone size-full wp-image-10222" srcset="https://www.asterisk.org/wp-content/uploads/Speech-ai-asterisk-model_small-1.png 1431w, https://www.asterisk.org/wp-content/uploads/Speech-ai-asterisk-model_small-1-300x175.png 300w, https://www.asterisk.org/wp-content/uploads/Speech-ai-asterisk-model_small-1-1024x596.png 1024w, https://www.asterisk.org/wp-content/uploads/Speech-ai-asterisk-model_small-1-768x447.png 768w" sizes="(max-width: 1431px) 100vw, 1431px" /></p>
<p>When a call is placed into stasis, the ARI controller builds the following call structure within Asterisk:</p>
<p><img loading="lazy" decoding="async" src="https://www.asterisk.org/wp-content/uploads/Bot-Call-Structure-2.png" alt="" width="544" height="399" class="alignnone wp-image-10223" srcset="https://www.asterisk.org/wp-content/uploads/Bot-Call-Structure-2.png 1320w, https://www.asterisk.org/wp-content/uploads/Bot-Call-Structure-2-300x220.png 300w, https://www.asterisk.org/wp-content/uploads/Bot-Call-Structure-2-1024x751.png 1024w, https://www.asterisk.org/wp-content/uploads/Bot-Call-Structure-2-768x563.png 768w" sizes="(max-width: 544px) 100vw, 544px" /></p>
<p>Once the above call structure is built, the Voice Business Logic Controller then sends a GET message to a local http server to retrieve a json configuration file that provides instructions and tools for the AI service that determines how to set up the parameters for the session.</p>
<p>The <a href="https://github.com/asterisk/asteriskvoicebridge">AsteriskVoiceBridge</a> then takes the RTP stream from Asterisk, converts it into audio segments and then sends those segments to Deepgram to perform Speech to Text on the incoming call.  That text is then sent to an AI Agent created using OpenAI.  As the AI Agent responds, the text of those responses is sent to Deepgram for Text to Speech conversion, which is then sent back to Asterisk as RTP.</p>
<p>Once the AI Agent determines which tool best matches the caller&#8217;s intent, it will send that choice to the Voice Business Logic Controller (VBLC).  The VBLC will then &#8216;use&#8217; that tool by issuing a subsequent GET to the local http server that matches the chosen tool to retrieve either a new set of instructions and tools for the AI and/or local commands to execute via the ARI controller.</p>
<p>The <a href="https://github.com/asterisk/asteriskvoicebridge">AsteriskVoiceBridge</a> includes an example demo IVR that lets the user choose between support, sales and accounts, then transfers the call to the corresponding destination in dialplan.</p>
<p>Our hope is that this demonstrates a model for how to build a voice service using Asterisk, but please note that the <a href="https://github.com/asterisk/asteriskvoicebridge">AsteriskVoiceBridge</a> is intended for educational purposes only and should not be used as the basis for any production service.</p>
<p>The post <a href="https://www.asterisk.org/asterisk-voicebridge/">Asterisk Voicebridge</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ARI snooping, an example in JavaScript</title>
		<link>https://www.asterisk.org/ari-snooping-an-example-in-javascript/</link>
		
		<dc:creator><![CDATA[Mike Bradeen]]></dc:creator>
		<pubDate>Wed, 16 Jul 2025 08:34:36 +0000</pubDate>
				<category><![CDATA[ARI]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[external media]]></category>
		<guid isPermaLink="false">https://www.asterisk.org/?p=9627</guid>

					<description><![CDATA[<p>In a previous post we saw an example of how to use Asterisk&#8217;s audiohooks to build an external media bridge using ARI. In this post we will show how to set up the services call structure using node-ari-client. First we create the client: let ari = await client.connect( ariServerUrl, ariUser, ariPassword); This client is routed [&#8230;]</p>
<p>The post <a href="https://www.asterisk.org/ari-snooping-an-example-in-javascript/">ARI snooping, an example in JavaScript</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In a <a href="https://www.asterisk.org/a-bridge-too-far/">previous post</a> we saw an example of how to use Asterisk&#8217;s audiohooks to build an external media bridge using ARI.</p>
<p>In this post we will show how to set up the services call structure using <a href="https://github.com/asterisk/node-ari-client">node-ari-client</a>.</p>
<p>First we create the client:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>let ari = await client.connect(
ariServerUrl, ariUser, ariPassword);</code></pre>
</div>
<p>This client is routed to via the Stasis dialplan:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-bash" data-lang="Bash"><code>[ext_med_service]
exten =&gt; 411,1,noOp()
same =&gt; n,Answer()
same =&gt; n,Stasis(ari-snooper)
same =&gt; n,Hangup()</code></pre>
</div>
<p>Once we receive a StasisStart event, check to make sure that this is a call coming in from the expected dialplan (this is to prevent the snoop and external media channels from triggering recursive events when <em>they</em> enter Stasis):</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>ari.on("StasisStart", async (event, chan) =&gt; {
    let dialed = chan.dialplan.exten.concat("-", chan.dialplan.context);
    if (dialed != "411-ext_med_service") {
        /* Only start a new call for callers into our app. */
        return;
    }</code></pre>
</div>
<p>Create the service bridge:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>    let serviceBridge = ari.Bridge();
    try {
        await serviceBridge.create({type: "mixing"});
    } catch(error) {
        console.error(error); /* also hangup channels */
    }</code></pre>
</div>
<p>Create the snoop channel and add it to the service bridge:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>    let snoopChannel;
    try {
        chan.snoopChannel({
            spy: "in",
            app: "ari-snooper",}, (snerr, snchan) =&gt; {
                if (snerr) {
                    console.error(snerr);
                } else {
                    snoopChannel = snchan;
                        try {
                                serviceBridge.addChannel({channel: snchan.id});
                            } catch (error) {
                                console.error(error);
                            }
                }
        });
    } catch (error) {
        console.error(error); /* also hangup channels */
    }</code></pre>
</div>
<p>Last we create the external media channel and it to the service bridge:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>    let externalChannel = ari.Channel();
    externalChannel.on('StasisStart', (event, echan) =&gt; {
        serviceBridge.addChannel({channel: echan.id});
        });
    try {
        let resp = await externalChannel.externalMedia({
                app: "ari-snooper",
                external_host: "127.0.0.1:9595",
                format: "ulaw"
            });
    } catch(error) {
        console.error(error);
    }
}</code></pre>
</div>
<p>With this structure, Asterisk will send all incoming audio on the original channel to 127.0.0.1:9595 as a raw ulaw stream.  Your application listening on this IP and port would record that stream to analyze or otherwise proxy off to an external service.</p>
<p>So far the external media and snoop channels are in a bridge, but the original caller is not.  This is so that the original caller can be placed into another bridge, conference or application independent of the attached service.  For example, if we want to add the caller to a &#8216;call&#8217; bridge with other extensions:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>let callBridge = ari.Bridge();
try {
    await callBridge.create({type: "mixing"});
} catch(error) {
    console.error(error);
}
callBridge.addChannel({channel: chan.id});</code></pre>
</div>
<p>From there you would add your other channels to the call bridge as you would typically.</p>
<p>A note about this call structure, if you want the service to be able to respond by sending audio back from the external media channel over the service bridge to the user channel via whisper on the snoop channel, there needs to be an audio source already feeding the user channel to whisper into.  This means the user channel has to be bridged with another channel that is generating audio or be in playback (presumably silence.)</p>
<p>Hopefully this gives you a head start on making your own services application using ARI!</p>
<p>The post <a href="https://www.asterisk.org/ari-snooping-an-example-in-javascript/">ARI snooping, an example in JavaScript</a> appeared first on <a href="https://www.asterisk.org">Asterisk</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
