Braden MacDonald
braden@opencraft.com
Breaking up & reusing course content:
How we built LabXchange using Open edX and Blockstore
Overview
Vision for LabXchange
Demo of LabXchange
Why build on Open edX?
LabXchange architecture (overview)
Open edX APIs we use
What we built separately
The end result
How you can build with Blockstore
Vision for LabXchange
Why build on Open edX?
Adapters for content - XBlocks!
Reuse content from edX courses
Scalable
Open source
Existing relationship with Harvard
Challenges with Open edX
Focused on courses
Requires registration & enrollment
Limited search, no tagging
Limited social features
LabXchange Architecture
LabXchange
backend
LabXchange
frontend
edX.org��LMS+Studio�+ plugins
Blockstore
Discourse
React
TypeScript
REST API
OpenAPI
Django
Kubernetes
Open edX
REST API
ElasticSearch
MySQL
proprietary
open source
Open edX APIs we use
and you can too!
Single Sign-On
Uses edx-auth-backends (GitHub / PyPI)
User account/profile API
Content Libraries v2
Content Libraries v2
get_library (lib_key)
library_exists (lib_key)
create_library (org_id, collection_uuid, slug, title, description="")
delete_library (lib_key)
add_block_to_library (lib_key, block_type, slug, parent_block=None)
get_library_block_olx (block_key)
set_library_block_olx (block_key, new_olx)
commit_library_changes (lib_key)
get_library_block (block_key)
delete_library_block (block_key)
get_library_blocks (lib_key)
get_library_block_assets (block_key)
get_library_block_asset_file (block_key, filename)
set_library_block_asset_file (block_key, filename, content)
Defined in edx-platform/openedx/core/djangoapps/content_libraries/urls.py
Content Libraries v2: OLX API
set_library_block_olx (block_key, new_olx)
XBlock runtime REST API
render_block_view (block_key, view_name)
render_block_view_studio (block_key, view_name)
get_xblock_metadata (block_key, extra_fields=None)
get_xblock_children (block_key: UsageKey)
get_block_handler_url (block_key, handler_name, use_cached_handler_url=False)
get_block_handler_url_studio (block_key, handler_name)
call_block_handler (block_key, handler_name, method='get', **kwargs)
call_block_handler_studio (block_key, handler_name, method='get', **kwargs)
Defined in edx-platform/openedx/core/djangoapps/xblock/rest_api/urls.py
XBlock Sandbox
<iframe>
HTML file served from unique domain, e.g.�https://d4f3crotqjvv0.cloudfront.net
Anonymous Access
During create_library:
�{� ...
"allow_public_learning": true�}
OLX Export API
Open edX OLX REST API Plugin
https://github.com/open-craft/openedx-olx-rest-api��Usage:�https://studio/api/olx-export/v1/xblock/:block_id/
�JSON response with:
<OLX/>
Pathways Plugin
“Pathway” as a new learning context.
REST API methods:
Opaque key: “lx-pathway:”
github.com/open-craft/lx-pathway-plugin
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
Custom XBlocks
github.com/open-craft/labxchange-xblocks
What we built separately
Discussion forum
Visual problem editor
by Raccoon Gang
Search + Tagging
Classrooms
Grade Interception/Cache
Other features
Notifications
Mentoring
Internationalization
The End Result
LabXchange launched on January 22, 2020
How you can build with Blockstore
github.com/edx/frontend-app-library-authoring - see the README
edx-platform/openedx/core/djangoapps/content_libraries/urls.py
edx-platform/openedx/core/djangoapps/xblock/rest_api/urls.py
Braden MacDonald
braden@opencraft.com
CTO
Questions?