Updates on Django's Async Story
Carlton Gibson is a former Django Fellow, sat on the security team for eight years, and he's on the steering council. On this episode we get into the async topic doc rewrite, what actually remains versus what was just fear, the new Tasks framework in 6.0, DB-level cascades and fetch modes landing in 6.1, and why free-threading is the bet that's about to pay off big for Django. If you've been told Django's async story isn't ready, this is the episode that puts that myth to bed.
Episode Deep Dive
Guest Introduction and Background
Carlton Gibson is one of the most recognizable voices in the Django world, and this episode finds him at the center of a story he personally helped rewrite. Carlton is a former Django Fellow (he held that role for five years and stepped down in 2023), a current member of the Django steering council, and he served on the Django security team for eight years. On top of that, he maintains a large collection of packages across the Django ecosystem and builds real web applications for a living, so he speaks from the perspective of someone who both shapes the framework and has to ship with it.
English by birth and now living in Spain, Carlton has been on a busy conference run: a JetBrains PyTV livestream event in Amsterdam in March, DjangoCon Europe in Athens, and PyCon Italia in Bologna. He co-organizes Django on the Med with Paolo Melchiorre, a multi-day core-developer sprint in Italy. He co-hosts the Django Chat podcast, and lately he has been building applications with HTMX, Alpine, and Django's template partials, while working on two headline efforts we dig into here: the rewrite of Django's async documentation and a new serialization project called Django Mantle. In short, if you want an informed, honest read on where Django's async story really stands, Carlton is exactly the person to ask.
- github.com/carltongibson: Carlton's open-source work and packages.
- djangochat.com: The Django Chat podcast Carlton co-hosts.
- djangoproject.com: The Django web framework.
What to Know If You're New to Python
This is an intermediate-to-advanced episode about web performance, concurrency, and how a mature framework evolves. You will get the most out of it if you understand a few mental models around how Python servers handle many requests at once and how Django talks to a database.
- Synchronous vs. asynchronous code (async and await): Synchronous code runs one line at a time and waits for slow operations (like a database call) to finish before moving on. Asynchronous code uses async and await so a single worker can start a slow operation, do other useful work while it waits, and come back later. The entire episode is about when this trade-off is worth it in Django.
- WSGI and ASGI: These are the two standard interfaces between a Python web app and the server that runs it. WSGI is the classic synchronous model (one request per worker at a time), and ASGI is the newer async-capable model that can hold many connections open on a single event loop. Carlton explains exactly when you should move from one to the other.
- The GIL (Global Interpreter Lock): Python has historically allowed only one thread to execute Python code at a time, even on a multi-core machine. This is why CPU-heavy work does not automatically get faster with more threads, and it is the backdrop for the "free threading" excitement in this episode.
- The ORM and the N+1 query problem: Django's ORM lets you work with database rows as Python objects. A common performance trap is the N+1 (or M+1) problem, where looping over a list of objects and touching a related object triggers one extra query per item. Django 6.1's fetch modes are a direct response to this.
- Background task queues: Some work (like sending an email) should not make the user wait for the HTTP response. A task queue accepts the job, returns immediately, and lets a separate worker process finish it. Django 6.0's new Tasks framework standardizes this pattern.
Key Points and Takeaways
Django's async story is ready, and the documentation finally says so The central news of this episode is that Carlton rewrote Django's asynchronous support topic guide, and the reframing matters. That guide was first written when async support landed in Django (back in the Django 3.x and Python 3.6 era), and it was strikingly negative: it warned that the work was unfinished, not ready, and carried terrible performance implications unless you did everything perfectly. Carlton's point is that this framing is now wrong. The async API surface is effectively complete, with async support across the ORM, cache framework, authentication, sessions, and signals. Old performance warnings were downgraded to notes, because the costs they described have largely evaporated. The story was, quite literally, rewritten to stop scaring people away from something that works.
- docs.djangoproject.com/en/stable/topics/async/: Django's asynchronous support topic guide.
- djangoproject.com: The Django web framework.
Fetch modes take on the N+1 query problem in Django 6.1 When Carlton asked people what they were most excited about in Django 6.1, most pointed to fetch modes as their headline feature. The problem they solve is the classic N+1 (or M+1) query: you fetch a user, iterate over that user's bookmarks, and each access lazily fires another query. That laziness is fine at small scale but becomes a performance nightmare as you grow. The new "fetch peers" mode lets you say that if you touch the first element in a set of related objects, Django should go and fetch them all at once, effectively a deferred prefetch_related. This is easier to maintain than hand-adding prefetch_related everywhere, which tends to rot as code changes and you end up prefetching data you no longer use. Carlton notes a DjangoCon Europe talk from new Fellow Jacob Tyler Wells that walks through how fetch modes work and where they are not a magic bullet.
- docs.djangoproject.com/en/dev/releases/6.1/: The in-development Django 6.1 release notes.
Database-level cascades land in Django 6.1 This is Carlton's personal favorite feature, and it fixes a real scaling landmine. When you delete a record that other rows depend on (say, an organization with team members and projects), Django's on_delete cascade has historically done that work in memory: it walks the object tree, pulls the objects into Python, then deletes leaves, then stems, then branches. At scale, deleting one organization that references tables with millions of rows can exhaust memory and take the whole application down. The database is dramatically better at this work than Python is, so Django 6.1 adds the option to push the cascade down to the database level. The ticket had been open for years because it was genuinely hard, and Carlton credits an in-person group at Django on the Med, including Mariusz Felisiak, Simon Charette, Lily Foote, and the new Django Fellow, for finally getting it over the line.
- docs.djangoproject.com/en/dev/releases/6.1/: The in-development Django 6.1 release notes.
The built-in Tasks framework makes background work pluggable (Django 6.0) Carlton is excited about Django's new Tasks framework, and the motivating example is the everyday password-reset email. Historically you might send the email during the request and make the user wait for delivery before returning the HTTP response, which is a poor experience. The better pattern is to accept the request, write a task, return immediately, and let a separate worker send the email. People have done this for years with Celery, RQ, Django Q, Django Q2, or Huey, but neither Django itself nor third-party packages could safely depend on any single one of those. Django Tasks provides a backend-agnostic API for enqueuing tasks and checking results, so package authors can offer background work while the user picks the backend in settings. Backends already exist for Redis and for the ORM (storing tasks in your database), with a Celery adapter tracked as an open issue.
- docs.djangoproject.com/en/dev/releases/6.1/: Django release notes covering the Tasks framework rollout.
- github.com/celery/celery: Celery distributed task queue.
- python-rq.org: RQ, a simple Redis-backed task queue.
- github.com/coleifer/huey: Huey, a lightweight task queue.
Free threading is the bet that's about to pay off Carlton frames free-threaded Python as the big, exciting shift, and he argues it vindicates a Django design decision that once looked clumsy. Django's approach of pushing synchronous work into a thread seemed awkward while the GIL meant threads could not truly run in parallel. As free threading matures and works its way through the ecosystem, that bet ages very well, because Django always really wanted to do CPU work in a thread and now that thread can deliver actual parallelism. The practical payoff is running everything in one process instead of spinning up many processes just to get parallelism, which cuts memory overhead substantially. Trying it is now trivial: with uv you can run a command like uv python install 3.14t and have a free-threaded Python to play with in seconds. Carlton stresses that the remaining work is mostly ecosystem-level thread safety (module-level caches, library internals, running test suites), not framework architecture, which is already in place.
- docs.astral.sh/uv: uv, which can install free-threaded Python builds.
- peps.python.org/pep-0703: PEP 703, making the GIL optional in CPython.
The hard parts of async are Python's, not Django's One of Carlton's clearest messages is that the genuine pain points in async are structural Python issues shared by every framework, not Django-specific flaws. CPU-bound work either blocks the event loop or gets thrown to a thread where it hits GIL contention, and pushing it out to a separate process is heavy because you have to bootstrap the process and marshal the data. Database parallelism is the real ceiling: each connection is an ordered pipe that takes a query and returns a response, so whether you use threads (as Django does) or greenlets (as some other ORMs do), you are limited by your connection pool. Django's connections are also tied to a thread local, so you cannot await inside an atomic transaction block, though you can still run a transaction by wrapping it in a single function called through sync_to_async. Carlton points out you would meet the very same GIL, concurrency, and database-scaling problems in FastAPI or Flask. That is actually reassuring: these are general problems the whole community shares.
- github.com/django/asgiref: The asgiref library that provides sync_to_async and async_to_sync.
- peps.python.org/pep-0703: PEP 703 on free-threaded CPython.
WSGI vs. ASGI: when you actually need to switch Carlton gives a crisp rule for when to move from WSGI to ASGI, and the answer is not "as soon as you write an async view." You can run async views under WSGI just fine. The real trigger is long-lived requests: server-sent events, WebSockets, or streaming responses where you hold a connection open, like a stock ticker pushing updates every few seconds. On the WSGI model, each held-open connection consumes a worker, and pre-forked workers each live in their own process with all the memory overhead of loading Django, priming caches, and setting up database connections. An ASGI worker can hold many connections open on a single event loop instead. For larger apps, Carlton likes a hybrid deployment: keep the core app on well-understood WSGI scaling and run a small ASGI sidecar, routing async endpoints by path in Nginx (for example, everything under an /a prefix).
- gunicorn.org: Gunicorn, a common WSGI server with pre-forked workers.
- nginx.org: Nginx, used here to route by path to a WSGI or ASGI backend.
The function coloring problem is not a dead end Michael and Carlton tackle the common complaint that async is "viral," the idea that one async function forces every caller above it to become async too. Carlton names this the function coloring problem: once you have a red (or blue) function, callers have to match its color, much like a GPL license spreading through a codebase. But you are not trapped. You can cap the propagation by dropping back to synchronous code with async_to_sync, or by spinning up your own asyncio event loop to run just the async part. The cleanest illustration is also one of the easiest ways into async with Django: a single synchronous view that needs to call five external APIs can fire all five concurrently in an event loop and aggregate them into one response, finishing in a fraction of the time it would take to call them one after another. It is a clear win with the complexity contained to a single view.
- journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function: The essay that popularized the function coloring metaphor.
A real-world win: fewer, more capable workers save memory Michael shares a concrete case that grounds the theory. While trying to shrink his servers' memory footprint (roughly nine gigabytes of RAM spread across about 27 containers), he found that moving more request handling onto an ASGI server with genuinely async calls down to the database let him run fewer workers. Because each async worker was more capable and did not get bound up waiting on slow I/O, he was able to cut around 500 megabytes off a single web app just by reducing worker count. Carlton adds that the memory savings compound because you avoid duplicating shared initialization, cache priming, and connection pooling across many processes. The takeaway is that you do not need Instagram-level traffic to benefit; even at modest scale, doing more per box saves on DevOps, complexity, and money. One of his async deployments used the Granian server for this exact reason.
- github.com/emmett-framework/granian: Granian, the Rust-based Python server Michael used.
Django Mantle: a modern, type-safe serialization story Django Mantle is Carlton's take on what serialization in Django should look like today. His argument is that Django REST Framework, while wonderful and battle-tested, has last-generation serializers that loop over model fields and pull values one at a time, which is slow by modern standards. Newer libraries like attrs, cattrs, msgspec, and Pydantic generate code that runs almost as fast as hand-written extraction. The catch is that Pydantic is not ORM-aware, so Mantle acts as a type-safe wrapper around Django's queryset core: you define attrs "shape" classes, instantiate a query, and get back fully typed objects populated in a single efficient fetch, with only the needed fields selected and prefetching handled to avoid N+1. Carlton describes these shape classes as "static islands" sitting on top of Django's powerful dynamic ORM, giving you clean, typed, separated domain logic without ripping out the dynamic patterns underneath. It grew out of the reality that a Django model naturally accretes display, aggregation, and validation logic until you need more structure, and Mantle offers a path to grow into that structure rather than over-engineering from day one.
- django-rest-framework.org: Django REST Framework, the incumbent serialization toolkit.
- attrs.org: attrs, the class-building library Mantle's shape classes use.
- github.com/jcrist/msgspec: msgspec, a fast serialization and validation library.
- docs.pydantic.dev: Pydantic, a widely used data-validation library.
Before you reach for async, fix your database indexes Michael puts a public-service announcement into the episode: if your requests feel slow and your instinct is to add parallelism, first spend an hour on your database indexes and query plans. Database indexes are, in his words, magic, and making sure every hot path uses one often solves the problem you were about to throw async at. Carlton reinforces the point from the internals: when Django makes a database query there is a little CPU time to compile the query, then the I/O of talking to the database, then CPU time to build the result rows into ORM objects. Crucially, psycopg already releases the GIL during that I/O wait, so you are getting concurrency there whether you are on async or not. More often than not, it was the database all along that was taking the time, and no amount of extra workers or async will fix a missing index.
- psycopg.org: psycopg, the PostgreSQL adapter that releases the GIL during I/O.
A customizable multipart parser, and why release notes matter Carlton highlights a smaller Django 6.1 feature that shows how targeted optimizations reach the people who need them: you can now customize the multipart parser class on the request object. For most developers this is irrelevant, but if you handle large multipart requests with many parts, swapping in a different parser can save around 30 percent of the CPU spent parsing each request, which for some workloads is a decisive win. What excites Carlton more is the direction it points: opening up the request implementation so people can swap components, benchmark alternatives, and turn performance knobs that used to be locked away. It is also a reminder of the broader habit he recommends, because Django ships a long release note every eight months and it is worth reading through to pick out the features that matter to you.
- docs.djangoproject.com/en/dev/releases/6.1/: The Django 6.1 release notes to skim for your own favorites.
Typing, "fit your brain," and the AI wrinkle Michael and Carlton have a thoughtful exchange about Python typing that avoids the usual tribalism. Carlton's core value is that Python should "fit your brain," and his grumble is that typing can push code past that point. He tells a story from PyCon Italia of five typing experts, genuine gurus, sitting around a table trying to work out the single correct type hint, which is hardly the picture of something that fits your brain. He notes that the original proposal that added type hints promised they would never be compulsory, even by convention, yet there is now real cultural pressure to adopt typing whether or not it helps you. AI adds a twist: models frequently write typed Python by default, and both agree that the type safety you get from a checker genuinely helps you (and the AI) verify that generated output is correct, which is an increasingly important benefit regardless of your personal taste.
- docs.python.org/3/library/typing.html: Python's typing module documentation.
Dark Matter Django: an invisible community of millions In one of the episode's more memorable riffs, Michael coins the term "dark matter Django" to describe how much of the community is effectively invisible. Carlton cites a best estimate from Jacob Kaplan-Moss (given at DjangoCon US in 2024) of roughly four million active Django projects in the world, while GitHub's public "used by" count shows around two million repositories, and that excludes private and internal apps entirely. The truly visible community, the people who subscribe to the newsletter, answer the survey, or show up at DjangoCon, is only about four or five thousand, roughly a thousandth of the user base. Both agree that download statistics from PyPI have become an unreliable proxy in the age of Docker builds, CI pipelines, and layered caching, where one real install can register as many or as few. An old idea to add telemetry to Django went nowhere, for the obvious reasons, leaving the project to estimate the size of a community it mostly cannot see.
- jacobian.org: Jacob Kaplan-Moss, whose estimate anchors the discussion.
- github.com/django/django: Django on GitHub, where the "used by" count appears.
In-person sprints, the beta, and the developer survey Carlton makes a strong case that in-person work still moves Django forward in ways remote work cannot. Django on the Med, a three-day sprint he co-organizes with Paolo Melchiorre (this year in Pescara, Italy), is where the long-stalled database-level cascades feature finally got over the line, and where disagreements that had rolled on the features board for months got resolved in five-minute conversations. He talks candidly about how COVID knocked the community back by roughly half a decade, and how it is only now recovering with fresh contributors and obvious new steering-council candidates. The event is open to everyone, not just core developers, and is designed to pair experienced and new contributors. Carlton closes with two direct calls to action: install the Django 6.1 beta and run your test suite against it so regressions get caught before release, and take a few minutes to fill out the Django developer survey, which genuinely helps steer the project.
- djangocon.eu: DjangoCon Europe, the conference whose sprints inspired the event.
- djangoproject.com: Home of the Django developer survey and beta downloads.
Interesting Quotes and Stories
"It looks as if Django's bet is going to pay off. That bet will have aged very well, because we always really wanted to do CPU work in the thread." -- Carlton Gibson
"This idea that the topic guide presented, that somehow the story wasn't finished, well, that wasn't quite right. So we wanted to update that." -- Carlton Gibson
"The problems that I see come up time and time and time again are problems with Python and Python's async story that we all share, not Django-specific problems." -- Carlton Gibson
"It is an order of magnitude more complicated to correctly handle async code than to just code synchronously. These are really complex patterns; grow into them rather than jumping headfirst." -- Carlton Gibson
"Celery is truly wonderful software, but it's literally overkill for 99% of projects, and it's operationally difficult to keep going. You end up running three or four different things." -- Carlton Gibson
"If slow is a problem, please just look at the query plans, and make sure every hot path is using a database index. Database indexes are magic." -- Michael Kennedy
"It was your database all along that was the thing that was taking the time." -- Carlton Gibson
"As your application grows, the complexity grows with it, and you need more structure to manage that complexity. That's the joy of crafting the application over time. That's why we program." -- Carlton Gibson
"There's something about the bandwidth of face-to-face communication which just isn't replicable, which you can't replicate." -- Carlton Gibson
The "dark matter Django" moment is worth calling out as its own small story. Riffing on how Django's real user base (estimated around four million active projects) dwarfs the few thousand people who are actually visible through newsletters, surveys, and conferences, Michael offered Carlton a new term for the enormous, unseen majority of Django users. Carlton's immediate reaction captured the delight of naming something everyone had felt but never labeled:
"I have a new term for you, Carlton: dark matter Django." "Brilliant, I'm having that. Let me write that down: dark matter Django." -- Michael Kennedy and Carlton Gibson
There is also a nice bookend on how the framework evolves. Carlton points out that the database-level cascade feature, an old and famously hard ticket, only shipped because a handful of core contributors sat in the same room at Django on the Med. As he put it, it was "literally something which would never have happened except for the time that was available at Django on the Med," a concrete argument for why in-person sprints still matter.
Key Definitions and Terms
- sync_to_async and async_to_sync: Helper functions from the asgiref library that bridge synchronous and asynchronous worlds. sync_to_async wraps a normal function so it can be awaited (running it in a thread), and async_to_sync lets synchronous code call an async function, which is how you can cap the "viral" spread of async.
- Coroutine: A special function defined with async def that can pause at await points and resume later. Coroutines are the building blocks that let a single thread juggle many in-flight operations.
- Event loop: The scheduler at the heart of asyncio that runs coroutines, pausing one whenever it awaits something slow and running another in the meantime. By default it is single-threaded, which is why CPU-heavy work can block it.
- Server-sent events (SSE): A technique for pushing a stream of updates from server to client over one long-lived HTTP connection, used for things like live stock tickers. It is a prime example of when moving to ASGI and async is worthwhile.
- select_related and prefetch_related: Django ORM tools for loading related objects efficiently in as few queries as possible, so you avoid the N+1 problem. Django 6.1's fetch modes build on the prefetch idea by triggering it automatically.
- Active Record pattern: A design where a single object is both a database row and the home for behavior (a Django model is the classic example). It is convenient early on but tends to accumulate too many responsibilities as an app grows, which is the problem Django Mantle addresses.
- Greenlets: Lightweight cooperative "threads" managed in user space rather than by the operating system, used by some ORMs to handle concurrency. Carlton mentions them to note that they still hit the same database-connection ceiling as Django's thread-based approach.
- Deferred field: A Django ORM object that stands in for a model attribute and returns the converted value when accessed via the descriptor protocol. It is one reason static typing over the ORM is awkward, since the declared type and the runtime value differ.
- Template partials: A Django templating feature that lets you define and render named fragments of a template, which pairs especially well with HTMX for swapping small pieces of a page.
Learning Resources
If this conversation made you want to go deeper on async, Django, or building interactive web apps the way Carlton describes, here are a few Talk Python Training courses that map directly onto the episode's themes. They range from Python's full concurrency toolkit to getting productive with Django itself.
- training.talkpython.fm/courses/python-concurrency-deep-dive: Async Techniques and Examples in Python covers async and await, asyncio, threads, multiprocessing, and the GIL trade-offs discussed throughout this episode.
- training.talkpython.fm/courses/getting-started-with-django: Django: Getting Started teaches the framework fundamentals, including the ORM, views, and templates, so the 6.1 and async topics here make sense in context.
- training.talkpython.fm/courses/htmx-django-modern-python-web-apps-hold-the-javascript: HTMX + Django matches Carlton's enthusiasm for HTMX, Alpine, and template partials, and the server-driven, real-time patterns that async unlocks.
Overall Takeaway
The heart of this episode is a myth-busting: for years Django's own documentation told people its async story was unfinished and slow, and Carlton Gibson's rewrite corrects the record. The async API is complete across the ORM, cache, auth, sessions, and signals; the old millisecond overheads are now measured in microseconds; and the genuinely hard parts, GIL contention, CPU-bound work, and database connection limits, are Python-wide realities that every framework shares, not Django failings. Layered on top of that are real reasons for optimism: Django 6.1's fetch modes and database-level cascades attack long-standing ORM pain points, the 6.0 Tasks framework finally makes background work pluggable without marrying you to Celery, and free threading looks set to vindicate Django's long-held bet on doing work in threads.
The inspiring throughline is one of pragmatic craftsmanship. You do not have to adopt async, typing, or heavy infrastructure to be a "real" Python developer; you grow into complexity only when your application earns it. Check your database indexes before you reach for parallelism. Start with a single ASGI worker or a small sidecar before you rewrite everything. Reach for Django Tasks and the humble ORM queue before you stand up a Celery cluster at 2 a.m. Django is ready for ambitious, high-performance, real-time applications, and the smartest way to get there is gently, one well-understood step at a time.
Links from the show
PyCon Italia: pycon.it
Django on the Med: djangomed.eu
Django Mantle: noumenal.es
PyPI: pypi.org
release notes: docs.djangoproject.com
on_delete: docs.djangoproject.com
Fetch modes: docs.djangoproject.com
HttpRequest.multipart_parser_class: docs.djangoproject.com
async topic doc: docs.djangoproject.com
docs: docs.djangoproject.com
DEP 14: github.com
django-tasks: github.com
django-tasks-local: github.com
Celery: docs.celeryq.dev
PEP 703: peps.python.org
free-threading HOWTO: docs.python.org
PEP 779: peps.python.org
ASGI: docs.djangoproject.com
PGBouncer: www.pgbouncer.org
Channels: channels.readthedocs.io
sync_to_async / async_to_sync: docs.djangoproject.com
noumenal.es: noumenal.es
Django Chat: djangochat.com
@carlton@fosstodon.org: fosstodon.org
Article: Cutting Python Web App Memory Over 31%: mkennedy.codes
Watch this episode on YouTube: youtube.com
Episode #556 deep-dive: talkpython.fm/556
Episode transcripts: talkpython.fm
Theme Song: Developer Rap
🥁 Served in a Flask 🎸: talkpython.fm/flasksong
---== Don't be a stranger ==---
YouTube: youtube.com/@talkpython
Bluesky: @talkpython.fm
Mastodon: @talkpython@fosstodon.org
X.com: @talkpython
Michael on Bluesky: @mkennedy.codes
Michael on Mastodon: @mkennedy@fosstodon.org
Michael on X.com: @mkennedy
Episode Transcript
Collapse transcript
00:00
00:04
00:06
00:08
00:10
00:12
00:17
00:22
00:24
00:27
00:33
00:41
00:44
00:46
01:09
01:14
01:20
01:22
01:25
01:27
01:31
01:35
01:35
01:39
01:44
01:48
01:50
01:55
02:01
02:03
02:08
02:15
02:18
02:20
02:22
02:24
02:29
02:30
02:33
02:34
02:34
02:37
02:40
02:44
02:50
02:54
02:59
03:06
03:11
03:12
03:15
03:17
03:19
03:25
03:26
03:27
03:29
03:32
03:34
03:36
03:36
03:38
03:40
03:42
03:44
03:46
03:48
03:51
04:01
04:02
04:04
04:09
04:10
04:13
04:14
04:19
04:20
04:23
04:26
04:27
04:30
04:34
04:37
04:40
04:43
04:47
04:50
04:52
04:57
04:58
05:01
05:03
05:06
05:09
05:15
05:17
05:22
05:24
05:28
05:28
05:29
05:29
05:33
05:37
05:38
05:39
05:41
05:43
05:43
05:45
05:50
05:51
05:53
05:58
05:59
06:03
06:04
06:09
06:14
06:19
06:23
06:28
06:32
06:39
06:44
06:47
06:52
06:57
06:59
07:02
07:06
07:10
07:16
07:18
07:19
07:21
07:23
07:28
07:37
07:41
07:46
07:47
07:48
07:53
07:59
08:05
08:10
08:15
08:21
08:27
08:32
08:38
08:42
08:47
08:50
08:56
09:01
09:06
09:12
09:18
09:25
09:30
09:35
09:40
09:45
09:50
09:54
09:58
10:03
10:10
10:15
10:20
10:27
10:31
10:37
10:43
10:48
10:52
10:58
11:02
11:06
11:11
11:18
11:24
11:30
11:36
11:41
11:43
11:48
11:52
11:54
11:57
12:03
12:05
12:09
12:10
12:12
12:17
12:19
12:23
12:25
12:27
12:33
12:45
12:52
12:57
13:00
13:03
13:04
13:06
13:11
13:14
13:18
13:19
13:23
13:27
13:31
13:32
13:35
13:37
13:38
13:43
13:46
13:49
13:52
14:01
14:04
14:09
14:12
14:16
14:19
14:24
14:26
14:31
14:34
14:37
14:42
14:44
14:49
14:54
15:00
15:04
15:07
15:11
15:17
15:23
15:27
15:28
15:30
15:36
15:36
15:43
15:44
15:48
15:49
15:49
15:56
16:03
16:07
16:12
16:18
16:24
16:28
16:30
16:32
16:35
16:38
16:40
16:41
16:43
16:44
16:45
16:46
16:47
16:52
16:53
16:57
17:02
17:03
17:04
17:09
17:12
17:16
17:20
17:22
17:24
17:33
17:36
17:38
17:44
17:50
17:55
17:58
18:00
18:01
18:03
18:09
18:11
18:17
18:23
18:28
18:35
18:40
18:45
18:50
18:55
19:01
19:05
19:10
19:15
19:20
19:25
19:35
19:36
19:38
19:42
19:43
19:45
19:46
19:47
19:49
19:52
19:54
19:56
19:57
19:58
20:01
20:05
20:07
20:10
20:13
20:16
20:17
20:23
20:25
20:28
20:33
20:37
20:43
20:51
20:57
21:05
21:10
21:13
21:20
21:22
21:33
21:36
21:40
21:41
21:45
21:50
21:53
21:55
22:00
22:04
22:04
22:09
22:12
22:13
22:17
22:22
22:27
22:32
22:39
22:43
22:47
22:50
22:57
23:03
23:08
23:14
23:18
23:19
23:25
23:31
23:36
23:37
23:39
23:40
23:43
23:48
23:52
23:56
23:56
23:58
24:00
24:04
24:06
24:08
24:10
24:12
24:12
24:13
24:14
24:15
24:16
24:19
24:21
24:23
24:25
24:27
24:29
24:31
24:32
24:34
24:35
24:37
24:41
24:43
24:46
24:46
24:48
24:51
24:55
25:01
25:02
25:03
25:06
25:09
25:14
25:16
25:17
25:19
25:24
25:30
25:31
25:32
25:36
25:37
25:39
25:41
25:43
25:44
25:45
25:48
25:49
25:49
25:51
25:53
25:54
25:56
25:58
26:02
26:06
26:12
26:19
26:23
26:28
26:31
26:36
26:40
26:46
26:51
26:56
27:01
27:05
27:11
27:17
27:22
27:28
27:33
27:35
27:38
27:44
27:48
27:51
27:54
27:58
28:02
28:04
28:05
28:06
28:08
28:10
28:14
28:15
28:16
28:18
28:18
28:19
28:21
28:22
28:27
28:39
28:43
28:51
28:58
29:04
29:10
29:17
29:24
29:30
29:36
29:42
29:48
29:53
29:58
30:05
30:11
30:17
30:24
30:29
30:36
30:42
30:46
30:49
30:53
30:55
31:01
31:03
31:06
31:07
31:09
31:10
31:11
31:19
31:20
31:24
31:27
31:28
31:32
31:38
31:39
31:43
31:47
31:51
31:56
32:01
32:07
32:13
32:20
32:24
32:29
32:34
32:35
32:35
32:38
32:42
32:45
32:47
32:51
32:53
32:55
32:58
33:01
33:02
33:04
33:06
33:12
33:17
33:21
33:26
33:27
33:31
33:37
33:41
33:46
33:51
33:53
33:56
34:06
34:08
34:11
34:13
34:19
34:21
34:22
34:23
34:25
34:28
34:30
34:32
34:37
34:43
34:47
34:50
34:54
34:56
34:58
35:04
35:06
35:07
35:09
35:13
35:20
35:26
35:27
35:30
35:31
35:39
35:49
35:53
35:56
36:00
36:01
36:06
36:11
36:12
36:17
36:19
36:36
36:44
36:51
36:56
37:01
37:03
37:07
37:11
37:19
37:23
37:25
37:36
37:42
37:44
37:45
37:46
37:49
38:00
38:08
38:13
38:18
38:20
38:22
38:23
38:27
38:29
38:33
38:38
38:43
38:49
38:55
39:00
39:05
39:11
39:17
39:23
39:32
39:34
39:38
39:42
39:44
39:49
39:51
39:56
39:58
40:03
40:07
40:08
40:16
40:23
40:29
40:35
40:40
40:45
40:49
40:55
41:02
41:09
41:13
41:22
41:29
41:34
41:39
41:45
41:49
41:54
41:55
41:59
42:01
42:02
42:11
42:19
42:24
42:29
42:32
42:36
42:38
42:47
42:49
42:51
42:58
43:03
43:05
43:08
43:10
43:11
43:13
43:17
43:19
43:22
43:25
43:26
43:35
43:38
43:48
43:51
43:58
44:00
44:03
44:04
44:05
44:08
44:14
44:15
44:19
44:21
44:25
44:30
44:31
44:32
44:34
44:37
44:39
44:40
44:41
44:46
44:51
44:57
45:02
45:06
45:13
45:19
45:25
45:33
45:39
45:42
45:43
45:44
45:45
45:49
45:54
45:56
45:58
46:02
46:07
46:08
46:09
46:12
46:13
46:15
46:18
46:19
46:22
46:26
46:34
46:36
46:37
46:38
46:38
46:41
46:46
46:48
46:49
47:00
47:02
47:06
47:07
47:10
47:15
47:18
47:26
47:29
47:31
47:36
47:37
47:40
47:46
47:50
47:52
47:56
47:57
48:01
48:06
48:15
48:17
48:20
48:22
48:23
48:24
48:25
48:27
48:29
48:33
48:34
48:42
48:48
48:54
49:00
49:02
49:03
49:06
49:10
49:12
49:19
49:19
49:23
49:25
49:30
49:33
49:35
49:36
49:37
49:38
49:42
49:43
49:46
49:49
49:55
49:58
50:01
50:03
50:06
50:09
50:10
50:12
50:15
50:19
50:21
50:23
50:26
50:28
50:32
50:38
50:43
50:49
50:53
50:55
50:59
51:00
51:04
51:05
51:11
51:13
51:17
51:19
51:19
51:20
51:26
51:27
51:32
51:37
51:43
51:49
51:57
52:06
52:09
52:11
52:12
52:20
52:21
52:23
52:23
52:26
52:26
52:28
52:34
52:42
52:49
52:53
52:58
53:01
53:05
53:09
53:27
53:35
53:42
53:47
53:49
53:55
54:06
54:06
54:07
54:15
54:18
54:20
54:23
54:24
54:26
54:29
54:33
54:36
54:37
54:43
54:48
54:53
55:05
55:14
55:16
55:17
55:20
55:22
55:28
55:34
55:44
55:51
55:56
56:03
56:07
56:09
56:11
56:14
56:14
56:21
56:24
56:26
56:28
56:31
56:42
56:45
56:49
56:52
56:53
56:55
56:56
56:59
57:02
57:05
57:06
57:07
57:08
57:11
57:17
57:24
57:32
57:37
57:41
57:47
57:53
57:58
58:06
58:12
58:17
58:22
58:29
58:35
58:40
58:42
58:46
58:52
58:55
58:59
59:04
59:09
59:13
59:15
59:18
59:20
59:26
59:30
59:34
59:38
59:42
59:44
59:47
59:50
59:56
59:58
01:00:00
01:00:03
01:00:06
01:00:07
01:00:08
01:00:08
01:00:09
01:00:14
01:00:17
01:00:19
01:00:20
01:00:22
01:00:22
01:00:24
01:00:28
01:00:29
01:00:30
01:00:31
01:00:33
01:00:37
01:00:40
01:00:41
01:00:44
01:00:49
01:00:53
01:00:55
01:00:57
01:00:58
01:01:01
01:01:03
01:01:08
01:01:11
01:01:12
01:01:15
01:01:17
01:01:19
01:01:21
01:01:22
01:01:23
01:01:27
01:01:29
01:01:31
01:01:32
01:01:35
01:01:37
01:01:37
01:01:42
01:01:42
01:01:43
01:01:48
01:01:50
01:01:51
01:01:53
01:01:57
01:02:02
01:02:07
01:02:11
01:02:15
01:02:20
01:02:26
01:02:29
01:02:31
01:02:34
01:02:34
01:02:35
01:02:38
01:02:40
01:02:41
01:02:42
01:02:43
01:02:44
01:02:47
01:02:51
01:02:54
01:02:56
01:02:58
01:03:00
01:03:02
01:03:03
01:03:04
01:03:04
01:03:04
01:03:06
01:03:07
01:03:10
01:03:12
01:03:12
01:03:14
01:03:14
01:03:19
01:03:20
01:03:20
01:03:21
01:03:24
01:03:25
01:03:26
01:03:28
01:03:30
01:03:34
01:03:36
01:03:41
01:03:44
01:03:48
01:03:54
01:04:01
01:04:04
01:04:06
01:04:10
01:04:12
01:04:13
01:04:15
01:04:18
01:04:20
01:04:22
01:04:23
01:04:25
01:04:46 We tapped into that modern vibe over Kingy Storm.
01:04:50 Talk Python To Me.
01:04:52 I-Sync is the norm.
01:05:22 .


