Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Djangocon EU: a practical guide to agentic coding for Django developers - Marlene Mhangami
(One of my summaries of the 2026 Djangocon EU in Athens). You could get code completion in your IDE for a while. Since about two years, you can generate code with an LLM by describing what you want and copy/pasting the results into your program. Nowadays you can do agentic coding. You give an AI agent access to your environment so that it can actually create the files (including a file with tests) on its own. A definition: an AI agent is an LLM (large language model) that calls tools in a loop to achieve a goal. You start with a "prompt", the agent starts its loop and after a while it is done. In the mean time you can interrupt/steer or give more "context". Within the loop, three things happen: Gather context. A "context" is something the LLM can use to gather information. You can attach a github issue, for instance. Or you attach files. Tell it "follow the conventions in this file. Instruction files also help: copilot-instructions.md, agents.md. There's something called "context engineering". If your AI agent starts to remember too much context, it starts to be less effective. So cleaning up old parts of the context might … -
Djangocon EU: digitising historical caving data with Python and Django - Andrew Northall
(One of my summaries of the 2026 Djangocon EU in Athens). Andrew's hobby is caving: exploring wild cave systems. It is a niche hobby, but he likes it a lot. One of the nicest thinks is that you can be the first human being standing in a specific spot on earth. Cavers achieve high standards, without formal organisation. Sounds like Django :-) With Django, we have exposure and visibility and bug trackers: we're transparent. So our high standards are verifiable. Would the same be possible for caving? The safety record is real good, but the public image is bad. Can the safety record be made more visible? There's an (American) organisation that has historical incident reports. But... mostly in printed text. Image recognition was hard. And something like "fall 1985" isn't really a Postgres data format. Several volunteers put a lot of work in it by manually entering incidents in a Django website that Andrew build. It was slow going. Nowadays they have an LLM pipeline for it that is actually really good. Extraction: docling. Splitting into separate incidents: LLM. Formatting/structuring/checking: LLM. Normalisation: mostly with the help of Django. Docling (https://github.com/docling-project/docling) is a great project for extracting usable text data … -
Djangocon EU: beyond print() debugging: observability for Django apps - Laís Carvalho
(One of my summaries of the 2026 Djangocon EU in Athens). OpenTelemetry (or OTel) is an open source vendor-neutral way of observering your app. There are lots of vendors, open source projects, language support, integrations. What is observability? Understanding the inner works of a system from the outside. So: "why is this happening?". For observability you need proper instrumentation. It is all about "signals" (or symptoms) and "causes". There are three pillars of observability: Logs. A log message is normally a datetime, a level and a message. If you have a logfile, it can be hard to group the individual log messages that belong together: everything is in one long undifferentiated list. Traces are more elaborate. Log items now have start/end datetimes and they can be nested. Metrics. A collection of datapoints at intervals. When stored with timestamps, it becomes a timeseries. For instance a timeseries with the duration of all the web requests. Monitoring and observability according to her definition: monitoring is what is happening, observability is about what happened. Signals and causes. A signal might be "my website is showing lots of Error 500's", a cause might be "my database is down". When in doubt about your system … -
Djangocon EU: role-based access control in Django - how we forked Guardian - Gergő Simonyi
(One of my summaries of the 2026 Djangocon EU in Athens). He works for authentik (an "open-core, self-hosted identity provider"). Note: in the talk he'll mix "access control" and "authorization". In Django, every model gets some basic permissions for CRUD named after the app and the model. You can ask a user object if it has a certain permission. That method, behind the scenes, will ask all authentication backends with backend.has_perm(self, perm, obj). The default will check whether the user has the permission or if the user belongs to a group that has the permission. So that's quite a query. The backends are queried in turn. If a backend doesn't know if a user has a permission, it can just return None, the next backend will then be checked. If the backend knows the user has no access, it raises PermissionDenied. The backends have methods like .has_perm(self, perm, obj), but "obj" isn't normally called, it is None by default. But you can implement it if you want object permissions. Django-guardian is an implementation of object permissions for Django by providing an extra authentication backend: ObjectPermissionBackend. user.has_perm("change_book") asks if the user has the permission to change all books. user.has_perm("change_book", obj=my_book) asks … -
Djangocon EU: is it time for a Django admin rewrite? If so, how? - Emma Delescolle
(One of my summaries of the 2026 Djangocon EU in Athens). One of Django's "batteries included" batteries is the admin interface. It is great. With a few lines you get Full CRUD, plus filtering, searching and pagination. But it isn't perfect: Want drag/drop ordering? Nested inlines? An extra button next to "edit" and "delete"? Form layout with columns? change_list_view and change_form_view are hard to extend. Better translation support? (There are plug-ins for most of the individual issues.) The admin actually predates most of the rest of Django. It has stagnated even though Django got many new features. The admin is a separate framework within django. Lots of patterns from regular Django views don't apply. You're missing musle memory when working on the admin. The community knows there's a problem. 30% of new proposed fixes are for the admin. There's discussion about a new UI. And there's issue #70 that proposes a change. The community has also been trying: django-admin2. Abandoned at the moment. Grapelli/Jet. Mostly better skins and extensions on top of the regular admin. Wagtail. It is actually a CMS, but people are using its admin interface for Django itself. drf-schema-adapter. Her own attempt via django restframework and a … -
Djangocon EU: Django task workers in subinterpreters - Melhin Ahammad
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: Django task workers in subinterpreters: single-server Django applications without process overhead. He was inspired to tinker with subprocessors by Antony Shaw`s pycon talk You normally use a wsgi runner like gunicorn to run your django app. There's also daphne, uvicorn and hypercorn: those also support asgi. If you have tasks, you might use celery , RQ or django-Q (or django-tasks). Instead of a single gunicorn, you then have a broker, a worker and a web server: all deployed separately. He's a fan of the fediverse and wanted to run his own server, but he just wanted one program, not three. You need python 3.14 to actually try some of the stuff he talks about. And you need to have some longer-running tasks in Django. Python 3.14 allows you to run multiple python interpreters in one process. You have separate imports, builtins and separate namespaces per interpreter: isolation. There's even IPC (inter process communication) via memory. Objects are copied. Subinterpreters handle the GIL by each having their own. Django: preferably 6.0 as you can then use the new Django task framework. Combining it, you'd use a subinterpreter for … -
Djangocon EU: when SaaS is not allowed: shipping Django as a desktop app - Jochen Wersdörfer
(One of my summaries of the 2026 Djangocon EU in Athens). He works on "steel-IQ", an open source modelling platform for steel decarbonisation. They knew that they couldn't run it as a web app because of strict security requirements at the end users. So they thought about distributing it as a Python library or as jupyter notebooks. But the users would probably mess it up, so an installable UI was needed. Perhaps we can do it with django? The first working version was easier than expected. They used "Electron" to get an installable app that showed a web interface. You'd start django inside the process, wait until it responded and then show the web interface as usual. So: electron + django + sqlite. The actual Steel-IQ app is full of steel terminology. Not everyone has a blast furnace in the back yard, so he created a sample project that's simpler: https://github.com/ephes/desktop-django-starter The components: Electron: main.js nodejs program. Django server. BrowserWindow: a chromium renderer, this is what the user sees. Django workers: for the background simulation work. Shared data layer: sqlite + filesystem. The sqlite database is also used by the DatabaseBackend of django-tasks. This means you can run background tasks … -
Djangocon EU: lightning talks (day 2)
(One of my summaries of the 2026 Djangocon EU in Athens). Developing Django's community - Andy Miller Andy likes these conferences. But getting here and attending costs at least €1000. So conferences are limited to those that can afford it. The new online community working group that wants to improve the online possibilities of gathering, as those are available to everyone. Perhaps new virtual social events. Better feeds of what's happening in the community. So: improve the community for everyone. More info: https://github.com/django/online-community-working-group To JWT or not to JWT - Benedikt JSON web tokens are not a one-size-fits-all solution. JWT is a bas64 encoded string with three parts: header, payload, signature. Marketed as stateless, but revocation always adds state. Why would you want to use it? Well, third-party identity providers often give you one. And: you can save database queries by embedding info in the token. And you can use it for offline mode in mobile or desktop apps. But there are drawbacks. Some reasons for using something else: JWTs are immutable, data remains valid until expiration even when the data changes server-side. Stateless revocation is impossible. Logout-from-all-devices requires tracking state, defeating the process. JWT if your provider uses them. … -
Djangocon EU: advanced ORM kung-fu - Mathias Wedeken
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: advanced ORM kung-fu for on-demand filtering, sorting, and summing 40 million financial transactions. He's working on a property management platform (so: buildings, rent payments, extra costs, maintenance, grouping per housing complex, etc). 300000 users. 472000 financial accounts. 40 million transactions. Users expect real-time filtering, sorting and summing. But originally his website often had "please wait for 10 seconds" spinners. This should be improved. A colleague told him that the database ought to be able to handle everything just fine. So the goal was to fully leverage postgresql through Django's ORM without writing raw SQL. Some things he discovered: Annotations are composable. Almost functional programming. Func(template=...) to drop custom SQL expressions into the ORM. You can use them to group items in a custom way, for instance. In JSONB, you can use __0 to grab the first element of a list. Use that before using raw SQL. Materialized views (note: use "managed=False") means you have pre-computed data available, usable just like a model. You do have to handle those views (create, refresh) yourself, though. Coalesce is something he mentioned and it looked useful, but I have to check … -
Django Tasks - Jake Howard
🔗 Links django-tasks and Jake's GitHub Jake's personal website DSF Member of the Month - Jake Howard DjangoCon Europe 2024: Empowering Django with Background Workers Django Forum - Steering Council Vote on Background Tasks PyCon UK 2025 Talk: Halt and Catch Fire: Forcefully Stopping Python Wagtail new security announcements channel Django new features repo Carlton’s Talk at PyTV on Mantle 📦 Projects microgpt Django-Mantle Django-Mantle-DRF 📚 Books The Passage by Justin Cronin Solar Power Finance Without the Jargon by Jenny Chase Designing Data Intensive Applications by Martin Kleppmann 🎥 YouTube YouTube 🤝 Sponsor This episode was brought to you by Buttondown, the easiest way to start, send, and grow your email newsletter. New customers can save 50% off their first year with Buttondown using the coupon code DJANGO. -
Djangocon EU: static islands, dynamic sea - Carlton Gibson
(One of my summaries of the 2026 Djangocon EU in Athens). PEP 484, about type hints: Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, not even by convention. Well, that last part seems to be be a bit more nuanced nowadays. Dynamic sea Django does not have type hints. Django predates type hints. But as Django and as a Django add-on author, you encounter lots of pressure to "just" add it. What about the "not even by by convention"? Django has 20+ years of keeping the dynamic stuff in check. Experience in validating, in cleaning inputs. And it uses conventions: everyone knows that a view takes a request and everyone knows what it does. According to Django's design philosophies: Django should take full advantage of Python's dynamic capabilities. It should reduce boilerplate, by using Python's dynamic possibilities to its advantage. Conventions are handy and can be build into editors. But the editor's work is made easier with type hints: you now have three LSP, language servers, that can use the type hints to give you feedback. Hence the popularity. But is it still powerful, dynamic Python when we enforce … -
Djangocon EU: Oh, I found a security issue - Markus Holtermann
(One of my summaries of the 2026 Djangocon EU in Athens). Markus is member of the Django security team. The important document is https://docs.djangoproject.com/en/dev/internals/security/ , how to report security issues, how the security team will evaluate it, which versions will include a fix (if needed) and how it gets disclosed. If you think you found an issue? Mail it to security@djangoproject.com. Don't start off writing lots of text, just provide a brief description and how to reproduce it. A fix is even better. And: don't report issues that are corner cases that go against normal web development and regular Django practice. If you take unfiltered, unvalidated user input and manage to do code injection: well, don't do that :-) The security team triages the issue. If it is valid, they try to fix it. And if there's a fix, they check it with the original reporter. Such development doesn't happen in public, of course. If there's a fix, they assign the issue a CVE number. Since last year, the Django project is its own (and only) CVE assigner. And they prepare the various Django version releases beforehand. Then the problem + the releases with the fixes are announced. Mailinglist, news … -
Djangocon EU: ATLAS, case study of Django in the public sector - Georgios Poulos
(One of my summaries of the 2026 Djangocon EU in Athens). Full title: ATLAS: building a zero‑budget IT service management platform with Django in the public sector. Georgios likes Django because it inspired him to think clearly about structure, workflow and architecting real-world systems. Projects don't fail because of technology. They fail because workflows are not clear and because the system doesn't show what is happening. Clarity is what you need. Meaningful metrics. Maintainability. The area for which he build the Atlas system was IT support. IT support originally was done by email and phone calls: completely unstructured. They now support 20500 employees... The problem: scaling without a system. Who owns what? Who's looking at what issue? The real problem was unstructured requests and lack of accountability. No visibility of the process, so you can only react. Atlas solves it by having a central Django workflow system. The user starts with a single form they need to fill in. Simple: fewer choices, fewer mistakes. Predictablility counts for a lot in internal systems. Workflow states are central. New/assigned/in progress/waiting/closed. Tickets move between those state based on explicit business rules. And timers to watch out for tickets being in the same state … -
Djangocon EU: AI-assisted contributions and maintainer load - Paolo Melchiorre
(One of my summaries of the 2026 Djangocon EU in Athens). Paolo is very active in the Django community. He's seeing more and more problems crop up for maintainers, related to AI-assisted contributions. He showed two quotes that seem to be about AI, but were really about something else: "It cripples the mind": Edsger Dijkstra (shortest path algorithm creator) in 1975, talking about the Cobol language. "You can't trust code that you didn't totally create yourself": Ken Thompson (Unix creator), talking about code within his own company. New technologies aren't always welcomed with open arms. He then showed an AI-adjusted/improved image of Django-the-guitar-player. With six fingers on his left hand and a too-modern guitar and amplifier. Amplification: that's what might happen with Django: More contributors, but also more low-value contributions. More code, but also more untested code. What will happen? He showed some examples from other projects. Being swamped with low-quality pull requests, for instance. Within the Django community, the jazzband project is stopping: there were more reasons, but "AI slop" was one of them. In matplotlib, an AI pull request was closed. Then the AI bot wrote a blog entry complaining about it and started attacking the open source … -
Djangocon EU: reliable Django signals - Haki Benita
(One of my summaries of the 2026 Djangocon EU in Athens). He's going to talk about: A pattern for decoupling modules in complicated systems Reliable and fault-tolerant workflows in your elaborate Django apps. (A workflow is a set of actions, like "select product", "place order", "pay"). For the payment example, you probably use a third party. You create a payment in the third party payment processor. The user provides details at the processor. After some time, the payment processor sends back some completion information. The completion info can contain "succeeded" or "failed". Handling the order is a bit more complicated. You have the order itself with its own workflow ("placed", "payment_succeeded", "sent", "received"). But this workflow also depends on the payment workflow. So two processes intertwined. Both have a webhook ("order placed" and "third party processor finished"). When the payment processor is finished, the webhook for the payment cannot normally talk to the Order model. If Order needs to talk to Payment and Payment to Order, you get circular dependencies. You can work around it, but this example only has a two-way relation. In a real order+payment example you also have refunds, customers and lots more. You get spaghetti code. … -
Djangocon EU: scaling the database, using multiple databases with Django - Jake Howard
(One of my summaries of the 2026 Djangocon EU in Athens). (Jake is the author of Django tasks, mentioned before at the conference. He's also in this week's Django podcast.) Scaling: horizontal and vertical. Horizontal: more machines. Vertical: more resources per machine. Horizontal scaling is often easier. Just start more django processes on more servers. But... often there's still only one database server. Databases aren't typical applications. They bring enormous speed and features, but have a big requirement: there's only one database server that's allowed to write to its data. One thing you can do is sharding: splitting up your data over multiple database servers. You need to think hard about this, as moving data afterwards is hard. And there are foreign key problems. You can improve scaling in a simpler way, with syncing: a primary with multiple replicas. Writing only happens to one databases, this syncs to the replicas (often in milliseconds). When you want Django to talk to them, you need a load balancer (pb_bouncer and so) in front of the replicas for the read traffic. Note: you don't want to use the primary for reading for performance reasons. Django allows multiple databases: DATABASES = { "default": {.....}, … -
Djangocon EU: partitioning very large tables with Django and Postgresql - Tim Bell
(One of my summaries of the 2026 Djangocon EU in Athens). The company where he works (Kraken) had an issue with vacuuming. 2TB table, 9 billion rows. 20-30 million row updates per day. The necessary vacuuming would take 16-20 hours every day. Partitioning seems a good idea. There aren't a lot of resources to read or watch. One of the best is a talk by Karen Jex. When to partition? Size over 100 GB or more than 100 million rows. You should rather not partition unless you really need to. In their case, vacuuming provided the reason. Vaccuuming a partial table takes much less time. Table partitioning: each row belongs in a partition based on a "partition key", the value and a set of bounds/rules. So "id 1-1000 in partition 1, 1001-2000 in 2". Which partition method to choose? Range, list, or hash? Look at your application, really design it from the ground up to work with partitioning in mind. How do you access your data? How do you want to purge data? Django abstracts away the complexity of the database, but the abstraction can be a bit leaky. Database partitions can be something that leaks through. Partitioned tables don't … -
Djangocon EU: lightning talks
(One of my summaries of the 2026 Djangocon EU in Athens). Note: "live-blogging lightning talks" means "I missed some names or mis-spelled them" :-) Faster delivery with feature flags - Miha Zidar Feature flags are often used for continuous delivery. You need to watch out with tests: do you need to run all of them twice, with and without the feature flag? And: remember to clean up the feature flags. Make them easy to remove. So only "if FEATURE .... else .....". Only use them to make deployment safer and faster Lessons from being an admin at Djangonaut Space - Raphaella Suardini https://djangonaut.space is a mentorship program to help you get into Django. All volunteers. There are some communication challenges when working with volunteers. People with different native languages. And you don't want to communicate too often, but you also want to communicate all that's necessary... There's an invisible workload: if you're an admin, you're partially also taking on resposibilities of others that might drop some tasks. Make decisions. Take care of your work/volunteer/life balance. Djangonaut space really helps people, which motivates her a lot and helps keep her volunteering her time and effort. Priming AI with atomic docs - … -
Djangocon EU: Django forms in the age of HTMX: the single field form - Hanne Moa
(One of my summaries of the 2026 Djangocon EU in Athens). You can go totally overboard with forms. Forms nested in forms. A list of forms. A recursive list of forms. She had to work with lots of elaborate forms/questionaires that needed to have many variants. Especially questionaires can drive you crazy with their dynamic form behaviour. A solution is to have a single field at the time. So: many forms with one single field. A little piece of htmx can load the single field forms when you click their "edit" button. Some example code is at https://github.com/Uninett/singlefieldform . (The presentation is there, too, in the slides/ directory). As an example, she showed a user preferences form. For every new preference, you only need to add an extra "single field form" which works on its own. Handy. The magic is that every field inherits from a SingleFieldMixin, which registers itself with the "main form page" registry. The main form page can iterate over the single field forms. Tip: using subclasses is the easiest way to get a plugin mechanism to work. (But de-activating the mechanisim is hard.) Unrelated photo explanation: a recent trip to the "Modellbundesbahn" in Germany. The same … -
Representing 'Jobs to be Done' in a project
I have had this idea/theory for a while, that most software tools would benefit from a simple built in todo list built into the product directly. The main idea is for users to create jobs themselves or for the system itself to create jobs for the user to complete. The general thesis for this idea comes from a direct reference to the term "Jobs to be done". Any piece of software that gets used, exists to complete a job and do it better than the solution before it. Well over the last couple of months I have turned this idea into a reality inside Hamilton Rock, or at least the first version of it and so far it seems very promising. The general API design is a few custom signals, a model and some signal reciever functions for the custom signals. The rest of the project interacts solely through the custom signals job_requested and job_completed. Each does as you would expect, job_requested requests a job be created, job_completed complete the related job to the model instance given. The core of the job model has a status, type and a generic foreign key which forms the target related to the job. … -
Built with Django Weekly Roundup: Mar 23 to Apr 13
Hey, Happy Monday! Why are you getting this: You signed up to receive this newsletter on Built with Django. I share recent projects, jobs, and useful Django links. If you no longer want this, you can unsubscribe anytime. News and Updates This issue covers March 23rd through April 13th. I widened the window this time so we capture the full recent batch of good additions. Sponsor This issue is sponsored by TuxSEO, your content team on auto-pilot. Generate SEO-focused content briefs and drafts faster, and ship consistently without the usual content bottlenecks. Projects Master Grammar - English grammar learning platform with structured lessons and tests. Built for english learners to master their grammar and achieve TOEIC/IELTS score target. Echoflare Managed Services - Professional Managed IT Services for Toronto Businesses My IT Fleet - Advanced IT Service Hub with advanced ticket approval flow , IT Asset inventory tracking, and It Fleet health intelligence. Jobs Backend Engineer at Twindo (Formerly Canvas) — Remote Lead Engineer (Backend) at Onos Health — Remote Fullstack Engineer (backend-leaning) at Pinwheel — Hybrid (NYC - Union Square) B2B SaaS) at Weave Bio — San Francisco (SF), Hybrid/Onsite 3 days/week Product Engineer at Baserow — Remote Senior Software … -
djust 0.4.0 — The Developer Experience Release
djust 0.4.0 ships 30+ features focused on developer experience: flash messages, keyboard shortcuts, form recovery, scaffolding generators, debug tooling, and security hardening. Build real-time Django apps with less code than ever. -
Django News - DjangoCon Europe Next Week! - Apr 10th 2026
Introduction Hi everyone, sorry for the late send of Issue #331. Last week, our provider, Curated, which is owned by Buttondown, went down and wasn’t able to send our newsletter for six days. You might have received it yesterday, but not everyone did. It’s the first time in several years we haven’t been able to land in your inbox. We’ve been in touch with their support all week and appreciate your patience while this gets sorted out. In the meantime, Will and I are looking at other provider options. If this shows up next week looking a little different, that’s probably why. If you missed it, please check out last week’s Issue 331: https://django-news.com/issues/331#start Django Newsletter News Django security releases issued: 6.0.4, 5.2.13, and 4.2.30 Django 4.2 has reached the end of extended support. Five CVEs (security vulnerabilities) fixed in this latest update. djangoproject.com DjangoCon Europe is next week! April 15-19 in Athens, Greece. There is a Django.Social event the night before, April 14th, 6-10pm, at Ipitou The Bar, organized by Jon Gould of Foxley Talent and Andrew Miller. djangocon.eu Updates to Django Today, "Updates to Django" is presented by Pradhvan from Djangonaut Space! 🚀 Last week we had 14 … -
DjangoCon Europe Next Week!
Introduction Hi everyone, sorry for the late send of Issue #331. Last week, our provider, Curated, which is owned by Buttondown, went down and wasn’t able to send our newsletter for six days. You might have received it yesterday, but not everyone did. It’s the first time in several years we haven’t been able to land in your inbox. We’ve been in touch with their support all week and appreciate your patience while this gets sorted out. In the meantime, Will and I are looking at other provider options. If this shows up next week looking a little different, that’s probably why. If you missed it, please check out last week’s Issue 331: https://django-news.com/issues/331#start News Django security releases issued: 6.0.4, 5.2.13, and 4.2.30 Django 4.2 has reached the end of extended support. Five CVEs (security vulnerabilities) fixed in this latest update. DjangoCon Europe is next week! April 15-19 in Athens, Greece. There is a Django.Social event the night before, April 14th, 6-10pm, at Ipitou The Bar, organized by Jon Gould of Foxley Talent and Andrew Miller. Updates to Django Today, "Updates to Django" is presented by Pradhvan from Djangonaut Space! 🚀 Last week we had 14 pull requests merged into … -
Switching all of my Python packages to PyPI trusted publishing
Switching all of my Python packages to PyPI trusted publishing As I have teased on Mastodon, I’m switching all of my packages to PyPI trusted publishing. I have been using it to release the django-debug-toolbar a few times but never set it up myself. The process seemed tedious. The malicious releases uploaded to PyPI two weeks ago and the blog post about digital attestations in pylock.toml finally pushed me to make the switch. All of my PyPI tokens have been revoked so there is no quick shortcut. Note I’m also looking at other code hosting platforms. I have been using git before GitHub existed and I’ll probably still use git when GitHub has completed its enshittification. For now the cost/benefit ratio of staying on GitHub is still positive for me. Trusted publishing isn’t available everywhere, so for now it is GitHub anyway. In the end, switching an existing project was easier than expected. I have completed the process for django-prose-editor and feincms3-cookiecontrol. For my future benefit, here are the step by step instructions I have to follow: Have a package which is buildable using e.g. uvx build On PyPI add a trusted publisher in the project’s publishing settings: Owner: matthiask, …