Experiencing Productivity Scaling Up

I have started using Cursor since the beginning of this semester. This is to make sure that I am up to date on one of the latest tools and technologies that is increasingly common for graduating students to be familiar with. Up until now, my experience with Cursor and its gpt-5.2-codex agent has been pleasant. So far, my work has been limited to modifying a single file with possible references to other contents within the entire code base. In this setting, everything has been great. I have also tested Cursor’s ability to completely refactor an entire repository whose technical contents are distributed around writing bash scripts to automate deployments of multi-container computing cluster. In this case, Cursor, or perhaps my selected agent, did not perform as well. While the overall set up was correct, the generated code suffered from premature optimization and specific command flag hallucination. It requires additional and somewhat extensive effort to refine, a process in which I realized that I over-architected the entire system anyway.

Today, I was pleasantly surprised and impressed to find another use case for my Cursor set up: automate and streamline repeated code edits with minor differences at scale. This highlights how AI significantly improved my productivity in one of my primary tasks: developing and maintaining lecture content. In this essay, I explain the initial motivation, describe my sequences of activities that eventually led to this specific use case, and highlight several potential pitfalls along the way.

Motivation

Most, if not all, of my lecture materials are in digital format. In my early years teaching, I maintained my materials as PowerPoint/Google slide decks and made them available to my students through both institutional learning management systems and my personal website. A problem with slide decks is that when modifications are made to the contents, it is easy to break up the aesthetic and flow of the slides. It also takes time to upload the updated decks to various locations. Since I want to optimize my time (aka I am lazy), I have eventually decided to settle down on using Markdown files to generate all my lectures. This allows me to make changes to the content and run an automation scripts to update the rendered pages to my WCU website. Since my LMS is linked to this location, I only need to update my website to make the changes available to my students.

Things were going great for a few years. Then WCU got hit by a DoS attack sometimes in 2022-2023. The university IT team promptly locked everything down. Now, SSH connection to my website, hosted on an internal departmental server, requires MFA, and access to this location is limited to U.S. only. This comprehensive approach is justified given the limited resources that the IT team has, but it introduces additional efforts. More steps are now needed to ensure seamless updates to my course contents. In addition, whenever I am outside of the U.S., to view my course live updates, I will have to get onto the university’s VPN. This is more work that reduces the level of optimization of my workflow.

Given that my course contents are not copyrighted and do not contain any potential FERPA data, a solution was to leverage GitHub Page, a free feature of GitHub, to host my website. To make this effort worthwhile, I have decided to use al-folio as the framework to develop a comprehensive website for both my personal site and my course content. This process started in January of 2025, and the personal portion of the site has been promptly customized and finished in several weeks. The course migration has taken much longer. Until last week, I have only completely transferred one course. The biggest challenge is the lecture syntax conversion. While I am quite efficient with converting my lectures through different formats (mkdocs, jupyter-book, and Software Carpentry’s template, to name a few), all of these formats only differ from one another slightly through their manipulation of Markdown. On the other hand, al-folio uses Liquid syntax to build its template, and this is completely new to me. The effort to learn enough to customize these syntax has been limited due to my other commitments.

Today, I have just finished converting all of my lecture notes from mkdocs to al-folio in less than an hour. A cursory (pun intended) inspection shows that most, if not all lectures, are currently at 80 to 90 percent ready. This would have taken me another year at least to complete. For me, this is a truly impressive feat that was enabled through Cursor.

Sequence of Realization

I have been procrastinating on moving my courses. Due to an unexpected circumstance, I find myself out of the country for two weeks, and my teaching activities have to be moved online. As I was updating my lecture contents, the issue of limited access to the server popped up. Nothing like now for motivation, I thought, and I decided then and there to just move one lecture of one course immediately to ensure that my students can have access to all learning materials. I copied all files related to the courses to my site repository, then focused on editing the one lecture that was relevant. I used Cursor to help with minor configuration issues such as adjusting font size, reconfiguring the sort order of timeline, etc. That process was completed fairly quickly, and an email was sent out to my students informing them of the alternative location.

As I sat there, I thought to myself, given that some of the modifications I requested was inside the Liquid source code, maybe Cursor can help me navigate the complexity of Liquid template and figure out how to create the same decorative syntax that I had with my mkdocs setup. I was right. Preliminary testing showed that Cursor found inside al-folio code base the example templates for dropdown boxes (details) and gave me instruction on how to edit these files. This was due to the fact that I stated my request as a How To rather that Do This.

While I was making the edits, another thought arrived. Why don’t I just ask the agent to make all the changes for me, and then I can go back and review the results. I had my al-folio container up and running, and most changes would be observable right way. Cursor once again succeeded in completing my tasks. All lectures for the course had their dropdown boxes updated, and I am fairly confident now with some minor adjustment, I will be able to have the same level of visualization as I had on mkdocs. I continued asking Cursor to several more tasks across all the lecture files (*.md), including appending the front matters and updating the toc: tag with appropriate header contents.

At this point, I was drunk with success. Let’s just do it for all the courses, I thought. And do it, I did. I copied all existing courses mkdocs over to al-folio, then issued a detailed request to Cursor to carry out the appropriate updates. The prompt is as follows.

I want a comprehensive refactoring/modification of the newly added collections: _csc231, _csc302, _csc331, _csc402, _csc466, _csc478, _csc495, _csc496, _csc530, _csc568, _csc578, _csc586, _csc588. For each collection, I want to:

  • Create the corresponding md file inside _pages. Use the description content inside index.md to populate the Course Description.
  • Move all *.md files inside the lectures directory out to the main collection directory.
  • Use the fig directory inside the lectures directory to asset/img/courses/collection_name
  • Update all *.md file with the appropriate lecture front matters. Populate the toc.
  • Update all *.md file so that all !!! and ??? are replaced by details. Use details class when appropriate.
  • Update all *.md file fig link with the corresponding liquid entry.

It took about 15 minutes for Cursor to run and complete the prompt. After one more minor prompt to update the website dropdown and add vertical scrolling to the list, all my courses could be considered migrated. There remains minor visualization adjustment, but this significantly sped up the amount of work that I thought I had to do.

Afterthought

My observations in this essay should be taken with a specific perspective. As I watched the thinking process of Cursor, it looks like the agent attempted to extract the pattern from the courses’ directory structure, reuse results from previous prompts which involve generated Python scripts that can handle contents modifications, and the final actual modifications of the files. The agent exhibited strong pattern recognitions ability and successfully completed a series of repeated complex tasks. While my requests do not demand advanced algorithmic support, my guess is that they do require the ability to generate fairly complex regular expressions. Could I have done all of this in one year? Likely. Could I have done all of this in one hour? Likely, if I have one year to learn. In other words, Cursor has boosted my productivity in this scenario to an obscene level.

The final results are not without flaw. The agent had trouble identifying and replacing nested dropdown boxes (e.g. Challenge and Solution). It also could not identify and comment out invalid file references, which break the auto-refresh capability of al-folio container’s Jekyll setup. These are not trivial to address and resolve, but I had the experience with the single attempt earlier, which made the troubleshooting process much easier even at scale.

Conclusion

Making lecture materials online is not about authoring content. Rather, it is about navigating a complex publishing path. With Cursor, I am able to streamline one of the more heavier tasks in the whole ordeal: to keep the publishing path reliable under changing access constraints. I now look forward to learning what else I can do with Liquid via the support of Cursor.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • The Hidden Obligations of Teaching
  • Redefining Rigor: From Selecting Talent to Developing Students in Computer Science
  • Bring Engineering Thinking to What We Do
  • The cats in my life
  • Beyond the Digital Sandbox: Why CS Needs to Get Physical