Fri, Mar 13, 2026
This is an early release. Staticware does something very satisfyingly today: it serves static files with content-hashed URLs for cache busting. That means when you edit your CSS then redeploy and restart your server, visitors get the latest CSS without forcing a refresh. More will come.
Mon, Mar 9, 2026
BinaryOrNot identifies binary files three ways: by extension, by file signature, and by content analysis. Pass it any file path and it tells you binary or text, accurately, across PNGs, PDFs, executables, archives, fonts, CJK-encoded text, and hundreds of other formats.
Sat, Mar 7, 2026
If you've ever had BinaryOrNot misidentify a UTF-16 file, choke on a CJK-encoded document, or crash because chardet changed its API, this release is for you.
Wed, Mar 4, 2026
You know that thing where you release an album, it's on the shelves, people are buying it, and then someone points out the spine says it's your previous album? That's what happened with Cookiecutter 2.7.0. We put out the long-awaited release with 27 improvements and 17 contributors, and cookiecutter -V proudly announced: **2.6.0**.
Tue, Mar 3, 2026
Cookiecutter 2.7.0 is tested on Python 3.10 through 3.14, ships with a security policy documenting the trust model for template hook scripts, and publishes to PyPI with cryptographic provenance so you can verify every release. Seventeen contributors from the community helped build it.
Thu, Feb 19, 2026
Air Web Framework exists not just because we created it, but because of the support we got soft-launching it at Python Philippines and running its first sprint at PyCon Davao. Now, Air is a PythonAsia 2026 community partner.
Tue, Feb 17, 2026
I've put out the biggest release of cookiecutter-pypackage since the modern rewrite. Generated projects now ship with a documentation site, type checking, cross-version coverage enforcement, and security-hardened CI, all configured and working out of the box.
Tue, Dec 16, 2025
We recently reviewed a pull request from contributor Martin Saizar that refactored our Python tests. The goal was to enable the PyTest (PT) linter rule in Ruff, our code formatter and linter.
Wed, Nov 26, 2025
On a recent flight from Japan to the Philippines, Pydanny and I started coding a new project. The result is **AirDragon**, a layout and component library for the Air web framework.
Sun, Oct 26, 2025
I co-led the first ever Air web framework sprint in Davao, Philippines, as part of Day 2 of PyCon Davao on October 26, 2025.
Sat, Oct 25, 2025
Slides from my keynote at PyCon Davao 2025, the first regional Filipino conference for Python programming enthusiasts.
Mon, Oct 6, 2025
Air is a pioneering AI-first Python web framework that represents the next evolution in web frameworks to be deeply AI-native.
Thu, Oct 2, 2025
If you need to run Python applications from PyPI without installing them permanently, uvx provides a convenient way to execute Python tools without having to manage dependencies manually.
Tue, May 6, 2025
How to get JSON into a local SQLite database fast.
Tue, Apr 15, 2025
Continuing the Sentence Transformers exploration, I use a cross-encoder model to rank my notebooks by similarity to search queries.
Mon, Apr 14, 2025
Here I use sentence transformers and a bi-encoder model to encode my notebooks as embeddings and implement semantic search.
Tue, Apr 8, 2025
When working in notebooks, you'll occasionally need to access the notebook's own filename. Here's code to do it, which I've verified works in Jupyter Notebook Classic.
Fri, Mar 14, 2025
Happy Pi Day. Here's pi from the stdlib math module and from Numpy.
Thu, Feb 20, 2025
How to remove stale .pyc files and __pycache__ directories, using uvx + pyclean.
Sat, Feb 15, 2025
Here I create a local titlecase model based on Mistral, using a local Ollama modelfile and a solid prompt.
Fri, Feb 14, 2025
Title-casing text is one of those hard problems no one ever gets right, yet no one considers worthy enough to solve with AI. Here I experiment to see if I can improve upon the latest best solutions with a local Ollama modelfile and a solid prompt.
Thu, Feb 13, 2025
I thought I had completely lost my new iteration on my notebook titler tool, but it turns out I'm finding bits and pieces in various places. Here I try to put it together again.
Sat, Feb 8, 2025
Here I play with using Pynput as a system level keylogger, from within my Jupyter notebook version of this.
Wed, Feb 5, 2025
Fastcore's call_parse decorator turns Python functions into CLI tools quickly. It's nowhere near as fancy as Typer or Click, but it's super quick to use.
Tue, Feb 4, 2025
Here I turn this Jupyter notebook into a Python script, using nbdev's nb_export function from the notebook itself.
Sun, Feb 2, 2025
I use Gemini's text-embedding-004 model to generate embeddings for sentences. Then I define a cosine similarity function and see what it returns for a few related and unrelated sentences.
Sat, Feb 1, 2025
I'm starting to accumulate many UntitledX.ipynb files. Here I use the Gemini 1.5 Flash language model from Google to rename each one based on its contents.
Fri, Jan 31, 2025
This is a proof-of-concept of moving MonsterUI's HTML class injection from lxml post-processing to a custom Mistletoe renderer. Looks like we can get 3x faster Markdown rendering using this simple MonsterHTMLRenderer vs. parsing the rendered HTML to inject the classes.
Tue, Jan 28, 2025
I define various useful datetime utilities with the help of fastcore's L and map, and functools' partial. Then I extend that to generate Discord timestamps, which localize Unix timestamps to the reader's timezone.
Sun, Jan 26, 2025
Using Pygments, CSS and Ruff to improve how code blocks are displayed on my daily notebook blog.
Fri, Jan 24, 2025
Here I use the Python Imaging Library to create and display an image in-notebook, so that it's rendered as part of the blog post on audrey.feldroy.com.
Wed, Jan 22, 2025
Can we customize a FastHTML app to set different headers when rendering notebooks with nb2fasthtml, based on what the notebook actually needs for its headers?
Sun, Jan 19, 2025
Working with Anki flashcard decks in Python, with genanki to work with the decks and fastcore for ease of use.
Tue, Jan 14, 2025
SQLite full text search setup via APSW for all the notebooks on this website, inspired by the APSW FTS5 Tour).
Mon, Jan 13, 2025
The SQLite FTS5 (full-text search) extension includes the built-in tokenizers unicode61, ascii, porter, and trigram, implemented in fts5_tokenize.c. APSW provides a Python API to use those.
Fri, Jan 10, 2025
In this tutorial we'll look at the simplest routes and route handlers you can create with FastHTML. We'll define the handlers as little functions, and then call them as we would any other Python function. After that, we'll make simple GET requests to a simple index route/handler, a parameterized one, and a parameterized one with a redirect.
Thu, Jan 9, 2025
I'm starting with a snippet of code from the bottom of execnb's 01_nbio.ipynb, breaking it down into pieces and seeing each part.
Mon, Jan 6, 2025
FastHTML provides default headers for every page, which are also fully customizable. This notebook explores how this works.
Fri, Jan 3, 2025
The zip docs say that zip(*iterables, strict=False):
Fri, Dec 27, 2024
This notebook shows how to:
Wed, Dec 25, 2024
## Understand the Problem
Tue, Dec 24, 2024
This notebook is a SolveIt-style exploration of https://github.com/AnswerDotAI/execnb/. Here I am following the SolveIt process in a Jupyter notebook to learn new things.
Tue, Dec 24, 2024
Having fun with fastcore's L (list) class and holiday lyrics.
Mon, Dec 23, 2024
Exploring how execnb reads notebooks and nb2fasthtml renders them, to understand the tools I'm building on.
Mon, Dec 23, 2024
Here we are checking the numbers from our daughter's snowman card to Daddy. She gave him math problems to solve and a snowman joke.
Mon, Aug 5, 2024
I'm here to learn the new web framework FastHTML by Jeremy Howard, and I'm using Claudette to help me explore it.
Sun, Aug 4, 2024
Studying https://claudette.answer.ai/
Mon, Jul 29, 2024
Studying https://docs.fastht.ml/tutorials/by_example.html more
Mon, Jul 29, 2024
My study of the @delegates decorator and GetAttr from fastcore.
Mon, Jul 29, 2024
My early attempts to figure out auth in FastHTML. Things have likely changed a lot since.
Tue, Jul 16, 2024
My early exploration of the xtend notebook in FastHTML.
Mon, Jul 15, 2024
Reading through fastcore's xml.py source to figure out how FastHTML components print and render, and what to_xml and highlight do.
Sun, Jul 14, 2024
Caution: I’ve learned better patterns since I wrote this. Leaving this here for posterity.
Sat, Jul 29, 2023
I feel like Jupyter notebooks would be really nice for blogging or publishing "Today I Learned" posts. I had heard about Fastpages before via Jeremy Howard's blog or YouTube videos, but seeing that it was deprecated in favor of nbdev, I decided to try nbdev.
Fri, Jun 16, 2023
In data science, EDA is an exploratory analysis of a data set. The goal is to better understand the stories that the data tells, and to uncover interesting ideas that may turn into new hypotheses to explore.
Wed, Sep 18, 2019
SciPy has tools for creating Voronoi tessellations. Besides the obvious data science applications, you can use them to make pretty art like this:
Thu, Apr 28, 2016
In Django terms, a QuerySet is an iterable of database records. What's nice about them is that they are evaluated only when you're ready for the results.
Mon, Nov 9, 2015
A common thing to do in Python is to go through a directory tree, opening each file and doing something with the file's text. Here's what to do when you hit a UnicodeDecodeError from accidentally opening a binary file.
Tue, Nov 3, 2015
Daniel and I just returned from a trip to San Antonio, Texas, where we taught one of our intensive Django training workshops at Lackland Air Force Base.
Tue, May 26, 2015
This weekend, Daniel and I drove down to Ensenada, Mexico to speak and coach at DjangoGirls Ensenada. It was a 2-day workshop for women of any level of experience to get a taste of web application development.