pamela fox's blog
AI / MLPythonJavaScript / TypeScriptEssays / personalEngineering blogs
- Posts
- 338 from 20 Oct 2007 to 20 Aug 2026
- Posting
- monthly (10 in the last year)
- Kind
- personal blog
- Feed
- http://blog.pamelafox.org/feeds/posts/default
2026 8
- Browser automation with Pydantic AI + Playwright
- Building safe MCP servers for your PostgreSQL database
- My experience at PyCon US 2026
- Building MCP servers with Entra ID and pre-authorized clients
- Do stricter MCP tool schemas increase agent reliability?
- Can MCP choose my outfit?
- Learnings from the PyAI conference
- Using on-behalf-of flow for Entra-based MCP servers
2025 19
- Watch the recordings from my Python + MCP series
- Watch the recordings from my Python + AI series
- Filter the tools from MCP servers
- How I learn about generative AI
- GPT-5: Will it RAG?
- Red-teaming a RAG app: gpt-4o-mini v. llama3.1 v. hermes3
- Automated repo maintenance via GitHub Copilot coding agent
- To MCP or not to MCP?
- MCP: Bringing mashups back!
- Getting a hysterectomy: My reasons and recovery
- Proficient Python: A free interactive online course
- Teaching Python with Codespaces
- A visual introduction to vector embeddings
- Using DefaultAzureCredential across multiple tenants
- Use any Python AI agent framework with free GitHub Models
- Building a streaming DeepSeek-R1 app on Azure
- Evaluating gpt-4o-mini vs. gpt-3.5-turbo for RAG applications
- Safety evaluations for LLM-powered apps
- Observations: Using Python with DeepSeek-R1
2024 23
- Add browser speech input & output to your app
- Running Azurite inside a Dev Container
- Making a dev container with multiple data services
- My first PyBay: Playing improv with Python
- Entity extraction using OpenAI structured outputs mode
- My parenting strategy: earn enough $ to outsource
- Integrating vision into RAG applications
- Making an Ollama-compatible RAG app
- Playwright and Pytest parametrization for responsive E2E tests
- Should you use Quart or FastAPI for an AI app?
- pgvector for Python developers
- Using SLMs in GitHub Codespaces
- RAG on a database table with PostgreSQL
- Doing RAG? Vector search is *not* enough
- Truncating conversation history for OpenAI chat completions
- Evaluating RAG chat apps: Can your app say "I don't know"?
- RAG techniques: Function calling for more structured retrieval
- RAG techniques: Cleaning user questions with an LLM
- Converting HTML pages to PDFs with Playwright
- Evaluating a RAG chat app: Approach, SDKs, and Tools
- Developer relations & motherhood: Will they blend?
- Using FastAPI for an OpenAI chat backend
- Using llamafile for local dev for an OpenAI Python web app
2023 33
- Santa Tracker Tales: Nearly crashing Google's servers, Leaking Santa's data, and Angering an entire country
- How to document a native California garden
- My failed attempt at using a closet as an office
- Strategies for managing dependencies for Python samples
- Using SQLAlchemy 2.0 in Flask
- Best practices for OpenAI Chat apps: Go Keyless
- Best practices for OpenAI Chat apps: Streaming UI
- Best practices for OpenAI Chat apps: Concurrency
- Mocking async openai package calls with pytest
- Fetching JSON over streaming HTTP
- Accessibility snapshot testing for Python web apps (Part 2)
- Automated accessibility audits for Python web apps (Part 1)
- Tips for debugging Flask deployments to Azure App Service
- Best practices for prompting GitHub Copilot in VS Code
- Providing feedback on the VS Code Python experience
- Streaming ChatGPT with server-sent events in Flask
- A Dev Container for SQLAlchemy with SQLTools
- Deploying to App Service free tier with Bicep
- Deploying PostgreSQL servers with Bicep
- Converting a Spreadsheet to JSON with Neptyne
- Adding Microsoft Graph authentication as a Flask Blueprint
- Deploying a containerized FastAPI app to Azure Container Apps
- Rendering matplotlib charts in Flask
- Fast-loading Python Dev Containers
- Hosting Python Web Apps on Azure: A Price-Off
- Testing APIFlask with schemathesis
- Managing Python dependency versions for web projects
- Loading multiple Python versions with Pyodide
- Dis This: Disassemble Python code online
- Writing a static maps API with FastAPI and Azure
- Using Copilot with Python apps
- Tips for writing Bicep files for Azure deployment
- Tips for debugging Django deployments to Azure App Service
2022 21
- FastAPI on Azure Functions with Azure API Management
- Running PostgreSQL in a Dev Container with Flask/Django
- Deploying a Django app to Azure with the Azure Developer CLI
- A template for new Python projects with Dev Container support
- Happy Hacktoberfest!
- Deploying a containerized Flask app to Azure Container Apps
- Returning an image from an Azure Function App in Python
- Preparing a Django app for deployment on Azure App Service
- How I setup a Python project
- CS content inclusivity guide
- A browser-based runner for Faded Parsons Problems
- My bed-sharing setup
- Porting a project from spaces to tabs
- Tips for planting milkweeds in the Bay area
- Line highlighting extension for Code Mirror 6
- Inactivity timer for Chrome extensions
- Diversifying historical references in CS classes
- How to audit CS61A
- How accessibility helps a nursing mother
- My experience as a Unit-18 Berkeley Lecturer
- New online class: Python Crash Course on Co:rise
2020 4
2018 6
2017 11
- Oops, I forgot to have kids
- Coding: A Hobby for the Waste-Adverse
- My Morning Practice
- What is the difference between ambition and discontent?
- I stopped listening to music
- Avoiding concept overload on the BART
- Drying out my thought loops
- Learning the Ursonate: the mind-clearing benefits of non-conceptual sound poetry
- My Nightly Gratitude Journal
- Operation Calm the Mind Down
- Project IceBreak: Let’s make networking easier
2016 1
2015 8
2014 4
2013 43
- Digital Learning Apps in Guatemala
- 1 Day in Antigua, Guatemala: Where to Go, What to Eat
- Shyness Hacks for Conferences
- On the Arbitrariness of Swear Words
- JSConf 2013: My Favorite Talks
- Technical Interviews Make Me Cry
- Communication at Khan Academy: Open By Default
- Why Do I Speak at Conferences?
- My Next Adventure: Khan Academy CS
- JavaScript UI Library Design
- The JavaScript Rap
- My Year at Coursera
- Rewriting Django Admin in Backbone
- A Guide to Writing Backbone Apps at Coursera
- What to look for in a software engineering culture
- Which JavaScript Library Should I Pick?
- Testing Backbone Frontends
- Increasing Diverse Engineers in the Workplace: A Call for Studies and Stories
- Our Backbone Stack
- Referencing DOM from JS: there must be a DRYer, safer way
- Exporting a Google Spreadsheet as JSON
- Improving Backbone App Performance
- Google I/O Talk: Online Learning Made Social
- Managing history in Backbone widgets with jQuery BBQ
- Server-side HTML vs. JS Widgets vs. Single-Page Web Apps
- Attracting women to developer events
- Making newbie-friendly developer events
- Outputting iCal with PHP
- Source "Snapshots"
- Rewriting our Forums with Backbone
- Keeping a Product Alive: On-Call & Maintenance
- I'm Bad At Recruiting
- Why I Hate Vanity Tweets
- 5 days in SoCal: Catalina Island, Joshua Tree, and LA
- Co-Learning Spaces
- Checking for Technical Requirements in a Sign-up Process
- Why isn't our warning banner based on feature detection?
- Warning Users on Older Browsers
- My Lasik Journey
- GirlDevelopIt SF: Help us grow in 2013!
- GirlDevelopIt SF: Thanks for a great 2012!
- Xtreme Makeover: Legacy Codebase Edition
- Getting Kids into Programming
2012 39
- My End of Year Donations
- A Tale of Two Bootstraps: Lessons Learned in Maintainable CSS
- Unit Testing our PHP Templates with Selector
- Proving Your Worth as a Self-Taught Developer
- RemixSouth: My Talk and My Favs
- Using Transloadit with Bootstrap
- Creating our Coursera Starter Culture
- Teaching Web Development in Africa
- Donating to Reduce the Birth Rate
- Using the Maps API Autocomplete for User Profile Location
- Geo-Targeted House Ads
- Porting to the Paid Google Translate API v2
- My Next Step: Coursera and The World of Online Education
- A Year of Hermit Hacking
- Alternatives for After-Parties at Conferences
- Client-Side Storage Article Series
- Using Grunt.js with CSS
- The Best Online Editors for Teaching HTML/CSS/JS
- Triggering Numeric Keyboards with HTML5
- Learning to Code in SF
- Learning to Code Online
- Theming Tumblr with Twitter Bootstrap
- Using the Instagram API from a Python Flask App
- Horsing Around Arizona
- Converting Addresses to Timezones in Python
- API Usability Testing
- Working around Android Webkit
- Porting jQuery Plugins to Zepto: Tips & Tricks
- Using FancyBox with Zepto
- The Red Queen: Sex, Gender, & Evolution
- A Yelp for Developer Platforms?
- Picking a Mobile App Strategy (Slides & Links)
- Interactive HTML5 Slides with FathomJS & CodeMirror
- Client-side Storage (Slides & Links)
- Datepicker for Twitter Bootstrap & Zepto/jQuery
- Theming Twitter Bootstrap (Without Less)
- Delayed Image Loading on Long Pages
- Website Monitoring Services
- Testing Facebook Login with Selenium
2011 36
- Reusing HTML/CSS/JS across Web & Mobile
- Using 3-Legged OAuth APIs with Flask
- Upgrading from jQuery Templates to jsRender
- Porting from jQuery to Zepto
- Logging JS Errors on iOS with PhoneGap
- Code Quality Tools
- PhoneGap Loading Performance in iOS
- JS & CSS Compiling, Compression & Cache-Busting
- Modularizing My JavaScript
- Grammatical Personalization in JS
- Ada Lovelace Day: Women that Inspire Me
- User Stats Visualization with HighCharts
- Client-Side Error Logging
- Pre-Deploy Git Check
- Sending Errors to Email in App Engine
- Switching from jQuery Mobile to Twitter Bootstrap
- Spriting with Compass
- WDCNZ: The Developer Experience
- So, what am I, exactly?
- Reading My Way to Better Design
- No, Really, I'm Shy: My Ignite I/O Talk
- Roundup: Developer Documentation Generators
- Roundup: The Best Developer Docs
- What makes a good "developer experience"?
- SF jQuery Conference 2011: My Learnings
- Twenty Questions (With Myself)
- What I Want in a Recipe Blogging Platform
- The Developer Support Handbook (aka How I Did My Job)
- Sightseeing in Sydney: What to See, Eat, Drink, and Yell
- StartupBus: What I Learnt & What I Loved
- Similarity Web 2.0: Remaking My First Mashup, 5 Years Later
- QuizCards: Learning While You Wait
- Translation Telephone: Having Fun with Language
- Goodbye, Google; Hello, World!
- Actually Healthy Alternatives to Carb Comforts
- New for Google Shared Spaces: Improved Interface, Inbox, Chrome Extension, & Embedding
2010 36
- Why I Love(d) Wave
- Triaging Issues: The Wave-y Way
- Using App Engine to Turn Emails into waves
- Issue Tracking in Wave
- Google Shared Spaces: How We Made It
- Google Shared Spaces: Why We Made It
- The Costa Rica Surf Camp Experience
- Reuseable HTML & CSS Teaching Materials
- DIY: Bleaching Dark Brown Hair
- GirlDevelopIt Sydney: Round 1, A Success!
- "No Boys Allowed"...And Why I Like It
- An Unofficial Guide to Geeking It Up Around Sydney
- Sydney International Food Festival Maps
- lscache: A localStorage-based, memcache-inspired library
- SydJS: JavaScript Libraries Panel Roundup
- Generating Slides from a Spreadsheet
- History of Client-side Web API Technology
- RageTube: Using APIs to Bring Music Video Playlists Online
- Embedding Feed Gadgets in Google Sites
- Using OAuth with Spreadsheets API on Django/AppEngine
- Porting from an App Engine RequestHandler to a Django View
- Teaching & Using Google Data APIs @ USYD
- Putting Europopped on the Map
- How to Pretty-Print Code Snippets in Blogger
- A JSON API for Posterous
- Girl Develop It: Teaching Web Programming to Women
- Importing data from Spreadsheets to App Engine
- Tip for Networking at Conferences: Be a Speaker!
- 5lide: HTML5-based Slides Maker
- Google APIs Timeline: Behind the Scenes
- Android Painting Apps: A Review
- How to pick & prepare an Ignite talk
- Why I Like Prezi
- How-to: 80s-ify your geek shirt!
- Sydney MCA: Notable Artists
- GTUG Campout: A weekend of HTML5 in 11+ Cities!
2009 31
- Developer Relations Explained (The Nerdy Way)
- Being a Girl in CS Doesn't Suck
- Joomla & Google Wave: The Possibilities
- Should I Defend My Cred? (...Yes)
- Why I Sent You to a Group
- A World of Words.. And Me
- How Google Wave Could Improve Education: Group Work
- The Quest for Karaoke-able Slidesets
- The Poem Store: "Write a Poem About Her Hair"
- Ignite I/O - Growing Up Geek: My Dad, The Computer Scientist
- Google Spreadsheets + APIs = Interactive Flash Cards
- Creating a Wordsearch using Google Spreadsheets
- How to Convert a Google Spreadsheet into JSON, XML, and MySQL
- How do you document an options Object?
- What is an API?
- Web09: Design, Code, Community.. and Maps!
- Google Image Search + Color Restrict: Just look what you can find!
- API Design: Beautiful Interfaces
- Web API Design: The Good, The Bad, and the Ugly
- APUGS Round-Up: Bzoo, AIR, & Eclipse
- BarCamp Canberra 2: Mapping the Fires
- Ada Lovelace Tribute: A Q&A with My Mum
- Adelaide: More than OK, Actually
- World-Wide Developer Events & Groups: Let's Map This Shit!
- Webstock 2009: Client Killed the Server Star
- Advertising Developer Events in Australia
- Coding in a Big Place
- Encouraging Interaction at Conferences
- GeoWeb 2009 Proposal: "GeoWeb Standards: How far they've come, How far they need to go"
- How to Alienate a Community 101: The "Gurus" Program
- HTML5 vs. Flex for RIAs (Ignite Style!)
2008 11
- Geocoding with Google Spreadsheets (and Gadgets)
- BarCamp Sydney: Best way to start off a life in Sydney?
- 7 Things I Learnt about Japan
- Using Notebook in a Delicious Way
- Flex Tips (OR: Examples I Wish Had Been Easier to Find)
- Going Dowwwwwwnnn... Under: See you Next Year!
- Social Networks & Web2.0 Mapping Meetup: Abaqus, Planet9, FireEagle
- Searching for faces with country domain restrictions with AJAX Image Search
- Spelman College Gadgets Competition
- 24 hours + 15 Google APIs + 45 students = ?
- Using Google to Find Housing in SF