<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Positron</title>
<link>https://positron.posit.co/blog/</link>
<atom:link href="https://positron.posit.co/blog/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<image>
<url>https://positron.posit.co/positron-blog-social.png</url>
<title>Positron</title>
<link>https://positron.posit.co/blog/</link>
</image>
<generator>quarto-1.9.23</generator>
<lastBuildDate>Tue, 07 Apr 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>April Release Highlights</title>
  <dc:creator>Cindy Tong</dc:creator>
  <link>https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/</link>
  <description><![CDATA[ 




<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Tip
</div>
</div>
<div class="callout-body-container callout-body">
<p><a href="https://posit.co/positron-updates-signup/">Subscribe</a> to get this newsletter directly in your email inbox.</p>
</div>
</div>
<p>Welcome to the first edition of our Positron newsletter! Here, we will share highlights from our latest release, tips on how to be more productive with Positron, and useful resources.</p>
<p>We just returned from an in-person onsite in beautiful Monterey, California. During the trip, we got a chance to meet (some of us for the first time), touch grass and sand, and brainstorm ways we can improve to build better products for you.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/monterey.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="A view from Point Lobos State Natural Reserve"><img src="https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/images/monterey.png" class="img-fluid figure-img" alt="A view from Point Lobos State Natural Reserve"></a></p>
<figcaption>A view from Point Lobos State Natural Reserve</figcaption>
</figure>
</div>
<p>Let’s get into the updates.</p>
<section id="key-product-updates" class="level2">
<h2 class="anchored" data-anchor-id="key-product-updates">Key Product Updates</h2>
<p>The April 2026 release of Positron brings significant improvements across:</p>
<ul>
<li>Positron Server for Academic Use via JupyterHub</li>
<li>AI enhancements: Next Steps in Jupyter Notebooks, Agent Skills, and Azure AI Foundry Support</li>
<li>Telemetry updates</li>
<li>R improvements: Addins, Debugging, and more</li>
<li>Data Explorer Performance Improvement</li>
<li>Windows ARM in GA</li>
<li>What’s Coming Next: Inline Outputs, Packages Pane, and Posit Assistant</li>
</ul>
<p>Here’s a look at the key features that shipped with the April 2026 release.</p>
<section id="positron-server-for-academic-use-via-jupyterhub" class="level3">
<h3 class="anchored" data-anchor-id="positron-server-for-academic-use-via-jupyterhub">Positron Server for Academic Use via JupyterHub</h3>
<p><strong>What we built:</strong> Academic institutions can now offer Positron Server to their students at no cost through JupyterHub (<a href="../2026-04-03-positron-server-jupyterhub/">blog post</a>). If your institution already runs JupyterHub, you can add Positron as a launcher option alongside JupyterLab, with no additional infrastructure required. Students simply log in and select Positron from the launcher, getting the full Positron experience including rich Python and R support, the extension marketplace, and (optionally) Positron Assistant.</p>
<p><strong>Why this matters:</strong> This removes the barrier for students and educators who want to use Positron in a classroom setting. No local installs, no configuration headaches — just a familiar JupyterHub login with Positron ready to go.</p>
<p><strong>Get started:</strong> <a href="https://github.com/posit-dev/positron/blob/main/LICENSE.txt">Review the eligibility criteria</a> and send an email to <a href="mailto:academic-licenses@posit.co">academic-licenses@posit.co</a> to request a free teaching license.</p>
</section>
<section id="ai-next-steps-in-the-native-jupyter-notebook-editor" class="level3">
<h3 class="anchored" data-anchor-id="ai-next-steps-in-the-native-jupyter-notebook-editor">AI Next Steps in the Native Jupyter Notebook Editor</h3>
<div class="quarto-video"><video id="video_shortcode_videojs_video1" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Collaborate with Assistant on Suggested Next Steps in Notebooks"><source src="images/notebook-next-step-suggestions.mov"></video></div>
<p><strong>What we built:</strong> AI Next Steps uses the Positron Assistant to analyze your current cell output and suggest a logical next step in a “ghost cell” at the bottom of your notebook. If you just loaded a CSV, it might suggest data cleaning steps or a visualization, without you needing to open a chat pane or write a prompt. Suggestions stay aligned with the notebook’s live kernel state, updating as your code and outputs change.</p>
<p><strong>Why this matters</strong>: The design came out of interviews with data scientists who kept telling us the same thing: switching to a chat pane mid-analysis breaks their concentration. AI Next Steps sits at the bottom of your notebook and updates as your outputs change. You just run a cell, and if there’s a logical next step, it surfaces, with no prompt required.</p>
<p><strong>Get started:</strong> Enable the feature by setting <a href="positron://settings/positron.assistant.notebook.ghostCellSuggestions.enabled"><code>positron.assistant.notebook.ghostCellSuggestions.enabled</code></a> to <code>true</code> in your settings. When you run a cell, look for the ghost cell suggestion at the bottom of the notebook, accept, reject, or hide it.</p>
</section>
<section id="agent-skills-in-positron-assistant" class="level3">
<h3 class="anchored" data-anchor-id="agent-skills-in-positron-assistant">Agent Skills in Positron Assistant</h3>
<p><strong>What we built:</strong> Agent skills — reusable, structured capabilities that extend what agents can do in agent.md files — are now integrated into Positron (<a href="https://github.com/posit-dev/positron/issues/11753">#11753</a>). Skills let agents execute multi-step workflows like “profile this dataset and suggest cleaning steps” or “run this test suite and summarize failures,” so you define a task once and reuse it across sessions and projects.</p>
<p><strong>Why this matters:</strong> Skills make agents composable building blocks rather than one-off chat interactions. Instead of re-explaining a complex workflow every time, you codify it as a skill that any team member can use.</p>
<p><strong>Get started:</strong> Open the chat gear icon and select <strong>Skills</strong>, or run <em>Chat: Configure Skills</em> from the Command Palette.</p>
</section>
<section id="positron-assistant-now-supports-microsoft-foundry-as-a-provider" class="level3">
<h3 class="anchored" data-anchor-id="positron-assistant-now-supports-microsoft-foundry-as-a-provider">Positron Assistant Now Supports Microsoft Foundry as a Provider</h3>
<p><strong>What we built:</strong> Positron Assistant now supports Microsoft Foundry as a model provider (<a href="https://github.com/posit-dev/positron/issues/8583">#8583</a>) with API key-based access via a custom base URL.</p>
<p><strong>Why this matters:</strong> If your team runs on Azure and uses LLMs through Foundry, you can now use Positron Assistant with them.</p>
<p><strong>Get Started:</strong> In Positron Assistant’s provider settings, set <a href="positron://settings/positron.assistant.provider.msFoundry.enable"><code>positron.assistant.provider.msFoundry.enable</code></a> to <code>true</code> to select Microsoft Foundry as a provider. You can authenticate with an API key and your Foundry endpoint URL.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/microsoft-foundry.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Configuring Microsoft Foundry in Positron Assistant"><img src="https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/images/microsoft-foundry.png" class="img-fluid figure-img" alt="Configuring Microsoft Foundry in Positron Assistant"></a></p>
<figcaption>Configuring Microsoft Foundry in Positron Assistant</figcaption>
</figure>
</div>
</section>
<section id="telemetry-update-anonymous-session-identifiers" class="level3">
<h3 class="anchored" data-anchor-id="telemetry-update-anonymous-session-identifiers">Telemetry Update: Anonymous Session Identifiers</h3>
<p><strong>What we changed:</strong> Positron now generates an anonymous, random session identifier to help us understand usage patterns like session frequency and retention across releases. This identifier contains no personal information, account data, or workspace content; it’s a cryptographically random UUID that cannot be linked to any other identifiers, including the identifier that VS Code uses for telemetry.</p>
<p><strong>Why we’re doing this:</strong> As a free, source available project, we don’t have traditional product analytics. Understanding whether people come back, how often they use Positron, and whether releases improve or regress the experience helps us prioritize the right work to build a better experience for you.</p>
<p>You can opt out by updating your settings outlined <a href="../../../privacy.html">here</a>, or you can reset the anonymous identifier with the command <em>Preferences: Reset Anonymous Telemetry ID</em>. If you’ve opted out of product updates, no session identifier is generated or sent.</p>
</section>
<section id="rstudio-addins-support" class="level3">
<h3 class="anchored" data-anchor-id="rstudio-addins-support">RStudio Addins Support</h3>
<p><strong>What we built:</strong> Positron now supports running RStudio addins from R packages. If a package registers an addin (like styler, reprex, clipr, or shinyuieditor), you can run it directly from Positron (<a href="https://github.com/posit-dev/positron/issues/1313">#1313</a>).</p>
<p><strong>Why this matters:</strong> This was one of our most upvoted issues this release (25 👍). Many R users rely on addins as part of their daily workflow for code formatting, generating reproducible examples, or launching Shiny tools.</p>
<p><strong>Get started:</strong> Open the Command Palette (<span class="visually-hidden"></span>) and search for <em>Run RStudio Addin</em>. You’ll see a quick pick with all available addins from your installed packages.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/addins-support.png" class="lightbox" data-gallery="quarto-lightbox-gallery-3" title="RStudio Addins running in Positron"><img src="https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/images/addins-support.png" class="img-fluid figure-img" alt="RStudio Addins running in Positron"></a></p>
<figcaption>RStudio Addins running in Positron</figcaption>
</figure>
</div>
</section>
<section id="r-debugger-workflow-improvements" class="level3">
<h3 class="anchored" data-anchor-id="r-debugger-workflow-improvements">R Debugger &amp; Workflow Improvements</h3>
<p><strong>What we built:</strong> The R debugger received a suite of improvements this release. In addition to conditional breakpoints, hit count breakpoints, and log breakpoints (<a href="https://github.com/posit-dev/positron/issues/12360">#12360</a>), the debugger now supports error and warning breakpoints (<a href="https://github.com/posit-dev/positron/issues/11797">#11797</a>), the ability to pause R at any time (<a href="https://github.com/posit-dev/positron/issues/11799">#11799</a>), Watch Pane support (<a href="https://github.com/posit-dev/positron/issues/1765">#1765</a>), and synchronization between the Console and Variables pane with the selected call stack frame (<a href="https://github.com/posit-dev/positron/issues/3078">#3078</a> and <a href="https://github.com/posit-dev/positron/issues/12131">#12131</a>).</p>
<p><strong>Why this matters:</strong> Advanced debugging in R has traditionally meant scattering <code>if (...) browser()</code> calls through your code or setting <code>options(error = recover)</code> by hand. These new features put Positron’s R debugger on par with what you’d expect from any modern language:</p>
<ul>
<li><strong>Conditional, hit count, and log breakpoints</strong> let you control exactly when breakpoints fire and print diagnostic info, all without touching your source code.</li>
<li><strong>Error and warning breakpoints</strong> drop you into the debugger the moment an error or warning is emitted, so you can inspect the state that caused it.</li>
<li><strong>Pause R at any time.</strong> If R is stuck in a long computation or an infinite loop, you can drop into the debugger mid-execution, look around, and resume by clicking <strong>Continue</strong>.</li>
<li><strong>Watch Pane</strong> lets you track expressions across debug steps. Prefix an expression with <code>/print</code> to see R’s printed output (hover to get full output) instead of a structured variable.</li>
<li><strong>Synchronization with the call stack.</strong> Click any frame in the <strong>Call Stack</strong> view and the Console, completions, and Variables pane all switch to that frame’s environment. The Console synchronization is like <code>recover()</code>, but built into the IDE.</li>
</ul>
<p><strong>Get started:</strong> Set a breakpoint in any R file, then right-click it and choose <strong>Edit Breakpoint</strong>. Select “Expression” to add a condition (e.g., <code>i &gt; 100</code>), “Hit Count” to break after N hits, or “Log Message” to print a message without pausing. For error and warning breakpoints, open the <strong>Breakpoints</strong> pane and enable them there. To pause R while code is running, use the command <em>Debug: Pause</em> or check the <strong>Interrupt</strong> breakpoint option in the <strong>Breakpoints</strong> pane. While debugging, add expressions in the <strong>Watch</strong> section of the debug sidebar and click on frames in the <strong>Call Stack</strong> to navigate environments.</p>
<div class="quarto-video"><video id="video_shortcode_videojs_video2" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Set condition breakpoints while debugging with R"><source src="images/conditional-breakpoints.mov"></video></div>
</section>
<section id="data-explorer-faster-with-multiple-dataframes" class="level3">
<h3 class="anchored" data-anchor-id="data-explorer-faster-with-multiple-dataframes">Data Explorer: Faster with Multiple DataFrames</h3>
<p><strong>What we built:</strong> We fixed two long-standing performance issues in the Data Explorer. Background Data Explorer tabs no longer trigger backend recomputation, and the summary panel no longer recalculates summary statistics for large DataFrames on every cell execution (<a href="https://github.com/posit-dev/positron/issues/4279">#4279</a> and <a href="https://github.com/posit-dev/positron/issues/2795">#2795</a>).</p>
<p><strong>Why this matters:</strong> If you work with multiple DataFrames open, you may have noticed lag as Positron recomputed statistics for tabs you weren’t even looking at. That’s gone now.</p>
<p><strong>Get started:</strong> Nothing to configure. When you open multiple DataFrames in the Data Explorer and switch between them, you should notice snappier performance, especially with large datasets.</p>
</section>
<section id="windows-arm-is-generally-available" class="level3">
<h3 class="anchored" data-anchor-id="windows-arm-is-generally-available">Windows ARM Is Generally Available</h3>
<p><strong>What we built:</strong> We started creating experimental builds for Windows ARM several months ago, and our early users have had good experiences with them. This release, we promoted the Windows ARM builds from experimental to stable and they are now available through all standard installation channels (<a href="https://github.com/posit-dev/positron/issues/12207">#12207</a>).</p>
<p><strong>Why this matters:</strong> ARM-based devices are increasingly common for Windows users, whether you’re a student or a professional. GA support means these users get the same Positron experience, including Quarto with R and Python support, without needing workarounds or experimental builds. Do be aware that the Windows ARM build bundles the non-ARM version of Quarto, which runs under emulation.</p>
<p><strong>Get started:</strong> Install Positron on your ARM-based Windows device through <a href="../../../download.html">standard installation channels</a>.</p>
<p>View all issues in the <a href="https://github.com/posit-dev/positron/milestone/36">2026.04.0 Release milestone</a>.</p>
</section>
</section>
<section id="whats-coming-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-coming-next">What’s Coming Next</h2>
<p>We are currently building the following features and we’d love your feedback. Please share on <a href="https://github.com/posit-dev/positron/discussions">GitHub</a>. These early alpha features with some rough edges are available for testing by enabling their respective settings.</p>
<section id="inline-outputs-for-quarto-and-r-markdown-files" class="level3">
<h3 class="anchored" data-anchor-id="inline-outputs-for-quarto-and-r-markdown-files">Inline Outputs for Quarto and R Markdown Files</h3>
<p>This was the second most upvoted issue we have ever, ever had! We just completed an initial run to allow displaying inline outputs within Quarto and R Markdown files (<a href="https://github.com/posit-dev/positron/issues/5640">#5640</a>), and it is available for early testing. Note that this experimental version, while it does get the basics into Positron, does not have support for many popular RStudio features. You can opt in to the experimental feature using the <a href="positron://settings/positron.quarto.inlineOutput.enabled"><code>positron.quarto.inlineOutput.enabled</code></a> setting.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/inline-output.png" class="lightbox" data-gallery="quarto-lightbox-gallery-4" title="Inline outputs rendered in a Quarto file"><img src="https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/images/inline-output.png" class="img-fluid figure-img" alt="Inline outputs rendered in a Quarto file"></a></p>
<figcaption>Inline outputs rendered in a Quarto file</figcaption>
</figure>
</div>
</section>
<section id="packages-pane-for-managing-environments" class="level3">
<h3 class="anchored" data-anchor-id="packages-pane-for-managing-environments">Packages Pane for Managing Environments</h3>
<p>We are currently building out a new Packages pane that will allow you to install, update, and uninstall packages without leaving your workspace or needing to use the terminal (<a href="https://github.com/posit-dev/positron/issues/11214">#11214</a>). We’d love to hear your feedback on this <a href="https://github.com/posit-dev/positron/discussions/12863">discussion thread</a>.</p>
</section>
</section>
<section id="events-and-resources" class="level2">
<h2 class="anchored" data-anchor-id="events-and-resources">Events and Resources</h2>
<section id="explore-positrons-video-walkthroughs-on-youtube" class="level3">
<h3 class="anchored" data-anchor-id="explore-positrons-video-walkthroughs-on-youtube">Explore Positron’s Video Walkthroughs on YouTube</h3>
<p>We hosted a walkthrough of exploring GitHub data in a Jupyter Notebook and converting this into an interactive Shiny app with AI. <a href="https://www.youtube.com/watch?v=qrVkG89ndi8">Catch up on the recording</a> or <a href="https://www.youtube.com/@PositPBC">explore more Positron videos</a>.</p>
</section>
<section id="registration-for-positconf2026-is-now-open" class="level3">
<h3 class="anchored" data-anchor-id="registration-for-positconf2026-is-now-open">Registration for posit::conf(2026) Is Now Open!</h3>
<p>Registration is officially open for posit::conf(2026)! Join the global data community in Houston or tune in online from September 14–16. <a href="https://posit.co/conference/">Register today!</a></p>
</section>
<section id="how-we-chose-a-python-type-checker" class="level3">
<h3 class="anchored" data-anchor-id="how-we-chose-a-python-type-checker">How We Chose a Python Type Checker</h3>
<p>Ever wondered about the decision making process behind how we chose which Python type checker to bundle in Positron? Check out Austin Dickey’s <a href="../2026-03-31-python-type-checkers/">blog post</a> walking through his research and decision making process.</p>
</section>
</section>
<section id="community-affirmations" class="level2">
<h2 class="anchored" data-anchor-id="community-affirmations">Community Affirmations</h2>
<p>Thank you all for your support, ideas and engagement. We’re building Positron in the open because the best ideas come from the people using it. If there’s a feature you’d love to see, <a href="https://github.com/posit-dev/positron/issues">open an issue</a> or upvote an existing one, it genuinely shapes what we work on next.</p>
<p>Have a great April!</p>
<p>Positron Team</p>


</section>

 ]]></description>
  <category>Newsletter</category>
  <category>Release</category>
  <guid>https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/</guid>
  <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://positron.posit.co/blog/posts/2026-04-06-april-newsletter/images/addins-support.png" medium="image" type="image/png" height="103" width="144"/>
</item>
<item>
  <title>Positron Server available for academic use via JupyterHub</title>
  <dc:creator>Isabel Zimmerman</dc:creator>
  <link>https://positron.posit.co/blog/posts/2026-04-03-positron-server-jupyterhub/</link>
  <description><![CDATA[ 




<p>Academic institutions can now offer Positron directly within their existing JupyterHub environments, giving students a robust data science IDE without needing a local install or new infrastructure. With a free teaching license, institutions can provide Positron Server to currently enrolled students for use in coursework. This makes it easy to deliver a consistent, fully featured data science environment to students without requiring local installation or setup.</p>
<p>Students can launch Positron the same way they would open JupyterLab or a notebook. Just select it from the JupyterHub launcher and start working.</p>
<p><a href="images/jupyter-positron.gif" class="lightbox" data-gallery="quarto-lightbox-gallery-1"><img src="https://positron.posit.co/blog/posts/2026-04-03-positron-server-jupyterhub/images/jupyter-positron.gif" class="img-fluid"></a></p>
<p>Once launched, Positron provides the full IDE experience, including:</p>
<ul>
<li>Rich Python and R support</li>
<li>Access to the OpenVSX extension marketplace</li>
<li>Built in data viewer and variables explorer</li>
<li>Integrated help pane, debugger, version control and <a href="../../../features.html">other features</a> to help students level up when they’re ready</li>
</ul>
<section id="how-it-works" class="level2">
<h2 class="anchored" data-anchor-id="how-it-works">How it works</h2>
<p>Positron Server is designed to integrate directly with existing JupyterHub deployments. It’s compatible with JupyterHub environments running JupyterLab 4 and Python 3.9+.</p>
<p>It’s installed via the <a href="https://github.com/posit-dev/jupyter-positron-server"><code>jupyter-positron-server</code> Python package</a>, built on Jupyter Server Proxy. If you’ve configured similar services before, setup will feel familiar. This is not a standalone desktop install. Rather, it lets you bring Positron into an existing JupyterHub setup.</p>
</section>
<section id="who-can-use-it" class="level2">
<h2 class="anchored" data-anchor-id="who-can-use-it">Who can use it?</h2>
<p>This offering is available to academic institutions using Positron for teaching. Under a free license, institutions can provide access to enrolled students, course participants, or staff involved in the delivery or receipt of educational programming.</p>
<p>Full eligibility details are available in the <a href="https://github.com/posit-dev/positron/blob/main/LICENSE.txt">Positron Education License Rider</a>.</p>
</section>
<section id="getting-started" class="level2">
<h2 class="anchored" data-anchor-id="getting-started">Getting started</h2>
<p>Hosting Positron for teaching purposes requires a free license key. To get set up:</p>
<ol type="1">
<li>Review the eligibility criteria in the <a href="https://github.com/posit-dev/positron/blob/main/LICENSE.txt">Positron Education License Rider</a>.</li>
<li>Email <a href="mailto:academic-licenses@posit.co">academic-licenses@posit.co</a> to request a teaching license.</li>
<li>Once your license is confirmed, follow the <a href="https://posit-dev.github.io/jupyter-positron-server/"><code>jupyter-positron-server</code> documentation</a> to complete setup in your JupyterHub environment.</li>
</ol>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Get in touch
</div>
</div>
<div class="callout-body-container callout-body">
<p>Have questions or want to learn more?</p>
<p>Reach out to <a href="mailto:academic-licenses@posit.co">academic-licenses@posit.co</a> and let us know you’re interested in Positron. We’ll help you navigate next steps!</p>
</div>
</div>


</section>

 ]]></description>
  <category>Server</category>
  <guid>https://positron.posit.co/blog/posts/2026-04-03-positron-server-jupyterhub/</guid>
  <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://positron.posit.co/blog/posts/2026-04-03-positron-server-jupyterhub/images/social.png" medium="image" type="image/png" height="73" width="144"/>
</item>
<item>
  <title>How we chose Positron’s Python type checker</title>
  <dc:creator>Austin Dickey</dc:creator>
  <link>https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/</link>
  <description><![CDATA[ 




<p><a href="images/social.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1"><img src="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/social.png" class="img-fluid"></a></p>
<p>The open-source Python type checker and language server ecosystem has exploded. Over the past year or two, four language server extensions have appeared, each with a different take on what Python type checking should look like. We evaluated each of them to decide which one to bundle with Positron to enhance the Python data science experience.</p>
<section id="background" class="level2">
<h2 class="anchored" data-anchor-id="background">Background</h2>
<p>The Language Server Protocol (LSP) is a cross-language, cross-IDE specification that allows different IDE extensions to contribute smart features like tab completions, hover info, and more. The four<sup>1</sup> Python extensions in this post are powered by type checkers, which are Python-specific tools that catch bugs in your code before runtime by guessing and checking the types of your variables. They do this by <em>statically analyzing</em> your code before you run it.</p>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Tip
</div>
</div>
<div class="callout-body-container callout-body">
<p>Positron’s built-in language server uses your running Python session to provide runtime-aware completions and hover previews too! Beyond what’s in code, it knows your DataFrame column names, your dictionary keys, your environment variables, and more. But the tools evaluated in this post handle the <em>static analysis</em> side: type checking, go-to-definition, rename, and code actions. Both run concurrently, and Positron merges their results.</p>
</div>
</div>
<p>With AI tools writing more of your code, a good language server helps you read and navigate code you didn’t write. LLM-generated code also introduces bugs that type checkers catch before you run anything. For data scientists, who rely on code to be the reproducibility layer, and who can’t automate away human judgment, what matters is a tool that helps you understand and trust your code.</p>
<p>We did this evaluation in November 2025 but have refreshed the data in this post at the time of publish.</p>
</section>
<section id="the-contenders" class="level2">
<h2 class="anchored" data-anchor-id="the-contenders">The contenders</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Tool</th>
<th>Backing</th>
<th>Language</th>
<th>License</th>
<th style="text-align: center;">Stars</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="https://github.com/facebook/pyrefly"><strong>Pyrefly</strong></a></td>
<td>Meta</td>
<td>Rust</td>
<td>MIT</td>
<td style="text-align: center;">5.5K</td>
</tr>
<tr class="even">
<td><a href="https://github.com/astral-sh/ty"><strong>ty</strong></a></td>
<td>Astral (OpenAI)</td>
<td>Rust</td>
<td>MIT</td>
<td style="text-align: center;">17.8K</td>
</tr>
<tr class="odd">
<td><a href="https://github.com/detachhead/basedpyright"><strong>Basedpyright</strong></a></td>
<td>Community</td>
<td>TypeScript</td>
<td>MIT</td>
<td style="text-align: center;">3.2K</td>
</tr>
<tr class="even">
<td><a href="https://github.com/zubanls/zuban"><strong>Zuban</strong></a></td>
<td>Indie</td>
<td>Rust</td>
<td>AGPL-3.0</td>
<td style="text-align: center;">1K</td>
</tr>
</tbody>
</table>
<p><strong>Pyrefly</strong> is Meta’s successor to Pyre. It takes a fast, aggressive approach to type inference, being able to catch issues even in code with no type annotations. It reached <a href="https://github.com/facebook/pyrefly/releases/tag/0.42.0">beta status</a> in November 2025.</p>
<p><strong>ty</strong> is from Astral, the team behind uv and ruff. <a href="https://openai.com/index/openai-to-acquire-astral/">OpenAI announced its acquisition of Astral</a> recently; Astral has stated that ty, ruff, and uv will remain open source and MIT-licensed. It’s the newest project, with a focus on speed and tight integration with the Astral toolchain. It reached <a href="https://astral.sh/blog/ty">beta status</a> in December 2025 and follows a “gradual guarantee” philosophy (more on that below).</p>
<p><strong>Basedpyright</strong> is a community fork of Microsoft’s Pyright type checker, with additional type-checking rules and LSP features baked in. It’s the most mature of the four and has the largest contributor base.</p>
<p><strong>Zuban</strong> is from David Halter, the author of Jedi (the longtime Python autocompletion library). It aims for mypy compatibility and ships as a pip-installable tool.</p>
</section>
<section id="what-we-tested" class="level2">
<h2 class="anchored" data-anchor-id="what-we-tested">What we tested</h2>
<p>We tested each language server across several dimensions, roughly following the <a href="https://github.com/posit-dev/positron/issues/10300">rubric we outlined publicly</a>:</p>
<ul>
<li><strong>Feature completeness</strong>: Completions, hover, go-to-definition, rename, code actions, diagnostics, inlay hints, call hierarchy</li>
<li><strong>Correctness</strong>: How well does the type checker handle real-world Python code?</li>
<li><strong>Performance</strong>: Startup time and time to first completion</li>
<li><strong>Ecosystem</strong>: License, community health, development velocity, production readiness</li>
</ul>
<p>We tested inside Positron with a mix of data science and general Python code.</p>
</section>
<section id="feature-completeness" class="level2">
<h2 class="anchored" data-anchor-id="feature-completeness">Feature completeness</h2>
<p>Here are some screenshots of hovers, tab-completions, and diagnostics from each extension:</p>
<div class="tabset-margin-container"></div><div class="panel-tabset">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">Pyrefly</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">ty</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">Basedpyright</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" aria-controls="tabset-1-4" aria-selected="false" href="">Zuban</a></li></ul>
<div class="tab-content">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/pyrefly.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Clean documentation with some extra info; simple completions"><img src="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/pyrefly.png" class="img-fluid figure-img" alt="Clean documentation with some extra info; simple completions"></a></p>
<figcaption>Clean documentation with some extra info; simple completions</figcaption>
</figure>
</div>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/ty.png" class="lightbox" data-gallery="quarto-lightbox-gallery-3" title="Red diagnostic due to invalid syntax; completions have extra info"><img src="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/ty.png" class="img-fluid figure-img" alt="Red diagnostic due to invalid syntax; completions have extra info"></a></p>
<figcaption>Red diagnostic due to invalid syntax; completions have extra info</figcaption>
</figure>
</div>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/basedpyright.png" class="lightbox" data-gallery="quarto-lightbox-gallery-4" title="One-line hover docs; completions for all dunder methods"><img src="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/basedpyright.png" class="img-fluid figure-img" alt="One-line hover docs; completions for all dunder methods"></a></p>
<figcaption>One-line hover docs; completions for all dunder methods</figcaption>
</figure>
</div>
</div>
<div id="tabset-1-4" class="tab-pane" aria-labelledby="tabset-1-4-tab">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="images/zuban.png" class="lightbox" data-gallery="quarto-lightbox-gallery-5" title="Extra hover docs from the class docstring; syntax diagnostic"><img src="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/zuban.png" class="img-fluid figure-img" alt="Extra hover docs from the class docstring; syntax diagnostic"></a></p>
<figcaption>Extra hover docs from the class docstring; syntax diagnostic</figcaption>
</figure>
</div>
</div>
</div>
</div>
<p>All four provide the core features you’d expect: completions, hover documentation, go-to-definition, semantic highlighting, and diagnostics. The differences show up in the details.</p>
<section id="pyrefly-1" class="level3">
<h3 class="anchored" data-anchor-id="pyrefly-1">Pyrefly</h3>
<p>Strong feature set. The hover documentation is the best of the four; <strong>Pyrefly</strong> renders it cleanly and sometimes includes hyperlinks to class definitions.</p>
</section>
<section id="ty-1" class="level3">
<h3 class="anchored" data-anchor-id="ty-1">ty</h3>
<p>Fast and clean, now in beta. The completion details can sometimes feel a little overwhelming, but can help when expanded.</p>
</section>
<section id="basedpyright-1" class="level3">
<h3 class="anchored" data-anchor-id="basedpyright-1">Basedpyright</h3>
<p>Handles type checking comprehensively well. The main friction point: it surfaces a lot of warnings out of the box. If you’re doing exploratory data science, a wall of type errors on your first <code>pandas</code> import can feel hostile. You can tune this down, but the defaults are oriented toward stricter use cases like package development.</p>
</section>
<section id="zuban-1" class="level3">
<h3 class="anchored" data-anchor-id="zuban-1">Zuban</h3>
<p>The least mature of the four so far. Installation requires a two-step process (<code>pip install zuban</code>, then configure the interpreter), and the analysis is tied to that specific Python installation on saved files only. Third-party library completions only work when stubs are available, not from installed packages. Symbol renaming once broke standard library code in our testing.</p>
</section>
</section>
<section id="type-checking-philosophy" class="level2">
<h2 class="anchored" data-anchor-id="type-checking-philosophy">Type checking philosophy</h2>
<p>The bigger difference between these tools isn’t features but how they think about type checking.</p>
<section id="gradual-guarantee-vs.-aggressive-inference" class="level3">
<h3 class="anchored" data-anchor-id="gradual-guarantee-vs.-aggressive-inference">Gradual guarantee vs.&nbsp;aggressive inference</h3>
<p><strong>ty</strong> follows what’s called the <em>gradual guarantee</em>: removing a type annotation from correct code should never introduce a type error. The idea is that type checking should be additive. You opt in by adding types, and the checker only flags things it’s sure about.</p>
<p>The other extensions take the opposite approach. They always infer types from your code, even when you haven’t written any annotations. This means they can catch bugs in completely untyped code, but it also means they may flag code that runs perfectly fine.</p>
<p>For example:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1">my_list <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>]</span>
<span id="cb1-2">my_list.append(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"foo"</span>)</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Pyrefly: bad-argument-type</span></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ty: &lt;no error&gt;</span></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Basedpyright: reportArgumentType</span></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Zuban: arg-type</span></span></code></pre></div></div>
<p><strong>Pyrefly</strong> infers <code>my_list</code> as <code>list[int]</code> and flags the <code>append("foo")</code> call as a type error. <strong>ty</strong> sees no annotations and stays silent. The code is dynamically typed and that’s fine.</p>
<p>If you’re doing exploratory data analysis and don’t want to annotate everything, <strong>ty</strong>’s restraint might be more comfortable. But if you’re writing a library and want to catch bugs early, <strong>Pyrefly</strong>’s aggressiveness is helpful. For example:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> process(data):</span>
<span id="cb2-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(data)</span>
<span id="cb2-3"></span>
<span id="cb2-4">process(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">42</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Raises a runtime AttributeError</span></span>
<span id="cb2-5"></span>
<span id="cb2-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Pyrefly: unsupported-operation</span></span>
<span id="cb2-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ty: &lt;no error&gt;</span></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Basedpyright: reportOperatorIssue</span></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Zuban: operator</span></span></code></pre></div></div>
<p><strong>Basedpyright</strong> and <strong>Zuban</strong> land somewhere in between, with <strong>Basedpyright</strong> leaning toward stricter checking and <strong>Zuban</strong> aiming for mypy compatibility. Each of these extensions has the ability to suppress certain diagnostics you actually see when typing if you wish.</p>
<p>For a deeper dive on this topic, Edward Li’s <a href="https://blog.edward-li.com/tech/comparing-pyrefly-vs-ty/">comparison of <strong>Pyrefly</strong> and <strong>ty</strong></a> and Rob Hand’s <a href="https://sinon.github.io/future-python-type-checkers/">overview of future Python type checkers</a> are both worth reading, though some bugs have been fixed since they were published.</p>
</section>
</section>
<section id="performance" class="level2">
<h2 class="anchored" data-anchor-id="performance">Performance</h2>
<p>We measured startup time (how long until the language server responds to an <code>initialize</code> request) and time to first completion (how long a <code>textDocument/completion</code> request takes after initialization) in a relatively small repository. We ran each measurement five times and averaged. As always, these results only represent our computer’s experimental setup.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 45%">
<col style="width: 27%">
<col style="width: 27%">
</colgroup>
<thead>
<tr class="header">
<th>LSP</th>
<th style="text-align: center;">Avg. startup (s)</th>
<th style="text-align: center;">Avg. first completion (ms)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Pyrefly</strong></td>
<td style="text-align: center;">5.8</td>
<td style="text-align: center;">190</td>
</tr>
<tr class="even">
<td><strong>ty</strong></td>
<td style="text-align: center;">2.2</td>
<td style="text-align: center;">88</td>
</tr>
<tr class="odd">
<td><strong>Basedpyright</strong></td>
<td style="text-align: center;">3.1</td>
<td style="text-align: center;">112</td>
</tr>
<tr class="even">
<td><strong>Zuban</strong></td>
<td style="text-align: center;">N/A<sup>2</sup></td>
<td style="text-align: center;">97</td>
</tr>
</tbody>
</table>
<p><strong>ty</strong> was the fastest across the board. But the practical differences are small: a 3-second difference in startup happens once per session, and a 100ms difference in completions is imperceptible. All four are fast enough that differences are negligible for daily use.</p>
</section>
<section id="ecosystem-health" class="level2">
<h2 class="anchored" data-anchor-id="ecosystem-health">Ecosystem health</h2>
<p>We also looked at each project’s development velocity and community health metrics. A language server you rely on daily needs to keep up with Python’s evolution.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th></th>
<th style="text-align: center;"><strong>Pyrefly</strong></th>
<th style="text-align: center;"><strong>ty</strong></th>
<th style="text-align: center;"><strong>Basedpyright</strong></th>
<th style="text-align: center;"><strong>Zuban</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>GitHub stars</td>
<td style="text-align: center;">5.5K</td>
<td style="text-align: center;">17.8K</td>
<td style="text-align: center;">3.2K</td>
<td style="text-align: center;">1K</td>
</tr>
<tr class="even">
<td>Contributors</td>
<td style="text-align: center;">162</td>
<td style="text-align: center;">186<sup>3</sup></td>
<td style="text-align: center;">82</td>
<td style="text-align: center;">17</td>
</tr>
<tr class="odd">
<td>License</td>
<td style="text-align: center;">MIT</td>
<td style="text-align: center;">MIT</td>
<td style="text-align: center;">MIT</td>
<td style="text-align: center;">AGPL-3.0</td>
</tr>
<tr class="even">
<td>Releases (since Nov 2025)</td>
<td style="text-align: center;">17</td>
<td style="text-align: center;">29</td>
<td style="text-align: center;">10</td>
<td style="text-align: center;">9</td>
</tr>
<tr class="odd">
<td>Release cadence</td>
<td style="text-align: center;">~weekly</td>
<td style="text-align: center;">~twice weekly</td>
<td style="text-align: center;">~biweekly</td>
<td style="text-align: center;">~biweekly</td>
</tr>
<tr class="even">
<td>Issues opened (90 days)</td>
<td style="text-align: center;">540</td>
<td style="text-align: center;">789</td>
<td style="text-align: center;">40</td>
<td style="text-align: center;">125</td>
</tr>
<tr class="odd">
<td>Issues closed (90 days)</td>
<td style="text-align: center;">531</td>
<td style="text-align: center;">712</td>
<td style="text-align: center;">20</td>
<td style="text-align: center;">111</td>
</tr>
</tbody>
</table>
<p><strong>ty</strong> and <strong>Pyrefly</strong> are shipping fast. Both are on a weekly release cadence or higher with high issue throughput. <strong>ty</strong>’s issue volume is notable: 789 issues opened in 90 days reflects both heavy adoption and active bug reporting. <strong>Pyrefly</strong> is closing more issues than it’s opening, a good sign for a beta project.</p>
<p>Response times are quick. In a spot-check of recent issues, <strong>ty</strong> and <strong>Pyrefly</strong> both had first responses from core maintainers within minutes to hours. <strong>Basedpyright</strong>’s maintainer responds quickly too, though at a lower volume. <strong>Zuban</strong>’s maintainer often replies within an hour.</p>
</section>
<section id="what-we-chose" class="level2">
<h2 class="anchored" data-anchor-id="what-we-chose">What we chose</h2>
<p>We bundled <strong>Pyrefly</strong> as Positron’s default Python language server.</p>
<p>The deciding factors:</p>
<ul>
<li><strong>Pyrefly</strong>’s clean design decisions felt like the best fit for Positron. The hover docs are rendered and hyperlinked, with sources for type inference. The type inference catches real bugs without requiring you to annotate everything. While it has the strictest type checking, this is configured to a moderate level by default.</li>
<li>It has active development with strong backing. Meta has committed to making <strong>Pyrefly</strong> genuinely open-source and community-driven, with biweekly office hours and a public Discord. Development velocity is high.</li>
<li>It is MIT licensed, which allows us to bundle it into Positron.</li>
</ul>
<p>It wasn’t a runaway winner. <strong>Basedpyright</strong> is more mature and feature-complete. <strong>ty</strong> has a lot of long-term potential, especially for ruff users and fans of the gradual guarantee, and is closing feature gaps fast. But for the specific use case of “Python data science in an IDE,” <strong>Pyrefly</strong> had the best balance of features, UX, and readiness.</p>
</section>
<section id="how-to-switch" class="level2">
<h2 class="anchored" data-anchor-id="how-to-switch">How to switch</h2>
<p>This space is competitive and moving fast, and you shouldn’t feel locked in. Positron makes it straightforward to switch language servers:</p>
<ol type="1">
<li>Open the <strong>Extensions</strong> view (<span class="visually-hidden"></span>).</li>
<li>Search for and install the language server you want to try (e.g., <code>basedpyright</code>, <code>ty</code>, or <code>zuban</code>).</li>
<li>Disable <strong>Pyrefly</strong>: search for <code>pyrefly</code> in Extensions, click <strong>Disable</strong>.</li>
<li>Reload the window with the command <em>Developer: Reload Window</em>.</li>
</ol>
<p>Or, if you want to keep <strong>Pyrefly</strong> installed but prevent it from auto-activating, you can use the <a href="positron://settings/extensions.allowed"><code>extensions.allowed</code></a> setting:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode json code-with-copy"><code class="sourceCode json"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb3-2">    <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"extensions.allowed"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb3-3">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"meta.pyrefly"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb3-4">        <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"*"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">true</span></span>
<span id="cb3-5">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb3-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next</h2>
<p>We started bundling <strong>Pyrefly</strong> in November and have been quite pleased with the results. It solved some longstanding user-requested issues (like better semantic highlighting) and feels snappier to users than our previous internal solution.</p>
<p><strong>ty</strong> is adding features at an aggressive pace and will likely close its remaining gaps. OpenAI’s acquisition of Astral adds resources but also uncertainty; it’s unclear how it will affect <strong>ty</strong>’s priorities. <strong>Pyrefly</strong> continues to improve its type checking and performance (a recent release noted <a href="https://github.com/facebook/pyrefly/releases/tag/0.57.0">20% faster PyTorch benchmarks</a>). <strong>Basedpyright</strong> tracks upstream Pyright closely and keeps shipping.</p>
<p>Both <strong>ty</strong> and <strong>Pyrefly</strong> have been receptive to PRs that improve the experience for Positron users, which suggests they care about working well across editors, not just VS Code. For example, both contribute hover, completions, and semantic highlighting in the Positron Console.</p>
<p>We’ll keep evaluating as these tools mature! Want to try Positron? <a href="../../../download.html">Download it here</a>.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Another LSP extension is Pylance, which may be familiar to VS Code users, but due to licensing restrictions, Code-OSS forks like Positron cannot use it.↩︎</p></li>
<li id="fn2"><p><strong>Zuban</strong> requires a multi-step manual startup, so we couldn’t measure this automatically.↩︎</p></li>
<li id="fn3"><p>Edit (2026-04-01): A previous version of this post undercounted the number of contributors to <strong>ty</strong>. The updated script to fetch stats lives <a href="https://github.com/posit-dev/positron-website/blob/main/blog/posts/2026-03-31-python-type-checkers/fetch_stats.py">here</a>.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Python</category>
  <guid>https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/</guid>
  <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://positron.posit.co/blog/posts/2026-03-31-python-type-checkers/images/social.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Native Jupyter Notebook Support Has Arrived in Positron</title>
  <dc:creator>Cindy Tong</dc:creator>
  <link>https://positron.posit.co/blog/posts/2026-03-12-notebooks-march-announcement/</link>
  <description><![CDATA[ 




<p>Positron now ships with a native <a href="../../../positron-notebook-editor.html">Jupyter Notebook Editor</a>, a new unified experience we built from the ground up for working with Jupyter notebooks within Positron.</p>
<section id="why-we-built-our-own-notebook-editor" class="level2">
<h2 class="anchored" data-anchor-id="why-we-built-our-own-notebook-editor">Why we built our own notebook editor</h2>
<p>We built the Positron Notebook Editor to treat your .ipynb files as first-class citizens in an IDE tailored specifically for data science workflows.</p>
<p>Up to this point, Positron used the <a href="../../../legacy-notebook-editor.html">legacy Code OSS notebook editor</a> that powers VS Code. While functional, this editor was designed for general-purpose development and not specifically for data science workflows. The tradeoffs show up in small ways that compound over time: limited context for AI assistance, no deep integration with your variables or data, and a user experience that treats <code>.ipynb</code> files as just another file type.</p>
<p>We wanted notebooks to feel like a first-class part of a data science IDE, so we built our own native notebook editor.</p>
<p>If you missed the <a href="https://posit.co/blog/announcing-the-positron-notebook-editor-for-jupyter-notebooks/">original February announcement</a>, that post covers our initial reasoning in more detail.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="../../../images/positron-notebook.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Positron Notebook Editor"><img src="https://positron.posit.co/images/positron-notebook.png" class="img-fluid figure-img" alt="Positron Notebook Editor"></a></p>
<figcaption>Positron Notebook Editor</figcaption>
</figure>
</div>
</section>
<section id="whats-included-out-of-the-box" class="level2">
<h2 class="anchored" data-anchor-id="whats-included-out-of-the-box">What’s included out of the box</h2>
<p>The Positron Notebook Editor brings the core capabilities of Positron directly into your notebook workflow:</p>
<p><strong><a href="../../../variables-pane.html">Variables Pane</a></strong>: Variables update in real time as you run cells. No need to print or inspect manually.</p>
<p><strong><a href="../../../data-explorer.html">Data Explorer</a></strong>: When a cell returns a Pandas or Polars DataFrame, you get an inline data viewer. Open the full Data Explorer to sort, filter, and profile your data. Any filtering or cleaning you do can be converted into code, so your analysis stays reproducible without writing repetitive <code>df.head()</code> or <code>df.describe()</code> calls.</p>
<div class="quarto-video"><video id="video_shortcode_videojs_video1" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Explore, sort and filter your dataframes in an embedded data explorer"><source src="../../../videos/notebook-data-explorer-variables.mp4"></video></div>
<p><strong><a href="../../../assistant.html">AI Assistant</a></strong>: The Assistant has access to your notebook’s full context, including cell states, execution history, and outputs like images and tables. It can suggest edits, reorder cells, and run code with your permission. You can inspect exactly what context it’s using and follow along as it works.</p>
<div class="quarto-video"><video id="video_shortcode_videojs_video2" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Using Positron Assistant to generate AI-powered suggestions and edits in a notebook"><source src="../../../videos/notebook-ai-quick-actions.mp4"></video></div>
<p><strong><a href="../../../help-pane.html">Help Pane</a></strong>: Python and R documentation is available inline, with hyperlinks, without switching to a browser.</p>
<div class="quarto-video"><video id="video_shortcode_videojs_video3" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Access Python and R documentation inline in the Help pane without switching to a browser"><source src="../../../videos/notebook-help.mp4"></video></div>
<p><strong><a href="../../../publish-to-connect.html">Publisher</a></strong>: Deploy your <code>.ipynb</code> notebooks directly to Connect or Connect Cloud, where you can manage access, schedule runs, and view telemetry.</p>
<div class="quarto-video"><video id="video_shortcode_videojs_video4" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Publish and share your notebook"><source src="../../../videos/notebook-publish-connect.mp4"></video></div>
</section>
<section id="a-sample-notebook-workflow" class="level2">
<h2 class="anchored" data-anchor-id="a-sample-notebook-workflow">A sample notebook workflow</h2>
<p>Now that you have all these capabilities in one place, your workflow might look something like this:</p>
<ol type="1">
<li>Import your data using Pandas or Polars.</li>
<li>Run your notebook cells and watch variables update in the pane as cells run.</li>
<li>Explore your DataFrame in the inline Data Explorer. Sort and filter without writing any code.</li>
<li>Use Assistant to generate a visualization based on your filtered data or AI quick actions to recommend next steps.</li>
<li>When the analysis is ready to share, use an AI action to add markdown headers and notes.</li>
<li>Publish the notebook to Connect or Connect Cloud to share with your colleagues.</li>
</ol>
</section>
<section id="whats-coming-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-coming-next">What’s coming next</h2>
<p>The roadmap includes SQL support, improved version control, R improvements, and more. You can view and vote on items in the <a href="https://github.com/posit-dev/positron/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22area%3A%20notebooks-jupyter%22">GitHub roadmap</a>.</p>
</section>
<section id="get-started-with-the-alpha" class="level2">
<h2 class="anchored" data-anchor-id="get-started-with-the-alpha">Get started with the alpha</h2>
<ol type="1">
<li><a href="../../../download">Download Positron</a> and install a release from February 2026 or later.</li>
<li>Enable the alpha by setting <a href="positron://settings/positron.notebook.enabled"><code>positron.notebook.enabled</code></a> to <code>true</code> in your settings.</li>
<li>Try the <a href="https://github.com/posit-dev/positron-demos-notebooks">tutorial repository</a> for examples that use the new features.</li>
<li>Share feedback in <a href="https://github.com/posit-dev/positron/discussions">GitHub Discussions</a> or <a href="https://scheduler.zoom.us/cindy-tong/improving-the-positron-notebook-experience">book time to talk with us directly</a>.</li>
</ol>
<p>We’re excited to hear how you use the Positron Notebook Editor as we continuously improve the experience.</p>


</section>

 ]]></description>
  <category>Jupyter</category>
  <category>Notebooks</category>
  <guid>https://positron.posit.co/blog/posts/2026-03-12-notebooks-march-announcement/</guid>
  <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://positron.posit.co/images/positron-notebook.png" medium="image" type="image/png" height="95" width="144"/>
</item>
<item>
  <title>Outgrowing your laptop with R and Positron</title>
  <dc:creator>Julia Silge</dc:creator>
  <link>https://positron.posit.co/blog/posts/2026-03-05-outgrow-your-laptop/</link>
  <description><![CDATA[ 




<section id="my-data-is-too-big-for-my-laptop" class="level2">
<h2 class="anchored" data-anchor-id="my-data-is-too-big-for-my-laptop">My data is too big for my laptop!</h2>
<p>Last week, I had the pleasure of giving a talk to <a href="https://www.meetup.com/rladies-abuja/">R-Ladies Abuja</a> about how Positron can grow with you as you work on data that is too large for your laptop. The talk was recorded, and you can find it on YouTube here:</p>
<div class="quarto-video ratio ratio-16x9"><iframe data-external="1" src="https://www.youtube.com/embed/sPZsH0eaUpQ" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p>I opened this talk discussing how I first learned about these “beyond your laptop” technologies, typically in a organization where these technologies were already in use and seemed specific to infrastructure there. I later came to understand that these technologies are actually related to each other and understanding one can really help when you need to pick up another one. I pointed out some of the Positron features that are designed to make it easier to work with these technologies:</p>
<ul>
<li><a href="../../../data-explorer.html">Data Explorer</a></li>
<li><a href="../../../connections-pane.html">Connections Pane</a></li>
<li><a href="../../../remote-ssh.html">Remote SSH sessions</a></li>
</ul>
</section>
<section id="check-out-my-slides" class="level2">
<h2 class="anchored" data-anchor-id="check-out-my-slides">Check out my slides</h2>
<p>If you’d like to check out my slides, they are <a href="https://juliasilge.github.io/rladies-abuja/">available as well</a>:</p>
<iframe src="https://juliasilge.github.io/rladies-abuja/" width="100%" style="aspect-ratio: 16/9; border: none;">
</iframe>


</section>

 ]]></description>
  <category>R</category>
  <category>Talks</category>
  <guid>https://positron.posit.co/blog/posts/2026-03-05-outgrow-your-laptop/</guid>
  <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://img.youtube.com/vi/sPZsH0eaUpQ/hqdefault.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
