<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: djangocon</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/djangocon.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2024-09-27T23:36:02+00:00</updated><author><name>Simon Willison</name></author><entry><title>Themes from DjangoCon US 2024</title><link href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2024/#atom-tag" rel="alternate"/><published>2024-09-27T23:36:02+00:00</published><updated>2024-09-27T23:36:02+00:00</updated><id>https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2024/#atom-tag</id><summary type="html">
    &lt;p&gt;I just arrived home from a trip to Durham, North Carolina for DjangoCon US 2024. I’ve already written &lt;a href="https://simonwillison.net/2024/Sep/25/djp-a-plugin-system-for-django/"&gt;about my talk where I announced a new plugin system for Django&lt;/a&gt;; here are my notes on some of the other themes that resonated with me during the conference.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#growing-the-django-software-foundation-dsf-"&gt;Growing the Django Software Foundation (DSF)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#could-we-fund-a-django-lts-accessibility-audit-"&gt;Could we fund a Django LTS accessibility audit?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#django-fellows-continue-to-provide-outstanding-value"&gt;Django fellows continue to provide outstanding value&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#django-needs-feature-champions"&gt;Django needs feature champions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#htmx-fits-django-really-well"&gt;htmx fits Django really well&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#django-ninja-has-positive-buzz"&gt;Django Ninja has positive buzz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#valkey-as-a-last-minute-sponsor"&gt;Valkey as a last-minute sponsor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2024/Sep/27/themes-from-djangocon-us-2014/#durham-has-a-world-class-collection-of-tubas"&gt;Durham has a world-class collection of tubas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="growing-the-django-software-foundation-dsf-"&gt;Growing the Django Software Foundation (DSF)&lt;/h4&gt;
&lt;p&gt;Jacob Kaplan-Moss gave &lt;a href="https://2024.djangocon.us/talks/if-we-had-1000000-what-could-the-dsf-do-with-4x-its-budget/"&gt;my favorite talk&lt;/a&gt; of the conference, asking what the Django Software Foundation could do if it quadrupled its annual income from $250,000 to $1 million dollars, and then mapping out a convincing path to get there.&lt;/p&gt;
&lt;p&gt;I really liked this diagram Jacob provided summarizing the foundation’s current income and expenditures. It’s pretty cool that $90,000 of annual income comes from individual donors, over a third of the total since corporate donors provide $160,000.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/dsf-diagram.jpg" alt="Financial breakdown diagram with the following numbers:  PLATINUM &amp;amp; GOLD: $125,000 CORPORATE DONORS: $160,000 BUDGET: $255,000 SILVER &amp;amp; BELOW: $35,000 INDIVIDUAL DONORS: $90,000  Spending:  WAGES (FELLOWS): $200,000 GRANTS: $35,000 OTHER: $5,000 FEES/HOSTING: $10,000 SURPLUS: $10,000​​​​​​​​​​​​​​​​" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Top priority would be hiring an Executive Director for the foundation, which is currently lead entirely by an elected, volunteer board. I’ve seen how useful a professional ED is from my own experiences &lt;a href="https://simonwillison.net/2024/Sep/18/board-of-the-python-software-foundation/"&gt;on the Python Software Foundation board&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having someone working full time on the foundation outside of our current fellows - who have more than enough on their plates already - would enable the foundation to both take on more ambitious goals and also raise more money with which to tackle them.&lt;/p&gt;
&lt;p&gt;A line that Jacob used repeatedly in his talk about funding the foundation was this: if you or your organization &lt;em&gt;wouldn’t&lt;/em&gt; want to sponsor Django, he’d love to know why that is - understanding those blockers right now is almost as valuable as receiving actual cash. You can reach out to him at &lt;code&gt;jacob at djangoproject.com&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="could-we-fund-a-django-lts-accessibility-audit-"&gt;Could we fund a Django LTS accessibility audit?&lt;/h4&gt;
&lt;p&gt;Django fellows and the &lt;a href="https://github.com/django/deps/blob/main/final/0011-accessibility-team.rst"&gt;Django Accessibility Team&lt;/a&gt; have been focusing significant effort on the accessibility of the Django admin. I found this very inspiring, and in combination with the talk of more funding for the foundation it put an idea in my head: what if every Django LTS release (once every two years) was backed by a full, professional accessibility audit, run by an agency staffed with developers who use screen readers?&lt;/p&gt;
&lt;p&gt;Imagine how much impact it would have if the default Django admin interface had excellent, documented accessibility out of the box. It could improve things for hundreds of thousands of users, and set an excellent precedent for projects (and foundations) in the wider open source community.&lt;/p&gt;
&lt;p&gt;This also feels to me like something that should be inherently attractive to sponsors. A lot of agencies use Django for government work, where accessibility is a requirement with teeth. Would one of those agencies like to be the “accessibility sponsor” for a major Django release?&lt;/p&gt;
&lt;h4 id="django-fellows-continue-to-provide-outstanding-value"&gt;Django fellows continue to provide outstanding value&lt;/h4&gt;
&lt;p&gt;The &lt;a href="https://www.djangoproject.com/fundraising/#fellowship-program"&gt;DSF’s fellowship program&lt;/a&gt; remains one of the most impactful initiatives I’ve seen anywhere for ensuring the ongoing sustainability of a community-driven open source project.&lt;/p&gt;
&lt;p&gt;Both of the current fellows, Natalia Bidart and Sarah Boyce, were in attendance and gave talks. It was great getting to meet them in person.&lt;/p&gt;
&lt;p&gt;If you’re not familiar with the program, the fellows are contractors who are paid by the DSF to keep the Django project ticking over - handling many of the somewhat less glamorous tasks of responsible open source maintenance such as ticket triage, release management, security fixes and code review.&lt;/p&gt;
&lt;p&gt;The fellows program is in its tenth year, and is a key reason that Django continues to release new versions &lt;a href="https://www.djangoproject.com/download/#supported-versions"&gt;on a regular schedule&lt;/a&gt; despite having no single corporate parent with paid developers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/django-roadmap.png" alt="Software release timeline: 4.2 LTS (April 2023), 5.0 (August 2024), 5.1 (2025), 5.2 LTS (2026), 6.0 (2027), 6.1 (2027), 6.2 LTS (2028), 7.0 (2029). LTS versions have extended support periods." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Unsurprisingly there is always more work than fellow capacity, hence Jacob’s desire to further expand the existing program.&lt;/p&gt;
&lt;p&gt;The fellows program launched with a policy that fellows should not work on new feature development. I believe this was partly related to interpretation of IRS nonprofit guidelines which have since been reconsidered, and there is a growing consensus now that this policy should be dropped.&lt;/p&gt;
&lt;h4 id="django-needs-feature-champions"&gt;Django needs feature champions&lt;/h4&gt;
&lt;p&gt;Django has a well deserved reputation for stability, reliability and a dependable release process. It has less of a reputation for constantly turning out ground-breaking new features.&lt;/p&gt;
&lt;p&gt;Long-time Django contributors who I talked to all had a similar position on this: the challenge here is that big new features need dedicated champions to both lead design and development on them and to push them through to completion.&lt;/p&gt;
&lt;p&gt;The pool of community members who are both willing and able to take on these larger projects is currently too small.&lt;/p&gt;
&lt;p&gt;There are a number of ways we could address this - most notably through investing financial resources in sponsoring feature development. This has worked well for Django in the past - Django’s migrations work was funded by &lt;a href="https://www.kickstarter.com/projects/andrewgodwin/schema-migrations-for-django"&gt;a Kickstarter campaign&lt;/a&gt; back in 2013.&lt;/p&gt;
&lt;p&gt;The Django Software Foundation will shortly be announcing details of elections for both the DSF board and the Django Steering Council. These are extremely influential positions for people who want to help solve some of these larger problems.&lt;/p&gt;
&lt;h4 id="htmx-fits-django-really-well"&gt;htmx fits Django really well&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://htmx.org/"&gt;htmx&lt;/a&gt; is an incredibly good fit for the uncodified Django community philosophy of building for the web. It came up in multiple talks. It feels like it may be a solution that the Django community has been seeking for years, as a very compelling alternative to writing everything in SPA JavaScript and using Django purely as a backend via something like Django REST Framework.&lt;/p&gt;
&lt;p&gt;I've been slightly resistant to embracing htmx myself purely because it's such a critical dependency and in the past I wasn't convinced of its staying power. It's now mature, stable and widely-enough used that I'm ready to consider it for my own long-term projects.&lt;/p&gt;
&lt;h4 id="django-ninja-has-positive-buzz"&gt;Django Ninja has positive buzz&lt;/h4&gt;
&lt;p&gt;I haven’t paid much attention to &lt;a href="https://django-ninja.dev/"&gt;Django Ninja&lt;/a&gt; but it had a lot of very positive buzz at the conference as well, as a tool for quickly building full-featured, performative API endpoints (thanks to Rust-backed &lt;a href="https://docs.pydantic.dev/"&gt;Pydantic&lt;/a&gt; for serialization) with &lt;a href="https://django-ninja.dev/#interactive-api-docs"&gt;interactive API docs&lt;/a&gt; powered by OpenAPI.&lt;/p&gt;
&lt;p&gt;I respect Django REST Framework a lot, but my personal programming style leans away from Class Based Views, which it uses quite a bit. Django Ninja looks like it might fit my function-view biases better.&lt;/p&gt;
&lt;p&gt;I wrote about Richard Terry’s excellent &lt;a href="https://github.com/radiac/nanodjango"&gt;nanodjango&lt;/a&gt; single-file Django application tool &lt;a href="https://simonwillison.net/2024/Sep/24/nanodjango/"&gt;the other day&lt;/a&gt; - Django Ninja comes baked into that project as well.&lt;/p&gt;
&lt;h4 id="valkey-as-a-last-minute-sponsor"&gt;Valkey as a last-minute sponsor&lt;/h4&gt;
&lt;p&gt;The three platinum sponsors for DjangoCon this year were &lt;a href="https://www.revsys.com/"&gt;REVSYS&lt;/a&gt;, &lt;a href="https://www.caktusgroup.com/"&gt;Caktus Group&lt;/a&gt; and &lt;a href="https://valkey.io/"&gt;Valkey&lt;/a&gt;. Valkey were a late and somewhat surprising addition to the sponsorship lineup.&lt;/p&gt;
&lt;p&gt;Valkey is the &lt;a href="https://www.linuxfoundation.org/press/linux-foundation-launches-open-source-valkey-community"&gt;Linux Foundation backed&lt;/a&gt; fork of Redis, created in response to Redis &lt;a href="https://redis.io/blog/redis-adopts-dual-source-available-licensing/"&gt;ditching their Open Source license&lt;/a&gt; (which I took quite personally, having contributed my own free effort to promoting and improving Redis in the past).&lt;/p&gt;
&lt;p&gt;Aside from expressing thanks to them, I usually don’t pay sponsors that much attention. For some reason this one hit differently - the fact that Valkey were ready to step in as a major sponsor despite being only a few months old has caused me to take that project a whole lot more seriously than I did before. I’ll certainly consider them next time I come across a Redis-shaped problem.&lt;/p&gt;
&lt;h4 id="durham-has-a-world-class-collection-of-tubas"&gt;Durham has a world-class collection of tubas&lt;/h4&gt;
&lt;p&gt;My favorite category of &lt;a href="https://www.niche-museums.com/"&gt;Niche Museum&lt;/a&gt; is one that's available by appointment only where the person who collected everything is available to show you around.&lt;/p&gt;
&lt;p&gt;I always check &lt;a href="https://www.atlasobscura.com/"&gt;Atlas Obscura&lt;/a&gt; any time I visit a new city, and this time I was delighted to learn about The Vincent and Ethel Simonetti Historic Tuba Collection!&lt;/p&gt;
&lt;p&gt;I promoted it in the DjangoCon US #outings Slack channel and got together a group of five conference attendees for a visit on Thursday, shortly before my flight.&lt;/p&gt;
&lt;p&gt;It was &lt;em&gt;peak&lt;/em&gt; Niche Museum. I’ve posted photos and notes over &lt;a href="https://www.niche-museums.com/112"&gt;on my Niche Museums&lt;/a&gt; website, the first new article there in quite a while.&lt;/p&gt;

&lt;p&gt;&lt;img alt="More than a dozen varied and beautiful tubas, each with a neat attached label." src="https://static.simonwillison.net/static/2024/tuba-collection-card.jpeg" /&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dsf"&gt;dsf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pydantic"&gt;pydantic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/htmx"&gt;htmx&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="accessibility"/><category term="conferences"/><category term="django"/><category term="djangocon"/><category term="jacob-kaplan-moss"/><category term="python"/><category term="redis"/><category term="dsf"/><category term="pydantic"/><category term="htmx"/></entry><entry><title>Announcing our DjangoCon US 2024 Talks!</title><link href="https://simonwillison.net/2024/Jul/17/djangocon-us-2024-talks/#atom-tag" rel="alternate"/><published>2024-07-17T03:20:57+00:00</published><updated>2024-07-17T03:20:57+00:00</updated><id>https://simonwillison.net/2024/Jul/17/djangocon-us-2024-talks/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://2024.djangocon.us/news/announcing-lineup/"&gt;Announcing our DjangoCon US 2024 Talks!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I'm speaking at DjangoCon in Durham, NC in September.&lt;/p&gt;
&lt;p&gt;My accepted talk title was &lt;strong&gt;How to design and implement extensible software with plugins&lt;/strong&gt;. Here's my abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Plugins offer a powerful way to extend software packages. Tools that support a plugin architecture include WordPress, Jupyter, VS Code and pytest - each of which benefits from an enormous array of plugins adding all kinds of new features and expanded capabilities.&lt;/p&gt;
&lt;p&gt;Adding plugin support to an open source project can greatly reduce the friction involved in attracting new contributors. Users can work independently and even package and publish their work without needing to directly coordinate with the project's core maintainers. As a maintainer this means you can wake up one morning and your software grew new features without you even having to review a pull request!&lt;/p&gt;
&lt;p&gt;There's one catch: information on &lt;em&gt;how&lt;/em&gt; to design and implement plugin support for a project is scarce.&lt;/p&gt;
&lt;p&gt;I now have three major open source projects that support plugins, with over 200 plugins published across those projects. I'll talk about everything I've learned along the way: when and how to use plugins, how to design plugin hooks and how to ensure your plugin authors have as good an experience as possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm going to be talking about what I've learned integrating &lt;a href="https://pluggy.readthedocs.io/"&gt;Pluggy&lt;/a&gt; with &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt;, &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; and &lt;a href="https://sqlite-utils.datasette.io/"&gt;sqlite-utils&lt;/a&gt;. I've been looking for an excuse to turn this knowledge into a talk for ages, very excited to get to do it at DjangoCon!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="plugins"/><category term="python"/><category term="speaking"/><category term="datasette"/><category term="sqlite-utils"/><category term="llm"/></entry><entry><title>Coping strategies for the serial project hoarder</title><link href="https://simonwillison.net/2022/Nov/26/productivity/#atom-tag" rel="alternate"/><published>2022-11-26T15:47:02+00:00</published><updated>2022-11-26T15:47:02+00:00</updated><id>https://simonwillison.net/2022/Nov/26/productivity/#atom-tag</id><summary type="html">
    &lt;p&gt;I gave a talk at DjangoCon US 2022 in San Diego last month about productivity on personal projects, titled "Massively increase your productivity on personal projects with comprehensive documentation and automated tests".&lt;/p&gt;
&lt;p&gt;The alternative title for the talk was &lt;em&gt;Coping strategies for the serial project hoarder&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm maintaining a &lt;em&gt;lot&lt;/em&gt; of different projects at the moment. Somewhat unintuitively, the way I'm handling this is by scaling down techniques that I've seen working for large engineering teams spread out across multiple continents.&lt;/p&gt;
&lt;p&gt;The key trick is to ensure that every project has comprehensive documentation and automated tests. This scales my productivity horizontally, by freeing me up from needing to remember all of the details of all of the different projects I'm working on at the same time.&lt;/p&gt;
&lt;p&gt;You can watch the talk &lt;a href="https://www.youtube.com/watch?v=GLkRK2rJGB0"&gt;on YouTube&lt;/a&gt; (25 minutes). Alternatively, I've included a detailed annotated version of the slides and notes below.&lt;/p&gt;
&lt;div class="resp-container"&gt;
  &lt;iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube-nocookie.com/embed/GLkRK2rJGB0" width="560"&gt; &lt;/iframe&gt;
&lt;/div&gt;
&lt;!-- cutoff --&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.001.jpeg" alt="Title slide: Massively increase your productivity on personal projects with comprehensive documentation and automated tests - Simon Willison, DjangoCon US 2022" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;This was the title I originally submitted to the conference. But I realized a better title was probably...&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.003.jpeg" alt="Same title slide, but the title has been replaced" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Coping strategies for the serial project hoarder&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.004.jpeg" alt="A static frame from a video: a monkey sits on some steps stuffing itself with several pastries. In the longer video the monkey is handed more and more pastries and can't resist trying to hold and eat all of them at once, no matter how many it receives." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;&lt;a href="https://twitter.com/devisridhar/status/1576170527882121217"&gt;This video&lt;/a&gt; is a neat representation of my approach to personal projects: I always have a few on the go, but I can never resist the temptation to add even more.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.005.jpeg" alt="A screenshot of my profile on PyPI - my join date is Oct 26, 2017 and I have 185 pojects listed." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;&lt;a href="https://pypi.org/user/simonw/"&gt;My PyPI profile&lt;/a&gt; (which is only five years old) lists 185 Python packages that I've released. Technically I'm actively maintaining all of them, in that if someone reports a bug I'll push out a fix. Many of them receive new releases at least once a year.&lt;/p&gt;
&lt;p&gt;Aside: I took this screenshot using &lt;a href="https://shot-scraper.datasette.io/"&gt;shot-scraper&lt;/a&gt; with a little bit of extra JavaScript to hide a notification bar at the top of the page:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;shot-scraper &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;https://pypi.org/user/simonw/&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; \
--javascript &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-s"&gt;    document.body.style.paddingTop = 0;&lt;/span&gt;
&lt;span class="pl-s"&gt;    document.querySelector(&lt;/span&gt;
&lt;span class="pl-s"&gt;        '#sticky-notifications'&lt;/span&gt;
&lt;span class="pl-s"&gt;    ).style.display = 'none';&lt;/span&gt;
&lt;span class="pl-s"&gt;  &lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; --height 1000&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.006.jpeg" alt="A map of the world with the Eventbrite logo overlaid on it. There are pins on San Francisco, Nashville, Mendoza and Madrid." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;How can one individual maintain 185 projects?&lt;/p&gt;
&lt;p&gt;Surprisingly, I'm using techniques that I've scaled down from working at a company with hundreds of engineers.&lt;/p&gt;
&lt;p&gt;I spent seven years at Eventbrite, during which time the engineering team grew to span three different continents. We had major engineering centers in San Francisco, Nashville, Mendoza in Argentina and Madrid in Spain.&lt;/p&gt;
&lt;p&gt;Consider timezones: engineers in Madrid and engineers in San Francisco had almost no overlap in their working hours. Good asynchronous communication was essential.&lt;/p&gt;
&lt;p&gt;Over time, I noticed that the teams that were most effective at this scale were the teams that had a strong culture of documentation and automated testing.&lt;/p&gt;
&lt;p&gt;As I started to work on my own array of smaller personal projects, I found that the same discipline that worked for large teams somehow sped me up, when intuitively I would have expected it to slow me down.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.007.jpeg" alt="The perfect commit: Implementation + tests + documentation and a link to an issue thread" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;I wrote an extended description of this in &lt;a href="https://simonwillison.net/2022/Oct/29/the-perfect-commit/"&gt;The Perfect Commit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've started structuring the majority of my work in terms of what I think of as "the perfect commit" - a commit that combines implementation, tests, documentation and a link to an issue thread.&lt;/p&gt;
&lt;p&gt;As software engineers, it's important to note that our job generally isn't to write new software: it's to make changes to existing software.&lt;/p&gt;
&lt;p&gt;As such, the commit is our unit of work. It's worth us paying attention to how we can make our commits as useful as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.008.jpeg" alt="Screenshot of a commit on GitHub: the title is Async support for prepare_jinja2_environment, closes #1809" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/datasette/commit/ddc999ad1296e8c69cffede3e367dda059b8adad"&gt;a recent example&lt;/a&gt; from one of my projects, Datasette.&lt;/p&gt;
&lt;p&gt;It's a single commit which bundles together the implementation, some related documentation improvements and the tests that show it works. And it links back to an issue thread from the commit message.&lt;/p&gt;
&lt;p&gt;Let's talk about each component in turn.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.009.jpeg" alt="Implementation: it should just do one thing (thing here is deliberately vague)" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;There's not much to be said about the implementation: your commit should change something!&lt;/p&gt;
&lt;p&gt;It should only change one thing, but what that actually means varies on a case by case basis.&lt;/p&gt;
&lt;p&gt;It should be a single change that can be documented, tested and explained independently of other changes.&lt;/p&gt;
&lt;p&gt;(Being able to cleanly revert it is a useful property too.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.010.jpeg" alt="Tests: prove that the implementation works. Pass if the new implementation is correct, fail otherwise." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The goals of the tests that accompany a commit are to prove that the new implementation works.&lt;/p&gt;
&lt;p&gt;If you apply the implementation the new tests should pass. If you revert it the tests should fail.&lt;/p&gt;
&lt;p&gt;I often use &lt;code&gt;git stash&lt;/code&gt; to try this out.&lt;/p&gt;
&lt;p&gt;If you tell people they need to write tests for &lt;em&gt;every single change&lt;/em&gt; they'll often push back that this is too much of a burden, and will harm their productivity.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.011.jpeg" alt="Every project should start with a test. assert 1 + 1 == 2 is fine! Adding tests to an existing test suite is SO MUCH less work than starting a new test suite from scratch." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;But I find that the incremental cost of adding a test to an existing test suite keeps getting lower over time.&lt;/p&gt;
&lt;p&gt;The hard bit of testing is getting a testing framework setup in the first place - with a test runner, and fixtures, and objects under test and suchlike.&lt;/p&gt;
&lt;p&gt;Once that's in place, adding new tests becomes really easy.&lt;/p&gt;
&lt;p&gt;So my personal rule is that every new project starts with a test. It doesn't really matter what that test does - what matters is that you can run &lt;code&gt;pytest&lt;/code&gt; to run the tests, and you have an obvious place to start building more of them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.012.jpeg" alt="Cookiecutter repo templates: simonw/python-lib, simonw/click-app, simonw/datasette-plugin" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;I maintain three &lt;a href="https://cookiecutter.readthedocs.io/"&gt;cookiecutter&lt;/a&gt; templates to help with this, for the three kinds of projects I most frequently create:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/python-lib"&gt;simonw/python-lib&lt;/a&gt; for Python libraries&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/click-app"&gt;simonw/click-app&lt;/a&gt; for command line tools&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/datasette-plugin"&gt;simonw/datasette-plugin&lt;/a&gt; for Datasette plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these templates creates a project with a &lt;code&gt;setup.py&lt;/code&gt; file, a README, a test suite and GitHub Actions workflows to run those tests and ship tagged releases to PyPI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.013.jpeg" alt="Screenshot of the GitHub page to create a new repsoitory from python-lib-template-repository, which asks for a repository name, a description string and if the new repo should be public or private." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;I have a trick for running &lt;code&gt;cookiecutter&lt;/code&gt; as part of creating a brand new repository on GitHub. I described that in &lt;a href="https://simonwillison.net/2021/Aug/28/dynamic-github-repository-templates/"&gt;Dynamic content for GitHub repository templates using cookiecutter and GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.014.jpeg" alt="Documentation: Same repository as the code! Document changes that impact external developers. Update the docs in the same commit as the change. Catch missing documentation updates in PR / code review" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;This is a hill that I will die on: your documentation must live in the same repository as your code!&lt;/p&gt;
&lt;p&gt;You often see projects keep their documentation somewhere else, like in a wiki.&lt;/p&gt;
&lt;p&gt;Inevitably it goes out of date. And my experience is that if your documentation is out of date people will lose trust in it, which means they'll stop reading it and stop contributing to it.&lt;/p&gt;
&lt;p&gt;The gold standard of documentation has to be that it's reliably up to date with the code.&lt;/p&gt;
&lt;p&gt;The only way you can do that is if the documentation and code are in the same repository.&lt;/p&gt;
&lt;p&gt;This gives you versioned snapshots of the documentation that exactly match the code at that time.&lt;/p&gt;
&lt;p&gt;More importantly, it means you can enforce it through code review. You can say in a PR "this is great, but don't forget to update this paragraph on this page of the documentation to reflect the change you're making".&lt;/p&gt;
&lt;p&gt;If you do this you can finally get documentation that people learn to trust over time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.015.jpeg" alt="Bonus trick: documentation unit tests" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Another trick I like to use is something I call documentation unit tests.&lt;/p&gt;
&lt;p&gt;The idea here is to use unit tests to enforce that concepts introspected from your code are at least mentioned in your documentation.&lt;/p&gt;
&lt;p&gt;I wrote more about that in &lt;a href="https://simonwillison.net/2018/Jul/28/documentation-unit-tests/"&gt;Documentation unit tests&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.016.jpeg" alt="Screenshot showing pytest running 26 passing tests, each with a name like test_plugin_hook_are_documented[filters_from_request]" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Here's an example. Datasette has &lt;a href="https://github.com/simonw/datasette/blob/0.63.1/tests/test_docs.py#L41-L53"&gt;a test&lt;/a&gt; that scans through each of the Datasette plugin hooks and checks that there is a heading for each one in the documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.017.jpeg" alt="Screenshot of the code linked to above" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The test itself is pretty simple: it uses &lt;code&gt;pytest&lt;/code&gt; parametrization to look through every introspected plugin hook name, and for each one checks that it has a matching heading in the documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="issue-thread"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.018.jpeg" alt="Everything links to an issue thread" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The final component of my perfect commit is this: every commit must link to an issue thread.&lt;/p&gt;
&lt;p&gt;I'll usually have these open in advance but  sometimes I'll open an issue thread just so I can close it with a commit a few seconds later!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.019.jpeg" alt="A screenshot of the issue titled prepare_jinja_enviroment() hook should take datasette argument - it has 11 comments" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/datasette/issues/1809"&gt;the issue&lt;/a&gt; for the commit I showed earlier. It has 11 comments, and every single one of those comments is by me.&lt;/p&gt;
&lt;p&gt;I have literally thousands of issues on GitHub that look like this: issue threads that are effectively me talking to myself about the changes that I'm making.&lt;/p&gt;
&lt;p&gt;It turns out this a fantastic form of additional documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.020.jpeg" alt="What goes in an issue?" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;What goes in an issue?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Background: the reasons for the change. In six months time you'll want to know why you did this.&lt;/li&gt;
&lt;li&gt;State of play before-hand: embed existing code, link to existing docs. I like to start my issues with "I'm going to change this code right here" - that way if I come back the next day I don't have to repeat that little piece of research.&lt;/li&gt;
&lt;li&gt;Links to things! Documentation, inspiration, clues found on StackOverflow. The idea is to capture all of the loose information floating around that topic.&lt;/li&gt;
&lt;li&gt;Code snippets illustrating potential designs and false-starts.&lt;/li&gt;
&lt;li&gt;Decisions. What did you consider? What did you decide? As programmers we make decisions constantly, all day, about everything. That work doesn't have to be invisible. Writing them down also avoids having to re-litigate them several months later when you've forgotten your original  reasoning.&lt;/li&gt;
&lt;li&gt;Screenshots - of everything! Animated screenshots even better. I even take screenshots of things like the AWS console to remind me what I did there.&lt;/li&gt;
&lt;li&gt;When you close it: a link to the updated documentation and demo&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.021.jpeg" alt="Temporal documentation. It's timestamped and contextual. You don't need to commit to keeping it up-to-date in the future (but you can add more comments if you like)" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The reason I love issues is that they're a form of documentation that I think of as &lt;em&gt;temporal documentation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Regular documentation comes with a big commitment: you have to keep it up to date in the future.&lt;/p&gt;
&lt;p&gt;Issue comments skip that commitment entirely. They're displayed with a timestamp, in the context of the work you were doing at the time.&lt;/p&gt;
&lt;p&gt;No-one will be upset or confused if you fail to keep them updated to match future changes.&lt;/p&gt;
&lt;p&gt;So it's a commitment-free form of documentation, which I for one find incredibly liberating.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.022.jpeg" alt="Issue driven development" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;I think of this approach as &lt;em&gt;issue driven development&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Everything you are doing is issue-first, and from that you drive the rest of the development process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.023.jpeg" alt="Don't remember anything: you can go back to a project in six months and pick up right where you left off" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;This is how it relates back to maintaining 185 projects at the same time.&lt;/p&gt;
&lt;p&gt;With issue driven development you &lt;em&gt;don't have to remember anything&lt;/em&gt; about any of these projects at all.&lt;/p&gt;
&lt;p&gt;I've had issues where I did a bunch of design work in issue comments, then dropped it, then came back 12 months later and implemented that design - without having to rethink it.&lt;/p&gt;
&lt;p&gt;I've had projects where I forgot that the project existed entirely! But I've found it again, and there's been an open issue, and I've been able to pick up work again.&lt;/p&gt;
&lt;p&gt;It's a way of working where you treat it like every project is going to be maintained by someone else, and it's the classic cliche here that the somebody else is you in the future.&lt;/p&gt;
&lt;p&gt;It horizontally scales you and lets you tackle way more interesting problems.&lt;/p&gt;
&lt;p&gt;Programmers always complain when you interrupt them - there's this idea of "flow state" and that interrupting a programmer for a moment costs them half an hour in getting back up to speed.&lt;/p&gt;
&lt;p&gt;This fixes that! It's much easier to get back to what you are doing if you have an issue thread that records where you've got to.&lt;/p&gt;
&lt;p&gt;Issue driven development is my key productivity hack for taking on much more ambitious projects in much larger quantities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.024.jpeg" alt="Laboratory notebooks - and a picture of a page from one by Leonardo da Vinci" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Another way to think about this is to compare it to laboratory notebooks.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://en.wikipedia.org/wiki/Studies_of_the_Fetus_in_the_Womb"&gt;a page&lt;/a&gt; from one by Leonardo da Vinci.&lt;/p&gt;
&lt;p&gt;Great scientists and great engineers have always kept detailed notes.&lt;/p&gt;
&lt;p&gt;We can use GitHub issues as a really quick and easy way to do the same thing!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.025.jpeg" alt="Issue: Figure out how to deploy Datasette to AWS lambda using function URLs and Mangum" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Another thing I like to use these for is deep research tasks.&lt;/p&gt;
&lt;p&gt;Here's an example, from when I was trying to figure out how to run my Python web application in an AWS Lambda function:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/simonw/public-notes/issues/6"&gt;Figure out how to deploy Datasette to AWS Lambda using function URLs and Mangum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This took me 65 comments over the course of a few days... but by the end of that thread I'd figured out how to do it!&lt;/p&gt;
&lt;p&gt;Here's the follow-up, with another 77 comments, in which I &lt;a href="https://github.com/simonw/public-notes/issues/1"&gt;figure out how to serve an AWS Lambda function with a Function URL from a custom subdomain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will never have to figure this out ever again! That's a huge win.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.026.jpeg" alt="simonw/public-notes/issues" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;&lt;a href="https://github.com/simonw/public-notes"&gt;https://github.com/simonw/public-notes&lt;/a&gt; is a public repository where I keep some of these issue threads, transferred from my private notes repos &lt;a href="https://til.simonwillison.net/github/transfer-issue-private-to-public"&gt;using this trick&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.027.jpeg" alt="Tell people what you did! (It's so easy to skip this step)" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The last thing I want to encourage you to do is this: if you do project, tell people what it is you did!&lt;/p&gt;
&lt;p&gt;This counts for both personal and work projects. It's so easy to skip this step.&lt;/p&gt;
&lt;p&gt;Once you've shipped a feature or built a project, it's so tempting to skip the step of spending half an hour or more writing about the work you have done.&lt;/p&gt;
&lt;p&gt;But you are missing out on &lt;em&gt;so much&lt;/em&gt; of the value of your work if you don't give other people a chance to understand what you did.&lt;/p&gt;
&lt;p&gt;I wrote more about this here: &lt;a href="https://simonwillison.net/2022/Nov/6/what-to-blog-about/"&gt;What to blog about&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.028.jpeg" alt="Release notes (with dates)" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;For projects with releases, release notes are a really good way to do this.&lt;/p&gt;
&lt;p&gt;I like using GitHub releases for this - they're quick and easy to write, and I have automation setup for my projects such that creating release notes in GitHub triggers a build and release to PyPI.&lt;/p&gt;
&lt;p&gt;I've done over 1,000 releases in this way. Having them automated is crucial, and having automation makes it really easy to ship releases more often.&lt;/p&gt;
&lt;p&gt;Please make sure your release notes have dates on them. I need to know when your change went out, because if it's only a week old it's unlikely people will have upgraded to it yet, whereas a change from five years ago is probably safe to depend on.&lt;/p&gt;
&lt;p&gt;I wrote more about &lt;a href="https://simonwillison.net/2022/Jan/31/release-notes/"&gt;writing better release notes&lt;/a&gt; here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.029.jpeg" alt="Expand your definition of done to include writing about what you did" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;This is a mental trick which works really well for me. "No project of mine is finished until I've told people about it in some way" is a really useful habit to form.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.030.jpeg" alt="Twitter threads (embed images + links + videos)" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Twitter threads are (or were) a great low-effort way to write about a project. Build a quick thread with some links and images, and maybe even a video.&lt;/p&gt;
&lt;p&gt;Get a little unit about your project out into the world, and then you can stop thinking about it.&lt;/p&gt;
&lt;p&gt;(I'm trying to do this &lt;a href="https://simonwillison.net/2022/Nov/5/mastodon/"&gt;on Mastodon now&lt;/a&gt; instead.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.031.jpeg" alt="Get a blog" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;Even better: get a blog! Having your own corner of the internet to write about the work that you are doing is a small investment that will pay off many times over.&lt;/p&gt;
&lt;p&gt;("Nobody blogs anymore" I said in the talk... Phil Gyford disagrees with that meme so much that he launched &lt;a href="https://ooh.directory/blog/2022/welcome/"&gt;a new blog directory&lt;/a&gt; to show how wrong it is.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.032.jpeg" alt="GUILT is the enemy of projects" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;The enemy of projects, especially personal projects, is &lt;em&gt;guilt&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The more projects you have, the more guilty you feel about working on any one of them - because you're not working on the others, and those projects haven't yet achieved their goals.&lt;/p&gt;
&lt;p&gt;You have to overcome guilt if you're going to work on 185 projects at once!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="avoid-user-accounts"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.033.jpeg" alt="Avoid side projects with user accounts. If i has user accounts it's not a side-project, it's an unpaid job." style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;This is the most important tip: avoid side projects with user accounts.&lt;/p&gt;
&lt;p&gt;If you build something that people can sign into, that's not a side-project, it's an unpaid job. It's a very big responsibility, avoid at all costs!&lt;/p&gt;
&lt;p&gt;Almost all of my projects right now are open source things that people can run on their own machines, because that's about as far away from user accounts as I can get.&lt;/p&gt;
&lt;p&gt;I still have a responsibility for shipping security updates and things like that, but at least I'm not holding onto other people's data for them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.034.jpeg" alt="If your project is tested and documented, you have nothing to feel guilty about. That's what I tell myself anyway!" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;I feel like if your project is tested and documented, &lt;em&gt;you have nothing to feel guilty about&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You have put a thing out into the world, and it has tests to show that it works, and it has documentation that explains what it is.&lt;/p&gt;
&lt;p&gt;This means I can step back and say that it's OK for me to work on other things. That thing there is a unit that makes sense to people.&lt;/p&gt;
&lt;p&gt;That's what I tell myself anyway! It's OK to have 185 projects provided they all have documentation and they all have tests.&lt;/p&gt;
&lt;p&gt;Do that and the guilt just disappears. You can live guilt free!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide"&gt;
&lt;img loading="lazy" src="https://static.simonwillison.net/static/2022/djangocon-productivity/productivity.035.jpeg" alt="Thank you - simonwillison.net - twitter.com/simonw / github.com/simonw" style="max-width: 100%;" width="450" height="253" /&gt;&lt;div&gt;
&lt;p&gt;You can follow me on Mastodon at &lt;a href="https://fedi.simonwillison.net/@simon"&gt;@simon@simonwillison.net&lt;/a&gt; or on GitHub at &lt;a href="https://github.com/simonw"&gt;github.com/simonw&lt;/a&gt;. Or subscribe to my blog at &lt;a href="https://simonwillison.net/"&gt;simonwillison.net&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;From the Q&amp;amp;A:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You've tweeted about using GitHub Projects. Could you talk about that?
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects"&gt;GitHub Projects V2&lt;/a&gt; is the perfect TODO list for me, because it lets me bring together issues from different repositories. I use a project called "Everything" on a daily basis (it's my browser default window) - I add issues to it that I plan to work on, including personal TODO list items as well as issues from my various public and private repositories. It's kind of like a cross between Trello and Airtable and I absolutely love it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How did you move notes from the private to the public repo?
&lt;ul&gt;
&lt;li&gt;GitHub doesn't let you do this. But there's a trick I use involving a &lt;code&gt;temp&lt;/code&gt; repo which I switch between public and private to help transfer notes. More in &lt;a href="https://til.simonwillison.net/github/transfer-issue-private-to-public"&gt;this TIL&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question about the perfect commit: do you commit your failing tests?
&lt;ul&gt;
&lt;li&gt;I don't: I try to keep the commits that land on my &lt;code&gt;main&lt;/code&gt; branch always passing. I'll sometimes write the failing test before the implementation and  then commit them together. For larger projects I'll work in a branch and then squash-merge the final result into a perfect commit to main later on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/documentation"&gt;documentation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/productivity"&gt;productivity&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/testing"&gt;testing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/annotated-talks"&gt;annotated-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-issues"&gt;github-issues&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="djangocon"/><category term="documentation"/><category term="productivity"/><category term="my-talks"/><category term="testing"/><category term="annotated-talks"/><category term="github-issues"/></entry><entry><title>Weeknotes: DjangoCon, SQLite in Django, datasette-gunicorn</title><link href="https://simonwillison.net/2022/Oct/23/datasette-gunicorn/#atom-tag" rel="alternate"/><published>2022-10-23T19:58:00+00:00</published><updated>2022-10-23T19:58:00+00:00</updated><id>https://simonwillison.net/2022/Oct/23/datasette-gunicorn/#atom-tag</id><summary type="html">
    &lt;p&gt;I spent most of this week at &lt;a href="https://2022.djangocon.us/"&gt;DjangoCon&lt;/a&gt; in San Diego - my first outside-of-the-Bay-Area conference since the before-times.&lt;/p&gt;
&lt;p&gt;It was a most excellent event. I spent a lot of time in the corridor track - actually the sitting-outside-in-the-sunshine track, catching up with people I haven't seen in several years.&lt;/p&gt;
&lt;p&gt;I gave a talk titled "&lt;a href="https://2022.djangocon.us/talks/massively-increase-your-productivity-on/"&gt;Massively increase your productivity on personal projects with comprehensive documentation and automated tests&lt;/a&gt;", with the alternative title "Coping strategies for the serial project hoarder". I'll do a full write-up of this once the video is made available in a few weeks time, but in the meantime the talk materials can be found here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/simonw/djangocon-2022-productivity"&gt;Supporting notes and links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/simon/massively-increase-your-productivity-on-personal-projects-with-comprehensive-documentation-and-automated-tests"&gt;Slides on Speaker Deck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://djangoconus2022.loudswarm.com/session/massively-increase-your-productivity-on-personal-projects-with-comprehensive-documentation-and-automated-tests"&gt;Video for paying DjangoCon attendees&lt;/a&gt; (public video coming soon)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also gave a lightning talk about AI and magic, which was effectively the five minute oral version of my recent blog post &lt;a href="https://simonwillison.net/2022/Oct/5/spell-casting/"&gt;Is the AI spell-casting metaphor harmful or helpful?&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="benchmarking-sqlite"&gt;Benchmarking SQLite in Django&lt;/h4&gt;
&lt;p&gt;I also hung around for the first day of the DjangoCon sprints.&lt;/p&gt;
&lt;p&gt;For over a decade, the Django documentation has warned against using SQLite in production - recommending PostgreSQL or MySQL instead.&lt;/p&gt;
&lt;p&gt;I asked Django Fellow &lt;a href="https://twitter.com/carltongibson"&gt;Carlton Gibson&lt;/a&gt; what it would take to update that advice for 2022. He suggested that what we really needed was a solid idea for how well modern SQLite performs with Django, against a variety of different settings.&lt;/p&gt;
&lt;p&gt;So I spent some time running benchmarks, using my new &lt;a href="https://github.com/simonw/django_sqlite_benchmark"&gt;django_sqlite_benchmark&lt;/a&gt; repository.&lt;/p&gt;
&lt;p&gt;You can follow the full details of my experiments in these issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/django_sqlite_benchmark/issues/2"&gt;#2: Locust test to exercise /counter/xxx endpoint&lt;/a&gt; which runs benchmarks against a simple Django view that increments a counter stored in a SQLite table&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/django_sqlite_benchmark/issues/3"&gt;#3: Load test for larger writes&lt;/a&gt; runs a benchmark using a script that inserts larger JSON objects into a database table. I also &lt;a href="https://github.com/simonw/django_sqlite_benchmark/issues/3#issuecomment-1287598057"&gt;tried this against PostgreSQL&lt;/a&gt;, getting very similar numbers to SQLite.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/django_sqlite_benchmark/issues/4"&gt;#4: Benchmark endpoint that doesn't interact with database&lt;/a&gt; benchmarks a simple "hello world" view that doesn't use SQLite at all - as a baseline for comparison&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I used &lt;a href="https://locust.io"&gt;Locust&lt;/a&gt; for all of these tests, and wrote up &lt;a href="https://til.simonwillison.net/python/locust"&gt;a TIL about using it&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;Here's the TLDR version of the results: SQLite in its default "journal" mode starts returning "database locked" errors pretty quickly as the write load increases. But... if you switch to "wal" mode (&lt;a href="https://til.simonwillison.net/sqlite/enabling-wal-mode"&gt;here's how&lt;/a&gt;) those errors straight up vanish!&lt;/p&gt;
&lt;p&gt;I was expecting WAL mode to improve things, but I thought I'd still be able to hit errors even with it enabled. No - it turns out that, at least for the amount of traffic I could generate on may laptop, WAL mode proved easily capable of handling the load.&lt;/p&gt;
&lt;p&gt;Even without WAL mode, bumping the SQLite "timeout" option up to 20s solved most of the errors.&lt;/p&gt;
&lt;p&gt;Even more interestingly: I tried using Gunicorn (and Uvicorn) to run multiple Django workers at once. I was certain this would lead to problems, as SQLite isn't designed to handle writes from multiple processes at once... or so I thought. It turned out SQLite's use of file locking meant everything worked far better than I expected - and upping the number of worker processes from 1 to 4 resulted in approximately a 4x increase in throughput.&lt;/p&gt;
&lt;p&gt;I shouldn't be surprised by this, if only because every time I've tried to push SQLite in a new direction it's impressed me with how much more capable it is than I expected.&lt;/p&gt;
&lt;p&gt;But still, these results are very exciting. This problem still needs more thorough testing and more eyes than just mine, but I think this indicates that SQLite should absolutely be considered a viable option for running Django in production in 2022.&lt;/p&gt;
&lt;h4&gt;datasette-gunicorn&lt;/h4&gt;
&lt;p&gt;Datasette has always run as a single process. It uses &lt;a href="https://www.uvicorn.org/"&gt;Uvicorn&lt;/a&gt; to serve requests, but it hard-codes Uvicorn to a single worker (&lt;a href="https://github.com/simonw/datasette/blob/0.62/datasette/cli.py#L617-L619"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Based on my experiments with SQLite and Django - in particular how running multiple worker processes gave me an increase in how much traffic I could handle - I decided to try the same thing with Datasette itself.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gunicorn.org/"&gt;Gunicorn&lt;/a&gt; remains one of the most well regarded options for deploying Python web applications. It acts as a process monitor, balancing requests between different workers and restarting anything that fails with an error.&lt;/p&gt;
&lt;p&gt;I decided to experiment with this through the medium of a Datasette plugin. So I built &lt;a href="https://datasette.io/plugins/datasette-gunicorn"&gt;datasette-gunicorn&lt;/a&gt;, a plugin that adds an extra command to Datasette that lets you start it like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;datasette gunicorn my.db --workers 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It takes &lt;a href="https://datasette.io/plugins/datasette-gunicorn#user-content-datasette-gunicorn---help"&gt;most of the same arguments&lt;/a&gt; as Datasette's regular &lt;code&gt;datasette serve&lt;/code&gt; command, plus that new &lt;code&gt;-w/--workers&lt;/code&gt; option for setting the number of workers.&lt;/p&gt;
&lt;p&gt;Initial benchmarks &lt;a href="https://github.com/simonw/datasette-gunicorn/issues/1#issuecomment-1287905177"&gt;were very positive&lt;/a&gt;: 21 requests a second with a single worker, increasing to 75 requests/second with four! Not bad for an initial experiment. I also &lt;a href="https://github.com/simonw/datasette-gunicorn/issues/4"&gt;tested it serving a static page&lt;/a&gt; through Datasette and got up to over 500 requests a second with a warning that Locust needed to be moved to a separate machine for a full load test.&lt;/p&gt;
&lt;p&gt;In writing the plugin I had to figure out how to build a new command that mostly copied parameters from the existing &lt;code&gt;datasette serve&lt;/code&gt; Click command - I wrote &lt;a href="https://til.simonwillison.net/datasette/plugin-modifies-command"&gt;a TIL&lt;/a&gt; about how I ended up doing that.&lt;/p&gt;
&lt;h4&gt;shot-scraper 1.0&lt;/h4&gt;
&lt;p&gt;Also this week: I released &lt;a href="https://github.com/simonw/shot-scraper/releases/tag/1.0"&gt;shot-scraper 1.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Despite the exciting version number this actually only has two small new features. Here's the full changelog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;shot-scraper html URL&lt;/code&gt; command (&lt;a href="https://shot-scraper.datasette.io/en/stable/html.html"&gt;documented here&lt;/a&gt;) for outputting the final HTML of a page, after JavaScript has been executed. &lt;a href="https://github.com/simonw/shot-scraper/issues/96"&gt;#96&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shot-scraper javascript&lt;/code&gt; has a new &lt;code&gt;-r/--raw&lt;/code&gt; option for outputting the result of the JavaScript expression as a raw string rather than JSON encoded (&lt;a href="https://shot-scraper.datasette.io/en/stable/javascript.html"&gt;shot-scraper javascript documentation&lt;/a&gt;). &lt;a href="https://github.com/simonw/shot-scraper/issues/95"&gt;#95&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tutorial: &lt;a href="https://simonwillison.net/2022/Oct/14/automating-screenshots/"&gt;Automating screenshots for the Datasette documentation using shot-scraper&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I bumped it to 1.0 because &lt;code&gt;shot-scraper&lt;/code&gt; is mature enough now that I'm ready to commit to not breaking existing features (at least without shipping a 2.0, which I hope to avoid for as long as possible).&lt;/p&gt;
&lt;p&gt;I'm always trying to get more brave when it comes to stamping a 1.0 release on my main projects.&lt;/p&gt;
&lt;p&gt;(I really, really need to get Datasette 1.0 shipped soon.)&lt;/p&gt;
&lt;h4&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-gunicorn"&gt;datasette-gunicorn&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-gunicorn/releases/tag/0.1"&gt;0.1&lt;/a&gt; - 2022-10-22
&lt;br /&gt;Plugin for running Datasette using Gunicorn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/shot-scraper"&gt;shot-scraper&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/shot-scraper/releases/tag/1.0"&gt;1.0&lt;/a&gt; - (&lt;a href="https://github.com/simonw/shot-scraper/releases"&gt;23 releases total&lt;/a&gt;) - 2022-10-15
&lt;br /&gt;A command-line utility for taking automated screenshots of websites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/asgi-gzip"&gt;asgi-gzip&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/asgi-gzip/releases/tag/0.2"&gt;0.2&lt;/a&gt; - (&lt;a href="https://github.com/simonw/asgi-gzip/releases"&gt;2 releases total&lt;/a&gt;) - 2022-10-13
&lt;br /&gt;gzip middleware for ASGI applications, extracted from Starlette&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/python/too-many-open-files-psutil"&gt;Using psutil to investigate "Too many open files"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/shot-scraper/subset-of-table-columns"&gt;shot-scraper for a subset of table columns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/gpt3/guessing-amazon-urls"&gt;Guessing Amazon image URLs using GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/django/datasette-django"&gt;Adding a Datasette ASGI app to Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/python/locust"&gt;Simple load testing with Locust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/datasette/plugin-modifies-command"&gt;Writing a Datasette CLI plugin that mostly duplicates an existing command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gunicorn"&gt;gunicorn&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shot-scraper"&gt;shot-scraper&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/carlton-gibson"&gt;carlton-gibson&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="django"/><category term="djangocon"/><category term="projects"/><category term="sqlite"/><category term="my-talks"/><category term="gunicorn"/><category term="datasette"/><category term="weeknotes"/><category term="shot-scraper"/><category term="carlton-gibson"/></entry><entry><title>How I moderated the State of Django panel at DjangoCon US.</title><link href="https://simonwillison.net/2018/Oct/22/moderating-the-state-of-django/#atom-tag" rel="alternate"/><published>2018-10-22T19:48:53+00:00</published><updated>2018-10-22T19:48:53+00:00</updated><id>https://simonwillison.net/2018/Oct/22/moderating-the-state-of-django/#atom-tag</id><summary type="html">
    &lt;p&gt;On Wednesday last week I moderated the &lt;a href="https://2018.djangocon.us/talk/state-of-django-panel/"&gt;State of Django panel&lt;/a&gt; as the closing session for &lt;a href="https://2018.djangocon.us/"&gt;DjangoCon US 2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think it went well, so I’m writing some notes on exactly how we did it. In my experience it’s worth doing this for things like public speaking: in six months time I might moderate another panel and I’ll be desperately trying to remember what went right last time.&lt;/p&gt;
&lt;p&gt;Panels are hard. Bad panels are way too common, to the point that some good conferences actively avoid having panels at all.&lt;/p&gt;
&lt;p&gt;In my opinion, a good panel has a number of important attributes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The panel needs a coherent theme. It shouldn’t just be several independent speakers that happen to be sharing the same time slot.&lt;/li&gt;
&lt;li&gt;Panels need to be balanced. Having just one or two of the speakers monopolize the conversation is bad for the audience and bad for the panelists themselves.&lt;/li&gt;
&lt;li&gt;The moderator is there to facilitate the conversation, not to be the center of attention. I love public speaking so I feel the need to be particularly cautious here.&lt;/li&gt;
&lt;li&gt;Panelists need to have diverse perspectives on the topics under discussion. A panel where everyone agrees with each other and makes the same points is a very boring panel indeed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I originally pitched the panel to the DjangoCon US organizing committee as a “State of Django” conversation where core maintainers would talk about the current state of the project.&lt;/p&gt;
&lt;p&gt;They countered with a much better idea: a panel that encompassed both the state of the Django framework and the community and ecosystem that it exists within. Since DjangoCon is primarily about bringing that community together this was a much better fit for the conference, and would make for a much more interesting and relevant discussion.&lt;/p&gt;
&lt;p&gt;I worked together with the conference organizers to find our panelists. Nicholle James in particular was the driving force behind assembling the panelists and ensuring everything was in place for the panel to succeed.&lt;/p&gt;
&lt;p&gt;We ended up with a panel representing a comprehensive cross-section of the organizations that make the Django community work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andrew Godwin, representing Django Core&lt;/li&gt;
&lt;li&gt;Anna Makarudze, representing the &lt;a href="https://www.djangoproject.com/foundation/" title="Django Software Foundation"&gt;DSF&lt;/a&gt;, &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt; and &lt;a href="https://africa.python.org/en/"&gt;Python Africa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Frank Wiles, President of the &lt;a href="https://www.djangoproject.com/foundation/" title="Django Software Foundation"&gt;DSF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeff Triplett, President of &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;, member of the Board of Directors for the &lt;a href="https://www.python.org/psf/" title="Python Software Foundation"&gt;PSF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Josue Balandrano Coronel, representing &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Katherine Michel, representing &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt; and DjangoCon US Website Chair&lt;/li&gt;
&lt;li&gt;Kojo Idrissa, &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt; North American Ambassador&lt;/li&gt;
&lt;li&gt;Rachell Calhoun, representing &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt; and &lt;a href="https://www.pyladies.com/"&gt;PyLadies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As it was the closing session for the conference, I wanted the panel to both celebrate the progress of the community and project and to explore what we need to do next: what should we be working on to improve Django and it’s community in the future?&lt;/p&gt;
&lt;p&gt;I had some initial thoughts on topics, but since the panel was scheduled for the last session of the conference I decided to spend the conference itself firming up the topics that would be discussed. This was a really good call: we got to create an agenda for the panel that was almost entirely informed by the other conference sessions combined with hot topics from the halfway track. We also asked conference attendees for their suggestions via an online form, and used those suggestions to further inform the topics that were discussed.&lt;/p&gt;
&lt;p&gt;I made sure to have a 10-15 minute conversation one-on-one with each of the panelists during the conference. We then got together for an hour at lunch before the panel to sync up with the topics and themes we would be discussing.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Topic_and_themes_38"&gt;&lt;/a&gt;Topic and themes&lt;/h3&gt;
&lt;p&gt;Our pre-panel conversations highlighted a powerful theme for the panel itself, which I ended up summarizing as “What can the Django project learn from the Django community?” This formed the framework for the other themes of the panel.&lt;/p&gt;
&lt;p&gt;The themes themselves were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diversity and education - inspired by the work of &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Events and international focus, lead by &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Django governance: In particular James Bennett’s &lt;a href="https://github.com/django/deps/blob/89712df93daeea9fdf7a993342e7087164620eea/draft/XXXX-dissolve-core.rst"&gt;proposal to split up core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big feature ideas for Django (guided by Andrew Godwin’s proposed &lt;a href="https://www.aeracode.org/2018/06/04/django-async-roadmap/"&gt;Django async roadmap&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Money: who has it, and who needs it - understanding the role of &lt;a href="https://www.djangoproject.com/foundation/"&gt;the DSF&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the hardest parts for me was figuring out the order in which we would tackle these themes. I ended up settling on the above order about half an hour before the panel started.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Opening_and_closing_52"&gt;&lt;/a&gt;Opening and closing&lt;/h3&gt;
&lt;p&gt;With eight panelists, ensuring that introductions didn’t drag on too long was particularly important. I asked each panelist to introduce themselves with a couple of sentences that highlighted the organizations they were affiliated with that were relevant to the panel. For our chosen group of panelists this was definitely the right framing.&lt;/p&gt;
&lt;p&gt;I then asked each panelist to be prepared to close the panel with a call to action: something an audience member could actively do that would support the community going forward. This worked really well: it provided a great, actionable note to end both the panel and the conference.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Preparing_and_running_the_panel_58"&gt;&lt;/a&gt;Preparing and running the panel&lt;/h3&gt;
&lt;p&gt;We used our panel lunch together to check that no one would have calls to action that overlapped too much, and to provide a rough indication of who had things to say about each topic we planned to discuss.&lt;/p&gt;
&lt;p&gt;This turned out to be essential: I’ve been on smaller panels where the panelists have been able to riff easily on each other’s points, but with eight panelists it turned out not everyone could even see each other, so as panel moderator it fell on me to direct questions to individuals and then prompt others for follow-ups. Thankfully the panel lunch combined with the one-to-one conversations gave me the information I needed for this.&lt;/p&gt;
&lt;p&gt;I had written down a selection of questions for each of the themes. Having a selection turned out to be crucial: a few times the panelists talked about material that I had planned to cover in a later section, so I had to adapt as we went along. In the future I’ll spend more time on this: these written ideas were a crucial component in keeping the panel flowing in the right direction.&lt;/p&gt;
&lt;p&gt;With everything in place the panel itself was a case of concentrating on what everyone was saying and using the selection of the next questions (plus careful ad-libbing) to guide the conversation along the preselected themes. I also tried to keep mental track of who had done the most speaking so I could ensure the conversation stayed as balanced as possible by inviting other panelists into the conversation.&lt;/p&gt;
&lt;p&gt;The video of the panel should be out in around three weeks time, at which point you can evaluate for yourself if we managed to do a good job of it. I’m really happy with the feedback we got after the panel, and I plan to use a similar process for panels I’m involved with in the future.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/andrew-godwin"&gt;andrew-godwin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frank-wiles"&gt;frank-wiles&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/panels"&gt;panels&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="andrew-godwin"/><category term="django"/><category term="djangocon"/><category term="frank-wiles"/><category term="panels"/><category term="speaking"/><category term="my-talks"/><category term="jeff-triplett"/></entry><entry><title>Django #8936: Add view (read-only) permission to admin (closed)</title><link href="https://simonwillison.net/2018/May/17/read-only-admin/#atom-tag" rel="alternate"/><published>2018-05-17T13:40:35+00:00</published><updated>2018-05-17T13:40:35+00:00</updated><id>https://simonwillison.net/2018/May/17/read-only-admin/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://code.djangoproject.com/ticket/8936"&gt;Django #8936: Add view (read-only) permission to admin (closed)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Opened 10 years ago. Closed 15 hours ago. I apparently filed this issue during the first DjangoCon back in September 2008, when Adrian and Jacob mentioned on-stage that they would like to see a read-only permission for the Django Admin. Thanks to Olivier Dalang from Fiji and Petr Dlouhý from Prague it’s going to be a feature shipping in Django 2.1. Open source is a beautiful thing.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-admin"&gt;django-admin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="django-admin"/><category term="djangocon"/><category term="open-source"/></entry><entry><title>The denormalized query engine design pattern</title><link href="https://simonwillison.net/2017/Aug/16/denormalized-query-engine/#atom-tag" rel="alternate"/><published>2017-08-16T22:49:22+00:00</published><updated>2017-08-16T22:49:22+00:00</updated><id>https://simonwillison.net/2017/Aug/16/denormalized-query-engine/#atom-tag</id><summary type="html">
    &lt;p&gt;I presented this talk &lt;a href="https://2017.djangocon.us/talks/the-denormalized-query-engine-design-pattern/"&gt;at DjangoCon 2017&lt;/a&gt; in Spokane, Washington. Below is the abstract, the slides and the YouTube video of the talk.&lt;/p&gt;
&lt;h4 id="abstract"&gt;Abstract&lt;/h4&gt;
&lt;p&gt;Most web applications need to offer search functionality. Open source tools like Solr and Elasticsearch are a powerful option for building custom search engines… but it turns out they can be used for way more than just search.&lt;/p&gt;
&lt;p&gt;By treating your search engine as a denormalization layer, you can use it to answer queries that would be too expensive to answer using your core relational database. Questions like “What are the top twenty tags used by my users from Spain?” or “What are the most common times of day for events to start?” or “Which articles contain addresses within 500 miles of Toronto?”.&lt;/p&gt;
&lt;p&gt;With the denormalized query engine design pattern, modifications to relational data are published to a denormalized schema in Elasticsearch or Solr. Data queries can then be answered using either the relational database or the search engine, depending on the nature of the specific query. The search engine returns database IDs, which are inflated from the database before being displayed to a user - ensuring that users never see stale data even if the search engine is not 100% up to date with the latest changes. This opens up all kinds of new capabilities for slicing, dicing and exploring data.&lt;/p&gt;
&lt;p&gt;In this talk, I’ll be illustrating this pattern by focusing on Elasticsearch - showing how it can be used with Django to bring new capabilities to your application. I’ll discuss the challenge of keeping data synchronized between a relational database and a search engine, and show examples of features that become much easier to build once you have this denormalization layer in place.&lt;/p&gt;

&lt;h4 id="denorm-query-video"&gt;Video&lt;/h4&gt;

&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/NzcvewgqYog" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"&gt;
&lt;/iframe&gt;

&lt;h4 id="denorm-query-slides"&gt;Slides&lt;/h4&gt;

&lt;iframe class="speakerdeck-iframe" style="border: 0px; background: rgba(0, 0, 0, 0.1) padding-box; margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 420;" frameborder="0" src="https://speakerdeck.com/player/465a2d2f25bc449ebdafd19247ec9712" title="The denormalized query engine design pattern" allowfullscreen="true" data-ratio="1.3333333333333333"&gt;
&lt;/iframe&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/definitions"&gt;definitions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/denormalisation"&gt;denormalisation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/design-patterns"&gt;design-patterns&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/elasticsearch"&gt;elasticsearch&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/software-architecture"&gt;software-architecture&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="definitions"/><category term="denormalisation"/><category term="design-patterns"/><category term="django"/><category term="djangocon"/><category term="elasticsearch"/><category term="my-talks"/><category term="software-architecture"/></entry><entry><title>Videos from DjangoCon 2009</title><link href="https://simonwillison.net/2010/Jan/3/djangocon/#atom-tag" rel="alternate"/><published>2010-01-03T11:02:11+00:00</published><updated>2010-01-03T11:02:11+00:00</updated><id>https://simonwillison.net/2010/Jan/3/djangocon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://djangocon.blip.tv/posts"&gt;Videos from DjangoCon 2009&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The videos from September's DjangoCon are now available, including my "Cowboy development with Django" talk (also &lt;a href="https://archive.org/details/pyvideo_24___cowboy-development-with-django"&gt;on the Internet Archive&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I talked about building Wildlife Near You on a /dev/fort trip to Alderney and the MP's expenses project at the Guardian.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/the-guardian"&gt;the-guardian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wildlifenearyou"&gt;wildlifenearyou&lt;/a&gt;&lt;/p&gt;



</summary><category term="conferences"/><category term="django"/><category term="djangocon"/><category term="python"/><category term="the-guardian"/><category term="wildlifenearyou"/></entry><entry><title>Welcome to Django Dose</title><link href="https://simonwillison.net/2009/Sep/21/djangodose/#atom-tag" rel="alternate"/><published>2009-09-21T18:21:01+00:00</published><updated>2009-09-21T18:21:01+00:00</updated><id>https://simonwillison.net/2009/Sep/21/djangodose/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://djangodose.com/blog/2009/09/welcome-django-dose/"&gt;Welcome to Django Dose&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Launched at DjangoCon, a new Django community site designed to be a successor to TWiD, still with (shorter) podcasts but also featuring more news, articles and screencasts.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/community"&gt;community&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangodose"&gt;djangodose&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/podcasts"&gt;podcasts&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/screencasts"&gt;screencasts&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twid"&gt;twid&lt;/a&gt;&lt;/p&gt;



</summary><category term="community"/><category term="django"/><category term="djangocon"/><category term="djangodose"/><category term="podcasts"/><category term="screencasts"/><category term="twid"/></entry><entry><title>EuroDjangoCon 2009</title><link href="https://simonwillison.net/2009/Feb/12/django/#atom-tag" rel="alternate"/><published>2009-02-12T16:59:57+00:00</published><updated>2009-02-12T16:59:57+00:00</updated><id>https://simonwillison.net/2009/Feb/12/django/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.djangoproject.com/weblog/2009/feb/11/eurodjangocon/"&gt;EuroDjangoCon 2009&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Tickets are now on sale for the conference, scheduled for 4th-6th of May (not March as I originally said) in Prague (followed by two days of development sprints).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/eurodjangocn"&gt;eurodjangocn&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prague"&gt;prague&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="eurodjangocn"/><category term="prague"/><category term="python"/></entry><entry><title>EuroDjangoCon</title><link href="https://simonwillison.net/2009/Jan/24/eurodjangocon/#atom-tag" rel="alternate"/><published>2009-01-24T18:54:25+00:00</published><updated>2009-01-24T18:54:25+00:00</updated><id>https://simonwillison.net/2009/Jan/24/eurodjangocon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://euro.djangocon.org/"&gt;EuroDjangoCon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
4th-6th of May 2009, in Prague. Talk submissions are open now, and registration starts on the 6th of February.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/eurodjangocon"&gt;eurodjangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/events"&gt;events&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prague"&gt;prague&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="conferences"/><category term="django"/><category term="djangocon"/><category term="eurodjangocon"/><category term="events"/><category term="prague"/><category term="python"/></entry><entry><title>Introducing the Django Debug Toolbar</title><link href="https://simonwillison.net/2008/Sep/21/introducing/#atom-tag" rel="alternate"/><published>2008-09-21T18:32:24+00:00</published><updated>2008-09-21T18:32:24+00:00</updated><id>https://simonwillison.net/2008/Sep/21/introducing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://rob.cogit8.org/blog/2008/Sep/19/introducing-django-debug-toolbar/"&gt;Introducing the Django Debug Toolbar&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Another project inspired by DjangoCon: a component based debugging toolbar for Django. I like the architecture so far.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/debugging"&gt;debugging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-debug-toolbar"&gt;django-debug-toolbar&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rob-hudson"&gt;rob-hudson&lt;/a&gt;&lt;/p&gt;



</summary><category term="debugging"/><category term="django"/><category term="djangocon"/><category term="django-debug-toolbar"/><category term="rob-hudson"/></entry><entry><title>DjangoCon and learning from Zope 2</title><link href="https://simonwillison.net/2008/Sep/17/djangocon/#atom-tag" rel="alternate"/><published>2008-09-17T23:25:10+00:00</published><updated>2008-09-17T23:25:10+00:00</updated><id>https://simonwillison.net/2008/Sep/17/djangocon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://compoundthinking.com/blog/index.php/2008/09/17/djangocon-and-learning-from-zope-2/"&gt;DjangoCon and learning from Zope 2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Mark Ramm presented probably the most thought-provoking talk at DjangoCon. He’s started writing it up as a series of posts.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mark-ramm"&gt;mark-ramm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/turbogears"&gt;turbogears&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zope2"&gt;zope2&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="mark-ramm"/><category term="python"/><category term="turbogears"/><category term="zope2"/></entry><entry><title>YouTube: djangocon tag</title><link href="https://simonwillison.net/2008/Sep/16/youtube/#atom-tag" rel="alternate"/><published>2008-09-16T02:43:00+00:00</published><updated>2008-09-16T02:43:00+00:00</updated><id>https://simonwillison.net/2008/Sep/16/youtube/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/results?search_query=djangocon&amp;amp;search=tag"&gt;YouTube: djangocon tag&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Google have started posting videos of presentations at DjangoCon on YouTube.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/youtube"&gt;youtube&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="google"/><category term="python"/><category term="youtube"/></entry><entry><title>DjangoCon and PyCon UK</title><link href="https://simonwillison.net/2008/Sep/15/conferences/#atom-tag" rel="alternate"/><published>2008-09-15T15:20:20+00:00</published><updated>2008-09-15T15:20:20+00:00</updated><id>https://simonwillison.net/2008/Sep/15/conferences/#atom-tag</id><summary type="html">
    &lt;p&gt;September is a big month for conferences. &lt;a href="http://djangocon.org/"&gt;DjangoCon&lt;/a&gt; was a weekend ago in Mountain View (forcing me to miss both &lt;a href="http://2008.dconstruct.org/"&gt;d.Construct&lt;/a&gt; and &lt;a href="http://barcamp.org/BarCampBrighton3"&gt;BarCamp Brighton&lt;/a&gt;), &lt;a href="http://pyconuk.org/"&gt;PyCon UK&lt;/a&gt; was this weekend in Birmingham, I'm writing this from &lt;a href="http://vivabit.com/atmediaAjax/"&gt;@media Ajax&lt;/a&gt; and &lt;a href="http://barcamp.org/BarCampLondon5"&gt;BarCamp London 5&lt;/a&gt; is coming up over another weekend at the end of this month. As always, I've been posting details of upcoming talks and notes and materials from previous ones on &lt;a href="http://simonwillison.net/2008/talks/"&gt;my talks page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DjangoCon went really, really well. Huge thanks to conference chair &lt;a href="http://www.siudesign.co.uk/"&gt;Robert Lofthouse&lt;/a&gt; for pulling it all together in just two months and &lt;a href="http://www.hawthornlandings.org/"&gt;Leslie Hawthorne&lt;/a&gt; for making it all happen from Google's end. Google's facitilies were superb: the AV team were the best I've ever worked with and an army of Google volunteers made sure everything went smoothly. It's hard to see how it could have gone better; the principle complaint we got was that at only two days it was hard to justify the travel, something which future DjangoCons will definitely address.&lt;/p&gt;

&lt;p&gt;Every session was recorded and the videos &lt;del&gt;should be going up on YouTube shortly&lt;/del&gt; &lt;a href="http://www.youtube.com/view_play_list?p=D415FAF806EC47A1"&gt;are now up on YouTube&lt;/a&gt;. For the impatient, you can subscribe to an &lt;a href="http://gdata.youtube.com/feeds/api/videos?vq=DjangoCon"&gt;Atom feed of a YouTube search for "DjangoCon"&lt;/a&gt;. I recommend starting with Cal Henderson's keynote &lt;a href="http://www.youtube.com/watch?v=i6Fr65PFqfk"&gt;"Why I hate Django"&lt;/a&gt; which was both funny and insightful in equal parts. Malcolm's talk on &lt;a href="http://www.youtube.com/watch?v=zlhyp5Ve2qk"&gt;ORM internals&lt;/a&gt; was another personal favourite.&lt;/p&gt;

&lt;p&gt;PyCon UK was the second I've attended, but last year I only stayed for the first day. This time I stuck around and was enormously impressed by the grassroots feel of the conference and the enthusiastic atmosphere. I presented &lt;a href="http://simonwillison.net/2008/talks/pyconuk-admin/"&gt;a tutorial on extending the Django admin&lt;/a&gt; and &lt;a href="http://simonwillison.net/2008/talks/pyconuk-zeppelins/"&gt;a lightning talk on Zeppelins&lt;/a&gt;, prepared two hours in advance after Jacob mentioned that the lightning talks were tending too much towards the technical side. It went down very well; I'm tempted to extend it to a half hour session for BarCamp London.&lt;/p&gt;

&lt;p&gt;Unlike most conferences I attend, PyCon tickets included a sit-down dinner for all attendees complete with a "dramatic lecture" on &lt;a href="http://en.wikipedia.org/wiki/Lunar_Society"&gt;the Lunar Society&lt;/a&gt; presented by &lt;a href="http://www.odyssey.dial.pipex.com/"&gt;Andrew Lound&lt;/a&gt;. This was a great fit for the conference, both for the Birmingham connection and the many analogies to the modern open source community - loose collaboration, patent concerns and what you might call an 18th century equivalent of the modern hacker ethic.&lt;/p&gt;

&lt;p&gt;Next year the PyCon UK team will be hosting EuroPython, and I'm certain they'll do an excellent job of it. Meanwhile, Rob has already started making plans for a Euro DjangoCon in around six months time, probably taking place in Prague.&lt;/p&gt;

    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/andrew-lound"&gt;andrew-lound&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/barcamplondon5"&gt;barcamplondon5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cal-henderson"&gt;cal-henderson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon08"&gt;djangocon08&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/leslie-hawthorne"&gt;leslie-hawthorne&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pyconuk"&gt;pyconuk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pyconuk08"&gt;pyconuk08&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/robert-lofthouse"&gt;robert-lofthouse&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zeppelins"&gt;zeppelins&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="andrew-lound"/><category term="barcamplondon5"/><category term="cal-henderson"/><category term="conferences"/><category term="django"/><category term="djangocon"/><category term="djangocon08"/><category term="google"/><category term="leslie-hawthorne"/><category term="pyconuk"/><category term="pyconuk08"/><category term="python"/><category term="robert-lofthouse"/><category term="speaking"/><category term="my-talks"/><category term="zeppelins"/></entry><entry><title>The web framework for ponies</title><link href="https://simonwillison.net/2008/Sep/9/ponies/#atom-tag" rel="alternate"/><published>2008-09-09T23:59:57+00:00</published><updated>2008-09-09T23:59:57+00:00</updated><id>https://simonwillison.net/2008/Sep/9/ponies/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://avalonstar.com/blog/2008/sep/9/web-framework-ponies/"&gt;The web framework for ponies&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
At DjangoCon Cal Henderson suggested that Django should get a mascot with “magical powers”. Brian Veloso obliges.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/brian-veloso"&gt;brian-veloso&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cal-henderson"&gt;cal-henderson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ponies"&gt;ponies&lt;/a&gt;&lt;/p&gt;



</summary><category term="brian-veloso"/><category term="cal-henderson"/><category term="django"/><category term="djangocon"/><category term="ponies"/></entry><entry><title>Django tickets with keyword "djangocon"</title><link href="https://simonwillison.net/2008/Sep/8/pony/#atom-tag" rel="alternate"/><published>2008-09-08T03:02:11+00:00</published><updated>2008-09-08T03:02:11+00:00</updated><id>https://simonwillison.net/2008/Sep/8/pony/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.djangoproject.com/query?status=new&amp;amp;status=assigned&amp;amp;status=reopened&amp;amp;keywords=%7Edjangocon&amp;amp;order=priority"&gt;Django tickets with keyword &amp;quot;djangocon&amp;quot;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian and Jacob ran an “I want a pony” session during their closing keynote at DjangoCon—I’ve filed the feature requests as tickets tagged with the “djangocon” keyword.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/adrian-holovaty"&gt;adrian-holovaty&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon08"&gt;djangocon08&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/iwantapony"&gt;iwantapony&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tickets"&gt;tickets&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="django"/><category term="djangocon"/><category term="djangocon08"/><category term="iwantapony"/><category term="jacob-kaplan-moss"/><category term="python"/><category term="tickets"/></entry><entry><title>Django 1.0 release party</title><link href="https://simonwillison.net/2008/Aug/27/django/#atom-tag" rel="alternate"/><published>2008-08-27T12:07:15+00:00</published><updated>2008-08-27T12:07:15+00:00</updated><id>https://simonwillison.net/2008/Aug/27/django/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.djangoproject.com/weblog/2008/aug/26/party/"&gt;Django 1.0 release party&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The big ass-party will be at the Tied House in Mountain View on Saturday the 6th from 7pm. RSVP on the linked announcement.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bigassparty"&gt;bigassparty&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mountainview"&gt;mountainview&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/party"&gt;party&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tiedhouse"&gt;tiedhouse&lt;/a&gt;&lt;/p&gt;



</summary><category term="bigassparty"/><category term="django"/><category term="djangocon"/><category term="mountainview"/><category term="party"/><category term="tiedhouse"/></entry><entry><title>DjangoCon &amp; Django 1.0 updates</title><link href="https://simonwillison.net/2008/Jul/30/djangocon/#atom-tag" rel="alternate"/><published>2008-07-30T10:25:24+00:00</published><updated>2008-07-30T10:25:24+00:00</updated><id>https://simonwillison.net/2008/Jul/30/djangocon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.djangoproject.com/weblog/2008/jul/29/updates/"&gt;DjangoCon &amp;amp; Django 1.0 updates&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
DjangoCon tickets will be released in two batches of 100. The first set will be available at 12 noon UTC on Thursday July 31st; the second set will be released at 6pm UTC on Friday August 1st.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/events"&gt;events&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tickets"&gt;tickets&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="events"/><category term="python"/><category term="tickets"/></entry><entry><title>DjangoCon 2008</title><link href="https://simonwillison.net/2008/Jul/20/djangocon/#atom-tag" rel="alternate"/><published>2008-07-20T20:49:07+00:00</published><updated>2008-07-20T20:49:07+00:00</updated><id>https://simonwillison.net/2008/Jul/20/djangocon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://djangocon.org/"&gt;DjangoCon 2008&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The official DjangoCon site is up, along with a mostly complete schedule.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="python"/></entry><entry><title>Quoting Robert Lofthouse</title><link href="https://simonwillison.net/2008/Jul/13/twitter/#atom-tag" rel="alternate"/><published>2008-07-13T16:50:17+00:00</published><updated>2008-07-13T16:50:17+00:00</updated><id>https://simonwillison.net/2008/Jul/13/twitter/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://twitter.com/evilrob/statuses/857131811"&gt;&lt;p&gt;DjangoCon 2008. Venue: Gooleplex, San Francisco Bay Area. Dates: 6th and 7th Sept. Official post will be on djangoproject.com soon.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://twitter.com/evilrob/statuses/857131811"&gt;Robert Lofthouse&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/events"&gt;events&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/googleplex"&gt;googleplex&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/robert-lofthouse"&gt;robert-lofthouse&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/san-francisco"&gt;san-francisco&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="djangocon"/><category term="events"/><category term="google"/><category term="googleplex"/><category term="python"/><category term="robert-lofthouse"/><category term="san-francisco"/></entry><entry><title>Quoting Me</title><link href="https://simonwillison.net/2008/Jul/7/djangocon/#atom-tag" rel="alternate"/><published>2008-07-07T17:14:03+00:00</published><updated>2008-07-07T17:14:03+00:00</updated><id>https://simonwillison.net/2008/Jul/7/djangocon/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://twitter.com/simonw/statuses/852094295"&gt;&lt;p&gt;It looks like the first ever Django conference will take place in early September in the San Francisco bay area.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://twitter.com/simonw/statuses/852094295"&gt;Me&lt;/a&gt;, on Twitter&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/events"&gt;events&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/san-francisco"&gt;san-francisco&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="conferences"/><category term="django"/><category term="djangocon"/><category term="events"/><category term="san-francisco"/><category term="twitter"/></entry></feed>