<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: adrian-holovaty</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/adrian-holovaty.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-08-29T20:02:50+00:00</updated><author><name>Simon Willison</name></author><entry><title>Talk Python: Celebrating Django's 20th Birthday With Its Creators</title><link href="https://simonwillison.net/2025/Aug/29/talk-python/#atom-tag" rel="alternate"/><published>2025-08-29T20:02:50+00:00</published><updated>2025-08-29T20:02:50+00:00</updated><id>https://simonwillison.net/2025/Aug/29/talk-python/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://talkpython.fm/episodes/show/518/celebrating-djangos-20th-birthday-with-its-creators"&gt;Talk Python: Celebrating Django&amp;#x27;s 20th Birthday With Its Creators&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I recorded this podcast episode recently to celebrate Django's 20th birthday with Adrian Holovaty, Will Vincent, Jeff Triplet, and Thibaud Colas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We didn’t know that it was a web framework. We thought it was a tool for building local newspaper websites. [...]&lt;/p&gt;
&lt;p&gt;Django’s original tagline was ‘Web development on journalism deadlines’. That’s always been my favorite description of the project.&lt;/p&gt;
&lt;/blockquote&gt;


    &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/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/podcast-appearances"&gt;podcast-appearances&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="django"/><category term="python"/><category term="podcast-appearances"/></entry><entry><title>Happy 20th birthday Django! Here's my talk on Django Origins from Django's 10th</title><link href="https://simonwillison.net/2025/Jul/13/django-birthday/#atom-tag" rel="alternate"/><published>2025-07-13T18:47:13+00:00</published><updated>2025-07-13T18:47:13+00:00</updated><id>https://simonwillison.net/2025/Jul/13/django-birthday/#atom-tag</id><summary type="html">
    &lt;p&gt;Today is the &lt;a href="https://www.djangoproject.com/weblog/2025/jul/13/happy-20th-birthday-django/"&gt;20th anniversary&lt;/a&gt; of &lt;a href="https://github.com/django/django/commit/d6ded0e91bcdd2a8f7a221f6a5552a33fe545359"&gt;the first commit&lt;/a&gt; to the public Django repository!&lt;/p&gt;
&lt;p&gt;Ten years ago we threw a multi-day 10th birthday party for Django back in its birthtown of Lawrence, Kansas. As a personal celebration of the 20th, I'm revisiting the talk I gave at &lt;em&gt;that&lt;/em&gt; event and writing it up here.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://www.youtube.com/watch?v=wqii_iX0RTs"&gt;the YouTube video&lt;/a&gt;. Below is a full transcript, plus my slides and some present-day annotations.&lt;/p&gt;

&lt;p&gt;&lt;lite-youtube videoid="wqii_iX0RTs" js-api="js-api"
  title="Django Origins"
  playlabel="Play: Django Origins"
&gt; &lt;/lite-youtube&gt;&lt;/p&gt;

&lt;h4&gt;Django Origins (and some things I have built with Django)&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Presented 11th July 2015 at Django Birthday in Lawrence, Kansas&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;My original talk title, as you'll see on your programs, was "Some Things I've Built with Django." But then I realized that we're here in the birthplace of Django, celebrating the 10th birthday of the framework, and nobody's told the origin story yet. So, I've switched things around a little bit. I'm going to talk about the origin story of Django, and then if I have time, I'll do the self-indulgent bit and talk about some of the projects I've shipped since then.&lt;/p&gt;
&lt;p&gt;I think Jacob's introduction hit on something I've never really realized about myself. I do love shipping things. The follow-up and the long-term thing I'm not quite so strong on. And that came to focus when I was putting together this talk and realized that basically every project I'm going to show you, I had to dig out of the Internet Archive.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ten years on from writing this talk I'm proud that I've managed to overcome my weakness in following-up - I'm now actively maintaining a bewildering array of projects, having finally figured out how to &lt;a href="https://simonwillison.net/2022/Nov/26/productivity/"&gt;maintain things&lt;/a&gt; in addition to creating them!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But that said, I will tell you the origin story of Django.&lt;/p&gt;

&lt;div class="slide" id="django-birthday02.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday02.jpg" alt="adrian holovaty blog post

May 31, 2003, 11:49 AM ET
Job opportunity: Web programmer/developer

I interrupt this blogging hiatus to announce a job opportunity.

World Online, my employer here in beautiful Lawrence, Kansas, is looking for another Web programmer to help build cool stuff for our three sites, ljworld.com, lawrence.com and kusports.com ...
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday02.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;For me, the story starts very much like Jacob's. I was reading RSS feeds back in 2003, and I saw &lt;a href="https://www.holovaty.com/writing/211/"&gt;this entry on Adrian's blog&lt;/a&gt;, talking about a job opportunity for a web programmer or developer in Lawrence, Kansas.&lt;/p&gt;
&lt;p&gt;Now, I was in England. I was at university. But my university had just given me the opportunity to take a year abroad, to take a year out to do an internship year in industry. My girlfriend at the time was off to Germany to do her year in industry. So I was like, well, you know, do I stay at university? And then this comes along.&lt;/p&gt;
&lt;p&gt;So I got in touch with Adrian and said, you know, could this work as a year-long internship instead? And he was reading my blog and I was reading his blog, and we knew that we aligned on a bunch of things. So we thought we'd give it a go.&lt;/p&gt;
&lt;p&gt;Now, if you look through this job ad, you'll see that this is all about expert knowledge of PHP and experience designing and maintaining databases, particularly MySQL. So this was a PHP and MySQL gig.&lt;/p&gt;
&lt;p&gt;But when I arrived in Kansas, we quickly realized that we were both kind of over PHP. You know, we'd both built substantial systems in PHP, and we were running up against the limits of what you can do in PHP and have your code still be clean and maintainable.&lt;/p&gt;
&lt;p&gt;And at the same time, we were both reading &lt;a href="https://web.archive.org/web/20020324174618/http://diveintomark.org/"&gt;Mark Pilgrim's blog&lt;/a&gt; (archive link). Mark Pilgrim had been publishing Dive into Python and making a really strong case for why Python was a great web language.&lt;/p&gt;
&lt;p&gt;So we decided that this was the thing we wanted to do. But we both had very strong opinions about how you should build websites. Things like URL design matters, and we care about the difference between get and post, and we want to use this new thing called CSS to lay out our web pages. And none of the existing Python web frameworks really seemed to let us do what we wanted to do.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday03.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday03.jpg" alt="Lawrence JOURNAL-WORLD
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday03.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;Now, before I talk more about that, I'll back up and talk about the organization we're working for, the &lt;a href="https://en.wikipedia.org/wiki/Lawrence_Journal-World"&gt;Lawrence Journal World&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;David &lt;a href="https://www.youtube.com/watch?v=FDsqFD4pDy4"&gt;gave a great introduction&lt;/a&gt; to why this is an interesting organization. Now, we're talking about a newspaper with a circulation of about 10,000, like a tiny newspaper, but with a world-class newsroom, huge amounts of money being funneled into it, and like employing full-time software developers to work at a local newspaper in Kansas.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday04.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday04.jpg" alt="Rob Curley (and a photo of Rob)" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday04.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And part of what was going on here was this guy. This is Rob Curley. He's been mentioned a few times before already.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday05.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday05.jpg" alt="Unofficial mission statement: “build cool shit”
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday05.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And yeah, Rob Curley set this unofficial mission statement that we "build cool shit". This is something that Adrian would certainly never say. It's not really something I'd say. But this is Rob through and through. He was a fantastic showman.&lt;/p&gt;
&lt;p&gt;And this was really the appeal of coming out to Lawrence, seeing the stuff they'd already built and the ambitions they had.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday06.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday06.jpg" alt="Screenshot of Lawrence.com - Focus on Kansas. Community blogs, calendars, merch, links to movies, video games, eating out and more." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday06.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;This is Lawrence.com. This is actually the Lawrence.com written in PHP that Adrian had built as the sole programmer at the Lawrence Journal World. And you should check this out. Like, even today, this is the best local entertainment website I have ever seen. This has everything that is happening in the town of Lawrence, Kansas population, 150,000 people. Every gig, every venue, all of the stuff that's going on.&lt;/p&gt;
&lt;p&gt;And it was all written in PHP. And it was a very clean PHP code base, but it was really stretching the limits of what it's sensible to do using PHP 4 back in 2003.&lt;/p&gt;
&lt;p&gt;So we had this goal when we started using Python. We wanted to eventually rebuild Lawrence.com using Python. But in order to get there, we had to first build -- we didn't even know it was a web framework. We called it the CMS.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday07.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday07.jpg" alt="6 Weather Lawrence. An image shows the Lawrence skyline with different conditions for the next 6 days." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday07.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And so when we started working on Django, the first thing that we shipped was actually this website. We had a lot of the six-news Lawrence. This is the six-news Lawrence -- six-news is the TV channel here -- six-news Lawrence weather page.&lt;/p&gt;
&lt;p&gt;And I think this is pretty cool. So Dan Cox, the designer, was a fantastic illustrator. We actually have this illustration of the famous Lawrence skyline with each panel could be displayed with different weather conditions depending on the weather.&lt;/p&gt;
&lt;p&gt;And in case you're not from Kansas, you might not have realized that the weather is a big deal here. You know, you have never seen more excited weathermen than when there's a tornado warning and they get to go on local news 24 hours a day giving people updates.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday08.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday08.jpg" alt="6 News Lawrence - 6 TV news anchor portrait photos in the heading." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday08.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So we put the site live first. This was the first ever Django website. We then did the rest of the 6 News Lawrence website.&lt;/p&gt;
&lt;p&gt;And this -- Adrian reminded me this morning -- the launch of this was actually delayed by a week because the most important feature on the website, which is clearly the photograph of the news people who are on TV, they didn't like their hairdos. They literally told us we couldn't launch the website until they'd had their hair redone, had the headshots retaken, had a new image put together. But, you know, image is important for these things.&lt;/p&gt;
&lt;p&gt;So anyway, we did that. We did six-news Lawrence. And by the end of my year in Kansas, Adrian had rewritten all of Lawrence.com as well.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday09.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday09.jpg" alt="Lawrence.com with a new design, it looks very cool." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday09.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So this is the Lawrence.com powered by Django. And one thing I think is interesting about this is when you talk to like David Heinemeier Hansson about Rails, he'll tell you that Rails is a framework that was extracted from Basecamp. They built Basecamp and then they pulled out the framework that they used and open sourced it.&lt;/p&gt;
&lt;p&gt;I see Django the other way around. Django is a framework that was built up to create Lawrence.com. Lawrence.com already existed. So we knew what the web framework needed to be able to do. And we just kept on iterating on Django or the CMS until it was ready to produce this site here.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday10.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday10.jpg" alt="LJWorld.com Game 2006 - photos of kids playing sports, stories about kid sports, links to photo galleries and playing locations and schedules and more." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday10.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And for me, the moment I realized that we were onto something special was actually when we built this thing. This is a classic Rob Curley project. So Rob was the boss. He had the crazy ideas and he didn't care how you implemented them. He just wanted this thing done.&lt;/p&gt;
&lt;p&gt;And he came to us one day and said, you know, the kids' little league season is about to start. Like kids playing softball or baseball. Whatever the American kids with bats thing is. So he said, kids' little league season is about to start. And we are going to go all out.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday11.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday11.jpg" alt="A Game page showing DCABA 10K Blue - a local team plus their schedule." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday11.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;I want to treat these kids like they're the New York Yankees. We're going to have player profiles and schedules and photos and results.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday12.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday12.jpg" alt="A form to sign up for cell phone updates for that team." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday12.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And, you know, we're going to have the ability for parents to get SMS notifications whenever their kid scores.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday13.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday13.jpg" alt="An index page showing 360 degree field photos for 12 different venues around town." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday13.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And we're going to have 360 degree, like, interactive photos of all of the pitches in Lawrence, Kansas, that these kids are playing games on.&lt;/p&gt;
&lt;p&gt;They actually did send a couple of interns out with a rig to take 360 degree virtual panoramas of Fenway Park and Lawrence High School and all of these different places.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday14.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday14.jpg" alt="... in three days
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday14.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And he said -- and it starts in three days. You've got three days to put this all together.&lt;/p&gt;
&lt;p&gt;And we pulled it off because Django, even at that very early stage, had all of the primitives you needed to build 360 degree interactives. That was all down to the interns. But we had all of the pieces we needed to pull this together.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday15.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday15.jpg" alt="&amp;quot;The CMS&amp;quot;" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday15.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So when we were working on it back then, we called it the CMS.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday16.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday16.jpg" alt="brazos
webbing
physique
anson
The Tornado Publishing System
private dancer
fizgig
lavalier
pythy

https://jacobian.org/writing/private_dancer/
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday16.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;A few years ago, &lt;a href="https://jacobian.org/2005/sep/9/private_dancer/"&gt;Jacob found a wiki page&lt;/a&gt; with some of the names that were being brainstormed for the open source release. And some of these are great. There's Brazos -- I don't know where that came from -- Webbing, Physique, Anson.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday17.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday17.jpg" alt="Highlighted: The Tornado Publishing System" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday17.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;This is my favorite name. I think this is what I proposed -- is the Tornado Publishing System.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday18.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday18.jpg" alt="Screenshot from Office Space. Lumbergh says &amp;quot;Yeah, if you could go ahead and get those TPS reprots to me as soon as possible... that&amp;#39;d be great&amp;quot;." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday18.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And the reason is that I was a really big fan of &lt;a href="https://en.wikipedia.org/wiki/Office_Space"&gt;Office Space&lt;/a&gt;. And if we had the Tornado, we could produce TPS reports, which I thought would be amazing.&lt;/p&gt;
&lt;p&gt;But unfortunately, this being Kansas, the association of Tornadoes isn't actually a positive one.&lt;/p&gt;
&lt;p&gt;Private Dancer, Physgig, Lavalia, Pithy -- yeah. I'm very, very pleased that they picked the name that they did.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday19.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday19.jpg" alt="“Wouldn&amp;#39;t It be cool If...”
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday19.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So one of our philosophies was build cool shit. The other philosophy we had was what we called "Wouldn't it be cool if?"&lt;/p&gt;
&lt;p&gt;So there were no user stories or careful specs or anything. We'd all sit around in the basement and then somebody would go "Wouldn't it be cool if...", and they'd say something. And if we thought it was a cool idea, we'd build it and we'd ship it that day.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday20.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday20.jpg" alt="Lawrence.com featured audio page - a list of bands each with links to their music and information about where they are playing in town this week." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday20.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And my favorite example of "Wouldn't it be cool if?" -- this is a classic Adrian one -- is "Wouldn't it be cool if the downloads page on Lawrence.com featured MP3s you could download of local bands?" And seeing as we've also got the schedule of when the bands are playing, why don't we feature the audio from bands who you can go and see that week?&lt;/p&gt;
&lt;p&gt;So this page will say, "OK Jones are playing on Thursday at the Bottleneck. Get their MP3. Listen to the radio station." We had a little MP3 widget in there. Go and look at their band profile. All of this stuff.&lt;/p&gt;
&lt;p&gt;Really, these kinds of features are what you get when you take 1970s relational database technology and use it to power websites, which -- back in 2003, in the news industry -- still felt incredibly cutting edge. But, you know, it worked.&lt;/p&gt;
&lt;p&gt;And that philosophy followed me through the rest of my career, which is sometimes a good idea and often means that you're left maintaining features that seemed like a good idea at the time and quickly become a massive pain!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday21.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday21.jpg" alt="YAHOO!
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday21.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;After I finished my internship, I finished my degree in England and then ended up joining up with Yahoo. I was actually working out of the Yahoo UK office but for a R&amp;amp;D team in the States. I was there for about a year and a half.&lt;/p&gt;
&lt;p&gt;One of the things I learned is that you should never go and work for an R&amp;amp;D team, because the problem with R&amp;amp;D teams is you never ship. I was there for a year and a half and I basically have nothing to show for it in terms of actual shipped features.&lt;/p&gt;
&lt;p&gt;We built some very cool prototypes. And actually, after I left, one of the projects I worked on, &lt;a href="https://en.wikipedia.org/wiki/Fire_Eagle"&gt;Yahoo FireEagle&lt;/a&gt;, did end up getting spun out and turned into a real product.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday22.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday22.jpg" alt="YAHOO! ASTRONEWSOLOGY

Dick Cheneey (age 65)

Compare their horoscope with our recent news stories!

A very close friend or a member of your current peer group -- who means a great deal to you -- has recently found it necessary to go out of their way to tick you off. At least, that&amp;#39;s the way it seems. It&amp;#39;s worked, too -- better than it should have. You&amp;#39;re not just angry, you&amp;#39;re furious. Before you let go and let them have it, be sure you&amp;#39;re right. Feeling righteous is far better than feeling guilty

Fox News wins battle for Cheney interview (Reuters) - 16th February, 12:13
Cheney Says He Has Power to Declassify Info (AP) - 16th February, 09:56
Cheney Mishap Takes Focus Off CIA Leak (AP) - 16th February, 09:13
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday22.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;But there is one project -- the first project I built at Yahoo using Django that I wanted to demonstrate. This was for Yahoo's internal hack day. And so Tom Coates and myself, who were working together, we decided that we were going to build a mashup, because it was 2005 and mashups were the cutting edge of computer science.&lt;/p&gt;
&lt;p&gt;So we figured, OK, let's take the two most unlikely Yahoo products and combine them together and see what happens. My original suggestion was that we take Yahoo Dating and Yahoo Pets. But I was told that actually there was this thing called Dogster and this other thing called Catster, which already existed and did exactly that.&lt;/p&gt;
&lt;p&gt;So the next best thing, we went for Yahoo News and Yahoo Horoscopes. And what we ended up building -- and again, this is the first Django application within Yahoo -- was Yahoo Astronewsology.&lt;/p&gt;
&lt;p&gt;And the idea was you take the news feed from Yahoo News, you pull out anything that looks like it's a celebrity's name, look up their birth date, use that to look up their horoscope, and then combine them on the page.
And in a massive stroke of luck, we built this the week that Dick Cheney &lt;a href="https://en.wikipedia.org/wiki/Dick_Cheney_hunting_accident"&gt;shot his friend in the face&lt;/a&gt; while out hunting.&lt;/p&gt;
&lt;p&gt;Dick Cheney's horoscope for that week says, "A very close friend who means a great deal to you has found it necessary to go out of their way to tick you off. You're not just angry, you're furious. Before you let go and let them have it, be sure you're right. Feeling righteous is far better than feeling guilty."&lt;/p&gt;
&lt;p&gt;And so if Dick Cheney had only had only been reading his horoscopes, maybe that whole situation would have ended very differently.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday23.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday23.jpg" alt="The Guardian" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday23.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So after Yahoo, I spent a while doing consulting and things, mainly &lt;a href="https://simonwillison.net/tags/openid/"&gt;around OpenID&lt;/a&gt; because I was determined to make OpenID work. I was absolutely convinced that if OpenID didn't take off, just one company would end up owning single sign-on for the entire internet, and that would be a total disaster.&lt;/p&gt;
&lt;p&gt;And with hindsight, it didn't quite happen. Facebook login looked like it was going to do that a few years ago, but these days there's enough variety out there that I don't feel like we all have to submit to our Facebook masters.&lt;/p&gt;
&lt;p&gt;But, you know, I was enjoying freelancing and consulting and so on. And then I ended up going for coffee with somebody who worked for &lt;a href="https://www.theguardian.com/"&gt;The Guardian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm sure you've all heard of The Guardian. It's one of England's most internationally focused newspapers. It's a very fine publication. And I realized that I really missed working in a newsroom environment. And I was incredibly jealous of people like Adrian, who'd gone off to the Washington Post and was doing data journalism there, and Derek Willis as well, who bounced from the Post and The New York Times. There was all of this cool data journalism stuff going on.&lt;/p&gt;
&lt;p&gt;And The Guardian's pitch was basically, we've been building a CMS from scratch in Java with a giant team of engineers, and we've built it and it's really cool, but we're not shipping things quickly. We want to start exploring this idea of building things much faster to fit in with the news cycle.&lt;/p&gt;
&lt;p&gt;And that was a very, very tempting thing for me to get involved with. So I went to work for The Guardian.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday24.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday24.jpg" alt="Photo of Simon Rogers, looking like a man who can find you the right data." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday24.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And The Guardian have a really interesting way of doing onboarding of new staff. The way they do it is they set you up on coffee dates with people from all over the organization. So one day you'll be having coffee with somebody who sells ads, and the next day it'll be the deputy editor of the newsroom, and the next day it'll be a journalist somewhere. And each of these people will talk to you and then they'll suggest other people for you to meet up with. So over the first few weeks that you're there, you meet a huge variety of people.&lt;/p&gt;
&lt;p&gt;And time and time again, as I was talking to people, they were saying, "You know what? You should go and talk to Simon Rogers, this journalist in the newsroom."&lt;/p&gt;
&lt;p&gt;This is Simon Rogers. I went down to talk to him, and we had this fascinating conversation. So Simon is a journalist. He worked in the newsroom, and his speciality was gathering data for The Guardian's infographics. Because they are in the paper. They post, they have graphs and charts and all sorts of things like that that they publish.&lt;/p&gt;
&lt;p&gt;It turns out that Simon was the journalist who knew how to get that data out of basically any source you can imagine. If you wanted data, he would make some phone calls, dig into some government contacts and things, and he'd get those raw numbers. And all of the other journalists thought he was a bit weird, because he liked hanging out and editing Excel spreadsheets and stuff.&lt;/p&gt;
&lt;p&gt;So I said to him halfway through this conversation, "Just out of interest, what do you do with those Excel spreadsheets?" And he's like, "Oh, I keep them all on my hard drive." And showed me this folder with hundreds and hundreds of meticulously researched, properly citable news quality spreadsheets full of data about everything you could imagine. And they lived on his hard drive and nowhere else.&lt;/p&gt;
&lt;p&gt;And I was like, "Have you ever talked to anyone in the engineering department upstairs?" And we made this connection.&lt;/p&gt;
&lt;p&gt;And so from then on, we had this collaboration going where he would get data and he'd funnel it to me and see if we could, see if I or someone else in the engineering department at Guardian could do something fun with it.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday25.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday25.jpg" alt="Guardian website screenshot.

BNP members: the far right map of Britain

A court injunction prevents the distribution of the names on the
BNP membership leaked online. This map shows you which
constituencies have the most BNP members

Then a BNP membership by constituency colourful map.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday25.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And so that was some of the most rewarding work of my career, because it's journalism, you know, it's news, it's stuff that matters. The deadlines are ridiculous. If a news story breaks and it takes you three weeks to turn around a piece of data journalism around it, why did you even bother? And it's perfect for applying Django to.&lt;/p&gt;
&lt;p&gt;So the first story I got to work on at the Guardian was actually one of the early WikiLeaks things. This is before WikiLeaks was like massively high profile. But quite early on, WikiLeaks leaked a list of all of the members of the British National Party, basically the British Nazis. They leaked a list of all of their names and addresses.&lt;/p&gt;
&lt;p&gt;And the Guardian is an ethical newspaper, so we're not going to just publish 18,000 people's names and addresses. But we wanted to figure out if there was something we could do that would make use of that data but wouldn't be violating anyone's individual privacy.&lt;/p&gt;
&lt;p&gt;And so what we did is we took all of the addresses, geocoded them, figured out which parliamentary constituency they lived in, and used that to generate a heat map that's actually called a choropleth map, I think, of the UK showing where the hotspots of BNP activity were.&lt;/p&gt;
&lt;p&gt;And this works because in the UK a parliamentary constituency is, they're designed to all have around about the same population. So if you just like make the color denser for the larger numbers of BNP members, you get this really interesting heat map of the country.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday26.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday26.jpg" alt="A photo of that same map shown in a paper newspaper" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday26.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And what was really cool about this is that I did this using SVG, because we have an infographics department with Illustrator who are good at working with SVG. And it's very easy with an SVG file with the right class names on things to set colors on different regions.&lt;/p&gt;
&lt;p&gt;And because we produced it in SVG, we could then hand it over to the print department, and the next day it was out in the paper. It was like a printed thing on paper, on like dead trees distributed all over the country, which I thought was super cool.&lt;/p&gt;
&lt;p&gt;So that was the first data journalism project that we did at The Guardian. And it really helped prove that given the right data sets and like the right tools and a bit of freedom, you can do some really cool things.&lt;/p&gt;
&lt;p&gt;The first few times I did this, I did it by hand. Then we had The Guardian's first hack day and I was like, well okay, I'm going to build a little self-service tool for our infographics journalists to like dump in a bunch of CSV numbers and get one of these maps out of it.&lt;/p&gt;
&lt;p&gt;So I built this tool. I didn't have anywhere official to deploy it, so I just ran it on my Linux desktop underneath my desk. And they started using it and putting things in the paper and I kind of forgot about it. And every now and then I get a little feature request.&lt;/p&gt;
&lt;p&gt;A few years after I left The Guardian, I ran into someone who worked there. And he was like, yeah, you know that thing that you built? So we had to keep your desktop running for six months after you left. And then we had to like convert it into a VMware instance. And as far as I know, my desktop is still running as a VMware instance somewhere in The Guardian.&lt;/p&gt;
&lt;p&gt;Which ties into the Simon database, I guess. The hard thing is building stuff is easy. Keeping it going it turns out is surprisingly difficult.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday27.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday27.jpg" alt="Website:  Investigate your MP&amp;#39;s expenses
mps-expenses.guaraian.co.uk

Join us in digging through the documents of MPs&amp;#39; expenses to identify individual claims, or documents that you think merit further investigation. You can work through your own MP&amp;#39;s expenses, or just hit the button below to start reviewing. 

A progress bar shows 28,801 of you have reviewed 221,220 of them, only 237o612 to go..." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday27.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;This was my favorite project at The Guardian. There was &lt;a href="https://en.wikipedia.org/wiki/United_Kingdom_parliamentary_expenses_scandal"&gt;a scandal in the UK a few years ago&lt;/a&gt; where it turned out that UK members of parliament had all been fiddling their expenses.&lt;/p&gt;
&lt;p&gt;And actually the background on this is that they're the lowest paid MPs anywhere in Europe. And it seems like the culture had become that you become an MP and on your first day somebody takes you aside and goes, look, I know the salary is terrible. But here's how to fill your expenses and make up for it.&lt;/p&gt;
&lt;p&gt;This was a scandal that was brewing for several years. The Guardian had actually filed freedom of information requests to try and get these expense reports. Because they were pretty sure something dodgy was going on. The government had dragged their heels in releasing the documents.&lt;/p&gt;
&lt;p&gt;And then just when they were a month before they finally released the documents, a rival newspaper, the Telegraph, managed to get hold of a leaked copy of all of these expenses. And so the Telegraph had 30 days lead on all of the other newspapers to dig through and try and find the dirt.&lt;/p&gt;
&lt;p&gt;So when they did release the expenses 30 days later, we had a race on our hands because we needed to analyze 20,000 odd pages of documents. Actually, here it says 450,000 pages of documents in order to try and find anything left that was newsworthy.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday28.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday28.jpg" alt="Page 34 of Janet Dean&amp;#39;s Incidental Expenses Provision 2007/08

Much of the page is redacted. 

What kind of page is this? Buttons for:
Claim, Proof, Blank, Other

Is this page interesting? Should we investigate it further?" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday28.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And so we tackled this with crowdsourcing. We stuck up a website. We told people, we told Guardian readers, come to this website, hit the button, we'll show you a random page from someone's expenses. And then you can tell us if you think it's not interesting, interesting, or we should seek an investigative reporter on it.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday29.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday29.jpg" alt="Hywel Francis MP&amp;#39;s expenses

Labour MP for Aberavon. A photo of him smiling. Below is a table of documents each showing progress through reviewing each one." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday29.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And one of the smartest things we did with this is we added a feature where you could put in your postcode, we'd figure out who your MP was, and then we would show you their smug press photo. You know, their smug face next to all of their expense claims that they'd filed.&lt;/p&gt;
&lt;p&gt;And this was incredibly effective. People were like, "Ooh, you look so smug. I'm going to get you." And once we put this up, and within 18 hours, our community had burned through hundreds of thousands of pages of expense documents trying to find this stuff.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday30.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday30.jpg" alt="Screenshot showing thumbnails of a document that is being processed." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday30.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And again, this was built in Django. We had, I think, five days warning that these documents are coming out. And so it was a total, like, I think I built a proof of concept on day one. That was enough to show that it was possible. So I got a team with a designer and a couple of other people to help out. And we had it ready to go when the document dump came out on that Friday.&lt;/p&gt;
&lt;p&gt;And it was pretty successful. We dug up some pretty interesting stories from it. And it was also just a fantastic interactive way of engaging our community. And, you know, the whole crowdsourcing side of it was super fun.&lt;/p&gt;
&lt;p&gt;So I guess the thing I've learned from that is that, oh, my goodness, it's fun working for newspapers. And actually, if you -- the Lawrence Journal world, sadly, no longer has its own technology team. But there was a period a few years ago where they were doing some cracking data journalism work. Things like tracking what the University of Kansas had been using its private jet for, and letting people explore the data around that and so on.&lt;/p&gt;
&lt;p&gt;The other thing we did at the Guardian, this is going back to Simon Rogers, is he had all of these spreadsheets on his hard drive. And we're like, okay, we should really try and publish this stuff as raw data. Because living on your hard drive under your head is a crying shame.&lt;/p&gt;
&lt;p&gt;And the idea we came up with was essentially to start something we called &lt;a href="https://www.theguardian.com/news/datablog/2009/mar/10/blogpost1"&gt;the Data blog&lt;/a&gt; and publish them as Google spreadsheets. You know, we spent a while thinking, well, you know, what's the best format to publish these things in? And we're like, well, they're in Excel. Google spreadsheets exists and it's pretty good. Let's just put a few of them up as Google sheets and see what people do with them.&lt;/p&gt;
&lt;p&gt;And it turns out that was enough to build this really fun community of data nerds around the Guardian's data blog who would build their own visualizations. They'd dig into the data. And it meant that we could get all sorts of -- like, we could get so much extra value from the work that we were already doing to gather these numbers for the newspaper. That stuff was super fun.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday31.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday31.jpg" alt="Side projects
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday31.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;Now, while I was working at the Guardian, I also got into the habit of building some projects with my girlfriend at the time, now my wife Natalie. So Natalie and I have skill sets that fit together very nicely. She's a front-end web developer. I do back-end Django stuff. I do just enough ops to be dangerous. And so between the two of us, we can build websites.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday32.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday32.jpg" alt="Django People

A map of the world with green markers, plus a table of the countries with the most registered Django community members." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday32.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;The first things we worked on together is a site which I think some people here should be familiar with, called Django People. The idea was just, you know, the Django community appears to be quite big now. Let's try and get people to stick a pin on a map and tell us where they are.&lt;/p&gt;
&lt;p&gt;Django People still exists today. It's online thanks to a large number of people constantly bugging me at Django Cons and saying, look, just give us the code and the data and we'll get it set up somewhere so it can continue to work. And that's great. I'm really glad I did that because this is the one project that I'm showing you today which is still available on the web somewhere. (&lt;em&gt;2025 update: the site is no longer online.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;But Django People was really fun. And the thing we learned from this, my wife and I, is that we can work together really well on things.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday33.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday33.jpg" alt="/dev/fort

A photo of a very cool looking sea fortress." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday33.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;The other side project we did was much more of a collaborative effort. Again, this no longer exists, or at least it's no longer up on the web. And I'm deeply sad about this because it's my favorite thing I'm going to show you.&lt;/p&gt;
&lt;p&gt;But before I show you the project, I'll show you how we built it. We were at a BarCamp in London with a bunch of our new friends and somebody was showing photographs of this Napoleonic sea fortress that they had rented out for the weekend from an organization in the UK called &lt;a href="https://www.landmarktrust.org.uk/"&gt;the Landmark Trust&lt;/a&gt;, who basically take historic buildings and turn them into vacation rentals as part of the work to restore them.&lt;/p&gt;
&lt;p&gt;And we were like, "Oh, wouldn't it be funny if we rented a castle for a week and all of us went out there and we built stuff together?" And then we were like, "That wouldn't be funny. That would be freaking amazing."&lt;/p&gt;
&lt;p&gt;So we rented this place. This is called &lt;a href="https://en.wikipedia.org/wiki/Fort_Clonque"&gt;Fort Clonque&lt;/a&gt;. It's in the Channel Islands, halfway between England and France. And I think it cost something like $2,000 for the week, but you split that between a dozen people and it's like youth hostel prices to stay in a freaking fortress.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday34.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday34.jpg" alt="Group photos of people hanging out on the fort with their laptops." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday34.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So we got a bunch of people together and we went out there and we just spent a week. We called it &lt;a href="https://devfort.com/"&gt;/dev/fort&lt;/a&gt;. We spent a week just building something together.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday35.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday35.jpg" alt="Where&amp;#39;s my nearest llama?" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday35.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And the thing we ended up building was called Wildlife Near You. And what Wildlife Near You does is it solves the eternal question, "Where is my nearest llama?"&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday36.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday36.jpg" alt="WildlifeNearYou.com

Seen any more animals? Why not add another trip 
or import some photos from Flickr. Or you could
help people identify the animals in their photos!" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday36.jpg"&gt;#&lt;/a&gt;
  
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday37.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday37.jpg" alt="My family trip to Gigrin Farm r-ed Kite Feeding station on 15th April 2008 

Sightings: Common Raven, Common Buzzard, Red Kite" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday37.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;Once again, this is a crowdsourcing system. The idea is that you go to wildlifenearyou.com and you've just been on a trip to like a nature park or a zoo or something. And so you create a trip report saying, "I went to the Red Kite feeding station and I saw a common raven and a common buzzard and a red kite." And you import any of your photos from Flickr and so forth.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday38.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday38.jpg" alt="WildlifeNearYou: cookieyum - list of recent trips for this user" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday38.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And you build up this profile saying, "Here are all the places I've been and my favorite animals and things I've seen."&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday39.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday39.jpg" alt="Search &amp;quot;llamas&amp;quot; near &amp;quot;brighton&amp;quot; - shows Ashdown Forest Llama Farm." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday39.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And then once we've got that data set, we can solve the problem. You can say, "Search for llamas near Brighton." And it'll say, "Your nearest llama is 18 miles away and it'll show you pictures of llamas and all of the llama things."&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday40.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday40.jpg" alt="Red Panda: 17 people love this animal. Link to Wikipedia. Your nearest Red Panda is at Marwell Zoo, 51 miles away from Brighton and Hove UK." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday40.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And we have species pages. So here's the red panda page. 17 people love red pandas. You can see them at Taronga Zoo.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday41.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday41.jpg" alt="Which Marmot photo is better?

Two marmot photos - you can select one or the other or click &amp;quot;skip&amp;quot;." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday41.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And then our most viral feature was we had all of these photos of red pandas, but how do we know which is the best photo of a red panda that we should highlight on the red panda page? So we basically built Hot or Not for photographs of wildlife.&lt;/p&gt;
&lt;p&gt;So it's like, "Which marmot photo is better?" And you say, "Well, clearly the one on the right." And it's like, "Okay, which skunk photo is better?"&lt;/p&gt;
&lt;p&gt;I was looking at the logs and people would go through hundreds and hundreds of photos. And you'd get scores and you can see, "Oh, wow, my marmot photo is the second best marmot photo on the whole website."&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday42.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday42.jpg" alt="Find owls near you!
owlsnearyou.com
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday42.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So that was really fun. And then we eventually took it a step further and said, "Okay, well, this is really fun, but this is a website that you have to type on, right?" And meanwhile, mobile phones are now getting HTML5 geolocation and stuff. So can we go a step further?&lt;/p&gt;
&lt;p&gt;So we built owlsnearyou.com. And what owlsnearyou.com does is you type in the location, and it says, "Your nearest owl is 49 miles away." It's a spectacle owl at London Zoo. It was spotted one year ago by Natalie.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday43.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday43.jpg" alt="Owls near 2-3 Kensington St,
Brighton, Brighton and Hove

49.1 miles away
We think your nearest owl is a Spectacled Owl at London Zoo! Spotted
twice, most recently by natbat 1 year ago.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday43.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And if you went here on a mobile phone-- If you went here on a device that supported geolocation, it doesn't even ask you where you live. It's just like, "Oh, okay, here's your nearest owl."&lt;/p&gt;
&lt;p&gt;And I think we shipped lions near you and monkeys near you and a couple of other domains, but owlsnearyou.com was always my favorite.&lt;/p&gt;
&lt;p&gt;So looking at this now, we should really get this stuff up and running again. It was freaking amazing. Like, this for me is the killer app of all killer apps.&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;We did eventually bring this idea back as &lt;a href="https://www.owlsnearme.com/"&gt;www.owlsnearme.com&lt;/a&gt;, using data from &lt;a href="https://www.inaturalist.org/"&gt;iNaturalist&lt;/a&gt; - that's online today.&lt;/em&gt;)&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday44.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday44.jpg" alt="‘Bugle is a Twitter-like
application for groups of
hackers collaborating in a
castle (or fort, or other
defensive structure) with no
internet connection”
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday44.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So there have actually been a bunch of Devforts since then. One of the things we learned from Devfort is that building applications-- If you want to do a side project, doing one with user accounts and logins and so on, it's a freaking nightmare. It actually took us almost a year after we finished on the fort to finally ship Wildlife Near You because there were so many complexities. And then we had to moderate it and keep an eye on it and so on.&lt;/p&gt;
&lt;p&gt;So if you look at the more recent Devforts, they've taken that to heart. And now they try and ship things which just work and don't require ongoing users logging in and all of that kind of rubbish.&lt;/p&gt;
&lt;p&gt;But one of the other projects I wanted to show you that came out of a Devfort was something called Bugle. And the idea of Bugle is Bugle is a Twitter-like application for groups of hackers collaborating in a castle, fort, or other defensive structure who don't have an internet connection.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday45.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday45.jpg" alt="Screenshot of Bugle - it looks like Twitter, has a &amp;quot;blast! button, various messages include todo list items and git commits and messages and at-mentions" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday45.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;This was basically to deal with Twitter withdrawal when we were all on the fort together and we had an internal network. So Bugle, looking at it now, we could have been Slack! We could have been valued at $2 billion.&lt;/p&gt;
&lt;p&gt;Yeah, Bugle is like an internal Twitter clone with a bunch of extra features like it's got a paste bin and to-do lists and all sorts of stuff like that.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday46.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday46.jpg" alt="So I said to Ben Firshman...
“Wouldn&amp;#39;t it be cool if Twitter
apps on the network could
talk to Bugle instead?”
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday46.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And does anyone here know Ben Firshman? I think quite a few people do. Excellent. So Ben Firshman was out on a Devfort and I did a "Wouldn't it be cool if" on him. I said, "Wouldn't it be cool if all of our Twitter apps and our phones talked to Bugle instead on the network?"&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday47.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday47.jpg" alt="Magic Twitter support

To make Twitter clients magically work with Bugle on a network, we need to mess with BIND.

Shows BIND settings" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday47.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And so if you &lt;a href="https://github.com/simonw/bugle_project/blob/master/README.md#magic-twitter-support"&gt;go and look on GitHub&lt;/a&gt;, I bet this doesn't work anymore. But he did add magic Twitter support where you could run a local DNS server, redirect Twitter to Bugle and we cloned, he cloned enough of the Twitter API that like Twitter apps would work and it would be able to Bugle instead.&lt;/p&gt;
&lt;p&gt;We wanted to do a Devfort in America. You don't really have castles and forts that you can rent for the most part. If anyone knows of one, please come and talk to me because there's a distinct lack of defensible structures at least of the kind that we are used to back in Europe.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday48.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday48.jpg" alt="Lanyrd.com
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday48.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So I'm running out of time, but that's OK because the most recent project, Lanyrd, is something which most people here have probably encountered.&lt;/p&gt;
&lt;p&gt;I will tell a little bit of the backstory of Lanyrd because it's kind of fun.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday49.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday49.jpg" alt="A photo of Natalie and myself in wedding attire with a Golden Eagle perched on a glove on my hand." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday49.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;Lanyrd was a honeymoon project. &lt;/p&gt;
&lt;p&gt;Natalie and I got married.  The wildlife near you influence affected our wedding - it was a freaking awesome wedding! You know, in England, you can get a man with a golden eagle and a barn owl and various other birds to show up for about $400 for the day. And then you get to take photos like this.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday50.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday50.jpg" alt="Natalie and I riding a camel on a beach" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday50.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So anyway, we got married, we quit our jobs, I had to leave the Guardian because we wanted to spend the next year or two of our lives just traveling around the world, doing freelancing work on our laptops and so on.&lt;/p&gt;
&lt;p&gt;We got as far as Morocco, we were six months in, when we contracted food poisoning in Casablanca and we were too sick to keep on travelling, so we figured we needed to like, you know, and it was also Ramadan, so it was really hard to get food and stuff. So we rented an apartment for two weeks and said, "Okay, well, since we're stuck for two weeks, let's like finish that side project we've been talking about and ship it and see if anyone's interested."&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday51.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday51.jpg" alt="Lanyrd screenshot: Your contacts&amp;#39; calendar. Shows 303 conferences your Twitter contacts are interested in." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday51.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So we shipped Lanyrd, which was built around the idea of helping people who use Twitter find conferences and events to go to. What we hadn't realised is that if you build something around Twitter, especially back in 2010, it instantly goes viral amongst people who use Twitter.&lt;/p&gt;
&lt;p&gt;So that ended up cutting our honeymoon short, and we actually applied for Y Combinator from Egypt and ended up spending three years building a startup and like hiring people and doing that whole thing.&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;Natalie wrote more about our startup in &lt;a href="https://blog.natbat.net/post/61658401806/lanyrd-from-idea-to-exit-the-story-of-our"&gt;Lanyrd: from idea to exit - the story of our startup&lt;/a&gt;.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;The only thing I'll say about that is everything in the... Startups have to give the impression that everything's super easy and fun and cool all the time, because people say, "How's your startup going?" And the only correct answer is, "Oh man, it's amazing. It's doing so well." Because everyone has to lie about the misery, pain, anguish and stress that's happening behind the scenes.&lt;/p&gt;
&lt;p&gt;So it was a very interesting three years, and we built some cool stuff and we learnt a lot, and I don't regret it, but do not take startups lightly.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday52.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday52.jpg" alt="Eventbrite
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday52.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;So a year and a half ago, we ended up selling Lanyrd to Eventbrite and moving out to San Francisco. And at Eventbrite, I've been mostly on the management team building side of things, but occasionally managing to sneak some code out as well.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday53.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday53.jpg" alt="Screenshot of the My Events page on Eventbrite - at the top is an orange bar showing SQL render time and number of templates and log lines and requests." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday53.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;The one thing I want to show you from Eventbrite, because I really want to open source this thing, is again at Hack Day, we built a tool called the Tikibar, which is essentially like the Django debug toolbar, but it's designed to be run in production. Because the really tough things to debug don't happen in your dev environment. They happen in production when you're hitting a hundred million row database or whatever.&lt;/p&gt;
&lt;p&gt;And so the Tikibar is designed to add as little overhead as possible, but to still give you detailed timelines of SQL queries that are executing and service calls and all of that kind of stuff. It's called the Tikibar because I really like Tikibars.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday54.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday54.jpg" alt="The orange bar is now expanded, it shows a line for each SQL query with a timeline indicating how long each one took." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday54.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;And the best feature is if a page takes over 500 milliseconds to load, the eyes on the Tiki God glow red in disapproval at you.&lt;/p&gt;
&lt;p&gt;If anyone wants a demo of that, come and talk to me. I would love to get a few more instrumentation hooks into Django to make this stuff easier.&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;The Tikibar was eventually open sourced as &lt;a href="https://github.com/eventbrite/tikibar"&gt;eventbrite/tikibar&lt;/a&gt; on GitHub.&lt;/em&gt;)&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="django-birthday55.jpg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2025/django-birthday/django-birthday55.jpg" alt="“build cool shit”
(thanks, Rob)
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2025/Jul/13/django-birthday/#django-birthday55.jpg"&gt;#&lt;/a&gt;
  &lt;p&gt;This has been a whistle-stop tour of the highlights of my career working with Django.&lt;/p&gt;
&lt;p&gt;And actually, in putting this presentation together, I realized that really it's that Rob Curley influence from all the way back in 2003. The reason I love Django is it makes it really easy to build cool shit and to ship it. And, you know, swearing aside, I think that's a reasonable moral to take away from this.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="colophon"&gt;Colophon&lt;/h4&gt;
&lt;p&gt;I put this annotated version of my 10 year old talk together using a few different tools.&lt;/p&gt;
&lt;p&gt;I fetched the audio from YouTube using &lt;a href="https://github.com/yt-dlp/yt-dlp"&gt;yt-dlp&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp -x --audio-format mp3 \
  "https://youtube.com/watch?v=wqii_iX0RTs"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I then ran &lt;a href="https://static.simonwillison.net/static/2025/django-birthday.mp3"&gt;the mp3&lt;/a&gt; through &lt;a href="https://goodsnooze.gumroad.com/l/macwhisper"&gt;MacWhisper&lt;/a&gt; to generate an initial transcript. I cleaned that up by &lt;a href="https://claude.ai/share/5fc8a371-7000-4373-afd6-91f1347680cc"&gt;pasting it into Claude Opus 4&lt;/a&gt; with this prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Take this audio transcript of a talk and clean it up very slightly - I want paragraph breaks and tiny edits like removing ums or "sort of" or things like that, but other than that the content should be exactly as presented.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I converted &lt;a href="https://static.simonwillison.net/static/2025/django-birthday.pdf"&gt;a PDF of the slides&lt;/a&gt; into a JPEG per page using this command (found with the &lt;a href="https://github.com/simonw/llm-cmd"&gt;llm-cmd&lt;/a&gt; plugin):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pdftoppm -jpeg -jpegopt quality=70 django-birthday.pdf django-birthday
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I used my &lt;a href="https://tools.simonwillison.net/annotated-presentations"&gt;annotated presentations tool&lt;/a&gt; (&lt;a href="https://simonwillison.net/2023/Aug/6/annotated-presentations/"&gt;described here&lt;/a&gt;) to combine the slides and transcript, making minor edits and adding links using Markdown in that interface.&lt;/p&gt;
    
        &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/devfort"&gt;devfort&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/history"&gt;history&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/lawrence"&gt;lawrence&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lawrence-com"&gt;lawrence-com&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lawrence-journal-world"&gt;lawrence-journal-world&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&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/the-guardian"&gt;the-guardian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/annotated-talks"&gt;annotated-talks&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="devfort"/><category term="django"/><category term="history"/><category term="jacob-kaplan-moss"/><category term="lawrence"/><category term="lawrence-com"/><category term="lawrence-journal-world"/><category term="python"/><category term="my-talks"/><category term="the-guardian"/><category term="annotated-talks"/></entry><entry><title>Adding a feature because ChatGPT incorrectly thinks it exists</title><link href="https://simonwillison.net/2025/Jul/7/chatgpt-incorrectly-thinks-it-exists/#atom-tag" rel="alternate"/><published>2025-07-07T15:29:38+00:00</published><updated>2025-07-07T15:29:38+00:00</updated><id>https://simonwillison.net/2025/Jul/7/chatgpt-incorrectly-thinks-it-exists/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.holovaty.com/writing/chatgpt-fake-feature/"&gt;Adding a feature because ChatGPT incorrectly thinks it exists&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian Holovaty describes how his &lt;a href="https://soundslice.com/"&gt;SoundSlice&lt;/a&gt; service saw an uptick in users attempting to use their sheet music scanner to import ASCII-art guitar tab... because it turned out ChatGPT had hallucinated that as a feature SoundSlice supported and was telling users to go there!&lt;/p&gt;
&lt;p&gt;So they built that feature. Easier than convincing OpenAI to somehow patch ChatGPT to stop
it from hallucinating a feature that doesn't exist.&lt;/p&gt;
&lt;p&gt;Adrian:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To my knowledge, this is the first case of a company developing a feature because ChatGPT is incorrectly telling people it exists. (Yay?)&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=44491071"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &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/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hallucinations"&gt;hallucinations&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="chatgpt"/><category term="llms"/><category term="ai-ethics"/><category term="hallucinations"/></entry><entry><title>State-of-the-art music scanning by Soundslice</title><link href="https://simonwillison.net/2024/Jun/20/music-scanning-by-soundslice/#atom-tag" rel="alternate"/><published>2024-06-20T04:37:28+00:00</published><updated>2024-06-20T04:37:28+00:00</updated><id>https://simonwillison.net/2024/Jun/20/music-scanning-by-soundslice/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.soundslice.com/sheet-music-scanner/"&gt;State-of-the-art music scanning by Soundslice&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It's been a while since I checked in on &lt;a href="https://www.soundslice.com/"&gt;Soundslice&lt;/a&gt;, Adrian Holovaty's beautiful web application focused on music education.&lt;/p&gt;
&lt;p&gt;The latest feature is spectacular. The Soundslice music editor - already one of the most impressive web applications I've ever experienced - can now import notation directly from scans or photos of sheet music.&lt;/p&gt;
&lt;p&gt;The attention to detail is immaculate. The custom machine learning model can handle a wide variety of notation details, and the system asks the user to verify or correct details that it couldn't perfectly determine using a neatly designed flow.&lt;/p&gt;
&lt;p&gt;Free accounts can scan two single page documents a month, and paid plans get a much higher allowance. I tried it out just now on a low resolution image I found on Wikipedia and it did a fantastic job, even allowing me to listen to a simulated piano rendition of the music once it had finished processing.&lt;/p&gt;
&lt;p&gt;It's worth spending some time with the &lt;a href="https://www.soundslice.com/blog/music-scanning/"&gt;release notes&lt;/a&gt; for the feature to appreciate how much work they've out into improving it since the initial release.&lt;/p&gt;
&lt;p&gt;If you're new to Soundslice, here's &lt;a href="https://www.soundslice.com/slices/RXTDc/course-preview-5904/"&gt;an example&lt;/a&gt; of their core player interface which syncs the display of music notation to an accompanying video.&lt;/p&gt;
&lt;p&gt;Adrian wrote up some &lt;a href="https://www.holovaty.com/writing/machine-learning-thoughts/"&gt;detailed notes&lt;/a&gt; on the machine learning behind the feature when they first launched it in beta back in November 2022.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OMR [Optical Music Recognition] is an inherently hard problem, significantly more difficult than text OCR. For one, music symbols have complex spatial relationships, and mistakes have a tendency to cascade. A single misdetected key signature might result in &lt;em&gt;multiple&lt;/em&gt; incorrect note pitches. And there’s a wide diversity of symbols, each with its own behavior and semantics — meaning the problems and subproblems aren’t just hard, there are &lt;em&gt;many&lt;/em&gt; of them.&lt;/p&gt;
&lt;/blockquote&gt;


    &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/machine-learning"&gt;machine-learning&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/music"&gt;music&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ocr"&gt;ocr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="machine-learning"/><category term="music"/><category term="ocr"/><category term="ai"/></entry><entry><title>Let websites framebust out of native apps</title><link href="https://simonwillison.net/2022/Aug/10/let-websites-framebust-out-of-native-apps/#atom-tag" rel="alternate"/><published>2022-08-10T22:29:42+00:00</published><updated>2022-08-10T22:29:42+00:00</updated><id>https://simonwillison.net/2022/Aug/10/let-websites-framebust-out-of-native-apps/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.holovaty.com/writing/framebust-native-apps/"&gt;Let websites framebust out of native apps&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian Holovaty makes a compelling case that it is Not OK that we allow native mobile apps to embed our websites in their own browsers, including the ability for them to modify and intercept those pages (it turned out today that Instagram injects extra JavaScript into pages loaded within the Instagram in-app browser). He compares this to frame-busting on the regular web, and proposes that the X-Frame-Options: DENY header which browsers support to prevent a page from being framed should be upgraded to apply to native embedded browsers as well.&lt;/p&gt;

&lt;p&gt;I’m not convinced that reusing X-Frame-Options: DENY would be the best approach—I think it would break too many existing legitimate uses—but a similar option (or a similar header) specifically for native apps which causes pages to load in the native OS browser instead sounds like a fantastic idea to me.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/adrianholovaty/status/1557478354152034305"&gt;@adrianholovaty&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &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/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/privacy"&gt;privacy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="browsers"/><category term="privacy"/><category term="security"/></entry><entry><title>Twenty years of my blog</title><link href="https://simonwillison.net/2022/Jun/12/twenty-years/#atom-tag" rel="alternate"/><published>2022-06-12T22:59:31+00:00</published><updated>2022-06-12T22:59:31+00:00</updated><id>https://simonwillison.net/2022/Jun/12/twenty-years/#atom-tag</id><summary type="html">
    &lt;p&gt;I started this blog on &lt;a href="https://simonwillison.net/2002/Jun/12/"&gt;June 12th 2002&lt;/a&gt; - twenty years ago today! To celebrate two decades of blogging, I decided to pull together some highlights and dive down a self-indulgent nostalgia hole.&lt;/p&gt;
&lt;h4&gt;Some highlights&lt;/h4&gt;
&lt;p&gt;Some of my more influential posts, in chronological order.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2002/Sep/2/aNewXMLRPCLibraryForPHP/"&gt;A new XML-RPC library for PHP&lt;/a&gt;&lt;/strong&gt; - 2nd September 2002&lt;/p&gt;
&lt;p&gt;I was really excited about XML-RPC, one of the earliest technologies for building Web APIs. IXR, the Incutio library for XML-RPC, was one of my earliest ever open source library releases. Here's &lt;a href="https://web.archive.org/web/20060316094837/http://scripts.incutio.com/xmlrpc/"&gt;a capture of the old site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/ixr-20060316094837.jpg" alt="Website: The Incutio XML-RPC Library for PHP. Version 1.6, pbulished May 25th 2003." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;I've not touched anything relating to this project in over 15 years now, but it has lived on in both &lt;a href="https://github.com/WordPress/WordPress/blob/270f2011f8ec7265c3f4ddce39c77ef5b496ed1c/wp-includes/class-IXR.php"&gt;WordPress&lt;/a&gt; and &lt;a href="https://github.com/d6lts/drupal/blob/6.x/includes/xmlrpc.inc"&gt;Drupal&lt;/a&gt; (now only in Drupal 6 LTS).&lt;/p&gt;
&lt;p&gt;It's also been responsible for &lt;a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-5266"&gt;at least one CVE vulnerability&lt;/a&gt; in those platforms!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2003/Mar/25/getElementsBySelector/"&gt;getElementsBySelector()&lt;/a&gt;&lt;/strong&gt; - 25th March 2003&lt;/p&gt;
&lt;p&gt;Andrew Hayward had posted a delightful snippet of JavaScript called &lt;a href="https://web.archive.org/web/20030402172546/http://blog.mooncalf.me.uk/archive/2003/03/25"&gt;document.getElementsByClassName()&lt;/a&gt; - like &lt;code&gt;document.getElementsByTagName()&lt;/code&gt; but for classes instead.&lt;/p&gt;
&lt;p&gt;Inspired by this, I built &lt;code&gt;document.getElementsBySelector()&lt;/code&gt; - a function that could take a CSS selector and return all of the matching elements.&lt;/p&gt;
&lt;p&gt;This ended up being very influential indeed! Paul Irish offers &lt;a href="https://www.paulirish.com/2008/javascript-css-selector-engine-timeline/"&gt;a timeline of JavaScript CSS selector engines&lt;/a&gt; which tracks some of what happens next. Most notably, &lt;code&gt;getElementsBySelector()&lt;/code&gt; was part of John Resig's &lt;a href="https://johnresig.com/blog/annotated-version-of-the-original-jquery-release/"&gt;inspiration&lt;/a&gt; in creating the first version of jQuery. To this day, the jQuery source includes &lt;a href="https://github.com/jquery/jquery/blob/a684e6ba836f7c553968d7d026ed7941e1a612d8/test/data/qunit-fixture.html"&gt;this testing fixture&lt;/a&gt; which is derived from &lt;a href="https://static.simonwillison.net/static/2003/getElementsBySelector.html"&gt;my original demo page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess you could call &lt;code&gt;document.getElementsBySelector()&lt;/code&gt; the original &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Polyfill"&gt;polyfill&lt;/a&gt; for &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll"&gt;document.querySelectorAll()&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2003/Aug/27/kansas/"&gt;I'm in Kansas&lt;/a&gt;&lt;/strong&gt; - 27th August 2003&lt;/p&gt;
&lt;p&gt;In May 2003 Adrian Holovaty &lt;a href="https://www.holovaty.com/writing/211/"&gt;posted about a job opportunity&lt;/a&gt; for a web developer at at the Lawrence Journal-World newspaper in Lawrence, Kansas.&lt;/p&gt;
&lt;p&gt;This coincided with my UK university offering a "year in industry" placement, which meant I could work for a year anywhere in the world with a student visa program. I'd been reading Adrian's blog for a while and really liked the way he thought about building for the web - we were big fans of Web Standards and CSS and cleanly-designed URLs, all of which were very hot new things at the time!&lt;/p&gt;
&lt;p&gt;So I talked to Adrian about if this could work as a year-long opportunity, and we figured out how to make it work.&lt;/p&gt;
&lt;p&gt;At the Lawrence Journal-Word Adrian and I decided to start using Python instead of PHP, in order to build a CMS for that local newspaper...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2005/Jul/17/django/"&gt;Introducing Django&lt;/a&gt;&lt;/strong&gt; - 17th July 2005&lt;/p&gt;
&lt;p&gt;... and this was the eventual outcome! Adrian and I didn't even know we were building a web framework at first - we called it "the CMS". But we kept having to solve new foundational problems: how should database routing work? What about templating? What's the best way to represent the incoming HTTP request?&lt;/p&gt;
&lt;p&gt;I had left the Lawrence Journal-World in 2004, but by 2005 the team there had grown what's now known as Django far beyond where it was when I had left, and they got the go-ahead from the company to release it as open source (partly thanks to the example set by Ruby on Rails, which first released in August 2004).&lt;/p&gt;
&lt;p&gt;In 2010 I wrote up &lt;a href="https://simonwillison.net/2010/Aug/24/what-is-the-history/"&gt;a more detailed history&lt;/a&gt; of Django in a Quora answer, now mirrored to my blog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2006/Dec/15/upgrade/"&gt;Finally powered by Django&lt;/a&gt;&lt;/strong&gt; - 15th December 2006&lt;/p&gt;
&lt;p&gt;In which I replaced my duct-tape-and-mud PHP blogging engine with a new Django app. I sadly don't have the version history for this anymore (this was pre-git, I think I probably had it in Subversion or Mercurial somewhere) but today's implementation is still based on the same code, upgraded to Django 1.8 &lt;a href="https://github.com/simonw/simonwillisonblog/commit/e6d0327b37debdf820b5cfef4fb7d09a9624cea9"&gt;in 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That 2006 version did include a very pleasing Flickr integration to import my photos (&lt;a href="https://web.archive.org/web/20080720032451/https://simonwillison.net/2005/Jan/6/"&gt;example on the Internet Archive&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of my blog's archive page for 6th January 2005 with my old design - it included photosets from Flickr mixed in among the links, as well as a set of photo thumbnails in the right hand navigation underneath the calendar widget" src="https://static.simonwillison.net/static/2022/web-archive-org-web-20080720032451-https--simonwillison-net-2005-Jan-6.jpg" style="max-width: 100%" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2006/Dec/19/openid/"&gt;How to turn your blog in to an OpenID&lt;/a&gt;&lt;/strong&gt; - 19th December 2006&lt;/p&gt;
&lt;p&gt;In late 2006 I got very, very excited about &lt;a href="https://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt;. I was convinced that Microsoft Passport was going to take over SSO on the internet, and that the only way to stop that was to promote an open, decentralized solution. I wrote posts about it, &lt;a href="https://web.archive.org/web/20070227104926/http://simonwillison.net/2006/openid-screencast/"&gt;made screencasts&lt;/a&gt; (that one &lt;a href="https://web.archive.org/web/20070302124121/https://digg.com/programming/Screencast_How_to_use_OpenID"&gt;got 840 diggs&lt;/a&gt;! Annoyingly I was serving it from the Internet Archive who &lt;a href="http://archive.org/download/openid-howto/openid-howto.mp4"&gt;appear to have deleted it&lt;/a&gt;) and gave a whole bunch of conference talks about it too.&lt;/p&gt;
&lt;p&gt;I spent the next few years advocating for OpenID - in particular the URL-based OpenID mechanism where any website can be turned into an identifier. It didn't end up taking off, and with hindsight I think that's likely for the best: expecting people to take control of their own security by chosing their preferred authentication provider sounded great to me in 2006, but I can understand why companies chose to instead integrate with a smaller, tightly controlled set of SSO partners over time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2009/Mar/10/openplatform/"&gt;A few notes on the Guardian Open Platform&lt;/a&gt;&lt;/strong&gt; - 10th March 2009&lt;/p&gt;
&lt;p&gt;In 2009 I was working at &lt;a href="https://www.theguardian.co.uk/"&gt;the Guardian&lt;/a&gt; newspaper in London in my first proper data journalism role - my work at the Lawrence Journal-World had hinted towards that a little, but I spent the vast majority of my time there building out a CMS.&lt;/p&gt;
&lt;p&gt;In March we launched two major initiatives: the Datablog (also known as the Data Store) and the Guardian's Open Platform (an API that is &lt;a href="https://open-platform.theguardian.com/"&gt;still offered to this day&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The goal of the Datablog was to &lt;a href="https://www.theguardian.com/news/datablog/2009/mar/10/blogpost1"&gt;share the data behind the stories&lt;/a&gt;. Simon Rogers, the Guardian's data editor, had been collecting meticulous datasets about the world to help power infographics in the paper for years. The new plan was to share that raw data with the world.&lt;/p&gt;
&lt;p&gt;We started out using Google Sheets for this. I desperately wanted to come up with something less proprietary than that - I spent quite some time experimenting with &lt;a href="https://en.wikipedia.org/wiki/Apache_CouchDB"&gt;CouchDB&lt;/a&gt; - but Google Sheets was more than enough to get the project started.&lt;/p&gt;
&lt;p&gt;Many years later my continued mulling of this problem formed part of the inspiration for my creation of &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt;, a story I told in my 2018 PyBay talk &lt;a href="https://simonwillison.net/2018/Aug/19/instantly-publish-datasette/"&gt;How to Instantly Publish Data to the Internet with Datasette&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2009/Oct/22/redis/"&gt;Why I like Redis&lt;/a&gt;&lt;/strong&gt; -  22nd October 2009&lt;/p&gt;
&lt;p&gt;I got interested in NoSQL for a few years starting around 2009. I still think Redis was the most interesting new piece of technology to come out of that whole movement - an in-memory data structure server exposed over the network turns out to be a fantastic complement for other data stores, and even though I now default to PostgreSQL or SQLite for almost everything else I can still find problems for which Redis is a great solution.&lt;/p&gt;
&lt;p&gt;In April 2010 I gave a three hour Redis tutorial at NoSQL Europe which I wrote up in &lt;a href="https://simonwillison.net/2010/Apr/25/redis/"&gt;Comprehensive notes from my three hour Redis tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2009/Nov/23/node/"&gt;Node.js is genuinely exciting&lt;/a&gt;&lt;/strong&gt; -  23rd November 2009&lt;/p&gt;
&lt;p&gt;In December 2009 I found out about Node.js. As a Python web developer I had been following the evolution of &lt;a href="https://en.wikipedia.org/wiki/Twisted_(software)"&gt;Twisted&lt;/a&gt; with great interest, but I'd also run into the classic challenge that once you start using event-driven programming almost every library you might want to use likely doesn't work for you any more.&lt;/p&gt;
&lt;p&gt;Node.js had server-side event-driven programming baked into its very core. You couldn't accidentally make a blocking call and break your event loop because it didn't ever give you the option to do so!&lt;/p&gt;
&lt;p&gt;I liked it so much I switched out my talk for &lt;a href="https://2009.ffconf.org/"&gt;Full Frontal 2009&lt;/a&gt; at the last minute for one about Node.js instead.&lt;/p&gt;
&lt;p&gt;I think this was an influential decision. I won't say who they are (for fear of mis-representing or mis-quoting them), but I've talked to entrepreneurs who built significant products on top of server-side JavaScript who told me that they heard about Node.js from me first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2009/Dec/20/crowdsourcing/"&gt;Crowdsourced document analysis and MP expenses&lt;/a&gt;&lt;/strong&gt; - 20th December 2009&lt;/p&gt;
&lt;p&gt;This was my biggest data journalism project at the Guardian.&lt;/p&gt;
&lt;p&gt;The UK government had finally got around to releasing our Member of Parliament expense reports, and there was a giant scandal brewing about the expenses that had been claimed. We recruited our audience to help dig through 10,000s of pages of PDFs to help us find more stories.&lt;/p&gt;
&lt;p&gt;The first round of the MP's expenses crowdsourcing project launched &lt;a href="https://simonwillison.net/2009/Jun/18/"&gt;in June&lt;/a&gt;, but I was too busy working on it to properly write about it! Charles Arthur wrote about it for the Guardian in &lt;a href="https://www.theguardian.com/politics/2009/jun/18/mps-expenses-crowdsourcing-app"&gt;The breakneck race to build an application to crowdsource MPs' expenses&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In December we launched round two, and I took the time to &lt;a href="https://simonwillison.net/2009/Dec/20/crowdsourcing/"&gt;write about it properly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's a &lt;a href="https://scholar.google.com/scholar?hl=en&amp;amp;as_sdt=0%2C5&amp;amp;q=guardian+mp+expenses&amp;amp;btnG="&gt;Google Scholar search for guardian mps expenses&lt;/a&gt; - I think it was pretty influential. It's definitely one of the projects I'm most proud of in my career so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2010/Jan/12/wildlifenearyou/"&gt;WildlifeNearYou: It began on a fort...&lt;/a&gt;&lt;/strong&gt; - 12th January 2010&lt;/p&gt;
&lt;p&gt;In October 2008 I participated in the first &lt;a href="https://devfort.com/"&gt;/dev/fort&lt;/a&gt; - a bunch of nerds rent a fortress (or similar historic building) for a week and hack on a project together.&lt;/p&gt;
&lt;p&gt;Following that week of work it took 14 months to add the "final touches" before putting the site we had built live (partly because I insisted on implementing OpenID for it) but in January 2010 we finally went live with WildlifeNearYou.com (sadly no longer available). It was a fabulous website, which crowdsourced places that people had seen animals in order to answer the crucial question "where is my nearest Llama?".&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://web.archive.org/web/20100324200252/http://www.wildlifenearyou.com:80/"&gt;what it looked like&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/wildlifenearyou-20100324200252.jpg" alt="Find and share places to see wildlife: WildlifeNearYou is a site for sharing your passion for wildlife. Search for animals or places near you, or register to add your own trips and photos." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Although it shipped after the Guardian MP's expenses project most of the work on WildlifeNearYou had come before that - building WildlifeNearYou (in Django) was the reason I was confident that the MP's expenses project was feasible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2010/Jun/21/married/"&gt;Getting married and going travelling&lt;/a&gt;&lt;/strong&gt; - 21st June 2010&lt;/p&gt;
&lt;p&gt;One June 5th 2010 I married Natalie Downe, and we both quit our jobs to set off travelling around the world and see how far we could get.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2010/me-nat-eagle.jpg" alt="Natalie is wearing a bridal gown. I am in a suit. I have a terrifying Golden Eagle perched on my arm." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;We got as far as Casablanca, Morocco before we accidentally launched a startup together: Lanyrd, launched &lt;a href="https://simonwillison.net/2010/Aug/31/lanyrd/"&gt;in August 2010&lt;/a&gt;. "Sign in with Twitter to see conferences that your friends are speaking at, attending or tracking, then add your own events."&lt;/p&gt;
&lt;p&gt;We ended up spending the next three years on this: we went through Y Combinator, raised a sizable seed round, moved to London, hired a team and shipped a LOT of features. We even managed to ship some features that made the company money!&lt;/p&gt;
&lt;p&gt;This also coincided with me putting the blog on the back-burner for a few years.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://web.archive.org/web/20101118055319/https://lanyrd.com/"&gt;an early snapshot&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/lanyrd-20101118055319.jpg" alt="Welcome to Lanyrd. The social conference directory. Get more out of conferences. Find great conferences to attend: See what your friends are going to or speaking at, find conferences near you or browse conferences by topic. Discover what's hot while it's on: Track what's going on during the conference, even if you aren't there. Who is tweeting what, what links are doing the rounds. Use our useful mobile version to decide what to go to next. Catch up on anything you missed: Easily discover slides, video and podcasts from conferences you attended or tracked. If you spoke at an event you can build up your speaker portfolio of talks you gave." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;In 2013 we sold Lanyrd to Eventbrite, and moved our entire team (and their families) from London to San Francisco. It had been a very wild ride.&lt;/p&gt;
&lt;p&gt;Sadly the site itself is no longer available: as Eventbrite grew it became impossible to justify the work needed to keep Lanyrd maintained, safe and secure. Especially as it started to attract overwhelming volumes of spam.&lt;/p&gt;
&lt;p&gt;Natalie told the full story of Lanyrd on her blog in September 2013: &lt;a href="https://blog.natbat.net/post/61658401806/lanyrd-from-idea-to-exit"&gt;Lanyrd: from idea to exit - the story of our startup&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2017/Sep/10/scraping-irma/"&gt;Scraping hurricane Irma&lt;/a&gt;&lt;/strong&gt; - 10th September 2017&lt;/p&gt;
&lt;p&gt;In 2017 &lt;a href="https://en.wikipedia.org/wiki/Hurricane_Irma"&gt;hurricane Irma&lt;/a&gt; devastated large areas of the Caribbean and the southern USA.&lt;/p&gt;
&lt;p&gt;I got involved with the Irma Response project, helping crowdsource and publish critical information for people affected by the storm.&lt;/p&gt;
&lt;p&gt;I came up with a trick to help with scraping: I ran scrapers against important information sources and recorded the results to a git repository, in order to cheaply track changes to those sources over time.&lt;/p&gt;
&lt;p&gt;I later coined the term "Git scraping" for this technique, see my &lt;a href="https://simonwillison.net/series/git-scraping/"&gt;series of posts&lt;/a&gt; about Git scraping over time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2017/Oct/1/ship/"&gt;Getting the blog back together&lt;/a&gt;&lt;/strong&gt; - 1st October 2017&lt;/p&gt;
&lt;p&gt;Running a startup, and then working at Eventbrite afterwards, had resulted in an almost 7 year gap in blogging for me. In October 2017 I decided to finally get my blog going again. I also back-filled content for the intervening years by scraping my content &lt;a href="https://simonwillison.net/tags/quora/"&gt;from Quora&lt;/a&gt; and &lt;a href="https://simonwillison.net/tags/askmetafilter/"&gt;from Ask Metafilter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you've been meaning to start a new blog or revive an old one this is a trick that I can thoroughly recommend: just because you initially wrote something elsewhere doesn't mean you shouldn't repost it on a site you own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2017/Oct/8/missing-content/"&gt;Recovering missing content from the Internet Archive&lt;/a&gt;&lt;/strong&gt; - 8th October 2017&lt;/p&gt;
&lt;p&gt;The other step in recovering my old blog's content was picking up some content that was missing from my old database backup. Here's how I pulled in that content by scraping the Internet Archive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2017/Oct/5/django-postgresql-faceted-search/"&gt;Implementing faceted search with Django and PostgreSQL&lt;/a&gt;&lt;/strong&gt; -  5th October 2017&lt;/p&gt;
&lt;p&gt;I absolutely love building faceted search engines. I realized a while ago that most of my career has been spent applying the exact same trick - faceted search - to different problem spaces. WildlifeNearYou offered faceted search over animal sightings. MP's expenses had faceted search across crowdsourced expense analysis. Lanyrd was faceted search for conferences.&lt;/p&gt;
&lt;p&gt;I implemented &lt;a href="https://simonwillison.net/search/"&gt;faceted search&lt;/a&gt; for this blog on top of PostgreSQL, and wrote about how I did it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2017/Nov/13/datasette/"&gt;Datasette: instantly create and publish an API for your SQLite databases&lt;/a&gt;&lt;/strong&gt; - 13th November 2017&lt;/p&gt;
&lt;p&gt;I shipped the first release of &lt;a href="https://github.com/simonw/datasette"&gt;simonw/datasette&lt;/a&gt; in Nevember 2017. Nearly five years later it's now my number-one focus, and I don't see myself losing interest in it for many decades to come.&lt;/p&gt;
&lt;p&gt;Datasette was inspired by the Guardian Datablog, combined with my realization that Zeit Now (today called &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt;) meant you could bundle data up in a SQLite database and deploy it as part of an exploratory application almost for free.&lt;/p&gt;
&lt;p&gt;My blog has &lt;a href="https://simonwillison.net/search/?q=&amp;amp;tag=datasette"&gt;284 items tagged datasette&lt;/a&gt; at this point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2018/May/20/datasette-facets/"&gt;Datasette Facets&lt;/a&gt;&lt;/strong&gt; - 20th May 2018&lt;/p&gt;
&lt;p&gt;Given how much I love faceted search, it's surprising it took me until May 2018 to realize that I could bake them into Datasette itself - turning it into a tool for building faceted search engines against any data. It turns out to be my ideal solution to my favourite problem!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2018/Jul/28/documentation-unit-tests/"&gt;Documentation unit tests&lt;/a&gt;&lt;/strong&gt; - 28th July 2018&lt;/p&gt;
&lt;p&gt;I figured out a pattern for using unit tests to ensure that features of my projects were covered by the documentation. Four years later I can confirm that this technique works &lt;em&gt;really well&lt;/em&gt; - though I wish I'd called it Test-driven documentation instead!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2018/Sep/18/letterboxing-lundy/"&gt;Letterboxing on Lundy&lt;/a&gt;&lt;/strong&gt; - 18th September 2018&lt;/p&gt;
&lt;p&gt;A brief foray into travel writing: Natalie and I spent a few days staying in a small castle on the delightful island of Lundy off the coast of North Devon, and I used it as an opportunity to enthuse about letterboxing and the Landmark Trust.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2018/lundy/IMG_5999.JPG" alt="A small, battered looking castle on a beautiful, remote looking moor" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2019/Feb/25/sqlite-utils/"&gt;sqlite-utils: a Python library and CLI tool for building SQLite databases&lt;/a&gt;&lt;/strong&gt; - 25th February 2019&lt;/p&gt;
&lt;p&gt;Datasette helps you explore and publish data stored in SQLite, but how do you get data into SQLite in the first place?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sqlite-utils.datasette.io/"&gt;sqlite-utils&lt;/a&gt; is my answer to that question - a combined CLI tool and Python library with all sorts of utilites for working with and creating SQLite databases.&lt;/p&gt;
&lt;p&gt;It recently had its &lt;a href="https://github.com/simonw/sqlite-utils/releases"&gt;100th release&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2019/Mar/7/oil-painting/"&gt;I commissioned an oil painting of Barbra Streisand’s cloned dogs&lt;/a&gt;&lt;/strong&gt; - 7th March 2019&lt;/p&gt;
&lt;p&gt;Not much I can add that's not covered by the title. It's a really good painting!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2019/oil-painting-framed.jpg" alt="A framed oil painting showing two small fluffy white dogs in a stroller, gazing at the tombstone of the dog from which they were cloned." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2019/Sep/10/jsk-fellowship/"&gt;My JSK Fellowship: Building an open source ecosystem of tools for data journalism&lt;/a&gt;&lt;/strong&gt; - 10th September 2019&lt;/p&gt;
&lt;p&gt;In late 2019 I left Eventbrite to join the JSK fellowship program at Stanford. It was an opportunity to devote myself full-time to working on my growing collection of open source tools for data journalism, centered around Datasette.&lt;/p&gt;
&lt;p&gt;I jumped on that opportunity with both hands, and I've been mostly working full-time on Datasette and &lt;a href="https://github.com/simonw/simonw/blob/main/releases.md"&gt;associated projects&lt;/a&gt; (without being paid for it since the fellowship ended) ever since.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2019/Sep/13/weeknotestwitter-sqlite-datasette-rure/"&gt;Weeknotes: ONA19, twitter-to-sqlite, datasette-rure&lt;/a&gt;&lt;/strong&gt; - 13th September 2019&lt;/p&gt;
&lt;p&gt;At the start of my fellowship I decided to publish weeknotes, to keep myself accountable for what I was working on now that I didn't have the structure of a full-time job.&lt;/p&gt;
&lt;p&gt;I've managed to post them roughly once a week ever since - &lt;a href="https://simonwillison.net/tags/weeknotes/"&gt;128 posts and counting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I absolutely love weeknotes as a format. Even if no-one else ever reads them, I find them really useful as a way to keep track of my progress and ensure that I have motivation to get projects to a point where I can write about them at the end of the week!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2020/Apr/20/self-rewriting-readme/"&gt;Using a self-rewriting README powered by GitHub Actions to track TILs&lt;/a&gt;&lt;/strong&gt; - 20th April 2020&lt;/p&gt;
&lt;p&gt;In April 2020 I started publishing TILs - Today I Learneds - at &lt;a href="https://til.simonwillison.net/"&gt;til.simonwillison.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea behind TILs is to dramatically reduce the friction involved in writing a blog post. If I learned something that was useful to me, I'll write it up as a TIL. These often take less than ten minutes to throw together and I find myself referring back to them all the time.&lt;/p&gt;
&lt;p&gt;My main blog is a Django application, but my TILs run entirely using Datasette. You can see how that all works in the &lt;a href="https://github.com/simonw/til"&gt;simonw/til&lt;/a&gt; GitHub repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2020/May/21/dogsheep-photos/"&gt;Using SQL to find my best photo of a pelican according to Apple Photos&lt;/a&gt;&lt;/strong&gt; - 21st May 2020&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dogsheep.github.io/"&gt;Dogsheep&lt;/a&gt; is my ongoing side project in which I explore ways to analyze my own personal data using SQLite and Datasette.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://datasette.io/tools/dogsheep-photos"&gt;dogsheep-photos&lt;/a&gt; is my tool for extracting metadata about my photos from the undocumented Apple Photos SQLite database (building on &lt;a href="https://github.com/RhetTbull/osxphotos"&gt;osxphotos&lt;/a&gt; by Rhet Turnbull). I had been wanting to solve the photo problem for years and was delighted when osxphotos provided the capability I had been missing. And I really like pelicans, so I celebrated by using my photos of them for the demo.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://photos.simonwillison.net/i/a444857c4ac71ceae6af5192c8acc5ac35934ed589259136df0ed11295dbb085.jpeg?w=800" alt="A glorious pelican, wings oustretched" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2020/Oct/9/git-scraping/"&gt;Git scraping: track changes over time by scraping to a Git repository&lt;/a&gt;&lt;/strong&gt; - 9th October 2020&lt;/p&gt;
&lt;p&gt;If you really want people to engage with a technique, it's helpful to give it a name. I defined Git scraping in this post, and I've been promoting it heavily ever since.&lt;/p&gt;
&lt;p&gt;There are now &lt;a href="https://github.com/topics/git-scraping?o=desc&amp;amp;s=updated"&gt;275 public repositories&lt;/a&gt; on GitHub with the &lt;code&gt;git-scraping&lt;/code&gt; topic, and if you &lt;a href="https://github.com/topics/git-scraping?o=desc&amp;amp;s=updated"&gt;sort them by recently updated&lt;/a&gt; you can see the scrapers on there that most recently captured some new data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2020/Nov/14/personal-data-warehouses/"&gt;Personal Data Warehouses: Reclaiming Your Data&lt;/a&gt;&lt;/strong&gt; - 14th November 2020&lt;/p&gt;
&lt;p&gt;I gave this talk for GitHub's OCTO (previously Office of the CTO, since rebranded to GitHub Next) speaker series.&lt;/p&gt;
&lt;p&gt;It's the Dogsheep talk, with a better title (thanks, &lt;a href="https://twitter.com/idangazit"&gt;Idan&lt;/a&gt;!) It includes a full video demo of my personal Dogsheep instance, including my dog's Foursquare checkins, my Twitter data, Apple Watch GPS trails and more.&lt;/p&gt;
&lt;p&gt;I also explain why I called it Dogsheep: it's a devastatingly terrible pun &lt;a href="https://simonwillison.net/2019/Feb/22/seeking-productive-life-some-details-my-personal-infrastructure/"&gt;on Wolfram&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm frustrated when information like this is only available in video format, so when I give particularly information-dense talks I like to turn them into full write-ups as well, providing extra notes and resources alongside screen captures from the talk.&lt;/p&gt;
&lt;p&gt;For this one &lt;a href="https://github.com/simonw/simonwillisonblog/commit/c4ecae7a17e6bbe8aee60a23d9f45ee874cadfbc"&gt;I added a custom template mechanism&lt;/a&gt; to my blog, to allow me to break out of my usual entry page design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2021/Feb/28/vaccinateca/"&gt;Trying to end the pandemic a little earlier with VaccinateCA&lt;/a&gt;&lt;/strong&gt; - 28th February 2021&lt;/p&gt;
&lt;p&gt;In February 2021 I joined the VaccinateCA effort to try and help end the pandemic a little bit earlier by crowdsourcing information about the best places to get vaccinated. It was a classic match-up for my skills and interests: a huge crowdsourcing effort that needed to be spun up as a fresh Django application as quickly as possible.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://django-sql-dashboard.datasette.io/"&gt;Django SQL Dashboard&lt;/a&gt; was one project that spun directly out of that effort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2021/Jul/28/baked-data/"&gt;The Baked Data architectural pattern&lt;/a&gt;&lt;/strong&gt; - 28th July 2021&lt;/p&gt;
&lt;p&gt;My second attempt at coining a new term, after Git scraping: Baked Data is the name I'm using for the architectural pattern embodied by Datasette where you bundle a read-only copy of your data alongside the code for your application, as part of the same deployment. I think it's a really good idea, and more people should be doing it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://simonwillison.net/2022/Jan/12/how-i-build-a-feature/"&gt;How I build a feature&lt;/a&gt;&lt;/strong&gt; - 12th January 2022&lt;/p&gt;
&lt;p&gt;Over the years I’ve evolved a processes for feature development that works really well for me, and scales down to small personal projects as well as scaling up to much larger pieces of work. I described that in detail in this post.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Picking out these highlights wasn't easy. I ended up setting myself a time limit (to ensure I could put this post live within a minute of midnight UTC time on my blog's 20th birthday) so there's plenty more that I would have liked to dig up.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://simonwillison.net/tags/"&gt;tags index page&lt;/a&gt; includes a 2010s-style word cloud that you can visit if you want to explore the rest of my content. Or use the faceted search!&lt;/p&gt;
&lt;p&gt;A few more project release highlights:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2020/Aug/7/datasette-graphql/"&gt;GraphQL in Datasette with the new datasette-graphql plugin&lt;/a&gt; - 7th August 2020&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2021/Dec/7/git-history/"&gt;git-history: a tool for analyzing scraped data collected using Git and SQLite&lt;/a&gt; - 7th December 2021&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2022/Mar/10/shot-scraper/"&gt;shot-scraper: automated screenshots for documentation, built on Playwright&lt;/a&gt; - 10th March 2022&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2021/May/10/django-sql-dashboard/"&gt;Django SQL Dashboard&lt;/a&gt; - 10th May 2021&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2021/Sep/8/datasette-desktop/"&gt;Datasette Desktop—a macOS desktop application for Datasette&lt;/a&gt; - 8th September 2021&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2022/May/4/datasette-lite/"&gt;Datasette Lite: a server-side Python web application running in a browser&lt;/a&gt; - 4th May 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Evolution over time&lt;/h4&gt;
&lt;p&gt;I started my blog in my first year of as a student studying computer science at the University of Bath.&lt;/p&gt;
&lt;p&gt;You can tell that Twitter wasn't a thing yet, because I wrote &lt;a href="https://simonwillison.net/2002/Jun/"&gt;107 posts in that first month&lt;/a&gt;. Lots of links to other people's blog posts (we did a lot of that back then) with extra commentary. Lots of blogging about blogging.&lt;/p&gt;
&lt;p&gt;That first version of the site was hosted at &lt;code&gt;http://www.bath.ac.uk/~cs1spw/blog/&lt;/code&gt; - on my university's student hosting. Sadly the Internet Archive doesn't have a capture of it there, since I moved it to &lt;code&gt;http://simon.incutio.com/&lt;/code&gt; (my part-time employer at the time) in September 2002. Here's &lt;a href="https://simonwillison.net/2002/Sep/9/newHosting/"&gt;my note&lt;/a&gt; from then about rewriting it to use MySQL instead of flat file storage.&lt;/p&gt;
&lt;p&gt;This is the earliest capture I could find &lt;a href="https://web.archive.org/web/20030610004652/http://simon.incutio.com/"&gt;on the Internet Archive&lt;/a&gt;, from June 2003:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/simonwillison-blog-20030610004652.jpg" alt="My blog in June 2003. The header and highlight colours were orange, the rest was black on white text. The tagline reads: PHP, PYthon, CSS, XML and general web development. The sidebar includes a &amp;quot;Blogs I read&amp;quot; section with notes as to when each one was last updated. My top post that day talks about Using boomarklets to experiment with CSS." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Full entry on &lt;a href="https://simonwillison.net/2003/Jun/3/bookmarkletsAndCSS/"&gt;Using bookmarklets to experiment with CSS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By &lt;a href="https://web.archive.org/web/20061113072435/http://simon.incutio.com/"&gt;November 2006&lt;/a&gt; I had redesigned from orange to green, and started writing Blogmarks - the name I used for small, bookmark-style link posts. I've collected &lt;a href="https://simonwillison.net/search/?type=blogmark"&gt;6,304 of them&lt;/a&gt; over the years!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/simonwillison-blog-20061113072435.jpg" alt="My blog in June 2003. The header and highlight colours were orange, the rest was black on white text. The tagline reads: PHP, PYthon, CSS, XML and general web development. The sidebar includes a &amp;quot;Blogs I read&amp;quot; section with notes as to when each one was last updated. My top post that day talks about Using boomarklets to experiment with CSS." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20100726061941/http://simonwillison.net/"&gt;By 2010&lt;/a&gt; I'd reached more-or-less my current purple on white design, albeit with the ability to sign in with OpenID to post a comment. I dropped comments entirely when I relaunched in 2017 - constantly fighting against spam comments makes blogging much less fun.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/simonwillison-20100726061941.jpg" alt="My blog in July 2010. It's the same visual design as today, but with an option to sign in with OpenID and a little bubble next to each item showing the number of comments." style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;p&gt;The source code for the current iteration of my blog is available &lt;a href="https://github.com/simonw/simonwillisonblog"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="internet-archive-screenshots"&gt;Taking screenshots of the Internet Archive with shot-scraper&lt;/h4&gt;
&lt;p&gt;Here's how I generated the screenshots in this post, using &lt;a href="https://shot-scraper.datasette.io/"&gt;shot-scraper&lt;/a&gt; against the Internet Archive but with a line of JavaScript to hide the banner the display at the top of every archived page:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shot-scraper 'https://web.archive.org/web/20030610004652/http://simon.incutio.com/' \
  --javascript 'document.querySelector("#wm-ipp-base").style.display="none"' \
   --width 800 --height 600 --retina
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mgdlbp on Hacker News &lt;a href="https://news.ycombinator.com/item?id=31729477"&gt;pointed out&lt;/a&gt; that you can instead add &lt;code&gt;if_&lt;/code&gt; to the date part of the archive URLs to hide the banner, like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shot-scraper 'https://web.archive.org/web/20030610004652if_/http://simon.incutio.com/' \
   --width 800 --height 600 --retina
&lt;/code&gt;&lt;/pre&gt;
    
        &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/blogging"&gt;blogging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/personal-news"&gt;personal-news&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="blogging"/><category term="personal-news"/></entry><entry><title>What is the history of the Django web framework? Why has it been described as "developed in a newsroom"?</title><link href="https://simonwillison.net/2010/Aug/24/what-is-the-history/#atom-tag" rel="alternate"/><published>2010-08-24T18:15:00+00:00</published><updated>2010-08-24T18:15:00+00:00</updated><id>https://simonwillison.net/2010/Aug/24/what-is-the-history/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-the-history-of-the-Django-web-framework-Why-has-it-been-described-as-developed-in-a-newsroom/answer/Simon-Willison"&gt;What is the history of the Django web framework? Why has it been described as &amp;quot;developed in a newsroom&amp;quot;?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was there!&lt;/p&gt;

&lt;p&gt;Django started when Adrian Holovaty and I were working together for a year at the Lawrence Journal-World newspaper back in 2003-2004.&lt;/p&gt;

&lt;p&gt;I was there on a year long internship (my UK university offered the chance to work abroad). Adrian had already created &lt;span&gt;&lt;a href="http://Lawrence.com"&gt;Lawrence.com&lt;/a&gt;&lt;/span&gt; using PHP, and I had about 5 years of PHP experience. Both of us were fed up with trying to maintain large sites in PHP (this was before namespaces, PHP5 etc so it might be better now, but at the time it started to drag once you got above a certain size of codebase). We had both fallen in love with Python, probably thanks to Mark Pilgrim's Dive Into Python book.&lt;/p&gt;

&lt;p&gt;We wanted to switch to doing web development in Python, but we both had very strong opinions about how web development should work - &lt;span&gt;thinks &lt;/span&gt;&lt;span&gt;things &lt;/span&gt;like the importance of well designed URLs, and making good use of CSS (back in 2004 the Web Standards movement was still a relatively new thing).&lt;/p&gt;

&lt;p&gt;We looked at the existing set of Python tools for web development, but none of them fitted the way we wanted to work. We also looked in to Python deployment options and found that the best bet appeared to be mod_python.&lt;/p&gt;

&lt;p&gt;The original reason for creating Django was that we weren't convinced that mod_python would scale, so we wanted to have our own thin abstraction layer between it and our code just in case we needed to ditch mod_python for something else. That's where the Django HttpRequest / HttpResponse objects came from. (WSGI didn't exist yet - in fact, we got involved on the initial Python Web-SIG mailing list to talk about what became WSGI based on what we were learning while building Django, but that process took several years and the eventual spec didn't look much like our request/response objects).&lt;/p&gt;

&lt;p&gt;We never really intended to build a web framework - for the longest time, the code that became Django was referred to as "the CMS". We pair programmed some of the core aspects of Django - the Request/Response objects, the URL resolving and the template language in particular.&lt;/p&gt;

&lt;p&gt;The ORM started life as some very unpleasant repetitive classes that we kept on having to copy-and-paste for each of our persistent models. We were sure there was a better way of doing it, but we didn't know quite what it was.&lt;/p&gt;

&lt;p&gt;Then I went away to SxSW 2004 for a week, and when I came back Adrian had written a code generator that spat out all of our model classes for us - I think he might even have had it spitting out simple versions of the admin pages as well!&lt;/p&gt;

&lt;p&gt;The aim with Django was always to port &lt;span&gt;&lt;a href="http://lawrence.com"&gt;lawrence.com&lt;/a&gt;&lt;/span&gt; to it - so you could say that while Rails was extracted out of BaseCamp, Django was built up to fit the functionality of &lt;span&gt;&lt;a href="http://lawrence.com"&gt;lawrence.com&lt;/a&gt;&lt;/span&gt;. We also built several new sites on Django - the first ever Django site to go live was &lt;code&gt;6newslawrence.com&lt;/code&gt; (now &lt;a href="https://en.wikipedia.org/wiki/6News_Lawrence"&gt;no longer available&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;My internship only lasted a year, and a month before we left we hired Jacob Kaplan-Moss as my replacement. Jacob and Adrian continued to develop Django, and about a year later convinced the World Company (the owners of the newspaper) to open source it - the successful story of Ruby on Rails was a useful argument there, but I understand the World Company were also convinced by the amount of free software the company had benefited from previously, and the desire to give something back to that community.&lt;/p&gt;

&lt;p&gt;Adrian named it after his favourite guitarist, Django Reinhardt. At some point before then the code generator had been replaced with a much smarter system based on metaclasses - I think Adrian's conversations with Ian Bicking may have influenced that.&lt;/p&gt;

&lt;p&gt;After that, everything is pretty much on the public record.&lt;/p&gt;
    
        &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/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/me"&gt;me&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="django"/><category term="frameworks"/><category term="me"/><category term="quora"/></entry><entry><title>Data Is Journalism: MSNBC.com Acquires Everyblock</title><link href="https://simonwillison.net/2009/Aug/18/everyblock/#atom-tag" rel="alternate"/><published>2009-08-18T12:10:11+00:00</published><updated>2009-08-18T12:10:11+00:00</updated><id>https://simonwillison.net/2009/Aug/18/everyblock/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://radar.oreilly.com/2009/08/data-is-journalism-msnbc-acqui.html"&gt;Data Is Journalism: MSNBC.com Acquires Everyblock&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Congratulations Adrian, Wilson and the team! Brady Forrest reports the acquisition within the larger context of the rise of data-driven journalism.


    &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/brady-forrest"&gt;brady-forrest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/data-journalism"&gt;data-journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/everyblock"&gt;everyblock&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/msnbc"&gt;msnbc&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wilson-miner"&gt;wilson-miner&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="brady-forrest"/><category term="data-journalism"/><category term="everyblock"/><category term="msnbc"/><category term="wilson-miner"/></entry><entry><title>Django tip: Caching and two-phased template rendering</title><link href="https://simonwillison.net/2009/May/19/twophased/#atom-tag" rel="alternate"/><published>2009-05-19T01:34:35+00:00</published><updated>2009-05-19T01:34:35+00:00</updated><id>https://simonwillison.net/2009/May/19/twophased/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/writing/django-two-phased-rendering/"&gt;Django tip: Caching and two-phased template rendering&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat trick for expensive pages which can be mostly cached with the exception of the “logged in as” bit—run them through the template system twice, caching the intermediary generated template.


    &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/caching"&gt;caching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/template"&gt;template&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="caching"/><category term="django"/><category term="performance"/><category term="python"/><category term="template"/></entry><entry><title>The Django Book: Version 2.0</title><link href="https://simonwillison.net/2009/Jan/9/django/#atom-tag" rel="alternate"/><published>2009-01-09T14:54:24+00:00</published><updated>2009-01-09T14:54:24+00:00</updated><id>https://simonwillison.net/2009/Jan/9/django/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.djangobook.com/en/2.0/"&gt;The Django Book: Version 2.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian’s working on a new edition of the Django Book updated to cover version 1.0. As with the first edition, it will be available free online in addition to a published Apress paperback. The first three chapters are now available.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.holovaty.com/blog/archive/2009/01/09/0133"&gt;Adrian Holovaty&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &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/apress"&gt;apress&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/books"&gt;books&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="apress"/><category term="books"/><category term="django"/><category term="python"/></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>Cyberstar</title><link href="https://simonwillison.net/2008/Aug/18/cyberstar/#atom-tag" rel="alternate"/><published>2008-08-18T23:56:42+00:00</published><updated>2008-08-18T23:56:42+00:00</updated><id>https://simonwillison.net/2008/Aug/18/cyberstar/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.chicagotribune.com/business/technology/chi-mxa0817magholovatyaug17,0,2153905.story"&gt;Cyberstar&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian made the front cover of the Chicago Tribune magazine!


    &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/everyblock"&gt;everyblock&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="django"/><category term="everyblock"/></entry><entry><title>themaneater.com Launch</title><link href="https://simonwillison.net/2008/Feb/10/themaneatercom/#atom-tag" rel="alternate"/><published>2008-02-10T08:10:42+00:00</published><updated>2008-02-10T08:10:42+00:00</updated><id>https://simonwillison.net/2008/Feb/10/themaneatercom/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.miketigas.com/2008/02/10/themaneatercom-launch/"&gt;themaneater.com Launch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The Maneater’s online edition is where Adrian cut his web development teeth, so it’s great to see them up and running on Django. Important to note that KeepAlive can completely murder Apache/Django performance.


    &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/apache"&gt;apache&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/keepalive"&gt;keepalive&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/themaneater"&gt;themaneater&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="apache"/><category term="django"/><category term="keepalive"/><category term="themaneater"/></entry><entry><title>Introducing EveryBlock</title><link href="https://simonwillison.net/2008/Jan/23/introducing/#atom-tag" rel="alternate"/><published>2008-01-23T21:56:55+00:00</published><updated>2008-01-23T21:56:55+00:00</updated><id>https://simonwillison.net/2008/Jan/23/introducing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.everyblock.com/2008/jan/23/launch/"&gt;Introducing EveryBlock&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
EveryBlock launched! Adrian Holovaty, Wilson Miner, Paul Smith and Daniel X. O’Neil’s startup which answers the question, “What’s happening in my neighborhood?” Cities covered by the launch are Chicago, New York and San Francisco.


    &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/chicago"&gt;chicago&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/daniel-x-oneil"&gt;daniel-x-oneil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/everyblock"&gt;everyblock&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/new-york"&gt;new-york&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-smith"&gt;paul-smith&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/wilson-miner"&gt;wilson-miner&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="chicago"/><category term="daniel-x-oneil"/><category term="django"/><category term="everyblock"/><category term="new-york"/><category term="paul-smith"/><category term="san-francisco"/><category term="wilson-miner"/></entry><entry><title>Chatting with Adrian Holovaty</title><link href="https://simonwillison.net/2008/Jan/1/akita/#atom-tag" rel="alternate"/><published>2008-01-01T11:44:21+00:00</published><updated>2008-01-01T11:44:21+00:00</updated><id>https://simonwillison.net/2008/Jan/1/akita/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.akitaonrails.com/2008/1/1/chatting-with-adrian-holovaty"&gt;Chatting with Adrian Holovaty&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Fabio Akita interviews Adrian about Django and related topics.


    &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/fabioakita"&gt;fabioakita&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="django"/><category term="fabioakita"/><category term="python"/></entry><entry><title>"The Definitive Guide to Django" is now shipping from Amazon</title><link href="https://simonwillison.net/2007/Dec/11/djangobook/#atom-tag" rel="alternate"/><published>2007-12-11T21:12:37+00:00</published><updated>2007-12-11T21:12:37+00:00</updated><id>https://simonwillison.net/2007/Dec/11/djangobook/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/1590597257/swillison-20/"&gt;&amp;quot;The Definitive Guide to Django&amp;quot; is now shipping from Amazon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The book looks absolutely fantastic (bias disclosure: I contributed the newforms chapter)—huge congratulations to Adrian and Jacob.


    &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/amazon"&gt;amazon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/apress"&gt;apress&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/books"&gt;books&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-book"&gt;django-book&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="amazon"/><category term="apress"/><category term="books"/><category term="django"/><category term="django-book"/><category term="jacob-kaplan-moss"/></entry><entry><title>Django Book Update</title><link href="https://simonwillison.net/2007/Nov/14/djangobook/#atom-tag" rel="alternate"/><published>2007-11-14T00:59:55+00:00</published><updated>2007-11-14T00:59:55+00:00</updated><id>https://simonwillison.net/2007/Nov/14/djangobook/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.jacobian.org/writing/2007/nov/13/book-update/"&gt;Django Book Update&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It’s done! Went to the printer on Friday, due in bookstores in the second week of December (just in time for Christmas). Congrats to Adrian and Jacob.


    &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/django-book"&gt;django-book&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;/p&gt;



</summary><category term="adrian-holovaty"/><category term="django"/><category term="django-book"/><category term="jacob-kaplan-moss"/><category term="python"/></entry><entry><title>Knight Foundation grant</title><link href="https://simonwillison.net/2007/May/24/knight/#atom-tag" rel="alternate"/><published>2007-05-24T16:27:04+00:00</published><updated>2007-05-24T16:27:04+00:00</updated><id>https://simonwillison.net/2007/May/24/knight/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2007/05/23/1145"&gt;Knight Foundation grant&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian’s leaving the Washington Post to found EveryBlock, a startup focusing on local news and information in the style of chicagocrime.org.


    &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/chicagocrime"&gt;chicagocrime&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/everyblock"&gt;everyblock&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/startup"&gt;startup&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/washington-post"&gt;washington-post&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="chicagocrime"/><category term="everyblock"/><category term="startup"/><category term="washington-post"/></entry><entry><title>Web Focus Leads Newspapers to Hire Programmers for Editorial Staff</title><link href="https://simonwillison.net/2007/Mar/8/mediashift/#atom-tag" rel="alternate"/><published>2007-03-08T00:27:26+00:00</published><updated>2007-03-08T00:27:26+00:00</updated><id>https://simonwillison.net/2007/Mar/8/mediashift/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.pbs.org/mediashift/2007/03/digging_deeperthe_geek_in_the_1.html"&gt;Web Focus Leads Newspapers to Hire Programmers for Editorial Staff&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It’s great to see this trend taking off. A newsroom is an excellent place to work as a programmer.


    &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/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jobs"&gt;jobs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/newspapers"&gt;newspapers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programmers"&gt;programmers&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="jacob-kaplan-moss"/><category term="jobs"/><category term="newspapers"/><category term="programmers"/></entry><entry><title>Graphing requests with Tamper Data</title><link href="https://simonwillison.net/2006/Oct/17/graph/#atom-tag" rel="alternate"/><published>2006-10-17T18:21:06+00:00</published><updated>2006-10-17T18:21:06+00:00</updated><id>https://simonwillison.net/2006/Oct/17/graph/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;I spent the weekend in Boston, speaking at &lt;a href="http://www.gbcacm.org/"&gt;GBC/ACM&lt;/a&gt;'s Deep Ajax seminar with Alex Russell and Adrian Holovaty. I'll be posting some notes on this later, but I wanted to share a really neat Firefox extension that Alex showed me: &lt;a href="http://tamperdata.mozdev.org/"&gt;Tamper Data&lt;/a&gt;.&lt;/p&gt;

&lt;p id="p-1"&gt;Tamper Data is an extension for intercepting HTTP requests and modifying them. I have very little interest in this functionality myself, but hidden deep within the extension is the ability to do this:&lt;/p&gt;

&lt;p id="p-2"&gt;&lt;a href="http://simon.incutio.com/images/2006/tampergraph.png"&gt;&lt;img alt="Screenshot of Tamper Data graph of www.yahoo.com" height="368" src="http://simon.incutio.com/images/2006/tampergraph_t.png" title="Click for full-size screenshot" width="492" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p id="p-3"&gt;That's a graph showing what happens when you load up &lt;a href="http://www.yahoo.com/"&gt;www.yahoo.com&lt;/a&gt;. It shows every component of the page - JavaScript, CSS, images - and when each component started and finished loading. You can use it to get an idea for how long it took between the HTML starting to load and the browser beginning to pull in the CSS, then the images, and so on. It's a superb visualization of  what happens when a page is loaded.&lt;/p&gt;

&lt;p id="p-4"&gt;Unfortunately, if you install and run the extension (Tools -&amp;gt; Tamper Data) you'll see this instead:&lt;/p&gt;

&lt;p id="p-5"&gt;&lt;a href="http://simon.incutio.com/images/2006/tamperdata.png"&gt;&lt;img alt="Screenshot of Tamper Data user interface" height="394" src="http://simon.incutio.com/images/2006/tamperdata_t.png" title="Click for full-size screenshot" width="492" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p id="p-6"&gt;To get the graph, you have to right click in the main data grid and select "Graph All" from the context menu. Be sure to hit "clear" before loading a page that you want to graph or you'll end up seeing data from other pages too (you should shut down GMail or similar to prevent their polling requests from polluting the graph).&lt;/p&gt;

&lt;p id="p-7"&gt;It's a great tool but it's pretty well hidden. If you're looking for a side project, implementing the same functionality in a smaller extension (maybe as an extra tab in the Page Info screen) would be a significant service to the web development community.&lt;/p&gt;
    
        &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/alex-russell"&gt;alex-russell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/extensions"&gt;extensions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&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/tamperdata"&gt;tamperdata&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="alex-russell"/><category term="extensions"/><category term="firefox"/><category term="my-talks"/><category term="tamperdata"/></entry><entry><title>The programmer as journalist</title><link href="https://simonwillison.net/2006/Jun/6/programmer/#atom-tag" rel="alternate"/><published>2006-06-06T10:51:01+00:00</published><updated>2006-06-06T10:51:01+00:00</updated><id>https://simonwillison.net/2006/Jun/6/programmer/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ojr.org/ojr/stories/060605niles/"&gt;The programmer as journalist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
An interview with Adrian Holovaty.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/adrian-holovaty"&gt;adrian-holovaty&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/></entry><entry><title>How I'm using Amazon S3 to serve media files</title><link href="https://simonwillison.net/2006/Apr/7/im/#atom-tag" rel="alternate"/><published>2006-04-07T18:51:53+00:00</published><updated>2006-04-07T18:51:53+00:00</updated><id>https://simonwillison.net/2006/Apr/7/im/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2006/04/07/0927"&gt;How I&amp;#x27;m using Amazon S3 to serve media files&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian’s saving server overhead on ChicagoCrime by serving media from S3.


    &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/amazon"&gt;amazon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/aws"&gt;aws&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chicagocrime"&gt;chicagocrime&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/s3"&gt;s3&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="amazon"/><category term="aws"/><category term="chicagocrime"/><category term="s3"/></entry><entry><title>Exciting developments with Django</title><link href="https://simonwillison.net/2005/Aug/3/django/#atom-tag" rel="alternate"/><published>2005-08-03T16:56:34+00:00</published><updated>2005-08-03T16:56:34+00:00</updated><id>https://simonwillison.net/2005/Aug/3/django/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;The amount of activity surrounding the &lt;a href="http://www.djangoproject.com/"&gt;Django web framework&lt;/a&gt; since its not-quite release a few weeks ago is amazing. Adrian, Jacob and Wilson have been working over-time, with 395 check-ins to source control since the 13th of July. They've added &lt;a href="http://code.djangoproject.com/file/django/trunk/django/core/handlers/wsgi.py"&gt;WSGI support&lt;/a&gt;, a &lt;a href="http://www.djangoproject.com/weblog/2005/jul/18/local_server/"&gt;development web server&lt;/a&gt;, &lt;a href="http://www.djangoproject.com/weblog/2005/jul/29/model_examples/"&gt;unit-tests&lt;/a&gt;, a &lt;a href="http://www.djangoproject.com/documentation/"&gt;ton of documentation&lt;/a&gt;, &lt;a href="http://www.djangoproject.com/weblog/2005/jul/21/sqlite3/"&gt;SQLite support&lt;/a&gt;, &lt;a href="http://code.djangoproject.com/changeset/384"&gt;database introspection&lt;/a&gt; and dozens of other feature tweaks and bug fixes. Check out the &lt;a href="http://code.djangoproject.com/timeline"&gt;project Timeline&lt;/a&gt; for an idea of just how frenetic things have been.&lt;/p&gt;

&lt;p id="p-1"&gt;The emerging &lt;a href="http://www.djangoproject.com/community/"&gt;Django community&lt;/a&gt; has been kicking in as well. There's a significant community-led initiative to get &lt;a href="http://code.djangoproject.com/wiki/InterNationalization"&gt;internationalisation&lt;/a&gt; and &lt;a href="http://code.djangoproject.com/wiki/Localization"&gt;localisation&lt;/a&gt; going, and a wide number of unofficial tutorials have emerged to complement &lt;a href="http://www.djangoproject.com/documentation/tutorial1/"&gt;the one on the site&lt;/a&gt;.&lt;/p&gt;

&lt;p id="p-2"&gt;Here's where things get really interesting: changes at the Journal-World have kick-started the Django job market. Rob Curley, formally in charge of the World Company's web activities, recently &lt;a href="http://www.digitaledge.org/DigArtPage.cfm?AID=7083"&gt;took up a new position&lt;/a&gt; at the &lt;a href="http://www.naplesnews.com/"&gt;Naples Daily News&lt;/a&gt; in Florida. Rob &lt;a href="http://eric.themoritzfamily.com/?p=48"&gt;just hired Eric Moritz&lt;/a&gt;, a regular on the #django IRC channel, to work on Django-powered projects there.&lt;/p&gt;

&lt;p id="p-3"&gt;Meanwhile, Adrian Holovaty has &lt;a href="http://www.poynter.org/column.asp?id=31&amp;amp;aid=86489"&gt;taken a new job&lt;/a&gt; at the &lt;a href="http://www.washingtonpost.com/"&gt;Washington Post&lt;/a&gt; as "Editor, Editorial Innovations" - a role that is sure to involve some very innovative use of Django (Adrian built &lt;a href="http://chicagocrime.org/"&gt;chicagocrime.org&lt;/a&gt;). Adrian's departure means that the Journal-World are &lt;a href="http://www.holovaty.com/blog/archive/2005/08/03/0202"&gt;looking for a new developer&lt;/a&gt; - here's &lt;a href="http://simonwillison.net/2004/Jun/29/job/" title="Fancy a job?"&gt;why you should apply&lt;/a&gt;.&lt;/p&gt;

&lt;p id="p-4"&gt;One thing's for certain: we're going to see some very exciting Django-powered sites in the next few months.&lt;/p&gt;
    
        &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/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wsgi"&gt;wsgi&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="django"/><category term="sqlite"/><category term="wsgi"/></entry><entry><title>Adrian is leaving the Journal-World</title><link href="https://simonwillison.net/2005/Aug/3/adrian/#atom-tag" rel="alternate"/><published>2005-08-03T14:50:51+00:00</published><updated>2005-08-03T14:50:51+00:00</updated><id>https://simonwillison.net/2005/Aug/3/adrian/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2005/08/03/0202"&gt;Adrian is leaving the Journal-World&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This opens an excellent Python job opportunity in Kansas.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/adrian-holovaty"&gt;adrian-holovaty&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/></entry><entry><title>Introducing Django</title><link href="https://simonwillison.net/2005/Jul/17/django/#atom-tag" rel="alternate"/><published>2005-07-17T11:59:57+00:00</published><updated>2005-07-17T11:59:57+00:00</updated><id>https://simonwillison.net/2005/Jul/17/django/#atom-tag</id><summary type="html">
    &lt;p id="p-0"&gt;You may know that I spent a year working in Kansas for a local newspaper - the &lt;a href="http://www.ljworld.com/"&gt;Lawrence Journal-World&lt;/a&gt;. I'm delighted to announce that a decent chunk of the software I worked on there is now available as open-source, in the form of the &lt;a href="http://www.djangoproject.com/"&gt;Django web framework&lt;/a&gt;.&lt;/p&gt;

&lt;p id="p-1"&gt;Django is an &lt;acronym title="Model View Controller"&gt;MVC&lt;/acronym&gt; Python web development framework with a strong emphasis on content management. While comparisons with &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; are inevitable (I plan to post one myself shortly), it should be emphasized that Django is by no means a clone of Rails - in fact, development on Django started in October 2003, months before the first public Rails release. That the two frameworks share so many ideas is, I feel, a testament to the design of both.&lt;/p&gt;

&lt;p id="p-2"&gt;Django was initially developed by &lt;a href="http://www.holovaty.com/"&gt;Adrian Holovaty&lt;/a&gt; and myself, with &lt;a href="http://www.jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; joining the team shortly before my departure. The framework evolved during the construction of a number of sites, which included:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="http://www.6newslawrence.com/"&gt;6newslawrence.com&lt;/a&gt;, local TV news, the first site to launch using the then nascent Django framework.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.lawrence.com/"&gt;lawrence.com&lt;/a&gt;, a local entertainment site. Every town should have a site like this; sadly, very few do.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.visitlawrence.com/"&gt;VisitLawrence.com&lt;/a&gt;, a local tourism site.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.kusports.com/"&gt;KUSports.com&lt;/a&gt;, a sports news site covering the University of Kansas.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.ljworld.com/"&gt;LJWorld.com&lt;/a&gt;, a local news site and the flagship for the Journal-World.&lt;/li&gt;
&lt;/ul&gt;

&lt;p id="p-3"&gt;It's also purring along under the hood of &lt;a href="http://www.chicagocrime.org/"&gt;chicagocrime.org&lt;/a&gt; and the &lt;a href="http://www.djangoproject.com/"&gt;Django project site&lt;/a&gt; itself.&lt;/p&gt;

&lt;p id="p-4"&gt;Adrian and I developed Django to allow us to create reasonably complex database driven web applications in as little time as possible. A local newspaper produces a huge amount of information - news stories, events listings, obituaries, sports results, marriage announcements, photo galleries, polls, weather reports and dozens of other bits and pieces. To maximise their value and potential for reuse, these things need to be stored in a database. That database needs a user interface for people to add and modify content, and of course the information needs to be published to a website somewhere.&lt;/p&gt;

&lt;p id="p-5"&gt;Django automates most of this - and makes the rest as easy as possible. You create a &lt;em&gt;data description&lt;/em&gt; (kind of like an &lt;acronym title="Structured Query Language"&gt;SQL&lt;/acronym&gt; table schema but with additional information about validation rules and interface widgets) and load it in to Django. Django then creates the database tables, model classes and a comprehensive web-based administration interface for your site's staff. All that's left for you to do manually is the code for the public site, which is generally a case of writing a few lines of controller code, configuring some &lt;acronym title="Universal Republic of Love"&gt;URL&lt;/acronym&gt;s and knocking out some templates.&lt;/p&gt;

&lt;p id="p-6"&gt;To give you an idea of how much this speeds up the creation of new sites, consider the case of &lt;a href="http://www.ljworld.com/game/"&gt;Game&lt;/a&gt;. Game was a site created to provide detailed coverage of little-league games in and around Lawrence (for non-Americans, little-league is baseball and softball for children aged around 5 to 11 - it's amazingly popular). The entire Game site, including news, fixtures, match results, team profiles and even weather forecasts for forthcoming matches took &lt;em&gt;two days&lt;/em&gt; to develop.&lt;/p&gt;

&lt;p id="p-7"&gt;I haven't been involved with Django since leaving the Journal-World back in September, but now that the framework is open-sourced I look forward to contributing to its further development - both in terms of documentation and actual code. There's already plenty to look at on the &lt;a href="http://www.djangoproject.com/"&gt;Django site&lt;/a&gt; (designed by the ever-talented &lt;a href="http://www.wilsonminer.com/live/"&gt;Wilson Miner&lt;/a&gt;); I suggest the &lt;a href="http://www.djangoproject.com/documentation/overview/"&gt;overview&lt;/a&gt; as your first port of call.&lt;/p&gt;

&lt;p id="p-8"&gt;Expect to hear a lot more about the framework in the next few weeks.&lt;/p&gt;
    
        &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/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lawrence-journal-world"&gt;lawrence-journal-world&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/highlights"&gt;highlights&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="django"/><category term="jacob-kaplan-moss"/><category term="lawrence-journal-world"/><category term="projects"/><category term="highlights"/></entry><entry><title>Why Greasemonkey is good for publishers</title><link href="https://simonwillison.net/2005/Apr/13/greasemonkey/#atom-tag" rel="alternate"/><published>2005-04-13T16:09:41+00:00</published><updated>2005-04-13T16:09:41+00:00</updated><id>https://simonwillison.net/2005/Apr/13/greasemonkey/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2005/04/12/1126"&gt;Why Greasemonkey is good for publishers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Free usability tips and bug fixing—your users know more than you do.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://rc3.org/cgi-bin/less.pl?arg=6901"&gt;rc3.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &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/greasemonkey"&gt;greasemonkey&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/><category term="greasemonkey"/></entry><entry><title>Again, a newspaper PDF experiment is fatally flawed</title><link href="https://simonwillison.net/2005/Mar/2/again/#atom-tag" rel="alternate"/><published>2005-03-02T11:25:28+00:00</published><updated>2005-03-02T11:25:28+00:00</updated><id>https://simonwillison.net/2005/Mar/2/again/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2005/03/02/0041"&gt;Again, a newspaper PDF experiment is fatally flawed&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian nails the reason PDF editions will always play second fiddle to the real web.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/adrian-holovaty"&gt;adrian-holovaty&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/></entry><entry><title>'Game': Fun with databases</title><link href="https://simonwillison.net/2004/Jun/12/game/#atom-tag" rel="alternate"/><published>2004-06-12T00:14:34+00:00</published><updated>2004-06-12T00:14:34+00:00</updated><id>https://simonwillison.net/2004/Jun/12/game/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.holovaty.com/blog/archive/2004/06/11/1740"&gt;&amp;#x27;Game&amp;#x27;: Fun with databases&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adrian discusses our latest site launch.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/adrian-holovaty"&gt;adrian-holovaty&lt;/a&gt;&lt;/p&gt;



</summary><category term="adrian-holovaty"/></entry><entry><title>Installing psycopg on Red Hat 9</title><link href="https://simonwillison.net/2003/Dec/31/psycopg/#atom-tag" rel="alternate"/><published>2003-12-31T04:43:03+00:00</published><updated>2003-12-31T04:43:03+00:00</updated><id>https://simonwillison.net/2003/Dec/31/psycopg/#atom-tag</id><summary type="html">
    &lt;p&gt;Adrian Holovaty and I spent some time today figuring out how to get the &lt;a href="http://initd.org/software/psycopg/"&gt;psycopg Postgres module&lt;/a&gt; to install on Red Hat 9. It took a while, but eventually we tweaked the spec file and used it to compile our own &lt;acronym title="Red Hat Package Manager"&gt;RPM&lt;/acronym&gt;. I've posted our modified spec file &lt;a href="http://lists.initd.org/pipermail/psycopg/2003-December/002482.html" title="[Psycopg] Updated spec file for Redhat 9"&gt;to the psycopg mailing list&lt;/a&gt;. More for my own record than anything else, the arcane incantations needed to create the &lt;acronym title="Red Hat Package Manager"&gt;RPM&lt;/acronym&gt; went roughly as follows:&lt;/p&gt;

&lt;ol&gt;
 &lt;li&gt;Copy the modified &lt;samp&gt;psycopg.spec&lt;/samp&gt; file in to &lt;samp&gt;/usr/src/redhat/SPECS/&lt;/samp&gt;&lt;/li&gt;
 &lt;li&gt;Copy &lt;samp&gt;psycopg-1.1.11.tar.gz&lt;/samp&gt; in to &lt;samp&gt;/usr/src/redhat/SOURCES&lt;/samp&gt;&lt;/li&gt;
 &lt;li&gt;In the SPECS directory, run &lt;samp&gt;rpmbuild -ba psycopg.spec&lt;/samp&gt;&lt;/li&gt;
 &lt;li&gt;Install the resulting &lt;acronym title="Red Hat Package Manager"&gt;RPM&lt;/acronym&gt;, which materialised in &lt;samp&gt;/usr/src/redhat/RPMS&lt;/samp&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The above was recreated by digging through my bash history - hopefully I haven't missed a step. The technique appears to work for Fedora as well.&lt;/p&gt;
    
        &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/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/postgresql"&gt;postgresql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/red-hat"&gt;red-hat&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="linux"/><category term="postgresql"/><category term="python"/><category term="red-hat"/></entry><entry><title>Lawrence web meetup</title><link href="https://simonwillison.net/2003/Oct/18/webMeetup/#atom-tag" rel="alternate"/><published>2003-10-18T23:06:57+00:00</published><updated>2003-10-18T23:06:57+00:00</updated><id>https://simonwillison.net/2003/Oct/18/webMeetup/#atom-tag</id><summary type="html">
    &lt;p&gt;My colleague &lt;a href="http://www.holovaty.com/"&gt;Adrian&lt;/a&gt; is putting together a meetup for web designers and developers in the Lawrence, Kansas area on Monday evening. The venue is yet to be decided but we're looking to book somewhere for dinner with an atmosphere that's conducive to lively conversation. Likely attendants so far include &lt;a href="http://www.holovaty.com/"&gt;Adrian Holovaty&lt;/a&gt;, &lt;a href="http://www.squidfingers.com/"&gt;Travis Beckham&lt;/a&gt;, &lt;a href="http://www.anitrapavka.com/"&gt;Anitra Pavka&lt;/a&gt;, Dan Cox (designer for &lt;a href="http://www.ljworld.com/"&gt;ljworld.com&lt;/a&gt;, &lt;a href="http://www.lawrence.com/"&gt;lawrence.com&lt;/a&gt; and &lt;a href="http://www.kusports.com/"&gt;kusports.com&lt;/a&gt;) and myself. If you're a web developer/designer in the area and this sounds like your kind of thing &lt;a href="http://www.holovaty.com/"&gt;drop Adrian a line&lt;/a&gt; for more information. It should be a lot of fun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Adrian's site now has a &lt;a href="http://www.holovaty.com/blog/archive/2003/10/18/1807" title="Calling all Kansas City-area Web developers"&gt;more details&lt;/a&gt; of confirmed attendants.&lt;/p&gt;
    
        &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/lawrence"&gt;lawrence&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="adrian-holovaty"/><category term="lawrence"/></entry></feed>