Overview

kennjordan
← All sections

Overview

Product in one line

A standalone site where medical CPD attendees (initially Family Care Practitioners / GPs) take a short AI-led conversational interview and get a personalised curriculum of UCT lectures, pulled from the MobiLearn Vimeo library, delivered via a clean course viewer.

Current status

Live and working

  • Live Homepage with hero, AI interview CTA, two featured pathways, UCT partnership footer
  • Live AI interview at /interview/ powered by Claude Sonnet 4.5 — warm conversational tone, extracts structured profile
  • Live Personalised pathway at /my-pathway/ — profile summary + video cards grouped by specialty
  • Live Inline video player — click any pathway card to open a Vimeo modal, no page navigation needed
  • Live Two manual pathways — MLUCT51 Latest FCP Event and Neurology cross-year
  • Live Course viewer at /watch/ — 16:9 player + lesson drawer + progress tracking
  • Live MobiLearn CPD branding — Fraunces + Inter, deep teal + coral palette, custom chrome on every page
  • Live Vimeo integration — all 300 MLUCT videos whitelisted for embed on cpd.medilearn.africa
  • Live CPD Activity funnel panel at /admin/plugins (EP CPD Interview → CPD Funnel) — six-stage funnel (landing → interview start → interview complete → pathway view → first video play → multi-video session), specialty distribution from interview profiles, top watched videos, today/7d/30d/all range filter

Next up

  • Stub Save personalised pathway as a persistent course (currently ephemeral per interview session)
  • Stub CPD certificate generation on completion
  • Stub Official UCT branding per partnership agreement
  • Stub Video view privacy policy — currently password-protected, may want unlisted for smoother demo

Reference guides

  • CPD Activity Funnel — what the admin panel measures, schema additions, event types, extension recipes, rollback steps

Session logs

A working journal of paired Hasmukh + Claude sessions. Each log captures what was built, what changed, what got stuck, and what is still open.

  • New Zoom Companion Session log — Named per-session recording logs (v0.14.0) (20 June 2026, afternoon) — Hasmukh is running the Medilearn camera app in an all-day production. The Zoom meeting and the bot sit in it all day. Between sessions there are speaker changeovers, nature breaks and lunch or coffee breaks, where most participants switch their cameras off as expected. The single join-to-leave log therefore mixes real session data with break noise and is not very useful. He asked for two things: a way to choose when logging starts and stops, and the ability to name a log before starting it. The goal is to get accurate, cleanly named per-session logs out of one continuous meeting, without joining and leaving repeatedly. Built operator-controlled named recording segments (v0.14.0) into both tenants (Mobilearn and Medilearn), with an optional full-day backup log written on Leave.
  • s2l.online Session log — Newsletter bot protection (18 June 2026, morning) — Hasmukh's daily activity digest showed bot sign-ups arriving on the newsletter form (gibberish names, padded-Gmail addresses — the same actor that had hit the sign-up page and created fake accounts). He asked me to review the newsletter form and add a guard rail if needed. It badly needed one: the list held 38 subscribers but only 4 were real people (Hasmukh on two addresses, Kenn, and Naren Gajjar); the other 34 were bots. The form has a hidden trap, but the bots stepped around it, and the email-confirmation step that would stop them was switched off, so every bot landed straight on the active list. Hasmukh first asked for the same visible "I am human" tick as the sign-up page. On building it I found that would be fragile here: the newsletter form belongs to a bundled plugin that processes the sign-up in its early load step and exits, so a separate guard cannot reliably intercept it, and editing the bundled plugin would be wiped by a future update (the same failure that had knocked out the sign-up tick). I flagged this and recommended email confirmation instead, which is a clean built-in setting that cannot be wiped. Hasmukh agreed.
  • Zoom Companion Session log — Build kit for Peter Sargeant (16 June 2026, evening) — The operator asked for a way to share how the Camera Monitor app was built with a friend, Peter Sargeant, so that Peter could paste a single prompt into his own Claude Code account and end up with the same app. The session produced two shareable documents: a build-story explainer and a self-contained Claude Code build prompt. No actual app source files were changed. To get the documents accurate, the full project context was read first: the authoritative project memory under the Zoom-Apps directory key, then main.js, renderer/renderer.js, renderer/index.html, renderer/styles.css, both broadcast overlays (stats-overlay.html, participant-counter.html), package.json and .env.example.
  • s2l.online Session log — Bot protection (contact form and sign-up) and page width (15 June 2026, evening) — Hasmukh reported too many bot messages coming through the "Send us a message" contact form and wanted a way to confirm a real person is sending. It turned out the contact form already had a full set of bot protections built in, but they were all switched off, which is why the junk was getting through. We switched them on. They work invisibly, so real visitors notice nothing and are not slowed down, which matters for the mobile and slower-connection audience. Later in the same session, Hasmukh showed that the sign-up page was also being flooded, with fake learner accounts using throwaway "wshu.net" addresses and padded-Gmail addresses, some pasting a crypto scam link into their details. He asked for a visible "I am human" tick, specifically Cloudflare's. We found that a Cloudflare tick had in fact been set up back on 2 May, but on the old EP Membership register page. The new passwordless sign-up page never had it, and a June software update to the old page had since wiped it off there too. The saved Cloudflare codes were still on the site and still valid, so we reused them, fitted the tick to the current sign-up page, shut the old sign-up door, and cleared out the fake accounts.
  • Vodalibrary Session log — Vodalibrary: 6-digit code sign-in, and email moved off SendGrid (13 June 2026, evening) — Changed how people sign in to vodalibrary.online. Instead of clicking a link in an email, members now type a 6-digit code that we email them. This matches the experience on the doctors' site (medilearn.africa). The whole sign-in journey is now: enter your email, receive a 6-digit code, type it in, and you are in. Sessions still last 30 days and the member list is unchanged. Built the new sign-in on a safe copy of the site first, tested it thoroughly, and only switched the live site over once everything passed. The live site was untouched until the new sign-in was proven. Confirmed who is on the list: Hasmukh as admin plus six viewers (two Mobilearn staff and four Vodacom managers). All seven kept exactly as they were.
  • Medilearn Session log — "Check on HPCSA" button fixed (dead register link) (13 June 2026, morning) — Continuation of the 12 June session. The original report was that a button on the ML Doctors admin page "takes me to the URL and nothing happens". The early part of this session assumed the Approve button was the culprit and confirmed that Approve works correctly end to end. Hasmukh then clarified with a screenshot that the broken button is actually the Check on HPCSA button, not Approve. That reframed everything. The Check on HPCSA button is the only button that opens a web address, which fits the original complaint exactly. The button was pointing at an HPCSA register address that is now dead, so the new tab opened to a page that never loaded. That is the "nothing happens".
  • Docs site Session log — Session recordal by date and group on the docs site (12 June 2026, evening) — Hasmukh asked for a review of documentation.mobilearn.africa and for every working session to be recorded there by date and labelled by project group, with multiple sessions on the same day easy to tell apart, and set "log and publish" as the trigger phrase for immediate publishing. The session ran in three rounds. First, the four notes waiting in this project's queue were published, the whole journal was relabelled with group chips and re-sorted, and the All session logs page was rebuilt as a complete index. Second, when Hasmukh pointed out the journal stopped at 3 June, three finished but unpublished medilearn notes were found and published. Third, on his instruction "all of them", ten missing sessions from folders without the journal routine were reconstructed from their saved conversations by parallel readers, saved as catch-up notes with their true dates and times, and published, so every working day from 1 to 12 June now appears on the journal.
  • Medilearn Session log — Passwordless doctor system, hardening and fixes (12 June 2026, evening) — A long working session on medilearn.africa's doctor verification. Started as a planning request and became a full build-out. Audited what the 9 June session had built, found that a 10 June platform update had silently broken all doctor sign-in, repaired it, then rebuilt sign-in entirely as passwordless (emailed one-time codes and links) at Hasmukh's request. Ran his twelve-item improvement list, published the privacy notice, verified the Vimeo recordings were already properly locked (correcting an earlier wrong claim), fixed the broken activity log plugin, added Doctors to the site menu, and hardened the approvals screen after buttons started bouncing to the plugins list.
  • Medilearn Session log — First name and surname split, and sign-in repair (12 June 2026, evening) — Hasmukh asked for the doctor sign-up to capture First Name and Surname separately (instead of one Full name box), since the HPCSA register is searched by surname, with email and MP number as before, and approval continuing to unlock the recordings. While making the change it emerged that the platform update of 10 June (PageMotor 0.9.4) had quietly broken every doctor action on the live site: sign-in, sign-up, sign-out and the Approve and Decline buttons all stopped working the day after they were built. The new platform routes plugin requests through a registry with access levels and structured results, and the plugin was written for the older style. Both things were done together: the name split and a full repair of the plugin for the new platform. Everything was tested end to end on the live site and works.
  • Medilearn Session log — Doctor authentication for medilearn.africa recordings (12 June 2026, morning) — An overnight-and-afternoon session that took the medilearn.africa doctor verification system from "built but quietly broken" to live and public. It began as a planning question, but inspection showed the 9 June build was already in place and that the 10 June platform update had silently broken all doctor sign-in, sign-up and approval buttons; the ML Doctors plugin was repaired, rebuilt as passwordless (emailed code or link, no passwords ever) at Hasmukh's request, and then extended with twelve hardening improvements as version 0.5.0. The session also published the missing privacy notice, confirmed the Vimeo recordings were already properly locked (correcting an earlier wrong claim made that same morning), patched the broken activity log, and added Doctors to the main menu, so real doctors can now find the page and register. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • Medilearn Session log — medilearn.africa domain audit (11 June 2026, afternoon) — Hasmukh shared the domains.co.za DNS management link for medilearn.africa (service 403352) and asked for a deep dive into what had actually been built on the domain, as the history had become confusing. Claude audited it end to end using saved notes, live DNS lookups, certificate logs, live site fingerprinting and the connector status, then explained the full picture including a glossary of every subdomain, and saved a Setup Reference Word document in the Mailgun Setup folder. Hasmukh then pointed out that vodalibrary.online had been wrongly bundled in, so the memory notes were cleaned, the reference document was regenerated without it, and a vodalibrary developer brief was deleted. The session was paused after recording a hard boundary: the Google Workspace inbox is live and untouchable, and Mailgun exists solely so the website can gate doctors' access to past recordings. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • Email Session log — medilearn.africa outbound email migration (10 June 2026, evening) — Hasmukh, working from Kenn's guide, asked for help moving medilearn.africa's outbound email off SendGrid onto Mailgun; the session started on the evening of 10 June 2026 and spanned into 11 June, wrapping up just after midnight. Mailgun was fully set up (mg.medilearn.africa, EU region, SPF and DKIM verified, EP Email switched to the Mailgun transport), but every real send returned 401 because the free Mailgun account blocks sending until a payment method is added, so Mailgun was parked after consulting Kenn. The work pivoted to host SMTP: the mailboxes turned out to live on wp14.domains.co.za, not da15 as the DNS suggested, sending was proven there, and the mail service was then migrated onto a new domains.co.za Email Only 20 package on cp70.domains.co.za, with DNS updated and an end-to-end test landing in the Gmail inbox with SPF, DKIM and PTR all passing. Along the way the broken medilearn MCP entry in ~/.claude.json was replaced with PageMotor's newly discovered native MCP endpoint. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • Medilearn Session log — Planning doctor verification and gated recordings (9 June 2026, evening) — Hasmukh asked how to plan and execute a way to put the Past Events recordings behind doctor verification on the live medilearn.africa. The idea he set out: a doctor registers once and gives their MP number, an operator authenticates them by hand by checking that MP number against the HPCSA register, and once approved their login unlocks the recordings. Confirmed the site can support this on its own, with no outside service needed, and that manual approval is the right call because there is no automatic way to confirm a doctor's registration. Took a read-only look at the live site to see what is already there. There is no doctor login or members area yet and only the admin account exists, so it is a clean start. Agreed to set this up as a small, purpose-made doctor login shaped around MP-number approval. No changes were made to the site this session. This was planning plus a read-only check only.
  • Guides Session log — Study guide system rebuild without Make (9 June 2026, afternoon) — The Make.com webhook was replaced with a same-origin /submit endpoint on the VPS, so quiz results from the staff handbooks at handbook.s2l.online now post directly to the Monday.com board "Study Guide Completions" (18416710291). A second handbook, the H2R Graphics Operator Guide (14 lessons, 28 questions), was authored from the official H2R docs using the ZoomISO template shell, the root URL became a listing page with ZoomISO moved to /zoomiso.html, back-links were added to both guides, and a stale-browser-cache bug was fixed with a no-cache header. Work began on the evening of 8 June and wrapped at 15:23 on 9 June with a written handoff; everything was deployed, tested end to end and verified live. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • s2l.online Session log — Server root password reset and ZoomISO Terminal help (8 June 2026, evening) — Hasmukh reopened an older session (originally 26 May) in the evening to ask how to recover the root password for the server. A fresh password he chose was set from chat at 19:01 and confirmed working, but a check at 20:22 showed it had been replaced again at about 20:19 by a separate reset made through the hosting provider's control panel, so the session ended without a confirmed record of the live root password. The "cannot log in" problem then turned out to be unrelated: Hasmukh was following a ZoomISO 3 training chat whose copy command contained a placeholder username, and he was given a corrected one-line command using the saved s2l-vps nickname. The published ZoomISO course on s2l.online was checked and contains no such faulty instruction, so nothing on the website needed fixing. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • General Session log — Reviewer and documentation password resets, site inventory (8 June 2026, evening) — Hasmukh reopened an older worktree session in the late afternoon with a string of access questions. The forgotten password for reviewer.s2l.online was reset and both login areas tested and working; vodalibrary.online was investigated and explained to need no password at all (magic-link sign-in, with hasmukh@gajjar.co.za as the only admin); and the admin password for documentation.mobilearn.africa was reset for the username hasmukh. A request to "pull the latest updates" failed because the GitHub access token on the Mac no longer has permission to read the ElmsPark-Studio storage area, but the requested list of all 12 live websites was produced anyway. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • General Session log — Interactive studio wiring diagram HTML (7 June 2026, morning) — Although it ran in the PageMotor 0.9.3b folder, this session had nothing to do with PageMotor: across 6 and 7 June it built interactive HTML maps of the broadcast studio wiring (ATEM switcher, Mac Studio, SDI/HDMI converters, Yamaha DM3 audio and more). A first map traced from a screenshot of the wire diagram was abandoned the same morning in favour of a pipeline where an editable spreadsheet is the source of truth and the HTML map is regenerated from it. When the Numbers app's Excel export proved unreadable, the updated rig was supplied as a PDF and the dataset rebuilt from it (40 devices, 47 cables, 8 connections still to verify). On 7 June, after Hasmukh pointed to the Vodacom FY2027 progress report as the navigation model, the map was rebuilt as a light, searchable single-page wiring report, and a bug where the floating column header covered table rows was fixed. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • PageMotor Session log — PageMotor 0.9.3b rollout to three local sites (5 June 2026, evening) — Claude read and summarised Kenn's build-safety brief for PageMotor 0.9.3b (a small two-file bugfix patch on 0.9.2b), flagging that the brief's token field was blank and taking no action until asked. Hasmukh then instructed it to run the brief's setup on the three local factory sites, marula, guide and v3demo. All three were updated from 0.9.2 to 0.9.3b using PageMotor's own built-in updater, marula first as a canary, and each site was verified live, on disk and via the update checker; the two skills were already active everywhere and no admin token was needed. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • PageMotor Session log — PageMotor 0.9.2b rollout to local factory sites (5 June 2026, afternoon) — Took delivery of the PageMotor 0.9.2b update folder (new core, two AI skill plugins, and Kenn's CC-to-CC build-safety brief) and rolled it out across the local PageMotor-Factory environment. All three local sites (guide, marula, v3demo) and the factory template were updated from core 0.9 to 0.9.2b, with timestamped core backups and a database dump per site taken first; the release proved to be code-only, so no database changes were needed and all three sites came up cleanly afterwards. The Design Conversion 1.4 and Plugin Creation 1.0 skill plugins were then activated on each site using admin tokens Hasmukh minted, and each site was connected to Claude Code as its own MCP server. The environment layout and the per-site finish procedure were saved to project memory. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • PageMotor Session log — PageMotor 0.9 source of truth and Discovery AI pipeline (4 June 2026, evening) — In this session, run with Kenn, the latest PageMotor codebase was locked in as the canonical source of truth, a full local PHP and MySQL stack was installed on the Mac, and the whole Discovery AI pipeline was then built on top of it: an interview plugin that produces a Design Brief, the Marula School of Medicine demo site synthesised from that Brief, three ways to ship a finished site, two interactive lesson guides, and a design-diversity gate after Hasmukh flagged that the outputs were looking samey. Work began on the evening of 3 June and ran through 4 June, including migrating the canonical tree from 0.9 RC4 to the released v0.9, and the session was picked up once more on 8 June to restore the local servers. A relayed message from Chris Pearson, PageMotor's creator, set the keyed-arguments rule that shaped the plugin work. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • PageMotor Session log — Kenn's PageMotor 0.9.1 brief and memory refresh (4 June 2026, afternoon) — Kenn's Claude Code supplied a build-safety brief for PageMotor 0.9.1b listing five known faults that can break sites during building, the worst being a theme save failure when a Design Option contains a raw var(...) value. Claude read the brief, then fully re-read the freshly updated PageMotor 0.9.1 code in the workspace (104 platform files plus 23 documentation files, vendored libraries skipped) and confirmed that all five faults are still present in 0.9.1, with nothing yet fixed. It then rewrote the project memory with an overview, the verified fault list and the build conventions, so future sessions build around them. Catch-up note reconstructed on 12 June 2026 from the saved conversation.
  • Medilearn Session log — Safari wide margins on the homepage (3 June 2026, evening) — Hasmukh noticed the live medilearn.africa homepage showing wide empty margins on the sides in Safari, while it looked fine in Chrome, and asked why. Investigated the site's styling end to end and found no fault in the website. The homepage is built as a centred column with a comfortable maximum width (about 1200 pixels), which is the same in every browser. The wide gaps in Safari are almost certainly down to the viewing conditions, not a bug: either Safari is zoomed out a little and remembering that for the site, or the Safari window is simply wider than the Chrome window. No changes were made to the site.
  • Discovery AI Session log — TIB AI builder, new site for Crossing the Line (3 June 2026, evening) — Hasmukh asked to create a new website using the TIB AI builder that Kenn set up, the same one used for the Tech Plus Things site. I traced the builder to discovery.mobilearn.africa (the tibaai-discovery plugin), read its method, and ran it for him. The new site is for Crossing the Line, a weekly video podcast hosted by veteran journalist Ryland Fisher, who interviews a wide range of South Africans. YouTube: @CrossingTheLinePodcastCPT. I looked the show up and built the preview on the real thing: real guests (David Africa, Stanley Jacobs, Vicky Sampson), the real topics, the weekly IOL feature, and Ryland's background as a former Cape Times editor. Hasmukh chose a bold, editorial look. I designed a bespoke one-page site: the latest interview big at the top, the full catalogue below, a "line" motif tied to the name, in a warm dark palette with a red accent. I checked it with my own eyes on both desktop and a phone, then published it to the private preview area behind the password gate, next to Tech Plus Things.
  • s2l.online Session log — ZoomISO v3 text course built and published on s2l.online (2 June 2026, evening) — Hasmukh supplied the official ZoomISO version 3.0.3 PDF manual and asked for a deep, lessons-style text course built from it and published on s2l.online, so he can learn the software properly. Read and absorbed the whole manual, confirmed two choices with him, then wrote fourteen lessons plus a quick-reference and glossary and published them as a self-contained set of pages at /zoomiso/. Everything was verified to load and link correctly, and the public site menu was left untouched as agreed. ZoomISO is a Mac app that pulls each person and screen out of a Zoom meeting as separate broadcast-quality feeds for live production. The course teaches it from first principles through to the advanced automation features.
  • Medilearn Session log — Past Events video description beside the Watch button (2 June 2026) — Hasmukh asked to take the description from a talk's video (the description box on Vimeo) and show it to the right of the green "Watch the recording" button in the Past Events spotlight, the same idea used on s2l.online. Bridget Hodkinson's Gout talk was the worked example. Delivered on the live medilearn.africa Past Events page. The description now sits beside the Watch button whenever a talk is featured in the top panel, and there is a new editing box so any talk can have one. Also looked into the recording player's fullscreen button not working in Safari. Traced it to a Safari setting on Hasmukh's Mac rather than the website, since the same thing happens on the s2l video library and both work in Chrome.
  • Medilearn Session log — Past Events page restyled as a gallery (2 June 2026) — Restyled the Past Events page on the live medilearn.africa site to match a podcast-style reference Hasmukh shared. The most recent event now sits large at the top as a featured item, with all events shown below as a gallery of photo tiles. Clicking any face brings that event up into the featured spot and plays its recording there. The new look is built to grow well as more events are added. The previous layout was backed up first, and the page was checked and confirmed working.
  • Medilearn Session log — Past Events: Bridget and Mashiko recordings (2 June 2026) — Added the recorded video of Prof Bridget Hodkinson's "Gout: What's New" talk to the live Past Events page (medilearn.africa). Located the matching Vimeo recording by its tag 20251001bridget, set it to play privately only on the live site, and attached it to the correct event. Then did the same for Prof Mashiko Setshedi's headline talk (tag 20251217mashiko). This also replaced the old placeholder YouTube link that was sitting on that event. Reused the proven private-Vimeo recipe from the Jantina recording (1 June): hidden video plus an embed whitelist to the live domain. Finally, at Hasmukh's request, saved the whole process as a reusable project skill so future recordings follow the same playbook automatically.
  • Medilearn Session log — medilearn.africa Vimeo connection and Jantina past-event recording (1 June 2026) — Connected the live medilearn.africa site to Vimeo (manual fetch only, no automation), then added the recorded Jantina de Vries ethics talk to the Past Events page so it plays on the site. Along the way we cleared up a naming mix-up left over from the 28 May go-live, which had caused the Vimeo key to be saved on the wrong copy at first. Everything was corrected and verified, and all changes were backed up.
  • General Session log — Vangelis MacMini workspace catch-up (28 May 2026) — Hasmukh opened the project from a different machine, the Vangelis MacMini, and asked for a review of the workspace and a summary of everything done so far. No site changes were made this session. The work was purely a status check, reading the recent session logs from iCloud and reporting back where both medistage and staging-medilearn stand.
  • Medilearn Session log — Medistage go-live to medilearn.africa (28 May 2026) — Took the site previously at medistage.medilearn.africa live as the new medilearn.africa. The old WordPress site (previously hosted at 41.222.32.14) was archived to iCloud and then replaced. Site is live, secure, and indexable. Old medistage links 301 to the new address.
  • Discovery AI Session log — Discovery AI medical school track analysis (28 May 2026) — Hasmukh asked whether the Discovery AI plugin on tibaai.org could be adapted for a medical school attached to a teaching hospital, covering clinical care, cutting-edge research, and the training of scientists and healthcare workers. He felt the existing plugin was geared toward his s2l.online style of need (single-owner commercial sites), and wanted a version that fits the academic medical centre sector. Read the Discovery AI plugin source on the s2l VPS at tibaai's plugins folder. Confirmed the plugin's actual shape: a guided interview, run in fifteen to twenty minute sessions, that builds up a full website specification and then generates a working homepage in HTML for live preview. Mapped out the three existing tracks the plugin already supports: Track A — Digital Products, five sessions, long-form sales-letter homepage with external checkout; Track B — Services and Booking, three sessions, trust-led homepage with a booking CTA; Track C — Something Else, routes the visitor into A or B. Identified why neither A nor B fits a medical school plus teaching hospital. The sector has three simultaneous missions (care, research, education), many distinct audiences, no checkout, much richer trust signals, and a portal-style information architecture rather than a single landing page. Drafted a proposal for a fourth track inside the same plugin, Track D for Academic Medical Centre. Four interview sessions covering mission and identity, the three estates (care, research, education), audience journeys for seven typical visitor types, and brand voice plus operations. Also sketched a different homepage shape with a three-pillar Care, Research, Education strip near the top, impact numbers, featured breakthrough, student and alumni faces, partner and accreditation logos, news and events, and a multi-CTA footer panel covering Apply, Refer a Patient, Find a Clinician, Partner, Support and Careers. Presented this back to Hasmukh in plain English and offered two next-step options: draft the actual Track D system-prompt content for review, or produce a sample homepage preview for a fictional medical school so he can react to the shape first.
  • Medilearn Session log — Setshedi caption, lectures list page, ML Lectures plugin (27 May 2026) — Three pieces of work on medistage.medilearn.africa today. First, a caption was added beneath the Prof Mashiko Setshedi portrait in the UCT Partnership section of the homepage. Second, a new public page was created to hold the list of pre-recorded lectures for the FCP Part 1 Refresher Course, with a call to action linking to it from the existing course page. Third, after Hasmukh pointed out that each lecture should be edited from the admin rather than by us editing the page, a new ML Lectures plugin was built on the Past Events plugin pattern, seeded with the 22 placeholder rows, and wired up so the public page is driven by a single shortcode. Two outstanding session logs from 26 May were also published to documentation.mobilearn.africa during this session.
  • Docs site Session log — Overview page session-logs cleanup (26 May 2026, evening) — Hasmukh reported that the Session logs section on documentation.mobilearn.africa/overview/ looked broken. Investigation showed three distinct rendering glitches in the most recent entries that the page had picked up over the last few days of publishing. All three were repaired against the docs_pm database in two passes, and the live page was reconfirmed clean.
  • s2l.online Session log — Activity monitoring: on-site dashboard and daily digest (26 May 2026, morning) — Started by checking whether the sign-in and sign-up emails sent by the S2L Magic Login plugin are still being delivered. They are, but Hasmukh was not seeing anything because the existing per-minute "signin-alerts" script still watches the old EP Membership log table and the magic login plugin writes to a different table. Hasmukh then asked for a way to monitor activity on the site, so we built two things: a private on-site activity dashboard and a daily digest email.
  • Medilearn Session log — Medistage under-construction notice (26 May 2026) — Hasmukh wanted visitors to know the site is still being built. He picked the slim top-of-page banner option. Banner now live on every page of medistage.medilearn.africa, using the brand name "Medilearn" (not "Medistage") in the wording, since the medistage URL is just the staging address for what becomes medilearn at launch.
  • Medilearn Session log — medistage founder photograph (26 May 2026) — Hasmukh asked to insert an image into the "Founder photograph" placeholder on the medistage homepage, in the section headed "Born from medicine, built through technology, ignited by COVID."
  • Medilearn Session log — Unhide Register Now button on medistage homepage (26 May 2026) — Hasmukh asked for the "Register Now — It's Free" button on the medistage homepage to be brought back. The button had been hidden on 25 May 2026 with an inline display:none while the session title and date were still placeholders. The placeholders have since been replaced with the real session details (FCP Part 1 Refresher Course, Department of Medicine, UCT — 19 May 2026 and the 19 to 21 June 2026 live event), so the button needed to render again.
  • Medilearn Session log — medistage nav buttons broken from other pages (26 May 2026) — Hasmukh reported that the top navigation buttons on medistage.medilearn.africa (About, What We Offer, How It Works, Partner With Us, Contact, Register for Next Session) did nothing when clicked from a page other than the homepage. The cause was that each link was a bare fragment such as #about, which only scrolls within the current page. On any inner page those sections do not exist, so the click had no effect.
  • Medilearn Session log — medistage live session image (26 May 2026) — Hasmukh shared a Zoom-style image of 12 South African doctors on a live call and asked to drop it into the "Not a webinar. A live clinical experience." block on the medistage homepage, replacing the placeholder that read "Live session photo or Zoom screenshot goes here".
  • Medilearn Session log — medistage how-it-works connector line alignment (26 May 2026) — Hasmukh shared a screenshot of the "How it works" section on the medistage homepage and pointed out that the thin horizontal connector line between the three numbered circles looked misaligned. Confirmed the site in question was medistage.medilearn.africa. Diagnosed the cause and corrected the vertical position of the connector so it now threads through the centre of the three numbered badges.
  • Medilearn Session log — FCP Part 1 Refresher Course landing page on medistage (26 May 2026) — Following the earlier session that brought the "Register Now" button back on the medistage homepage banner, Hasmukh asked for a proper landing page behind that button. Over the course of this session we built a new page at /fcp-part-1-refresher-2026, repointed the homepage banner button to it, added the official UCT Department of Medicine banner image, attached the two registration PDFs as forced downloads, refined the copy, and renamed the call to action. The course fee on the page now reads R3,500.00 (Hasmukh updated it directly during the session).
  • Medilearn Session log — medistage deactivate "Read the full story" button (26 May 2026) — Hasmukh sent a screenshot of the founder section on the medistage homepage showing the "Read the full story →" button under Dr Hasmukh Gajjar's bio, and asked for the button to be deactivated.
  • Medilearn Session log — Deactivate "Education built for doctors in practice" buttons on medistage homepage (26 May 2026) — Hasmukh sent a screenshot of the offerings grid on the medistage homepage and asked for the four call to action buttons in that section to be deactivated for now. The cards themselves (Free One-Hour Specialist Sessions, FCP Refresher Course, Medical Ethics CPD Course, Setting Up a Diabetes Clinic) should remain in place, but none of the buttons should be clickable while the underlying pages and registration flow are not yet ready.
  • Medilearn Session log — Prof Setshedi UCT partnership block and photo refresh (25 May 2026) — Hasmukh asked for a profile block on the medistage homepage stating that medilearn manages some of the online events in collaboration with the Department of Medicine, UCT, with a photo of Prof Mashiko Setshedi. The block was placed just below the "Browse past events" banner, styled to match the existing "Not a webinar. A live clinical experience" section. He then supplied a new photo of Prof Setshedi and asked for it to be used across the homepage, Past Events page, the Mashiko Setshedi speaker page, and her thumbnail on the Speakers list.
  • Medilearn Session log — medistage workspace location (25 May 2026) — Hasmukh asked where his local workspace for medistage.medilearn.africa lives on his laptop. Confirmed there is no dedicated local folder for medistage. The site is hosted entirely on the s2l VPS and is accessed through the server connection. The current working folder, s2l-assistant, is for s2l.online only.
  • Medilearn Session log — Medistage Setshedi block lookup (25 May 2026) — Hasmukh asked about the "Prof Setshidi block". After confirming what he meant, I read the current state of the Prof Mashiko Setshedi event card on the medistage Past Events page and reported it back in plain English. No changes were made.
  • Medilearn Session log — Hide Register Now button on medistage homepage (25 May 2026) — Hasmukh asked to hide the "Upcoming Free Session" banner on medistage.medilearn.africa, then corrected the scope to just the "Register Now — It's Free" button inside that banner. The button is now hidden while the rest of the banner (label, placeholder title, date/time line, "Free to attend, Cameras on") still shows.
  • Medilearn Session log — medistage broadcast gallery captions (25 May 2026) — Hasmukh asked for captions to be added under the six images in the "our live broadcasts" gallery on medistage.medilearn.africa. Confirmed the site is medistage (not staging.medilearn.africa). Captions were supplied by Hasmukh one image at a time. Two images are to be replaced later, so they were left without captions for now.
  • General Session log — Claude Code Groups question (25 May 2026) — Brief Q&A session. Hasmukh asked what the "Move to group" option in the Claude Code sidebar context menu does. Confirmed Groups are simply folders for organising sessions in the sidebar; they do not affect session content, memory, or project assignment.
  • Medilearn Session log — medistage — Recent Events banner and Past Events page (25 May 2026) — Added a "Recent Events" banner on the medistage homepage, sitting directly below the existing "Upcoming Free Session" banner, with a "Browse past events" button that links to a new placeholder page at /past-events.
  • s2l.online Session log — Magic login polish: URL migration, page redesign, homepage sign-in (25 May 2026) — Continuation of the previous evening's magic-link work. Hasmukh manually cleared every self-registered learner overnight via the admin UI, leaving just the three Administrators (himself, Kenn, webmaster). The morning's work split into three connected pieces: (1) finishing the URL migration so /login and /register are retired and every link on the site points to the new /sign-in and /sign-up, (2) rebuilding the look of the sign-in and sign-up pages so they match the rest of s2l.online rather than looking like raw browser defaults, and (3) adding a visible Sign in path on the homepage so a non-digital learner who has already registered does not get stuck at the Start Learning Free button. Tied off with a polish pass on the /watch not-enrolled gate that Hasmukh flagged as still feeling unfinished. By the end of the session every relevant entry point — top nav, mobile nav, hero, footer, and the course-viewer gate — feels visually consistent with the homepage brand. The live email round-trip is still the one piece Hasmukh has to verify himself when he is ready.
  • s2l.online Session log — Vimeo nightly sync for s2l.online courses (24 May 2026) — Started as an explanation of the current manual Vimeo refresh workflow for s2l.online, then expanded into building and switching on a nightly automatic sync that mirrors how vodalibrary works, adapted to the s2l course-and-lesson shape.
  • s2l.online Session log — Quiz page redesign (24 May 2026) — Hasmukh sent a screenshot showing the quiz page from yesterday's build looking unstyled, with options crammed onto a single line inside bare fieldset boxes. Investigated the cause, rebuilt the look from scratch, and shipped it. Pending Hasmukh's feedback on the new design.
  • s2l.online Session log — Magic-link sign-in plugin for s2l.online (24 May 2026) — Hasmukh said he was not comfortable with the existing EP Membership password login on s2l.online and asked whether we could give learners the same vodalibrary.online experience, where you only need an email address to sign in. The difference is that vodalibrary users are added by an administrator, whereas s2l learners register themselves. We agreed the journey should be: sign up with name and email, get a one-time activation link, click it, do a single confirm click for safety, land signed in. Sign-in from then on is just an email, a one-time link, and a confirm click. The session built a new PageMotor plugin (S2L Magic Login), added two new pages (/sign-in and /sign-up) using it, and tested the full flow end to end against the live site. The old /login and /register pages were not touched, so both flows now run side by side. Hasmukh's plan for the morning is to delete all the existing learners on s2l.online (keeping only himself and Kenn as admins, and also removing the vysor and gajjar test accounts), so the old EP Membership pages can be retired and the URLs simplified.
  • General Session log — System reminder banner question (24 May 2026) — Very short session. Hasmukh asked what the repeating banner at the start of each turn means. Explained in plain English that it is an internal note from the system listing my available tools, skills, and site notes, and that he can safely ignore it.
  • General Session log — Pull request status message question (24 May 2026) — Hasmukh asked what the recurring "Pull request status couldn't be checked and may be out of date" message means. Explained that it is a Claude Code message about checking GitHub, not anything to do with the s2l.online website, and that it is safe to ignore. Later in the day the message reappeared as "GitHub CLI authentication expired", and Hasmukh asked how to refresh it. Walked him through running gh auth login on his Mac, picking the personal-access-token option, and pasting in a token. The CLI confirmed he was logged in as hasmukhgajjar, and the warning is gone.
  • Zoom Companion Session log — Quick time check (23 May 2026, afternoon) — Single-question session. Operator asked for the current date and time in South Africa, which was returned as Saturday, 23 May 2026, 16:46:47 SAST.
  • Zoom Companion Session log — Session, 23 May 2026, Date query (23 May 2026, afternoon) — Brief utility session. The user asked for the current South African date and time in the format yyyymmdd hh:mm:00. The answer returned was 20260523 16:48:00.
  • s2l.online Session log — Lesson completion gate (95% watch rule) (23 May 2026) — Hasmukh raised a concern that learners can mark a lesson complete on s2l.online without actually watching the video. He asked how to stop that. We agreed the right design is to lock the "Mark as Complete" button until 95% of the video has been watched, and then auto-complete the lesson the moment the threshold is reached. We also agreed that watch progress must be remembered across visits, so a learner who refreshes or comes back later resumes from where they stopped rather than starting over. I implemented the change end-to-end on the live s2l.online site (EP Courses plugin). Hasmukh will test tomorrow.
  • General Session log — Date/time check (23 May 2026) — Very short session. Hasmukh asked for the current date and time in the format he normally uses. Returned Saturday, 23 May 2026, 18:45 SAST.
  • General Session log — Date/time check (evening) (23 May 2026) — Very short session. Hasmukh asked for the current date and time in his standard format. Returned 20260523 21:49:36 (SAST). Separate from the earlier 18:45 SAST check on the same day.
  • s2l.online Session log — Course quiz (check at the end) (23 May 2026) — Designed and shipped a "check at the end of a course" feature on s2l.online. Each course can now have an optional short multiple-choice quiz, learners take it after marking the last lesson complete, results are scored automatically, and the admin gets a report by course and by learner. The simple "check" version, not a full graded exam.
  • Vodacom Session log — Vodacom progress report request (22 May 2026) — Hasmukh asked for a Vodacom FY2026 projects progress report. I asked which reporting window to use. He chose a custom date range but has not yet supplied the From and To dates. The report itself has not been generated yet, as the session is waiting on those dates.
  • s2l.online Session log — home page logo (22 May 2026) — Hasmukh asked for the S2L logo to be more pronounced on the home page. After discussing placement, he chose to have the logo sit above the headline in the top banner, and asked that the previous look be reversible.
  • Zoom Companion Session log — Session, 20 May 2026, Live participant-count dashboard (20 May 2026, evening) — User asked for an HTML dashboard that shows how many participants are in a meeting, in the spirit of the Camera Monitor app, with an incremental number display to create excitement amongst the members. Built a new broadcast page that piggybacks on the existing v0.11.0 stats HTTP server (port 8766) and consumes the same SSE stream the cameras-off overlay uses. No new IPC, no renderer changes. Wired it into the existing HTTP server in main.js at /counter (alias /participants). Made the broadcast server reachable from other machines on the LAN (the user runs H2R Graphics on a separate appliance) by changing the bind from loopback to all interfaces. Released as v0.12.0 across both tenants (Mobilearn and Medilearn): version bumps, operator guide updates, DEVLOG entries, both DMGs rebuilt. Diagnosed and resolved a notifications problem on a second test Mac (Do Not Disturb was the culprit), then added a pre-flight check to the operator guides so it does not catch operators out again.
  • ConsciousCuisine Session log — Session opened, no work done (17 May 2026, afternoon) — Session opened with the standard ConsciousCuisine operating brief loaded. Hasmukh did not raise a task. Claude offered to help with content work (recipe drafting, copy edits, Ayurveda blocks, OG card descriptions) and waited for direction. No substantive discussion followed before the stop.
  • General Session log — Website inventory (15 May 2026) — Quick session to pull the latest repo updates and produce a list of all websites currently running on the VPS.
  • General Session log — Workflow rollout to five iCloud projects (12 May 2026) — The s2l session-log + publish workflow has been rolled out to five more project folders on iCloud (ConsciousCuisine, monday stuff, Vimeo Stuff, Zoom Apps, Zoom Companion). Each project gets its own daily log, its own start-of-session check that publishes yesterday's log, and its own section on /overview/ when its first log goes live. A strategic discussion about working across multiple Macs ended with a recommendation to add per-project HANDOFF.md notes only when needed, parked for sign-off.
  • Vodalibrary Session log — Vodalibrary privacy lockdown and in-page video player (9 May 2026) — Three big additions to vodalibrary.online. Editable Mobilearn-branded sign-in email with an admin Settings page, an in-page modal video player so users stay inside the library, and the big one: locked down all 1,201 vodac-tagged Vimeo videos so they only play inside vodalibrary.online (view = disable + embed = whitelist). The privacy lockdown took a wrong turn first — view = password + embed = whitelist did not bypass the password — before settling on the right model.
  • Medilearn Session log — Ethics page replicated, plus a long day of homepage fixes (8 – 10 May 2026) — A long, multi-pass session on medistage.medilearn.africa. Replicated the live ethics page from medilearn.africa as a draft, then spent the rest of the day fixing the home page hero (broken layout, missing button styles, broken nav icons), updating nav labels, removing white margins, swapping the hero photo three times to find the right image, re-encoding everything to WebP, adding a six-photo From recent sessions gallery, and swapping in the colourful Medilearn brand SVG for the header and footer logos.
  • Discovery AI Session log — Discovery AI Phase 1, the resume after compaction (7 May 2026) — Resume point after the previous conversation ran out of context. Read the three required documents (PHASE-1-RESUME.md, the verify-with-eyes skill, the Setshedi bio) and surfaced five open questions to Hasmukh. Nothing touched on any server. Awaiting his answers before locating the Discovery AI plugin on Tibaai.
  • Docs site Session log — Auto-publishing session logs after midnight (7 May 2026) — Hasmukh asked what is needed so every session log gets published to documentation.mobilearn.africa just after midnight SAST. Planning conversation only, no schedule set up yet. Two options on the table: same-night publishing with no editing window, or one-day-delayed publishing that gives a morning to edit before the log goes public.
  • Medilearn Session log — Medistage Setshedi interview, the investigation phase (6 May 2026) — Phase 1 only of a four-phase brief: build a Personalised Pathway Interview on medistage.medilearn.africa featuring Prof Mashiko Setshedi. Read across cpd.medilearn.africa (read-only) and medistage to map every moving part of the cpd interview, confirmed the medistage prerequisites (ep-courses present, Medilearn theme active, Anthropic key still to add), shortlisted three design options (cosmetic, Setshedi-as-host with rewritten AI voice, or gastro-only scope) and parked them awaiting Hasmukh’s choice. No code or content changed.
  • Medilearn Session log — Novamira connectors and a fresh PageMotor at medistage (6 May 2026) — Two pieces of work in one session. Installed Node.js LTS and the Claude command-line tool on the Mac (user-local prefix at ~/.npm-global, no sudo), then added two Novamira MCP connectors at user scope so Claude can talk to the WordPress sites at staging.mobilearn.africa and medilearn.africa. Stood up a second PageMotor instance at medistage.medilearn.africa on the s2l VPS, mirroring the staging.medilearn.africa plugin set and theme but with its own user, FPM pool, database and certificate.
  • Vodalibrary Session log — Vodalibrary moves to vodalibrary.online (5 May 2026) — Migrated the live private library off vodalibrary.vodavideos.co.za onto a dedicated domain, vodalibrary.online. New DNS, new Let’s Encrypt cert, new SendGrid sender authentication. Also fixed a Mimecast-induced magic-link breakage by splitting verify into a two-step GET-then-POST flow, so corporate email scanners that pre-fetch links no longer consume the single-use token before the human can click. Adding a person via the admin page now also auto-sends them their first sign-in link.
  • Vodalibrary Session log — Vodalibrary announcements feature and dated outputs (5 May 2026) — Two enhancements. The local Vimeo refresh now writes a fresh date-stamped file each time (YYYYMMDD HHMM Vodac Library.html) instead of overwriting, so chronology is preserved in Finder. Added an Announcements feature to the live Vodalibrary site, history-style not single-banner, with admin post/archive/delete, per-user dismiss, dismissal-count tracking, an auto-installing schema, and a full history page for re-reading.
  • Vodalibrary Session log — Vodalibrary launch and bulk Vimeo tagging (4 May 2026) — Two big bodies of work. First, bulk tagged 1,196 Vodacom videos on the Vimeo account with the vodac tag across eight progressively larger batches (one of which ran 840 tag operations as a single background pass). Second, built and shipped a live web app at vodalibrary.vodavideos.co.za that gates the vodac library behind a passwordless magic-link login, with admin pages for self-service enrolment of client managers. Daily cron refreshes the Vimeo data file at 02:00 SAST. End-to-end test confirmed working before close.
  • Vodalibrary Session log — Vimeo library export, viewer, and a refresh launcher (3 May 2026) — Hasmukh asked whether I could see his Vimeo account; not directly, but the API token already lives on the s2l server inside the EP Courses options. Pulled a full inventory of all 1,962 videos via a server-side Python script, built an Excel workbook (Summary, All Videos, By Tag), then a single-file HTML viewer with search, multi-tag filter (AND logic, removable pill chips), sortable cards and per-card descriptions with show more / show less. A double-click .command launcher refreshes the data and opens the page. All output sits in the iCloud “Vimeo Stuff” folder.
  • s2l.online Session log — Online Meetings course on s2l.online (3 May 2026) — Used the course-add playbook end-to-end in a fresh session. New English course Online Meetings at /zoom2020-english/, two lessons (Lesson 01 Overview of Working from Home, Lesson 02 Zoom Overview), about six minutes total, free, listed alongside the existing English catalogue. Two videos on Vimeo carry the ZOOM2020 tag right now, so the course is short by content rather than by design; tagging more lessons later will pull them in without code changes.
  • s2l.online Session log — A quick site health check (3 May 2026) — A short morning session. Hasmukh asked “check my site” and that was the scope. The harness surfaced five queued session logs ready to be published to documentation.mobilearn.africa, but they were not part of the asked scope, so the right move was to flag them and wait for the go-ahead rather than start publishing without consent.
  • s2l.online Session log — WhatsApp isiXhosa course, plus the login fix that let everyone see it (3 May 2026) — new free WhatsApp isiXhosa course at /whatsapp-isixhosa/, ten lessons (Isifundo 01 to 10), about 79 minutes total. Along the way fixed a real bug in the membership login flow: the auth cookie was being written without the signed format the rest of the site expects, so logged-in learners were being treated as guests on every page. With that fixed, the top-right of the site now swaps to My account when you sign in, with a softly outlined Log out beside it. Hidden a stray “kennjordan” author byline that had been showing under every page title. Wrote a course-add playbook so the next course can be built without rediscovering the procedure.
  • s2l.online Session log — A “you are human” check on the register page (2 May 2026) — Added a Cloudflare Turnstile widget to the s2l.online register page (chosen over Google reCAPTCHA for a lighter, more privacy-friendly footprint). Site key and secret stored in EP Membership settings rather than baked into code, so they can be rotated without touching the plugin. Matching server-side check rejects sign-ups submitted without a passed token. Original plugin file preserved as a timestamped backup for one-step rollback.
  • s2l.online Session log — Discovery plugin check on s2l.online (2 May 2026) — A one-question session. Confirmed from the project notes that Discovery AI, the AI-powered site-building plugin, is one of the active EP plugins on s2l.online. Information-only check, no site changes.
  • Medilearn Session log — medilearn.africa rebuild kickoff (1 May 2026) — End-to-end kickoff for a fresh medilearn.africa rebuild on PageMotor, leaving the existing WordPress placeholder untouched. Stood up staging.medilearn.africa with its own VPS user, FPM pool, database, certificate, and noindex headers. Ported the s2l theme, rebranded to the medilearn six-colour palette with Nunito headings, installed eight public-side EP plugins plus six cross-cutting helpers, and populated the home page with real medilearn copy with the UCT Department of Medicine partnership prominent. Published a handover brief for Kenn at /medilearn-rebuild-plan-2026-05-01/.
  • s2l.online Session log — A short blog page sanity check (1 May 2026) — A five-minute session. Hasmukh wondered whether the s2l.online Blog page actually had any HTML behind it; a quick look confirmed the page is fine (intro paragraph plus a card linking to the first welcome post, rendering at /blog/). Nothing changed. The journal entry exists for completeness, sometimes the most useful thing a session log records is “we looked at this, and it was already fine.”
  • Docs site Session log — Automatic publishing of daily session logs (1 May 2026) — Stood up the publishing rhythm itself. Added a SessionStart check that lists any unpublished previous-day session logs and asks Claude to publish each one, including a mention on /overview/ in the same run. Added a Stop check that requires today’s log to exist before a session can end. Each published log is “remembered” with a small empty marker file next to the original (<filename>.md.published), the simplest reliable signal to keep the morning queue accurate. The journal now keeps itself.
  • s2l.online Session log — Course deletion no longer reloads the admin (1 May 2026) — fixed a small UX bug in the EP Courses admin. Deleting a course used to do a full page reload that lost the admin's tab and scroll position; deletion now removes the row in place with a soft fade. Two-file change in ep-courses.js and plugin.php, with a JS cache-bust so admins see the fix immediately.
  • s2l.online Session log — A SARS isiXhosa course built from Vimeo videos (30 April 2026) — a free six-lesson SARS course in isiXhosa goes live on s2l.online, built end-to-end from existing Vimeo recordings. New course SARS2isiXhosa at /sars2isixhosa/, six lessons (Isifundo 01 to 06), ~21 minutes total, free, reachable without an account.
  • s2l.online Session log — Lesson description on the watch page (29 April 2026) — a short follow-up to the 27 April lesson-description work. The description was live but only on the course landing page; from today it also renders on the watch page, in a soft grey panel between the lesson title and the video, so a learner sees the context before pressing play. Re-uses the existing per-language translation helper, so an isiXhosa learner sees an isiXhosa description if one is written.
  • General Session log — A working journal, started (28 April 2026) — an organisational session. Stood up a top-level sessions-log/ folder in the s2l-assistant project, agreed a four-section format for every entry (summary, decisions, changes made, follow-ups), wrote a short README, and committed the first entry same-day. From now on every working session ends with a dated Markdown file capturing what was decided and why — the local notes that sit underneath the polished docs pages.
  • s2l.online Session log — A short description under every lesson on s2l.online (27 April 2026) — added a "Short description" field to EP Courses lessons. Edited in the admin next to the title, translated per language, rendered as muted grey copy under the lesson title on every course landing page. End-to-end change across schema, admin editor, save handler, frontend markup, and styling. Lessons without a description render unchanged.
  • s2l.online Session log — Blog page added, then a new SARS course on s2l.online (27 April 2026) — two pieces of work in one day. Stood up a blog on s2l.online (refreshed /blog from a Coming Soon placeholder into a card listing, added the Blog menu link, seeded a first post). Then built a brand-new English course SARS2s2L from two Vimeo videos tagged S2LSARS, wired the landing page, and surfaced the course on both the English Courses page and the home page
  • s2l.online Session log — s2l.online register-then-course bug fix (26 April 2026) — the “login loop” was a UI illusion: auth was fine, the home page nav did not reflect login state. Added [member-nav], swapped three nav locations, fixed a missing-braces bug on /profile/. Same day: hid the isiNdebele and Tshivenda language pages until their courses are ready, and dropped the new S2L logo into the site header
  • s2l.online Session log — private content reviewer (25 April 2026) — new self-hosted reviewer at reviewer.s2l.online, basic auth, Let’s Encrypt, S2L brandmark and 9-channel grid
  • s2l.online Session log — 25 April 2026 — SARS course on s2l.online, learner auth wired up, email migrated to mobilearn.africa, SPF added, lesson drawer fixed
  • MobiLearn CPD Session log — 23 April 2026 — activity funnel build for MobiLearn CPD, plus the wifi course on s2l.online
  • All session logs →

Zoom Apps session log

A working journal of paired Hasmukh + Claude sessions building Camera Monitor, a silent companion bot that joins a Zoom meeting and shows live camera on/off state per participant. Newest first.

  • Session log — Zoom Apps, OBF cross-account support (16 May 2026) — Built OBF (On Behalf Of) authentication so Camera Monitor can join meetings hosted by accounts outside Mobilearn. Operator authorises once via browser OAuth, bot then joins meetings on their behalf. Auth-required external meetings still TBD, retest pending. Shipped as v0.9.0.
  • Session log — Zoom Apps, Shape A polish and notifications (15 May 2026) — A long debugging arc on macOS notifications (bot-in-own-roster regression, a race condition between user-updated and peer-video-state-change, plus Do Not Disturb silently swallowing banners), then a polish run of three features: session reports in HTML / TXT / CSV written to ~/Documents/Camera Monitor Logs/ on Leave, a configurable “at least N seconds” notification threshold, and a snooze button with a live countdown. Camera Monitor v0.7.0 built and waiting for the morning test.
  • Session log — Zoom Apps, footer fix and webinar support (15 May 2026) — Recovered yesterday's power-outage work in iCloud, rebuilt v0.3.1, then v0.3.2 to unhide the version footer that my own anti-popup CSS had been killing. Added webinar support: a paste-the-URL field auto-extracts meeting number, passcode and registration token (tk) from any Zoom URL and passes tk into client.join() only when set. v0.4.0 built.

Zoom Companion session log

A working journal of paired Hasmukh + Claude sessions on Camera Monitor, the silent companion Electron app that joins a Zoom meeting and shows live camera on/off state per participant. Newest first.

  • Session log — Zoom Companion, Medilearn fork built and verified live (18 May 2026) — Built and verified the parallel Camera Monitor (Medilearn) packaged app, sibling to the Mobilearn build shipped the day before. Provisioned the Medilearn-side Meeting SDK Marketplace app, hit two real blockers along the way (iCloud rsync silently lost files inside node_modules, and the new General App produced a "Signature is invalid" error until the Meeting SDK and programmatic-join sub-toggles on the Embed tab were enabled), worked through both. First end-to-end join against a medilearn.africa-hosted meeting succeeded via the Medilearn ZAK path; bot appeared in the host's roster as Camera Monitor (Medilearn). Three cosmetic Mobilearn → Medilearn cleanups followed (window title bar, in-app heading, OAuth banner text — required two extra rebuilds to also catch the HTML <title> which overrides BrowserWindow's title). Both v0.11.0 builds now coexist on the same Mac with separate userData dirs. Three new lessons captured in project memory for any future third-tenant fork.
  • Session log — Zoom Companion, v0.10.0 dual-tenant attempt reverted, v0.11.0 broadcast overlay shipped (17 May 2026) — A long arc that ended well. Attempted dual-tenant ZAK so one app could join meetings on both mobilearn.africa and medilearn.africa; reverted same day after live testing revealed the Meeting SDK key is account-bound (a Mobilearn-issued SDK key cannot act on behalf of Medilearn users even with a valid Medilearn ZAK). Multi-tenant support needs a separate packaged app per tenant. Kept the chain refactor and a new participant-stats line above the roster, shipped as v0.10.0. Later built a live broadcast-overlay HTTP server at http://localhost:8766/ for H2R Graphics / OBS Browser Source pulls — beautifully styled real-time view of camera on/off percentages and off-camera names — shipped as v0.11.0.
  • Session log — Zoom Companion, DEVLOG catch-up and v0.9.1 / v0.9.2 fixes (16 May 2026) — DEVLOG catch-up across six version bumps that had slipped, then a live OBF investigation that closed the open question from the prior session: OBF works without operator presence when meeting auth is off, gets rejected with errorCode 3051 when auth is on regardless of presence. Shipped v0.9.1 with a one-line leave-teardown fix (client.leaveclient.leaveMeeting) and v0.9.2 with an OBF-fail → ZAK-retry fallback that lets authorised operators still join auth-required Mobilearn meetings.

Related plans

  • medilearn.africa rebuild plan — replacing the WordPress placeholder at medilearn.africa with a purpose-built PageMotor site on our VPS, branded for medilearn, with a protected video library for doctors and a donor-facing front door. Written as a brief for Kenn.

Target audience

Primary: UCT FCP candidates (GPs preparing for or engaged in the Family Care Practitioner programme).

Secondary: Broader South African primary care / GP CPD audience.

Conference-specific pathways (Neurology, Diabetes, Cardiology, etc.) as entry points for specialist events.

Why this product

  • MobiLearn already holds ~200+ hours of high-quality UCT FCP lectures spanning every major clinical specialty.
  • No existing structured platform surfaces this content to doctors doing CPD or preparing for FCP.
  • An AI-driven interview removes the friction of “where do I start?” for busy clinicians.
  • UCT already supplies the content; a co-branded platform is a natural extension of an existing relationship.