simonw/til
Điểm qua simonw/til: 1.4k sao trên GitHub, viết chủ yếu bằng HTML. Today I Learned
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
Snapshot
Cộng tác viên hàng đầu
Xem cộng tác viên hàng đầu
Today I Learned
My Today I Learned snippets. Inspired by jbranchaud/til, which I spotted on Hacker News.
Search these TILs at https://til.simonwillison.net/
581 TILs so far. Atom feed here.github-actions
- Only run GitHub Action on push to master / main - 2020-04-19
- Dump out all GitHub Actions context - 2020-04-19
- Set environment variables for all steps in a GitHub Action - 2020-04-19
- Commit a file if it changed - 2020-04-19
- Running different steps on a schedule - 2020-04-20
- Updating a Markdown table of contents with a GitHub Action - 2020-07-22
- Using grep to write tests in CI - 2020-08-19
- Skipping a GitHub Actions step without failing - 2020-08-22
- Open a debugging shell in GitHub Actions with tmate - 2020-09-14
- Talking to a PostgreSQL service container from inside a Docker container - 2020-09-18
- Using Prettier to check JavaScript code style in GitHub Actions - 2020-12-31
- Running tests against PostgreSQL in a service container - 2021-02-23
- Installing different PostgreSQL server versions in GitHub Actions - 2021-07-05
- Attaching a generated file to a GitHub release using Actions - 2021-09-07
- Storing files in an S3 bucket between GitHub Actions runs - 2021-12-07
- Testing against Python 3.11 preview using GitHub Actions - 2022-02-02
- Using the GitHub Actions cache with npx and no package.json - 2022-03-22
- Deploying a live Datasette demo when the tests pass - 2022-03-27
- GitHub Actions job summaries - 2022-05-17
- Optimizing PNGs in GitHub Actions using Oxipng - 2022-05-18
- Conditionally running a second job in a GitHub Actions workflow - 2022-07-11
- Ensure labels exist in a GitHub repository - 2022-09-25
- actions/setup-python caching for setup.py projects - 2022-11-28
- Running tests against multiple versions of a Python dependency in GitHub Actions - 2023-09-15
- Serving a JavaScript project built using Vite from GitHub Pages - 2023-10-23
- GitHub Actions, Issues and Pages to build a daily planner - 2024-01-01
- Creating GitHub repository labels with an Actions workflow - 2024-02-09
- Running cog automatically against GitHub pull requests - 2024-11-06
- Building and deploying a custom site using GitHub Actions and GitHub Pages - 2025-03-18
- Using uvx in GitHub Actions in a cache-friendly way - 2026-07-13
python
- Convert a datetime object to UTC without using pytz - 2020-04-19
- macOS Catalina sort-of includes Python 3 - 2020-04-21
- Generated a summary of nested JSON data - 2020-04-28
- Installing and upgrading Datasette plugins with pipx - 2020-05-04
- Use setup.py to install platform-specific dependencies - 2020-05-05
- Build the official Python documentation locally - 2020-05-08
- Introspecting Python function parameters - 2020-05-27
- Password hashing in Python with pbkdf2 - 2020-07-13
- How to call pip programatically from Python - 2020-08-11
- Outputting JSON with reduced floating point precision - 2020-08-21
- Debugging a Click application using pdb - 2020-09-03
- Understanding option names in Click - 2020-09-22
- Explicit file encodings using click.File - 2020-10-16
- Decorators with optional arguments - 2020-10-28
- Running Python code in a subprocess with a time limit - 2020-12-06
- Controlling the style of dumped YAML using PyYAML - 2020-12-07
- Relinquishing control in Python asyncio - 2020-12-29
- Packaging a Python app as a standalone binary with PyInstaller - 2021-01-04
- Handling CSV files with wide columns in Python - 2021-02-15
- Using io.BufferedReader to peek against a non-peekable stream - 2021-02-15
- Tracing every executed Python statement - 2021-03-21
- Check spelling using codespell - 2021-08-03
- Find local variables in the traceback for an exception - 2021-08-09
- Using Fabric with an SSH public key - 2021-10-06
- Using the sqlite3 Python module in Pyodide - Python WebAssembly - 2021-10-18
- Planning parallel downloads with TopologicalSorter - 2021-11-16
- Using cog to update --help in a Markdown README file - 2021-11-18
- Ignoring a line in both flake8 and mypy - 2021-11-30
- init_subclass - 2021-12-03
- Using C_INCLUDE_PATH to install Python packages - 2021-12-09
- Safely outputting JSON - 2021-12-17
- Annotated explanation of David Beazley's dataklasses - 2021-12-19
- Streaming indented output of a JSON array - 2022-01-17
- Generating a calendar week grid with the Python Calendar module - 2022-03-31
- Efficiently copying a file - 2022-05-13
- Freezing requirements with pip-tools - 2022-07-14
- struct endianness in Python - 2022-07-28
- Defining setup.py dependencies using a URL - 2022-08-13
- Running PyPy on macOS using Homebrew - 2022-09-14
- Using psutil to investigate "Too many open files" - 2022-10-13
- Simple load testing with Locust - 2022-10-22
- os.remove() on Windows fails if the file is already open - 2022-10-25
- The pdb interact command - 2022-10-31
- Upgrading a pipx application to an alpha version - 2023-01-11
- Installing lxml for Python on an M1/M2 Mac - 2023-01-27
- Calculating embeddings with gtr-t5-large in Python - 2023-01-31
- A few notes on Rye - 2023-04-26
- The location of the pip cache directory - 2023-04-28
- TOML in Python - 2023-06-26
- CLI tools hidden in the Python standard library - 2023-06-28
- Python packages with pyproject.toml and nothing else - 2023-07-07
- Quickly testing code in a different Python version using pyenv - 2023-07-10
- Using tree-sitter with Python - 2023-07-13
- Protocols in Python - 2023-07-26
- Checking if something is callable or async callable in Python - 2023-08-04
- A simple pattern for inlining binary content in a Python script - 2023-08-19
- Using pprint() to print dictionaries while preserving their key order - 2024-01-14
- Getting Python MD5 to work with FIPS systems - 2024-02-13
- Programmatically comparing Python version strings - 2024-03-17
- Trying out free-threaded Python on macOS - 2024-07-12
- Using uv to develop Python command-line applications - 2024-10-23
- Installing flash-attn without compiling it - 2024-10-24
- Fixes for datetime UTC warnings in Python - 2024-12-12
- Geocoding from Python on macOS using pyobjc-framework-CoreLocation - 2025-01-26
- Trying out Python packages with ipython and uvx - 2025-02-13
- Testing different Python versions with uv with-editable and uv-test - 2025-10-08
zeit-now
- Running a Python ASGI app on Vercel - 2020-04-19
- Redirecting all paths on a Vercel instance - 2021-03-27
sqlite
- Lag window function in SQLite - 2020-04-19
- Null case comparisons in SQLite - 2020-04-21
- Compile a new sqlite3 binary on Ubuntu - 2020-04-30
- List all columns in a SQLite database - 2020-05-06
- Using LD_PRELOAD to run any version of SQLite with Python - 2020-06-17
- SQLite BLOB literals - 2020-07-29
- Enabling WAL mode for SQLite database files - 2020-08-09
- Compiling the SQLite spellfix.c module on macOS - 2020-09-19
- Figuring out if a text value in SQLite is a valid integer or float - 2020-09-27
- Replicating SQLite with rqlite - 2020-12-28
- Identifying column combination patterns in a SQLite table - 2021-01-12
- Fixing broken text encodings with sqlite-transform and ftfy - 2021-01-18
- Splitting on commas in SQLite - 2021-02-01
- Querying for items stored in UTC that were created on a Thursday in PST - 2021-03-12
- Using pysqlite3 on macOS - 2021-07-10
- Importing CSV data into SQLite with .import - 2021-07-13
- SQLite aggregate filter clauses - 2021-08-04
- Building a specific version of SQLite with pysqlite on macOS/Linux - 2021-08-14
- Track timestamped changes to a SQLite table using triggers - 2021-08-19
- json_extract() path syntax in SQLite - 2022-01-18
- Ordered group_concat() in SQLite - 2022-02-06
- Combining substr and instr to extract text - 2022-02-15
- The simplest recursive CTE - 2022-03-20
- Counting SQLite virtual machine operations - 2022-03-20
- One-liner for running queries against CSV files with SQLite - 2022-06-20
- Related content with SQLite FTS and a Datasette template function - 2022-07-31
- Trying out SQLite extensions on macOS - 2022-08-03
- Sort by number of JSON intersections - 2022-08-17
- Seeing which functions are unique to a specific SQLite / Datasette instance - 2022-08-23
- SQLite VACUUM: database or disk is full - 2022-08-29
- Returning related rows in a single SQL query using JSON - 2022-09-16
- Finding the SQLite version used by Web SQL in Chrome - 2022-10-28
- SQLite can use more than one index for a query - 2022-12-11
- Comparing database rows before and after with SQLite JSON functions - 2022-12-14
- Geopoly in SQLite - 2023-01-04
- Loading SQLite extensions in Python on macOS - 2023-01-07
- SQLite pragma_function_list() - 2023-01-27
- Combining CTEs and VALUES in SQLite - 2023-01-29
- The SQLite now argument is stable within the same query - 2023-02-05
- Subqueries in select expressions in SQLite - also window functions - 2023-02-08
- Copy tables between SQLite databases - 2023-04-03
- Saving an in-memory SQLite database to a file in Python - 2023-04-08
- Unix timestamp in milliseconds in SQLite - 2023-04-08
- Comparing two training datasets using sqlite-utils - 2023-05-23
- A one-liner to output details of the current Python's SQLite - 2023-08-19
- Calculating the size of a SQLite database file using SQL - 2023-08-21
- Compile and run a new SQLite version with the existing sqlite3 Python library on macOS - 2023-08-22
- Trying out cr-sqlite on macOS - 2023-09-12
- Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg - 2023-09-25
- Running Steampipe extensions in sqlite-utils and Datasette - 2023-12-20
- Tracking SQLite table history using a JSON audit log - 2024-02-26
- SQLite timestamps with floating point seconds - 2024-03-13
- Using sqlite-vec with embeddings in sqlite-utils and Datasette - 2024-08-11
- Compiling and running sqlite3-rsync - 2024-10-04
- SQLite triggers - 2025-05-09
presenting
- Using macOS stickies to display a workshop link on the screen - 2020-04-20
macos
- Running pip install -e .[test] in zsh on macOS Catalina - 2020-04-21
- Get Skitch working on Catalina - 2020-04-21
- Close terminal window on Ctrl+D for macOS - 2020-04-21
- Fixing "compinit: insecure directories" error - 2020-04-26
- Finding the largest SQLite files on a Mac - 2020-08-19
- Shrinking PNG files with pngquant and oxipng - 2021-02-07
- Running Docker on an M1 Mac - 2021-05-25
- Using lsof on macOS - 2021-12-11
- Installing Python on macOS with the official Python installer - 2022-02-28
- Trick Apple Photos into letting you access your video files - 2022-04-12
- Seeing files opened by a process using opensnoop - 2022-04-26
- Atuin for zsh shell history in SQLite - 2022-04-26
- Driving an external display from a Mac laptop - 2022-09-10
- Browse files (including SQLite databases) on your iPhone with ifuse - 2022-09-13
- sips: Scriptable image processing system - 2023-02-18
- Using fs_usage to see what files a process is using - 2023-06-15
- Syncing slide images and audio in iMovie - 2023-06-15
- Local wildcard DNS on macOS with dnsmasq - 2023-06-30
- Downloading partial YouTube videos with ffmpeg - 2023-08-26
- Grabbing a transcript of a short snippet of a YouTube video with MacWhisper - 2023-11-30
- Editing an iPhone home screen using macOS - 2023-12-11
- impaste: pasting images to piped commands on macOS - 2024-04-04
- A script to capture frames from a QuickTime video - 2024-04-16
- Transcribing MP3s with whisper-cpp on macOS - 2024-04-26
- Accessing 1Password items from the terminal - 2024-07-09
- Converting ORF raw files to JPEG on macOS - 2025-06-26
cloudrun
- Use labels on Cloud Run services for a billing breakdown - 2020-04-21
- How to deploy a folder with a Dockerfile to Cloud Run - 2020-08-04
- Using the gcloud run services list command - 2020-09-01
- Listing files uploaded to Cloud Build - 2021-04-14
- Switching between gcloud accounts - 2021-05-18
- Increasing the time limit for a Google Cloud Scheduler task - 2021-07-08
- Tailing Google Cloud Run request logs and importing them into SQLite - 2021-08-09
- Using build-arg variables with Cloud Run deployments - 2021-11-19
tailscale
- Restricting SSH connections to devices within a Tailscale network - 2020-04-23
- Using a Tailscale exit node with GitHub Actions - 2025-02-22
pytest
- Session-scoped temporary directories in pytest - 2020-04-26
- How to mock httpx using pytest-mock - 2020-04-29
- Asserting a dictionary is a subset of another dictionary - 2020-05-28
- Registering temporary pluggy plugins inside tests - 2020-07-21
- Code coverage using pytest and codecov.io - 2020-08-15
- Start a server in a subprocess during a pytest session - 2020-08-31
- Using VCR and pytest with pytest-recording - 2021-11-02
- Quick and dirty mock testing with mock_calls - 2021-11-02
- Writing pytest tests against tools written with argparse - 2022-01-08
- Testing a Click app with streaming input - 2022-01-09
- Opt-in integration tests with pytest --integration - 2022-01-26
- pytest coverage with context - 2022-03-04
- Async fixtures with pytest-asyncio - 2022-03-19
- Treating warnings as errors in pytest - 2022-04-01
- Using pytest and Playwright to test a JavaScript web application - 2022-07-24
- Mocking a Textract LimitExceededException with boto - 2022-08-07
- Show files opened by pytest tests - 2022-12-11
- Mocking subprocess with pytest-subprocess - 2023-03-08
- Snapshot testing with Syrupy - 2023-09-26
- Mocking Stripe signature checks in a pytest fixture - 2024-07-01
- Using namedtuple for pytest parameterized tests - 2024-08-31
- Running pytest against a specific Python version with uv run - 2025-02-04
- A tip for debugging pytest-httpx - 2025-05-28
- Subtests in pytest 9.0.0+ - 2025-12-04
github
- Accessing repository dependencies in the GitHub GraphQL API - 2020-04-30
- Paginating through the GitHub GraphQL API with Python - 2020-07-09
- Searching for repositories by topic using the GitHub GraphQL API - 2020-10-09
- Bulk fetching repository details with the GitHub GraphQL API - 2021-01-17
- Syntax highlighting Python console examples with GFM - 2021-01-18
- Transferring a GitHub issue from a private to a public repository - 2021-12-22
- Configuring Dependabot for a Python project - 2022-01-14
- Setting up a custom subdomain for a GitHub Pages site - 2022-05-04
- Reporting bugs in GitHub to GitHub - 2022-07-07
- Migrating a GitHub wiki from one repository to another - 2022-07-28
- Clone, edit and push files that live in a Gist - 2022-09-08
- GitHub Pages: The Missing Manual - 2022-10-31
- Finding uses of an API with the new GitHub Code Search - 2022-12-08
- Bulk editing status in GitHub Projects - 2023-06-29
- Running a Django and PostgreSQL development environment in GitHub Codespaces - 2023-08-10
- Assistance with release notes using GitHub Issues - 2024-08-05
- Publishing a Docker container for Microsoft Edit to the GitHub Container Registry - 2025-06-21
- Configuring GitHub Codespaces using devcontainers - 2025-08-12
- Downloading archived Git repositories from archive.softwareheritage.org - 2025-12-30
node
- Constant-time comparison of strings in Node - 2020-05-01
firefox
- Search across all loaded resources in Firefox - 2020-05-05
markdown
- Converting HTML and rich-text to Markdown - 2020-05-09
- Rendering Markdown with the GitHub Markdown API - 2020-08-22
- Useful Markdown extensions in Python - 2021-04-03
pypi
- Adding project links to PyPI - 2020-05-11
- Publish releases to PyPI from GitHub Actions without a password or token - 2024-01-14
asgi
- Writing tests for the ASGI lifespan protocol with HTTPX - 2020-06-29
heroku
- Using heroku pg:pull to restore a backup to a macOS laptop - 2020-07-10
- Upgrading a Heroku PostgreSQL database with pg:copy - 2020-07-20
- Programatically accessing Heroku PostgreSQL from GitHub Actions - 2020-08-18
javascript
- Implementing a "copy to clipboard" button - 2020-07-23
- Working around the size limit for nodeValue in the DOM - 2020-08-21
- Dynamically loading multiple assets with a callback - 2020-08-21
- Minifying JavaScript with npx uglify-js - 2020-08-30
- Manipulating query strings with URLSearchParams - 2020-10-04
- Writing JavaScript that responds to media queries - 2020-10-21
- Dropdown menu with details summary - 2020-10-31
- Using Jest without a package.json - 2020-12-30
- Scroll page to form if there are errors - 2021-05-08
- Preventing double form submissions with JavaScript - 2021-07-08
- Loading lit from Skypack - 2021-09-21
- Using Tesseract.js to OCR every image on a page - 2021-11-09
- JavaScript date objects - 2022-01-16
- Creating a tiled zoomable image with OpenSeadragon and vips - 2022-08-12
- Copy rich text to the clipboard - 2023-03-10
- Using packages from JSR with esbuild - 2024-03-02
django
- PostgreSQL full-text search in the Django Admin - 2020-07-25
- Adding extra read-only information to a Django admin change page - 2021-02-25
- Writing tests for the Django admin with pytest-django - 2021-03-02
- Show the timezone for datetimes in the Django admin - 2021-03-02
- Pretty-printing all read-only JSON in the Django admin - 2021-03-07
- How to almost get facet counts in the Django admin - 2021-03-11
- Efficient bulk deletions in Django - 2021-04-09
- Enabling the fuzzystrmatch extension in PostgreSQL with a Django migration - 2021-04-18
- Usable horizontal scrollbars in the Django admin for mouse users - 2021-04-20
- Filter by comma-separated values in the Django admin - 2021-04-21
- Django Admin action for exporting selected rows as CSV - 2021-04-25
- migrations.RunSQL.noop for reversible SQL migrations - 2021-05-02
- Enabling a gin index for faster LIKE queries - 2021-05-16
- Django data migration using a PostgreSQL CTE - 2021-05-17
- Using just with Django - 2022-06-06
- Adding a Datasette ASGI app to Django - 2022-10-20
- Building a blog in Django - 2023-08-15
- Using pytest-django with a reusable Django application - 2024-08-07
- Building an automatically updating live blog in Django - 2024-10-02
docker
- Attaching a bash shell to a running Docker container - 2020-08-10
- Running gdb against a Python process in a running Docker container - 2021-03-21
- Installing packages from Debian unstable in a Docker image based on stable - 2021-03-22
- Docker Compose for Django development - 2021-05-24
- Allowing a container in Docker Desktop for Mac to talk to a PostgreSQL server on the host machine - 2022-03-31
- Testing things in Fedora using Docker - 2022-07-27
- Emulating a big-endian s390x with QEMU - 2022-07-29
- Run pytest against a specific Python version using Docker - 2022-09-05
- Using pipenv and Docker - 2022-11-28
homebrew
- Packaging a Python CLI tool for Homebrew - 2020-08-11
- Browsing your local git checkout of homebrew-core - 2020-08-27
- Upgrading Python Homebrew packages using pip - 2020-10-14
- Running a MySQL server using Homebrew - 2021-06-11
- Running the latest SQLite in Datasette using Homebrew - 2022-02-28
- Automatically maintaining Homebrew formulas using GitHub Actions - 2023-06-21
- Upgrading Homebrew and avoiding the failed to verify attestation error - 2024-10-09
zsh
- Customizing my zsh prompt - 2020-08-12
- Passing command arguments using heredoc syntax - 2022-07-07
readthedocs
- Pointing a custom subdomain at Read the Docs - 2020-08-14
- Read the Docs Search API - 2020-08-16
- Using custom Sphinx templates on Read the Docs - 2020-12-07
- Promoting the stable version of the documentation using rel=canonical - 2022-01-20
- Linking from /latest/ to /stable/ on Read The Docs - 2022-01-20
- Updating stable docs in ReadTheDocs without pushing a release - 2023-08-20
- Running pip install '.[docs]' on ReadTheDocs - 2023-11-24
ics
- Providing a "subscribe in Google Calendar" link for an ics feed - 2020-08-21
svg
- Creating a dynamic line chart with SVG - 2020-08-22
linux
- Piping echo to a file owned by root using sudo and tee - 2020-08-24
- Basic strace to see what a process is doing - 2020-09-07
- Enabling a user to execute a specific command as root without a password - 2022-02-13
- Using iconv to convert the text encoding of a file - 2022-06-14
jq
- Converting Airtable JSON for use with sqlite-utils using jq - 2020-08-28
- Loading radio.garden into SQLite using jq - 2021-02-17
- Flattening nested JSON objects with jq - 2021-03-11
- Converting no-decimal-point latitudes and longitudes using jq - 2021-03-11
- Turning an array of arrays into objects with jq - 2021-05-25
- Extracting objects recursively with jq - 2021-07-24
- Convert git log output to JSON using jq - 2023-03-25
- Combined release notes from GitHub with jq and paginate-json - 2023-08-12
bash
- Looping over comma-separated values in Bash - 2020-09-01
- Escaping strings in Bash using !:q - 2020-10-01
- Escaping a SQL query to use with curl and Datasette - 2020-12-08
- Skipping CSV rows with odd numbers of quotes using ripgrep - 2020-12-11
- Finding CSV files that start with a BOM using ripgrep - 2021-05-28
- nullglob in bash - 2022-02-14
- Using awk to add a prefix - 2022-04-08
- Ignoring errors in a section of a Bash script - 2022-06-27
- Start, test, then stop a localhost web server in a Bash script - 2022-12-17
- Running multiple servers in a single Bash script - 2023-08-16
- A shell script for running Go one-liners - 2023-08-20
typescript
- Very basic tsc usage - 2020-09-06
aws
- Display EC2 instance costs per month - 2020-09-06
- Recovering data from AWS Lightsail using EC2 - 2021-01-16
- Adding a CORS policy to an S3 bucket - 2022-01-04
- Helper function for pagination using AWS boto3 - 2022-01-19
- Running OCR against a PDF file with AWS Textract - 2022-06-28
- Using boto3 from the command line - 2022-08-02
- Athena error: The specified key does not exist - 2022-09-27
- Querying newline-delimited JSON logs using AWS Athena - 2022-10-06
- Using S3 triggers to maintain a list of files in DynamoDB - 2025-02-19
jinja
- Turning on Jinja autoescaping when using Template() directly - 2020-09-18
- Formatting thousands in Jinja - 2022-06-08
- Custom Jinja template tags with attributes - 2023-07-01
selenium
- Installing Selenium for Python on macOS with ChromeDriver - 2020-10-02
- Using async/await in JavaScript in Selenium - 2020-10-02
digitalocean
- Running Datasette on DigitalOcean App Platform - 2020-10-06
datasette
- Redirects for Datasette - 2020-11-25
- Serving MBTiles with datasette-media - 2021-02-03
- Querying for GitHub issues open for less than 60 seconds - 2021-03-12
- Running Datasette on Replit - 2021-05-02
- Searching all columns of a table in Datasette - 2021-08-23
- Reusing an existing Click tool with register_commands - 2021-11-29
- Crawling Datasette with Datasette - 2022-02-27
- Registering new Datasette plugin hooks by defining them in other plugins - 2022-06-17
- Writing a Datasette CLI plugin that mostly duplicates an existing command - 2022-10-22
- Writing a CLI utility that is also a Datasette plugin - 2022-11-21
- Scraping Reddit and writing data to the Datasette write API - 2023-03-13
- Interactive row selection prototype with Datasette - 2023-03-30
- Exploring Baseline with Datasette Lite - 2023-05-12
- Syntax highlighted code examples in Datasette - 2023-07-01
- Using pytest-httpx to run intercepted requests through an in-memory Datasette instance - 2023-07-24
- Remember to commit when using datasette.execute_write_fn() - 2023-08-31
- Running Datasette on Hugging Face Spaces - 2023-09-08
- Writing Playwright tests for a Datasette Plugin - 2024-01-08
jupyter
- Embedding JavaScript in a Jupyter notebook - 2021-01-22
- Running jupyterlab via uv tool install - 2025-03-08
cookiecutter
- Testing cookiecutter templates with pytest - 2021-01-27
- Conditionally creating directories in cookiecutter - 2021-01-27
gis
- Downloading MapZen elevation tiles - 2021-02-04
- Natural Earth in SpatiaLite and Datasette - 2022-03-04
- Using SQL with GDAL - 2023-03-09
- Serving a custom vector web map using PMTiles and maplibre-gl - 2023-10-23
sphinx
- Using sphinx.ext.extlinks for issue links - 2021-02-17
- Adding Sphinx autodoc to a project, and configuring Read The Docs to build it - 2021-08-10
- Format code examples in documentation with blacken-docs - 2022-04-24
- literalinclude with markers for showing code in documentation - 2024-01-10
postgresql
- Show the SQL schema for a PostgreSQL database - 2021-02-23
- Granting a PostgreSQL user read-only access to some tables - 2021-02-26
- Closest locations to a point - 2021-03-22
- Using unnest() to use a comma-separated string as the input to an IN query - 2021-04-10
- Using json_extract_path in PostgreSQL - 2021-04-13
- Constructing GeoJSON in PostgreSQL - 2021-04-24
- Upgrade Postgres.app on macOS - 2024-06-15
mediawiki
- How to run MediaWiki with SQLite on a macOS laptop - 2021-03-06
azure
- Writing an Azure Function that serves all traffic to a subdomain - 2021-03-27
vscode
- Language-specific indentation settings in VS Code - 2021-04-04
- Search and replace with regular expressions in VS Code - 2021-08-02
wikipedia
- The Wikipedia page stats API - 2021-05-13
vega
- Vega-Lite bar charts in the same order as the data - 2021-05-15
spatialite
- KNN queries with SpatiaLite - 2021-05-16
- Creating a minimal SpatiaLite database with Python - 2021-12-17
- GUnion to combine geometries in SpatiaLite - 2022-04-12
- Viewing GeoPackage data with SpatiaLite and Datasette - 2022-12-11
sql
- Finding duplicate records by matching name and nearby distance - 2021-05-19
- Building a Markdown summary of Django group permissions - 2021-06-03
- Cumulative total over time in SQL - 2021-09-13
- Using recursive CTEs to explore hierarchical Twitter threads - 2023-01-30
- Consecutive groups in SQL using window functions - 2023-06-08
amplitude
- Exporting Amplitude events to SQLite - 2021-06-06
vim
- Mouse support in vim - 2021-06-19
- Scraping Reddit via their JSON API - 2021-06-21
nginx
- Using nginx to proxy to a Unix domain socket - 2021-07-10
tesseract
- Using the tesseract CLI tool - 2021-07-18
imagemagick
- Set a GIF to loop using ImageMagick - 2021-08-03
- Compressing an animated GIF with gifsicle or ImageMagick mogrify - 2021-08-05
observable-plot
- Histogram with tooltips in Observable Plot - 2021-08-21
- Wider tooltip areas for Observable Plot - 2022-11-21
purpleair
- Calculating the AQI based on the Purple Air API for a sensor - 2021-08-31
electron
- Using the Chrome DevTools console as a REPL for an Electron app - 2021-08-31
- Open external links in an Electron app using the system browser - 2021-09-02
- Signing and notarizing an Electron app for distribution using GitHub Actions - 2021-09-08
- Bundling Python inside an Electron app - 2021-09-08
- Configuring auto-update for an Electron app - 2021-09-13
- Testing Electron apps with Playwright and GitHub Actions - 2022-07-13
googlecloud
- Publishing to a public Google Cloud bucket with gsutil - 2021-09-20
- Google OAuth for a CLI application - 2022-02-16
- Recursively fetching metadata for all files in a Google Drive folder - 2022-02-16
- Analyzing Google Cloud spend with Datasette - 2022-08-16
- Workaround for google-github-actions/setup-gcloud errors - 2022-12-01
- Reading thermometer temperatures over time from a video - 2023-04-02
git
- Removing a git commit and force pushing to remove it from history - 2021-10-22
- Rewriting a repo to contain the history of just specific files - 2022-03-22
- git bisect - 2022-10-29
- How to create a tarball of a git repository using "git archive" - 2022-11-15
- Rewriting a Git repo to remove secrets from the history - 2023-01-24
- Using git-filter-repo to set commit dates to author dates - 2023-07-10
- Back-dating Git commits based on file modification dates - 2024-08-01
- Calculating the size of all LFS files in a repo - 2024-12-25
web-components
- Understanding Kristofer Joseph's Single File Web Component - 2021-10-27
kubernetes
- Basic Datasette in Kubernetes - 2021-11-05
- kubectl proxy - 2021-12-28
deno
- Annotated code for a demo of WebSocket chat in Deno Deploy - 2021-11-06
- Deno KV - 2023-04-28
- Running Python code in a Pyodide sandbox via Deno - 2023-05-10
fly
- Assigning a custom subdomain to a Fly app - 2021-11-20
- Using the undocumented Fly GraphQL API - 2022-01-21
- Using the Fly Docker registry - 2022-05-21
- Writing Fly logs to S3 - 2022-05-25
- Wildcard DNS and SSL on Fly - 2022-05-25
- Deploying a redbean app to Fly - 2022-07-24
- How to scp files to and from Fly - 2022-09-02
- Configuring Django SQL Dashboard for Fly PostgreSQL - 2023-08-21
- Deploying the CLIP embedding model on Fly - 2023-10-18
- Running Varnish on Fly - 2024-01-08
caddy
- Pausing traffic and retrying in Caddy - 2021-11-24
npm
- Publishing a Web Component to npm - 2021-11-28
- Annotated package.json for idb-keyval - 2022-02-10
- Upgrading packages with npm - 2022-07-13
- Running self-hosted QuickJS in a browser - 2024-03-20
- Running Prettier against Django or Jinja templates - 2024-06-19
- Publishing a simple client-side JavaScript package to npm with GitHub Actions - 2024-12-07
pluggy
- Registering the same Pluggy hook multiple times in a single file - 2021-12-16
cloudflare
- Adding a robots.txt using Cloudflare workers - 2021-12-21
- How to get Cloudflare to cache HTML - 2024-01-08
- Redirecting a whole domain with Cloudflare - 2024-03-15
- Cloudflare redirect rules with dynamic expressions - 2024-05-29
- Setting cache-control: max-age=31536000 with a Cloudflare Transform Rule - 2024-10-23
- GitHub OAuth for a static site using Cloudflare Workers - 2024-11-28
- Redirecting a domain using Cloudflare Pages - 2025-05-28
- Rate limiting by IP using Cloudflare's rate limiting rules - 2025-07-03
- Cloudflare response header transform rules - 2026-01-23
- Cloudflare CAPTCHA on at least one ampersand - 2026-06-15
webauthn
- WebAuthn browser support - 2021-12-29
pixelmator
- Pixel editing a favicon with Pixelmator - 2022-01-20
graphql
- get-graphql-schema - 2022-02-01
- Using curl to run GraphQL queries from the command line - 2022-02-21
- GraphQL fragments - 2022-09-30
google-sheets
- Concatenating strings and newlines in Google Sheets - 2022-03-15
- SQL functions in Google Sheets to fetch data from Datasette - 2026-04-19
- Exporting and editing a Twitter Spaces recording - 2022-03-23
- How to get credentials for a new Twitter bot - 2022-04-17
- Loading Twitter Birdwatch into SQLite for analysis with Datasette - 2022-09-03
- Collecting replies to tweets using JavaScript - 2024-10-08
shot-scraper
- Extracting web page content using Readability.js and shot-scraper - 2022-03-24
- shot-scraper for a subset of table columns - 2022-10-14
- Scraping the Sky News Westminster Accounts, a Flourish application - 2023-01-10
- Social media cards generated with shot-scraper - 2023-04-29
- axe-core and shot-scraper for accessibility audits - 2023-07-30
auth0
- Simplest possible OAuth authentication with Auth0 - 2022-03-26
- Logging users out of Auth0 - 2022-04-03
webassembly
- Compiling to WASM with llvm on macOS - 2022-03-28
- Run Python code in a WebAssembly sandbox - 2023-02-02
service-workers
- Intercepting fetch in a service worker - 2022-04-30
networking
- Making HTTP calls using IPv6 - 2022-06-08
- Running Ethernet over existing coaxial cable - 2024-02-12
gpt3
- Using GPT-3 to figure out jq recipes - 2022-08-10
- Guessing Amazon image URLs using GitHub Copilot - 2022-10-15
- Generating OpenAPI specifications using GPT-3 - 2022-11-13
- Writing tests with Copilot - 2022-11-14
- Reformatting text with Copilot - 2022-12-09
- A simple Python wrapper for the ChatGPT API - 2023-03-02
- Using ChatGPT to write AppleScript - 2023-03-08
- Using the ChatGPT streaming API from Python - 2023-04-01
- GPT-4 for API design research - 2023-04-06
- Using ChatGPT Browse to name a Python package - 2023-06-18
- Using OpenAI functions and their Python library for data extraction - 2023-07-09
quarto
- Trying out Quarto on macOS - 2022-08-18
duckdb
- Using DuckDB in Python to access Parquet data - 2022-09-16
- Use DuckDB to convert parquet to JSON and then open it in Datasette Lite - 2023-03-21
- Summing columns in remote Parquet files using DuckDB - 2023-11-14
awslambda
- Deploying Python web apps as AWS Lambda functions - 2022-09-18
cocktails
- Whisky sour - 2022-09-25
- Tommy's Margarita - 2022-10-02
- Pisco sour - 2022-10-08
html
- HTML video that loads when the user clicks play - 2022-09-29
- HTML datalist - 2022-11-14
- Lazy loading images in HTML - 2022-11-26
- Scroll to text fragments - 2023-08-08
- HTML video with subtitles - 2024-07-31
mastodon
- Getting Mastodon running on a custom domain - 2022-11-02
- Export a Mastodon timeline to SQLite - 2022-11-04
- Verifying your GitHub profile on Mastodon - 2022-11-16
- Building Mastodon bots with GitHub Actions and toot - 2023-02-02
json
- JSON Pointer - 2022-11-14
- Processing a stream of chunks of JSON with ijson - 2023-08-15
- Streaming output of an indented JSON array - 2023-08-29
clickhouse
- Querying the GitHub archive with the ClickHouse playground - 2022-12-31
- Reviewing your history of public GitHub repositories using ClickHouse - 2024-03-20
cooking
- Breakfast tacos with eggs, vegetarian sausages and avocado sauce - 2023-01-02
llms
- Running nanoGPT on a MacBook M2 to generate terrible Shakespeare - 2023-02-01
- Training nanoGPT entirely on content from my blog - 2023-02-09
- Running LLaMA 7B and 13B on a 64GB M2 MacBook Pro with llama.cpp - 2023-03-10
- A simple Python implementation of the ReAct pattern for LLMs - 2023-03-17
- Running Dolly 2.0 on Paperspace - 2023-04-12
- Expanding ChatGPT Code Interpreter with Python packages, Deno and Lua - 2023-04-30
- mlc-chat - RedPajama-INCITE-Chat-3B on macOS - 2023-05-22
- Running OpenAI's large context models using llm - 2023-06-13
- Storing and serving related documents with openai-to-sqlite and embeddings - 2023-08-14
- Embedding paragraphs from my blog with E5-large-v2 - 2023-09-08
- Summarizing Hacker News discussion themes with Claude and LLM - 2023-09-09
- Using llama-cpp-python grammars to generate JSON - 2023-09-12
- Exploring ColBERT with RAGatouille - 2024-01-27
- Piping from rg to llm to answer questions about code - 2024-02-11
- How streaming LLM APIs work - 2024-09-21
- Running prompts against images, PDFs, audio and video with Google Gemini - 2024-10-23
- Generating documentation from tests using files-to-prompt and LLM - 2024-11-05
- Named Entity Resolution with dslim/distilbert-NER - 2024-12-23
- Running a gpt-oss eval suite against LM Studio on a Mac - 2025-08-16
- Exploring OpenAI's deep research API model o4-mini-deep-research - 2025-10-18
- Using Codex CLI with gpt-oss:120b on an NVIDIA DGX Spark via Tailscale - 2025-11-06
- Running OpenClaw in Docker - 2026-02-01
- Using LLM in the shebang line of a script - 2026-05-11
- Setting a custom price for a model in AgentsView - 2026-06-09
- Adding a custom MCP server to Claude and ChatGPT - 2026-07-28
ab
- Avoiding "length" errors in Apache Bench with the -l option - 2023-02-08
hacker-news
- How to read Hacker News threads with most recent comments first - 2023-03-12
observable
- Using jq in an Observable notebook - 2023-03-25
midjourney
- Creating desktop backgrounds using Midjourney - 2023-04-10
exif
- Interpreting photo orientation and locations in EXIF data - 2023-04-22
misc
- hexdump and hexdump -C - 2023-05-22
- Cloning my voice with ElevenLabs - 2023-11-15
http
- Testing the Access-Control-Max-Age CORS header - 2023-05-25
discord
- A Discord bot to expand issue links to a private GitHub repository - 2023-06-29
yaml
- Auto-formatting YAML files with yamlfmt - 2023-07-13
overture-maps
- Exploring the Overture Maps places data using DuckDB, sqlite-utils and Datasette - 2023-07-27
cosmopolitan
- Catching up with the Cosmopolitan ecosystem - 2023-08-10
- Limited JSON API for Google searches using Programmable Search Engine - 2023-09-16
- Generating URLs to a Gmail compose window - 2024-03-12
machinelearning
- Trying out the facebook/musicgen-small sound generation model - 2023-09-23
css
- Understanding the CSS auto-resizing textarea trick - 2023-09-30
- A simple two column CSS grid - 2023-10-26
- Styling an HTML dialog modal to take the full height of the viewport - 2025-03-14
pyodide
- Cryptography in Pyodide - 2023-11-26
playwright
- Using expect() to wait for a selector to match multiple items - 2024-01-13
- Testing HTML tables with Playwright Python - 2024-09-03
httpx
- Logging OpenAI API requests and responses using HTTPX - 2024-01-26
valtown
- Running a scheduled function on Val Town to import Atom feeds into Datasette Cloud - 2024-02-20
chrome
- Google Chrome --headless mode - 2024-03-24
go
- Installing tools written in Go - 2024-03-25
ham-radio
- How I studied for my Ham radio general exam - 2024-05-11
ios
- Listen to a web page in Mobile Safari - 2024-05-21
youtube
- Livestreaming a community election event on YouTube - 2024-10-09
- Error 153 Video player configuration error on YouTube embeds - 2025-09-30
hugo
- The most basic possible Hugo site - 2024-10-22
uv
- Using uv to develop Python command-line applications - 2024-10-23
- Running pytest against a specific Python version with uv run - 2025-02-04
- Testing different Python versions with uv with-editable and uv-test - 2025-10-08
- Dependency groups and uv run - 2025-12-02
tiktok
- Downloading every video for a TikTok account - 2025-01-18
claude-code
- Using Playwright MCP with Claude Code - 2025-07-01
- Previewing Claude Code for web branches with GitHub Pages - 2026-01-22
neon
- Taking Neon I at the Crucible - 2026-01-11
Repo liên quan
Master programming by recreating your favorite technologies from scratch.
A curated meta-list of curated lists organized by technology domain. The repository acts as a directory pointing to hundreds of specialized awesome lists covering programming languages, platforms, frameworks, and tooling. All content is community-contributed under the CC0 public domain dedication.
Public APIs is a community-curated GitHub repository listing free, publicly accessible APIs across a wide range of categories, with auth type, HTTPS, and CORS noted for each entry. It's a browsable reference, not a library to install.
freeCodeCamp is a free, self-paced curriculum for learning to code, published as open source at freeCodeCamp/freeCodeCamp. It's a 501(c)(3) nonprofit funded by donor support, structured around six certifications in its Full-Stack Developer Curriculum, each gated by required projects instead of open-book quizzes. The repository also carries beta language certifications for developers, interview-prep resources, and the code that runs the live freecodecamp.org platform.
Trả lời nhanh
Đọc thêm về simonw/til ở đâu?
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/simonw/til là nguồn chính thức.
simonw/til có những chủ đề gì?
GitHub topics của simonw/til: "datasette", "til". TopGit xếp repo vào nhóm mã nguồn mở.
simonw/til có phải mã nguồn mở không?
Có — simonw/til phát hành theo license Apache-2.0, nghĩa là mã nguồn mở để đọc, fork và (tùy license) tái sử dụng. Mã: github.com/simonw/til.
simonw/til có trang demo không?
Dự án có trang chủ ở https://til.simonwillison.net. Tab "Readme" ở trang này thường có ảnh chụp và hướng dẫn bắt đầu nhanh.
simonw/til còn đang phát triển không?
Commit gần nhất trên simonw/til là 17 ngày trước (theo timestamp GitHub). Repo có 119 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
simonw/til dùng license gì?
simonw/til phát hành theo license Apache-2.0. Nên mở file LICENSE trên GitHub để xác nhận — license metadata đôi khi lệch với thực tế dự án.
Đọc đầy đủ README ở tab phía trên.
Vẫn đang phân vân về til?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về til.