From September 2023 through June 2025 I worked on parts of the Open edX codebase as a senior engineer at Arbisoft. The work was concentrated in the enterprise repositories — edx-enterprise, enterprise-catalog, enterprise-access, license-manager, course-discovery, and the two frontend portals — with a handful of changes also landing in the main platform repo.
Most of these are small or incremental: bug fixes, schema cleanups, a few features that span multiple services. This is a log grouped by area, with links to the merged PRs for anyone curious about specifics.
A search filter for the full list lives here.
Integrated channels — LMS and HRIS connectors
Open edX has a set of connectors that push course content, completion data, and skill metadata to external learning systems — Canvas, Moodle, Degreed, Cornerstone, Blackboard, SAP SuccessFactors, and a few others. Most of my time in edx-enterprise went to making those transmissions more resilient and observable.
- Persisted client-call history for Cornerstone (#1994) and Blackboard (#2004), with the underlying
IntegratedChannelAPIRequestLogstable (#1983) and an admin view to inspect them (#2015, #2022). - Switched Moodle course updates from hard-delete to inactivate, so re-syncs didn't lose state (#1881).
- Marked Degreed courses active when the upstream returned 409 instead of failing the transmission (#2059).
- Stopped retrying failed content transmissions for 24 hours after a fail, with an
errored_atfilter so retries were bounded (#2043, #2047). - Unlinked Canvas users on the Open edX side when the upstream account was decommissioned (#2026).
- Forced transmission of content metadata when customer configs changed, so newly-onboarded customers didn't have to wait for the next cycle (#2105).
- A few schema cleanups in
integrated_channels(#2115, #2119, #2121). - Added an
is_mobiletransformer for the Cornerstone (CSOD) channel (#2166) and posted skills metadata to Degreed2 (#1969).
Provisioning admin role and RBAC
In mid-2024 a new "provisioning admin" role was introduced — a small group of operators that needed read/write access to enterprise records across services. The change touched four services because the role and its permissions had to be defined consistently in each one.
- Defined the role and its permissions in
license-manager(#693) andedx-enterprise(#2181), and replaced the older django-group-based check with role-based access in bothenterprise-catalog(#901) andedx-enterprise(#2192). - Registered the role system-wide on the platform itself (#35223).
- Granted PA access to specific catalog views (#853) and license-manager endpoints (#656, #2143, #2170).
- Cleaned up a 403 that surfaced for these admins because of crum's user resolution (catalog, edx-enterprise).
Learner Credit Requests
A 2025 feature in enterprise-access where learners could request enrollment paid for via learner credit, with a downstream Braze email campaign triggered on approval.
- Added the
can_requestaction (#702) and anamountfield on the request model (#723) so the request carried the right price for downstream billing. - Wired the learner portal to send
pricewhen creating a request, converting USD to cents at the boundary (#1377, #1391). - Fixed the Braze trigger to receive a complete timestamp so email scheduling worked correctly (#639).
- A 200-vs-400 fix on
can_requestso the frontend didn't treat a normal "no, can't request" response as an error (#726).
Subscription and license management
- Added CRUD endpoints for
SubscriptionPlanin license-manager (#642, #660). - Reworked the license-revocation endpoint to handle a few edge cases (#698), and updated the admin-portal bulk-revoke flow that consumes it (#1295).
- An OpenAPI yaml that the rest of the toolchain reads from (#544).
SSO self-serve and SAML
- Fixed entityId parsing in the SSO self-serve tool (#2065) and a follow-up where the form didn't persist updates when no fields appeared to have changed (#1183).
- Added
simple-historytracking onSAMLProviderConfigso SSO config changes were auditable (#35578).
Catalog filtering and discovery
- Excluded archived courses from a few catalog endpoints (#968).
- Introduced a
marketablefield incourse-discovery(#4493) and wired the catalog Algolia indexing to honoris_marketable_externalso externally-marketable courses surfaced correctly (#1029). - Fixed a regression where the archived-course exclusion was incorrectly filtering out courses when callers passed an explicit
content_keyslist (#1058).
Smaller fixes
- A JS exception on initial render in the learner portal for some courses (#1262).
- A missing
hrefon an XML download button in the admin portal (#1259). - Search filters on the learner-data audit admin views in
edx-enterprise(#2285). - Adding
frontend-app-admin-portalto whitelisted origins on the platform (#34354).
If you're working on something in this part of the codebase and have questions about any of the above, the contact page is the easiest way to reach me.