#503: It’s not 85% HTML
About the show
Sponsored by us! Support our work through:
- Our courses at Talk Python
- Consulting from Six Feet Up Connect with the hosts
- Michael: Mastodon / BlueSky / X / LinkedIn
- Calvin: Mastodon / BlueSky / X / LinkedIn
- Show: Mastodon / BlueSky / X Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Tuesday at 7am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Michael #1: Your GitHub language bar is lying (how to fix it)
GitHub's language bar comes from Linguist, which counts every tracked byte in the repo. Michael's chameleon-rs project read as 75.5% HTML because committed docs-site output and test suites outweighed the Rust engine. Three .gitattributes attributes changed the story: linguist-generated for build output, linguist-vendored for an upstream test suite, and linguist-detectable=false for tests and benchmarks on both sides. The bar now shows the real mix, roughly 62% Rust and 38% Python.
- That bar is one of the first things people see on your repo; if generated files skew it, a few lines of .gitattributes tell the truth.
- The bar is byte-proportional, so a 9 MB committed docs build can make a Rust project read as mostly HTML
- linguist-generated hides build output and collapses those diffs in pull requests too
- linguist-vendored covers copied-in code; linguist-detectable=false drops anything from the stats
- chameleon-rs went from 75.5% HTML to roughly 62% Rust and 38% Python after a few lines of config
- Tests and benchmarks were excluded symmetrically, on both the Rust and Python sides, so neither skews the ratio
- Check patterns before pushing with git check-attr; GitHub recalculates a few minutes after the push
Calvin #2: Python Typing Survey 2026: developers mix type checkers, and AI is writing the hints
- Meta's 2026 Python Typing Survey results: 1,794 responses, Aug 5 - Sep 2. Pyrefly (Meta), JetBrains, Microsoft and Astral's ty team helped write it.
- Typing is stable: 85.5% use hints often or always (88.0% in 2024). Which checker people use is not stable.
- 49.9% run two or more checkers (46.0% in 2025), and 83.3% of Pyrefly users also run another one. Speed is the top reason for picking a checker (56.5%).
- Checkers disagree: 33.3% report inconsistencies between them, rising to 42.7% among multi-checker users.
- AI is writing the types: 42.5% had AI write hints, and 38.4% say types make AI code more reliable (18.5% last year).
- 29.8% are "not sure" whether types help AI-assisted coding, about 4x the uncertainty on any other benefit.
- Help sources flipped: Stack Overflow 46.4% to 22.9% and LLM chat 26.0% to 41.7%, 2024 to 2026.
- Top pain is still missing library types (65.1%; Django, SQLAlchemy, pandas, NumPy). The most-wanted feature is better Callable syntax (45.7%). Raw data zip is linked.
Michael #3: Flask Vibe - Build Apps You Can Understand
Flask Vibe is a new tutorial site from Frederick Tubiermont, a developer who started coding at 47 and builds with Flask, PostgreSQL, raw SQL, and vanilla JS. The pitch: AI assistants generate more reliable, easier-to-verify code when the stack has no build step, no ORM, and no hydration. It ships a manifesto, tutorials on modular vanilla JS and AI-friendly coding patterns, and a Flask plus psycopg2 CRUD walkthrough.
- For vibe coders burned by Next.js defaults on Lovable or Replit, this is a concrete, opinionated case that simpler Python stacks pair better with AI-generated code.
- Claims a structural 1.8x LCP win over Next.js on the same dashboard app: 905ms vs 1.66s, both scoring Lighthouse 100
- Tutorials cover modular vanilla JS, AI-friendly coding patterns, and Flask CRUD with raw psycopg2 SQL and no ORM
- Creator started Python at 47 in 2022 and runs the site on the stack it teaches; the homepage is 42 KB with Lighthouse 100
- Solo London-based project (adsyme Ltd), launched via an r/flask self-post in February 2026; early, opinionated, and the benchmark leans on one self-run comparison with its methodology published on site
Calvin #4: Python on my wrist: MicroPython on a PineTime
- Michiel (Python Leiden user group) runs MicroPython on a PineTime, Pine64's ~$26 open smartwatch: 64 MHz Cortex-M4, 64 KB RAM, 512 KB flash.
- He revived wasp-os, a dormant MicroPython watch OS stuck on a 2019 MicroPython fork whose maintainer is asking for new maintainers (issue #536).
- The build is now one command with uv. Bluetooth flashing uses bleak instead of the deprecated gatttool, cutting update time from over 8 minutes to about 3.5.
- Free RAM at boot went from 7.1 KB to 12.4 KB by using the flash chip's real 4 KB blocks. He also added a watchdog, plus vibration, touch and I2C dead-battery fixes.
- His three upstream PRs (frozen native code, PWM, ADC sample time) are merged, so wasp-os now runs on mainline MicroPython. They're targeted for MicroPython 1.30, planned for December.
- New faces: a Dutch week clock, and an 8-bit pixel clock that draws its digits without any font data and shows a live Unix epoch counter.
- The Guido app: a 16-color, 80x80 run-length-encoded portrait (photo by Kushal Das, CC BY-SA). All four images total under 12 KB, versus 112 KB for one raw screen.
- Next up is the PineTime Pro (AMOLED, GPS, dual-core M33), with no release date yet. Code is on the pinetime-upstream-micropython branch of mbeijen/wasp-os.
Extras
Calvin:
- PyPI now caps version strings at 128 characters — https://blog.pypi.org/posts/2026-10-23-version-length-limit/
- Wagtail Space — https://wagtail.org/wagtail-space-2026/
Michael:
- Thanks Hugo: Lots of Python releases for Cybersecurity Awareness Month
- Talk Python Meetup: Talk Python in Production: Building Your Own Infrastructure
Joke: Binging red buttons
Episode Transcript
Collapse transcript
00:00
00:04
00:05
00:09
00:11
00:12
00:13
00:17
00:22
00:24
00:28
00:33
00:35
00:39
00:40
00:43
00:50
00:50
00:52
00:54
00:56
01:00
01:04
01:08
01:10
01:12
01:16
01:18
01:19
01:28
01:34
01:41
01:44
01:49
01:50
01:51
01:52
01:53
01:54
01:56
01:56
01:59
02:02
02:04
02:06
02:07
02:14
02:16
02:19
02:20
02:23
02:24
02:25
02:26
02:34
02:37
02:38
02:39
02:45
02:49
02:49
02:53
02:54
02:55
02:58
03:00
03:01
03:05
03:08
03:10
03:12
03:13
03:16
03:18
03:26
03:30
03:33
03:35
03:38
03:41
03:43
03:46
03:50
03:52
03:56
04:00
04:06
04:07
04:10
04:14
04:15
04:17
04:19
04:25
04:27
04:30
04:34
04:36
04:38
04:44
04:46
04:47
04:48
04:50
04:50
04:54
04:57
04:58
05:00
05:04
05:06
05:08
05:11
05:13
05:15
05:16
05:17
05:18
05:23
05:26
05:31
05:31
05:33
05:35
05:36
05:37
05:42
05:44
05:45
05:47
05:51
05:52
05:56
05:59
06:01
06:02
06:05
06:06
06:09
06:10
06:11
06:11
06:16
06:18
06:19
06:21
06:22
06:23
06:26
06:29
06:34
06:37
06:38
06:40
06:41
06:44
06:48
06:51
06:55
06:57
07:01
07:02
07:03
07:04
07:05
07:06
07:08
07:11
07:11
07:15
07:16
07:16
07:23
07:24
07:29
07:33
07:38
07:42
07:44
07:50
07:57
08:01
08:05
08:08
08:10
08:12
08:14
08:17
08:20
08:24
08:27
08:30
08:32
08:34
08:37
08:39
08:41
08:45
08:49
08:50
08:54
08:59
09:02
09:05
09:07
09:09
09:13
09:16
09:19
09:22
09:23
09:30
09:32
09:36
09:41
09:46
09:55
09:59
10:02
10:03
10:05
10:07
10:11
10:16
10:17
10:20
10:23
10:27
10:32
10:34
10:38
10:40
10:44
10:47
10:49
10:51
10:55
11:01
11:06
11:14
11:23
11:24
11:25
11:28
11:33
11:34
11:39
11:41
11:46
11:47
11:49
11:53
11:53
11:57
12:01
12:03
12:04
12:05
12:06
12:08
12:09
12:10
12:10
12:12
12:15
12:17
12:21
12:21
12:23
12:26
12:30
12:30
12:36
12:37
12:41
12:42
12:47
12:52
12:57
12:58
12:59
13:03
13:12
13:17
13:20
13:25
13:26
13:27
13:30
13:30
13:34
13:38
13:44
13:48
13:50
13:50
13:52
13:52
13:54
13:55
14:01
14:03
14:04
14:07
14:09
14:13
14:16
14:18
14:19
14:21
14:22
14:26
14:28
14:31
14:32
14:34
14:37
14:40
14:42
14:44
14:47
14:51
14:51
15:02
15:04
15:06
15:12
15:12
15:16
15:17
15:21
15:24
15:27
15:32
15:32
15:38
15:41
15:42
15:47
15:49
15:51
15:54
15:56
15:59
16:01
16:02
16:02
16:03
16:07
16:07
16:10
16:16
16:17
16:17
16:19
16:20
16:21
16:22
16:24
16:26
16:29
16:33
16:34
16:35
16:37
16:40
16:42
16:43
16:44
16:49
16:53
16:56
16:58
17:02
17:06
17:07
17:09
17:11
17:15
17:16
17:17
17:18
17:22
17:24
17:26
17:28
17:29
17:33
17:35
17:39
17:41
17:43
17:45
17:46
17:50
17:53
17:54
17:55
17:58
17:58
18:01
18:02
18:06
18:08
18:09
18:13
18:16
18:17
18:19
18:21
18:23
18:24
18:25
18:29
18:35
18:35
18:36
18:37
18:38
18:38
18:41
18:44
18:48
18:48
18:49
18:50
18:52
18:58
19:04
19:07
19:09
19:09
19:10
19:13
19:14
19:15
19:20
19:21
19:22
19:23
19:25
19:26
19:30
19:34
19:38
19:43
19:46
19:51
19:55
20:01
20:02
20:04
20:07
20:08
20:12
20:15
20:16
20:19
20:21
20:23
20:25
20:30
20:32
20:35
20:36
20:39
20:41
20:44
20:46
20:51
20:58
21:00
21:06
21:09
21:12
21:15
21:16
21:18
21:20
21:23
21:28
21:30
21:36
21:39
21:43
21:47
21:54
21:59
22:06
22:10
22:15
22:20
22:24
22:24
22:28
22:29
22:31
22:32
22:32
22:36
22:39
22:40
22:42
22:43
22:48
22:49
22:54
22:58
22:59
23:00
23:05
23:08
23:13
23:15
23:18
23:21
23:23
23:24
23:26
23:28
23:32
23:36
23:40
23:41
23:43
23:45
23:48
23:48
23:50
23:51
23:52
23:52
23:53
23:56
23:59
24:03
24:04
24:06
24:08
24:10
24:11
24:14
24:17
24:21
24:24
24:24
24:26
24:27
24:28
24:31
24:32
24:32
24:33
24:35
24:35
24:37
24:40
24:42
24:43
24:44
24:45
24:46
24:47
24:50
24:57
24:59
25:01
25:04
25:06
25:08
25:09
25:10
25:10
25:14
25:15
25:16
25:19
25:22
25:24
25:28
25:29
25:34
25:37
25:40
25:45
25:48
25:50
25:51
25:54
26:00
26:02
26:05
26:06
26:07
26:11
26:12
26:14
26:16
26:18
26:21
26:22
26:23
26:24
26:25
26:27
26:29
26:30
26:31
26:31
26:32
26:33
26:33
26:36
26:40
26:44
26:47
26:49
26:51
26:53
26:57
26:59
27:02
27:05
27:06
27:07
27:07
27:09
27:16
27:18
27:24
27:25
27:28
27:29
27:31
27:33
27:34
27:37
27:38
27:40
27:41
27:46
27:49
27:51
27:54
27:55
27:56
27:59
28:02
28:05
28:07
28:08
28:09
28:10
28:11
28:15
28:18
28:19
28:23
28:23
28:27
28:28
28:29
28:29
28:32
28:35
28:36
28:39
28:40
28:40
28:45
28:45
28:48
28:49
28:50
28:52
28:55
28:57
29:03
29:04
29:07
29:08
29:09
29:14
29:19
29:25
29:31
29:37
29:42
29:46
29:53
29:58
30:05
30:07
30:08
30:10
30:11
30:11
30:12
30:13
30:15
30:16
30:19
30:20
30:20


