Please visit https://django.dr-chuck.com to learn more about my Django CLOC The idea of a Campus-Linked Online Course (CLOC) is an online, low cost, non-credit enrollment in a special section of an on-campus course. Students have access to all the course materials, course...
Please visit https://django.dr-chuck.com to learn more about my Django CLOC
The idea of a Campus-Linked Online Course (CLOC) is an online, low cost, non-credit enrollment in a special section of an on-campus course. Students have access to all the course materials, course schedule, office hours, teaching assistants, and regular course communications. It is far more like taking an actual 15-week college course than a MOOC. I have permission to do this novel model for Fall Semester 2026. Registration starts August 1 and ends October 31. Please join me and help define a possible future online educational model.
If you want to join Dr. Chuck's new online offering visit https://django.dr-chuck.com Registration will be open August-October 2026. In this video, I use Cursor AI to add a lightweight UTM tracking system to https://django.dr-chuck.com The goal is simple: determine whether...
If you want to join Dr. Chuck's new online offering visit https://django.dr-chuck.com
Registration will be open August-October 2026.
In this video, I use Cursor AI to add a lightweight UTM tracking system to https://django.dr-chuck.com
The goal is simple: determine whether visitors arrived through a QR code, LinkedIn post, YouTube video, or another campaign—without installing a full analytics platform or setting up a database server.
We build the tracker using PHP and a small local SQLite database. It records each UTM code, the number of visits, and the first and most recent usage dates. We also add a 250-code limit so that the database cannot grow indefinitely, plus optional password protection for the results page.
Along the way, I test the system locally, deploy it to production, inspect the generated code, and explain why SQLite is such a useful piece of technology for small, fast, self-contained applications.
You can explore my experimental Campus Aligned Open Course (CLOC) in Django at:
https://django.dr-chuck.com/
Try adding your own tracking value to the URL:
https://django.dr-chuck.com/?utm=42
The course runs alongside my University of Michigan on-campus web development course and gives online students access to the course schedule, Canvas materials, teaching assistants, and office hours.
This is another experiment in my long-running effort to use the Internet, open source software, and open educational resources to improve teaching.
Like, subscribe, and follow along as I continue building the course and sharing the process.
This lecture demonstrates a Django implementation for managing user favorites using a many-to-many relationship between `Thing` objects and users. The model includes a unique constraint to ensure each user can favorite a `Thing` only once, preventing duplicate entries. The...
This lecture demonstrates a Django implementation for managing user favorites using a many-to-many relationship between `Thing` objects and users. The model includes a unique constraint to ensure each user can favorite a `Thing` only once, preventing duplicate entries. The system uses a `through` model to handle the relationship without additional tables.
The implementation employs AJAX with jQuery to update favorite states without full page refreshes. When a user clicks a favorite button, a POST request is sent to update the database, and the UI dynamically toggles between filled and empty star indicators. Views handle the POST requests with CSRF exemption for simplicity, ensuring only authenticated users can modify favorites.
For more materials, auto graders, and more courses, please see https://www.masterprogrammer.com
The lecture explains the distinction between HTML source code and the Document Object Model (DOM). The source code is the raw text file retrieved from the server, while the DOM is the structured representation generated by the browser during parsing. The lecture demonstrates...
The lecture explains the distinction between HTML source code and the Document Object Model (DOM). The source code is the raw text file retrieved from the server, while the DOM is the structured representation generated by the browser during parsing.
The lecture demonstrates that the browser's parsing process may correct errors in the source code (e.g., adding missing tags like `tbody`). It also covers relative links, special characters (such as ampersand, less than, greater than), and common HTML elements including `html`, `head`, `body`, `a`, `p`, `ul`, `li`, `table`, `tr`, `td`, and `img`.
For more materials, auto graders, and more courses, please see https://www.masterprogrammer.com
This lecture demonstrates fundamental SQLite command line operations for creating tables, inserting records, and executing basic queries with examples of SELECT, UPDATE, and DELETE statements using WHERE clauses and ORDER BY. These operations function on a file-based SQLite...
This lecture demonstrates fundamental SQLite command line operations for creating tables, inserting records, and executing basic queries with examples of SELECT, UPDATE, and DELETE statements using WHERE clauses and ORDER BY.
These operations function on a file-based SQLite database without server dependencies, enabling direct inspection and debugging of database structures.
For more materials, auto graders, and more courses, please see https://www.masterprogrammer.com
In this Coding AI with Dr. Chuck episode, I work on SAK-52736, an improvement to Sakai Assignments and LTI resource selection. When an instructor selects an external tool using LTI 1.1 Content-Item Selection or LTI 1.3 Deep Linking, the tool can return both a title and a...
In this Coding AI with Dr. Chuck episode, I work on SAK-52736, an improvement to Sakai Assignments and LTI resource selection.
When an instructor selects an external tool using LTI 1.1 Content-Item Selection or LTI 1.3 Deep Linking, the tool can return both a title and a description. Sakai already used the returned title, but the description was not being copied into the assignment instructions.
Using Cursor and AI-assisted coding, I trace Sakai’s rather complicated LTI return flow, update the shared internal abstraction, and pass the returned description into the assignment editor. Before displaying it, Sakai sanitizes the content using its existing formatted-text and AntiSamy security infrastructure.
I test:
• LTI 1.1 Content-Item Selection
• LTI 1.3 Deep Linking
• Blank and existing assignment titles and descriptions
• Safe HTML formatting
• Malicious HTML and script content
• The resulting LTI launch data as both instructor and student
Along the way, I discuss the value of Sakai’s unified LTI 1.1 and LTI 1.3 architecture, the benefits and risks of AI-generated code and test plans, and the challenge of maintaining a high-quality open-source LMS with limited community funding.
SAK-52736: Copy the LTI deep-link description into Sakai assignment instructions and sanitize it before display.
Learn more:
https://www.sakailms.org/
https://www.masterprogrammer.com/
https://www.tsugi.org/
Please like, share, and subscribe for more real-world AI-assisted software development.
#Sakai #LTI #OpenSource #ArtificialIntelligence #SoftwareDevelopment
In this follow-up bathrobe edition of AI Coding with Dr. Chuck, I continue modernizing the Digitization for Everybody sites and start preparing the three Tsugi-based sites — audio, video, and imaging — for Google OAuth login. The goal is to make sure the sites are ready for...
In this follow-up bathrobe edition of AI Coding with Dr. Chuck, I continue modernizing the Digitization for Everybody sites and start preparing the three Tsugi-based sites — audio, video, and imaging — for Google OAuth login.
The goal is to make sure the sites are ready for Google’s OAuth review requirements before configuring tokens in the Google Developer Console. That means checking for privacy policy and terms of service pages, wiring those links into the site footer, and making sure the pages are visible even when users are not logged in.
Along the way, I use Cursor AI to inspect the existing Digitization for Everybody sites, borrow working patterns from Python for Everybody, update retired instructor links, clean up navigation, and commit the changes across the related repositories.
I also talk about why Google OAuth requires more setup than GitHub OAuth, how OAuth 2.0 shows up in both web login and LTI 1.3, and how Tsugi and Sakai connect through these standards.
Topics include:
Google OAuth login
OAuth 2.0
Tsugi framework
Cursor AI coding
Privacy policy and terms of service pages
Preparing sites for Google Developer Console review
PHP web application maintenance
Digitization for Everybody
Python for Everybody
Django for Everybody
Learning Tools Interoperability 1.3
Sakai and Tsugi integration
AI-assisted software maintenance
This is a short bonus coding session about getting real production sites ready for OAuth-based login — with a few detours, surprises, and broken links along the way.
Tsugi: https://www.tsugi.org/
Python for Everybody: https://www.py4e.com/
Support Dr .Chuck: https://support.dr-chuck.com/
2026 06 19 Dig4E 02
In this bathrobe edition of AI Coding with Dr. Chuck, I work through maintaining and modernizing the Digitization for Everybody sites, which are built on top of the Tsugi framework. The goal is to make four related websites easier to maintain together: the main Digitization...
In this bathrobe edition of AI Coding with Dr. Chuck, I work through maintaining and modernizing the Digitization for Everybody sites, which are built on top of the Tsugi framework.
The goal is to make four related websites easier to maintain together: the main Digitization for Everybody site plus the imaging, audio, and video learning sites. Along the way, I use Cursor to set up multi-root workspaces, create agent-oriented project notes, configure local Tsugi checkouts, fix session and navigation issues, and push changes across several related repositories.
A few surprises happen along the way — including Cursor figuring out repository structure, helping create workspace files, improving speech-to-text accuracy with a vocabulary file, and even doing a little more database setup than expected.
Topics include:
Cursor multi-root workspaces
Using AGENTS.md and .ai folders
Voice prompting for coding
Vocabulary files for better AI coding prompts
Maintaining old PHP/Tsugi sites
Local versus production URL handling
Cleaning up deprecated session code
Using AI as a maintenance assistant for related repositories
This is a real-time coding session, complete with confusion, delight, debugging, coffee, and a few moments where the AI gets scarily useful.
https://www.dig4e.com/
https://www.tsugi.org/
https://support.dr-chuck.com/
2026 06 19 Dig4E
https://amzn.to/44yIiu2 2 in 1 Portable Tumbler for Dogs,Portable Dog Water Ball,10Oz Stainless Steel Dog Water Bottle with Silicone Foldable Bowl, Leak-Proof 2 in 1 Portable Small Dog Water Bottle for Walking
https://amzn.to/44yIiu2
2 in 1 Portable Tumbler for Dogs,Portable Dog Water Ball,10Oz Stainless Steel Dog Water Bottle with Silicone Foldable Bowl, Leak-Proof 2 in 1 Portable Small Dog Water Bottle for Walking
n this short AI Coding with Dr. Chuck episode, I finally tackle one of those tiny web development annoyances that has been bugging me for years: browsers helpfully — and sometimes unhelpfully — autofilling password fields in admin forms. The target is an access key edit...
n this short AI Coding with Dr. Chuck episode, I finally tackle one of those tiny web development annoyances that has been bugging me for years: browsers helpfully — and sometimes unhelpfully — autofilling password fields in admin forms.
The target is an access key edit screen where an empty type="password" field keeps inviting the browser to jam saved credentials into places they do not belong. Along the way, we poke through the PHP CRUD form code, hit a small SQL error detour, test a few edit/update cases, and land on a cleaner pattern for marking sensitive fields so browser autofill behaves itself.
A quick breakfast-before-it-burns coding session with a surprisingly satisfying fix.
Topics:
Browser autocomplete and autofill behavior
type="password" fields in admin forms
PHP CRUD form cleanup
Testing access key edits
Small bug hunt and code review
AI-assisted coding workflow
Tsugi: https://www.tsugi.org/
Python for Everybody: https://www.py4e.com/
Support Dr .Chuck: https://support.dr-chuck.com/
#AICoding #PHP #WebDevelopment
In this video, we watch Dr. Chuck code up a feature that allows students to look at a solution to an auto grader assignment through a Parson's Problems lens. The goal is to un-stick students that are just a "little stuck". Barbara Ericson (Associate Professor of Information,...
In this video, we watch Dr. Chuck code up a feature that allows students to look at a solution to an auto grader assignment through a Parson's Problems lens. The goal is to un-stick students that are just a "little stuck". Barbara Ericson (Associate Professor of Information, School of Information and Associate Professor of Electrical Engineering and Computer Science, College of Engineering) is my inspiration for this feature. She is one of the world's leading experts on Parson's Problems and a few weeks back she showed me a demo of a recent feature they added to their Runstone online book/course system and it clicked for me as to how I could / should use it. In PY4E it lives under a Sparkle button to give it an "AI shine" :)
This went pretty smoothly - you ca see it in action at www.py4e.com
https://www.py4e.com/
https://www.si.umich.edu/people/barbara-ericson
https://en.wikipedia.org/wiki/Parsons_problem
2026 06 09 PY4E Sparkle
In this video, we start with what seems like a simple task: adding a checkbox that automatically releases incoming grades from LTI tools directly into the Sakai gradebook. The goal is to make LTI grades flow straight through without stopping in Sakai Assignments’ intermediate...
In this video, we start with what seems like a simple task: adding a checkbox that automatically releases incoming grades from LTI tools directly into the Sakai gradebook.
The goal is to make LTI grades flow straight through without stopping in Sakai Assignments’ intermediate “only viewable as instructor” state. This is especially useful for LTI tools that already have their own release workflow. The instructor or tool decides when the grade should be released, sends it, and the grade appears immediately in the gradebook.
But around the 21-minute mark, things go sideways when one of my test harness tools unexpectedly stops working. I pause the recording and dig into the problem. A few hours later, the culprit turns out to be a tiny AI-introduced regression in the test tool itself.
Along the way, we see a useful reminder: AI can help write code, but it does not always dig deeply enough to find regressions it introduced. Some human-led debugging was still necessary. It all worked out in the end.
Related issue: https://sakaiproject.atlassian.net/browse/SAK-49972
Sakai: https://www.sakailms.org/
Support Dr. Chuck: https://www.py4e.com/support
2026-06-08-Release-OOPS.mp4
In this video we continue to work on the LTI 1.3 date management. I got an email with screen shot form Andrea, our Sakai QA lead pointing out a unclear bit in the UI with screen shot. I decided just to paste it into Cursor.AI including the screen shot. Cursor gave a great...
In this video we continue to work on the LTI 1.3 date management. I got an email with screen shot form Andrea, our Sakai QA lead pointing out a unclear bit in the UI with screen shot. I decided just to paste it into Cursor.AI including the screen shot. Cursor gave a great explanation which we sent back to Andrea. The change was more rewording the text in the UI to reflect the behind-the-scenes reality.
2026 05 27 Sakai Assignment Modify
In this video we continue work adding a feature that will allow LTI 1.3 tools to access Sakai /api and /direct web services using LTI access tokens. This connects LTI and proprietary APIs in a very elegant way by sharing authentication and authorization features....
In this video we continue work adding a feature that will allow LTI 1.3 tools to access Sakai /api and /direct web services using LTI access tokens. This connects LTI and proprietary APIs in a very elegant way by sharing authentication and authorization features.
https://sakaiproject.atlassian.net/browse/SAK-52581
https://www.sakailms.org/
2026 05 18 SakaiAPI Functions
In this video we demonstrate the Kenwood to Helmet connector which makes it very convenient for the crew chief in the pits to maintain driver communication while in full protective gear. X1 Baofeng IMSA Headset Cord w/ Inline PTT...
In this video we demonstrate the Kenwood to Helmet connector which makes it very convenient for the crew chief in the pits to maintain driver communication while in full protective gear.
X1 Baofeng IMSA Headset Cord w/ Inline PTT
http://raceradiosdirect.com/viewpart.asp?idpart=52301KHK
Sakai Racing Team:
https://racing.dr-chuck.com
This video has no audio. But it was pretty cool. So I kept it anyways, In this video we start work adding a feature that will allow LTI 1.3 tools to access Sakai /api and /direct web services using LTI access tokens. This connects LTI and proprietary APIs in a very elegant...
This video has no audio. But it was pretty cool. So I kept it anyways,
In this video we start work adding a feature that will allow LTI 1.3 tools to access Sakai /api and /direct web services using LTI access tokens. This connects LTI and proprietary APIs in a very elegant way by sharing authentication and authorization features.
https://sakaiproject.atlassian.net/browse/SAK-52581
https://www.sakailms.org/
2026 05 17 SakaiAPI WebAPI
This video greatly increases the flexibility of how we use deployment_id in Sakai. When I first built LTI 1.3 support in Sakai years ago, I looked at deployment_id and thought "this if for single instance cloud hosted LMS systems" and I decided we would be a single tenant all...
This video greatly increases the flexibility of how we use deployment_id in Sakai. When I first built LTI 1.3 support in Sakai years ago, I looked at deployment_id and thought "this if for single instance cloud hosted LMS systems" and I decided we would be a single tenant all the time (i.e. deployment_id==1). Over time, it turns out that Sakai is really multi-tenant with features like delegated access, hierarchy service, differentiated billing for LTI Tools, and multiple universities using one instance of Sakai. So this work (SAK-52559) goes from one way to set deployment_id in Sakai to five ways to give more flexibility in the various multi-tenant uses of Sakai.
https://sakaiproject.atlassian.net/browse/SAK-52559
https://www.sakailms.org/
Support Dr .Chuck: https://support.dr-chuck.com/
2026 05 12 Deployment Id SAK 52559
This video greatly increases the flexibility of how we use deployment_id in Sakai. When I first built LTI 1.3 support in Sakai years ago, I looked at deployment_id and thought "this if for single instance cloud hosted LMS systems" and I decided we would be a single tenant all...
This video greatly increases the flexibility of how we use deployment_id in Sakai. When I first built LTI 1.3 support in Sakai years ago, I looked at deployment_id and thought "this if for single instance cloud hosted LMS systems" and I decided we would be a single tenant all the time (i.e. deployment_id==1). Over time, it turns out that Sakai is really multi-tenant with features like delegated access, hierarchy service, differentiated billing for LTI Tools, and multiple universities using one instance of Sakai. So this work (SAK-52559) goes from one way to set deployment_id in Sakai to five ways to give more flexibility in the various meulti-tenant uses of Sakai.
https://sakaiproject.atlassian.net/browse/SAK-52559
https://www.sakailms.org/
2026 05 12 Deployment Id SAK 52559
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/ Online Courses: https://www.masterprogrammer.com Support: https://patreon.dr-chuck.com...
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/
Online Courses: https://www.masterprogrammer.com
Support: https://patreon.dr-chuck.com
Racing Series https://24hoursoflemons.com/
GX013724 render 02 Greg
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/ Online Courses: https://www.masterprogrammer.com Support: https://patreon.dr-chuck.com...
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/
Online Courses: https://www.masterprogrammer.com
Support: https://patreon.dr-chuck.com
Racing Series https://24hoursoflemons.com/
2026 04 10 Chuck Session
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/ Online Courses: https://www.masterprogrammer.com Support: https://patreon.dr-chuck.com...
Dr. Chuck's Racing Team is sponsored by students who pay for his on line courses - please support the team by registering for one of his classes. We race in the https://24hoursoflemons.com/
Online Courses: https://www.masterprogrammer.com
Support: https://patreon.dr-chuck.com
Racing Series https://24hoursoflemons.com/
GX013719 render 03 John
We are working on keeping dates synchronizes between Sakai and an LTI tool. The LTI scores protocol is imperfect ad there are situations where there is just not enough information to do the right thing. In this situation, we are told an assignment has been submitted but not...
We are working on keeping dates synchronizes between Sakai and an LTI tool. The LTI scores protocol is imperfect ad there are situations where there is just not enough information to do the right thing. In this situation, we are told an assignment has been submitted but not whether this the first submission, a re-submission or its status is submitted and waiting for the grade. When do we update the submit date!
https://sakaiproject.atlassian.net/browse/SAK-52505
https://www.sakailms.org/
2026 06 04 Submit Date SAK 52505