Course Manager is a web application currently in testing mode that allows teachers to develop curricular materials in a systematic and coherent fashion.
The problem this is meant to address is one that I personally experienced as a teacher. I found the current processes of generating and delivering materials to students on a daily basis to be unnecessarily cumbersome and frustrating. To say that I don’t like Canvas is a bit of an understatement. So this began as a personal tool. At first, it was a command-line-interface static site generator. I would manually push the site to Github pages. Eventually I made the interface graphical using Fyne, and then in December 2024 I switched to creating a web application. In April and May I switched the static site generation portion to using Hugo instead of my own generator.
Now the web service hosts users’ static sites directly which negates the step of publishing to a separate platform.
Features:
- Create slides from markdown using marp
- Create documents from markdown rendered to html using goldmark
- Site generation for each course using Hugo
https://course-manager.app
Developer Environment Dependencies Go (see go.mod for go dependencies) Docker Marp runs in container Caddy runs in container Sqlc CLI Task CLI Templ CLI Goose (for db migrations) Tailwind Typescript Hugo stuff prettier plugin Production Environment Dependencies Docker Bash Task CLI VS Code extensions used Task Task Tailwind CSS Intellisense Tailwind Docs Tailwind Fold Templ Workflows Run in development (local) task run-dev Builds app binary and mounts as volume, runs all services with docker compose:
...
This change log is mainly to help me keep track of what I’ve done and what I’m planning to do. I’ve considered making the application open-source, which would probably mean putting a change log on GitHub along with the code, but I’m not sure about that. So in the meantime, I’m sharing my progress on this work here.
Pending (keep in priority order) Add course occasions so that occasions can be specific to a course instead of applying to an entire term Course Occaions Add view standards tab to lesson details change title page of static site change title page for files especially assessment files if possible favicons for static site and server Add hx-indicator to everything so user gets confirmation that request is pending CourseNode files capabilities: 1/22/25 User can delete node files 1/22/25 User can rename node files 1/22/25 User can move node files 1/22/25 User can duplicate node files Automatic site regeneration for every change (??) Publish/unpublish for all nodes and assessments Password protection for assessment files Add table for assessment files columns: title, relative path (relative to node files), password Add password to assessment file Allow user to modify unit sequence Calendar should jump to current month From lesson details page: next lesson or previous lesson (nice to have) Static and manager calendars should show assessments Copy course must alter or at least zero out the assessment dates (assigned and due) Share course with user (read-only) Share course with user (with edit privileges) Copy course from user Complete From lesson details: back to calendar Markdown file editor (non slides) 1/23/25 In calendar, user can add and remove lessons from a date Add: new screen to select lesson from course Remove: remove date from lesson dates From lesson details page, user can edit assessment details Static site should show assessments for lesson along with assessment details 1/22/25 User can view lesson files 1/22/25 User can upload lesson files 12/30/24 Go command to generate site should include other build commands e.g. tailwind, templ, etc (all the things that the task command does). Should probably also pass in the data instead of Generator using its own connection and fetching data? 12/30/24 Create New Lesson UI 12/30/24 Create New Unit UI 12/30/24 Create New Course interface 12/30/24 Create Copy Course to Term interface (this will use the Course.FitToTerm method)
Pending (major) New course calendar doesn’t show at smaller screen sizes (I left out a portion of the tailwind template) (major) New course calendar buttons don’t show text (major) 2025-06-28 GET echo-1 | /users/101602110272674353046/terms/3/courses/7/occasions echo-1 | /users/:user-id/terms/:term-id/courses/:course-id/occasions echo-1 | 200 0 798.275µs parsing time "" as "2006-01-02": cannot parse "" as "2006" - (major) No way to drop assessments in edit assessment - (major) Attempting to view or download file that does not exist (e.g. in the assessments part of lesson details) will crash the server completely. - (minor) lesson details: assignment file info / view link not displayed on app side - (minor) need placeholder image for when no user is signed in - (major) signin page after redirect following token expiration does not seem to render properly under certain circumstances - in particular when I clicked Generate from the home page, the signin component was sent but not as a complete page including layout - maybe htmx problem not redirect problem - Select lesson to add to date page needs major cosmetic upgrade (functionality is ok) - Assessments list page UI needs major upgrade (functionality is ok) - (major) if there's a lesson on 2 dates, bumping that date left or right on the calendar page will bump BOTH instances, not just the one that's clicked on. - (major) forgot to add ON CASCADE DELETE to assessments.lesson_id column; this means deleting a lesson will give a foriegn key error upon attempting to delete a lesson that has assignments. Which might be ok, but will need to adjust the UI accordingly. - (major) attempting to view lesson files returns a server error rather than a simple message stating that no files exist for the lesson - (major) similarly, attempting to view lesson slides returns a server error - 1/23/25 (minor) Deleting a course (unit, lesson may take a while as well) takes a long time. Maybe after a course row itself is deleted we should go ahead and return the response to the user and do the rest in the background. If child elements and files are not deleted we should log an error but the user doesn't need to wait on all of that, maybe? - (minor) I think FitToTerm won't respect out of order units or lessons, it will put units and lessons in order using sequence and numbers rather than keeping the order as it was in the previous term. Complete (major) lesson details: add standards functionality lacking
...