<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Jugmac00 on Launchpad Blog</title>
    <link>https://blog.launchpad.net/authors/jugmac00/</link>
    <description>News and updates from the Launchpad team</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 19 Oct 2026 20:40:02 +0000</lastBuildDate>
    <atom:link href="https://blog.launchpad.net/feed/authors/jugmac00/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Protect your Launchpad API tokens with a security key</title>
      <link>https://blog.launchpad.net/general/protect-your-launchpad-api-tokens-with-a-security-key/</link>
      <pubDate>Mon, 19 Oct 2026 20:40:02 +0000</pubDate>
      <dc:creator>Jürgen Gmach</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4608</guid>
      <description>&lt;p&gt;Supply-chain attacks that harvest developer credentials are on the rise. The &lt;a href=&#34;https://unit42.paloaltonetworks.com/npm-supply-chain-attack/&#34;&gt;Shai-Hulud&lt;/a&gt; campaign, for example, used automated scanners to sweep up any secrets they could find in files and keyrings. If you use Launchpad&amp;rsquo;s API, one of those secrets is your API token – and until now it has been about as safe as the laptop it sits on.&lt;/p&gt;
&lt;p&gt;Launchpad now supports &lt;strong&gt;hardware-bound API tokens&lt;/strong&gt;: you can tie your API access to a USB FIDO2 security key, such as a YubiKey, so that a stolen token is useless to an attacker who does not have your physical key.&lt;/p&gt;
&lt;h2 id=&#34;the-problem&#34;&gt;The problem&lt;/h2&gt;
&lt;p&gt;Tools like lp-shell and ubuntu-archive-tools use the launchpadlib library to talk to Launchpad. After you log in, launchpadlib stores your OAuth token – either as a plaintext file on disk or in your desktop keyring. The keyring is unlocked when you log in to your session, so to anything running as you, or to malware that can read your files, that token is effectively plaintext.&lt;/p&gt;
&lt;p&gt;For most people that is an acceptable risk. For core developers, stable release update team members, archive administrators, and Launchpad developers who run a lot of unaudited code, it is a tempting target.&lt;/p&gt;
&lt;h2 id=&#34;the-idea&#34;&gt;The idea&lt;/h2&gt;
&lt;p&gt;Hardware-bound API tokens change what gets stored. Instead of a usable token, launchpadlib stores a long-lived OAuth &lt;strong&gt;refresh grant&lt;/strong&gt; that is useless on its own. To do anything with it, launchpadlib has to ask your security key to sign a challenge from Launchpad, which mints a &lt;strong&gt;short-lived access token&lt;/strong&gt; for the actual API calls.&lt;/p&gt;
&lt;p&gt;The stored grant cannot mint a token without the key. So if an attacker copies your grant, they get nothing – the signing happens on a device they do not have.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Once you have registered a key and issued a grant, logging in looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;launchpadlib loads your stored refresh grant.&lt;/li&gt;
&lt;li&gt;It asks Launchpad for a challenge.&lt;/li&gt;
&lt;li&gt;Your security key signs the challenge (you touch the key, and enter its PIN if it has one).&lt;/li&gt;
&lt;li&gt;Launchpad verifies the signature against your registered key and returns a short-lived access token.&lt;/li&gt;
&lt;li&gt;launchpadlib uses that token for API calls until it is close to expiry, then you need to touch your hardware key to renew.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The signing step is a standard WebAuthn assertion – the same mechanism browsers use for passkeys – so it builds on a well-tested security model.&lt;/p&gt;
&lt;h2 id=&#34;keeping-it-usable&#34;&gt;Keeping it usable&lt;/h2&gt;
&lt;p&gt;Security that gets in the way does not get used, so the design keeps everyday work smooth:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A minted access token is reused until it is nearly expired, so you are not touching your key on every command.&lt;/li&gt;
&lt;li&gt;Long-running scripts keep working; the token is renewed as needed.&lt;/li&gt;
&lt;li&gt;The grant is stored in your keyring by default, or in a file you control if you prefer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-it-protects--and-what-it-doesnt&#34;&gt;What it protects – and what it doesn&amp;rsquo;t&lt;/h2&gt;
&lt;p&gt;Being honest about the boundaries matters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opportunistic theft&lt;/strong&gt; of stored credentials – the main thing this defends against. A scanner that grabs your grant gets something it cannot use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Targeted attacks on your user session&lt;/strong&gt; – if an attacker can already run code as you, they could still capture a freshly minted access token. Reducing that exposure is future work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Root-level compromise&lt;/strong&gt; – out of scope. If an attacker owns the machine, no client-side measure fully protects you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is also specifically about &lt;strong&gt;programmatic access through launchpadlib&lt;/strong&gt;, not logging in to the Launchpad website, and it is not intended for automation or bot accounts.&lt;/p&gt;
&lt;h2 id=&#34;try-it&#34;&gt;Try it&lt;/h2&gt;
&lt;p&gt;You will need a USB FIDO2 security key and launchpadlib with the fido2 extra:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install &amp;#39;launchpadlib[fido2]&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then register your key, issue a grant, and log in with it. The step-by-step instructions are in the Launchpad documentation&amp;rsquo;s how-to, &lt;a href=&#34;https://ubuntu.com/docs/launchpad/user/how-to/launchpadlib/use-hardware-bound-api-tokens/&#34;&gt;&lt;em&gt;Use hardware-bound API tokens&lt;/em&gt;&lt;/a&gt;, with the design and protocol covered in the developer docs.&lt;/p&gt;
&lt;p&gt;We would love your feedback as you start using it! &lt;a href=&#34;mailto:feedback@launchpad.net&#34;&gt;feedback@launchpad.net&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Phasing out Bazaar code hosting</title>
      <link>https://blog.launchpad.net/general/phasing-out-bazaar-code-hosting/</link>
      <pubDate>Fri, 06 Jun 2025 09:26:22 +0000</pubDate>
      <dc:creator>Jürgen Gmach</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4464</guid>
      <description>&lt;h2 id=&#34;what-is-bazaar-code-hosting&#34;&gt;What is Bazaar code hosting?&lt;/h2&gt;
&lt;p&gt;Bazaar is a distributed revision control system, originally developed by Canonical. It provides similar functionality compared to the now dominant Git.&lt;/p&gt;
&lt;p&gt;Bazaar code hosting is an offering from Launchpad to both provide a Bazaar backend for hosting code, but also a web frontend for browsing the code. The frontend is provided by the Loggerhead application on Launchpad.&lt;/p&gt;
&lt;h2 id=&#34;sunsetting-bazaar&#34;&gt;Sunsetting Bazaar&lt;/h2&gt;
&lt;p&gt;Bazaar passed its peak a decade ago. &lt;a href=&#34;https://launchpad.net/brz&#34;&gt;Breezy&lt;/a&gt; is a fork of Bazaar that has kept a form of Bazaar alive, but the last release of Bazaar was in 2016. Since then the impact has declined, and there are modern replacements like Git.&lt;/p&gt;
&lt;p&gt;Just keeping Bazaar running requires a non-trivial amount of development, operations time, and infrastructure resources - all of which could be better used elsewhere.&lt;/p&gt;
&lt;p&gt;Launchpad will now begin the process of discontinuing support for Bazaar.&lt;/p&gt;
&lt;h2 id=&#34;timelines&#34;&gt;Timelines&lt;/h2&gt;
&lt;p&gt;We are aware that the migration of the repositories and updating workflows will take some time, that is why we planned sunsetting in two phases.&lt;/p&gt;
&lt;h3 id=&#34;phase-1&#34;&gt;Phase 1&lt;/h3&gt;
&lt;p&gt;Loggerhead, the web frontend, which is used to browse the code in a web browser, will be shut down imminently. Analyzing access logs showed that there are hardly any more requests from legit users, but almost the entire traffic comes from scrapers and other abusers. Sunsetting Loggerhead will not affect the ability to pull, push and merge changes.&lt;/p&gt;
&lt;h3 id=&#34;phase-2&#34;&gt;Phase 2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Updated timeline&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From December 11th, 2025 (was September 1st in the first announcement), we do not intend to have Bazaar, the code hosting backend, any more. Users need to migrate all repositories from Bazaar to Git between now and this deadline.&lt;/p&gt;
&lt;h2 id=&#34;migration-paths&#34;&gt;Migration paths&lt;/h2&gt;
&lt;p&gt;The following blog post describes all the necessary steps on how to convert a Bazaar repository hosted on Launchpad to Git.&lt;/p&gt;
&lt;h3 id=&#34;migrate-a-repository-from-bazaar-to-git&#34;&gt;&lt;a href=&#34;https://jugmac00.github.io/blog/migrate-a-repository-from-bazaar-to-git/&#34;&gt;Migrate a Repository From Bazaar to Git&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;call-for-action&#34;&gt;Call for action&lt;/h2&gt;
&lt;p&gt;Our users are extremely important to us. Ubuntu, for instance, has a long history of Bazaar usage, and we will need to work with the Ubuntu Engineering team to find ways to move forward to remove the reliance on the integration with Bazaar for the development of Ubuntu. If you are also using Bazaar and you have a special use case, or you do not see a clear way forward, please reach out to us to discuss your use case and how we can help you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can reach us in #launchpad:&lt;a href=&#34;http://ubuntu.com/&#34;&gt;ubuntu.com&lt;/a&gt; on Matrix, or submit a &lt;a href=&#34;https://answers.launchpad.net/launchpad&#34;&gt;question&lt;/a&gt; or send us an e-mail via &lt;a href=&#34;mailto:feedback@launchpad.net&#34;&gt;feedback@launchpad.net&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is also recommended to join the ongoing discussion at &lt;a href=&#34;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189&#34;&gt;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sunsetting Launchpad&#39;s mailing lists</title>
      <link>https://blog.launchpad.net/general/sunsetting-launchpads-mailing-lists/</link>
      <pubDate>Thu, 22 May 2025 17:42:38 +0000</pubDate>
      <dc:creator>Jürgen Gmach</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4460</guid>
      <description>&lt;h2 id=&#34;what-are-launchpads-mailing-lists&#34;&gt;What are Launchpad&amp;rsquo;s mailing lists?&lt;/h2&gt;
&lt;p&gt;Launchpad&amp;rsquo;s mailing lists are team-based mailing lists, which means that each team can have one of them. E-mails from Launchpad&amp;rsquo;s mailing lists contain &lt;code&gt;lists.launchpad.net &lt;/code&gt; in their address.&lt;/p&gt;
&lt;p&gt;For more information on the topic please see &lt;a href=&#34;https://documentation.ubuntu.com/launchpad/user/explanation/launchpad-mailing-lists/&#34;&gt;https://documentation.ubuntu.com/launchpad/user/explanation/launchpad-mailing-lists/&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-are-they-not&#34;&gt;What are they not?&lt;/h2&gt;
&lt;p&gt;Please note that both &lt;a href=&#34;http://lists.canonical.com&#34;&gt;lists.canonical.com&lt;/a&gt; and &lt;a href=&#34;http://lists.ubuntu.com&#34;&gt;lists.ubuntu.com&lt;/a&gt; are not managed by Launchpad, but by Canonical Information Systems.&lt;/p&gt;
&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;
&lt;p&gt;Launchpad will no longer offer mailing lists as of the end of October 2025, which aligns with the end of the 25.10 cycle.&lt;/p&gt;
&lt;h2 id=&#34;migration-paths&#34;&gt;Migration paths&lt;/h2&gt;
&lt;p&gt;Depending on your use case, there are different alternatives available.&lt;/p&gt;
&lt;p&gt;For a couple of years now, discourse has become a viable alternative for most scenarios. Launchpad also offers the &lt;a href=&#34;https://help.launchpad.net/Answers&#34;&gt;Answers feature&lt;/a&gt; for discussions. If it is not so much about communication, but more about receiving information, e.g. for updates on a bug report, you should be aware that you can also subscribe teams to bugs.&lt;/p&gt;
&lt;h2 id=&#34;call-for-action&#34;&gt;Call for action&lt;/h2&gt;
&lt;p&gt;We are aware that your use case may be very different from the above listed ones. If you are using Launchpad&amp;rsquo;s mailing lists today and you do not see a clear way forward, please reach out to us to discuss your use case and how we can help you.&lt;/p&gt;
&lt;p&gt;Please contact us on Matrix (#launchpad:&lt;a href=&#34;http://ubuntu.com&#34;&gt;ubuntu.com&lt;/a&gt;) or drop as a message via feedback@launchpad.net.&lt;/p&gt;
&lt;p&gt;Please note that this is still work in progress, and we will provide more information over the upcoming weeks and months.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Make your first open source contribution</title>
      <link>https://blog.launchpad.net/general/make-your-first-open-source-contribution/</link>
      <pubDate>Tue, 29 Apr 2025 15:00:22 +0000</pubDate>
      <dc:creator>Jürgen Gmach</dc:creator>
      <guid isPermaLink="false">https://blog.launchpad.net/?p=4453</guid>
      <description>&lt;h2 id=&#34;launchpad-and-the-open-documentation-academy-live-in-málaga&#34;&gt;Launchpad and the Open Documentation Academy Live in Málaga&lt;/h2&gt;
&lt;p&gt;Launchpad is a web-based platform to support collaborative software development for open source projects. It offers a comprehensive suite of tools including bug tracking, code hosting , translation management, and package building&lt;/p&gt;
&lt;p&gt;Launchpad is tightly integrated with the Ubuntu ecosystem, serving as a central hub for Ubuntu development and community contributions. Its features are designed to streamline the process of managing, developing, and distributing software in a collaborative environment.&lt;/p&gt;
&lt;p&gt;Launchpad aims to foster strong community engagement by providing features that support collaboration, community management, and user participation, positioning itself as a central hub for open source communities.&lt;/p&gt;
&lt;p&gt;Canonical&amp;rsquo;s &lt;a href=&#34;https://documentationacademy.org/&#34;&gt;Open Documentation Academy&lt;/a&gt; is a collaboration between Canonical&amp;rsquo;s documentation team and open source newcomers, experts, and those in-between, to help us all improve documentation, become better writers, and better open source contributors.&lt;/p&gt;
&lt;p&gt;A key aim of the project is to set the standard for inclusive and welcoming collaboration while providing real value for both the contributors and the projects involved in the programme.&lt;/p&gt;
&lt;h2 id=&#34;join-us-at-opensouthcode-in-málaga&#34;&gt;Join us at OpenSouthCode in Málaga&lt;/h2&gt;
&lt;p&gt;Launchpad and the Open Documentation Academy will join forces at &lt;a href=&#34;https://www.opensouthcode.org/conferences/opensouthcode2025&#34;&gt;OpenSouthCode 2025&lt;/a&gt; in the wonderful city of Málaga, Spain, on June 20 - 21 2025.&lt;/p&gt;
&lt;p&gt;The Open Documentation Academy will have a hands-on documentation workshop at the conference, where the participants will learn how to do meaningful open source contributions with the help of the &lt;a href=&#34;https://diataxis.fr/&#34;&gt;Diátaxis&lt;/a&gt; documentation framework.&lt;/p&gt;
&lt;p&gt;Launchpad&amp;rsquo;s &lt;a href=&#34;https://jugmac00.github.io/&#34;&gt;Jürgen Gmach&lt;/a&gt; will be on-site and help you to land your first open source contribution.&lt;/p&gt;
&lt;p&gt;Please register at &lt;a href=&#34;https://www.opensouthcode.org/conferences/opensouthcode2025&#34;&gt;https://www.opensouthcode.org/conferences/opensouthcode2025&lt;/a&gt; - the conference and the workshop are free of charge. If you have any questions, please do not hesitate to reach out to us at &lt;a href=&#34;mailto:feedback@launchpad.net&#34;&gt;feedback@launchpad.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tenemos muchas ganas de conoceros. ¡Nos vemos en Málaga!&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
