Community Contributor

Learning LTI with Atomic Jolt & a Noobie


I'm an educational designer turned web developer. Since there's no such thing as a silly question, I thought I would share all my questions on LTI to help others learn. Perhaps we can even start an LTI study group!?!

I've been struggling to wrap my head around LTI since starting my new role here at UTS. I'm a junior Ruby/JS dev so there are gaps in my knowledge that I simply could not fill on my own by reading the documentation (even though I have a billion and one times), watching all the instructureCon videos and cloning all of the LTI repos on Github. I'm a little embarrassed to admit that I needed some (read: a lot) of hand holding.

Thankfully, I found Atomic Jolt! With the help of the incredible minds at Atomic Jolt , I've finally started to understand LTI line by line. I thought I would share what I've been learning, hopefully, to encourage others to ask questions and continue to collaborate so we can start to build social, engaging, data-driven, interactive activities (think: You Draw It )

So here goes, I'll continue to add/edit this original post with more questions I had for @justinball and his team. Chime in at any time to add yours.



PS. A million thanks to Justin, for his patience, generosity with his knowledge and excellent teaching skills. LTI is hard but it's so much fun learning ALL THE THINGS!!!

Meeting 1: How do I get started with the LTI Starter App & Pass a Grade to the Gradebook

Atomic Jolt LTI Starter Ep. 1: Getting started with the Atomic Jolt LTI Starter App - YouTube

GitHub - atomicjolt/lti_starter_app

Meeting 1.5: How do I setup ngrok?

Atomic Jolt LTI Starter Ep 2: Using ngrok with the Atomic Jolt LTI Starter App - YouTube

Meeting 2: How do I add my LTI tool through the Rich Text Editor (Ruby)?

Atomic Jolt LTI Starter Ep 3: Content Item Example - YouTube

GitHub - atomicjolt/content_item_example

Meeting 3: Discussing scaling LTI apps for future planning. (aka The Widget Dream)

No resources for this one, instead we discussed the functionality we will require in our future apps (i.e the things we would like to build). My widget dream consists of highly interactive data-driven in-line widgets dropped into the RCE (rich content editor).

The Widget Dream [0:46 sec] – is pretty much inspired by the NYTimes and Guardian narrative journalism interactives and Chinn and Brewer’s (1980) use of use of anomalous data in learning. Using formative feedback to inspire big impact learning.

Need to know Functionality

  • Basic LTI Launch
  • Creating Content item LTI (using Ruby and React)
  • Injecting HTML into the RCE
  • GET/POST to the API data via the RCE.
  • Grade passback

We discussed scalability and maintainability using AWS Lambda, Atomic Jolt are doing some incredible work here (stay tuned). We also spoke about integrating the Learnosity Assessment Toolkit and utilising their 55 (and growing) questions styles to add to our bespoke builds.

Meeting 4: How do I add my LTI tool through the Rich Text Editor (React)?

React Ep. 40: LTI ContentItemSelection With React - YouTube

Meeting 5: Inserting images and HTML into the RCE using an LTI (React)

Use React with LTI Content Item - YouTube

For funsies

Any time I learn something new, I try to build something small and fun with all that learning!!! So after all of my "learndings" with Justin, I spun up this speech recognition app in 50 lines and 5 mins. G'wan the internet!!! Not specifically LTI, but from little things, big things grow #javascripting30 #2017comeatme

Say the Magic Word - YouTube

Labels (1)
8 Replies
Community Champion

 @sonya_corcoran1  thanks for sharing this info, any information people can share on LTI is a great help.

Once you get over the hump it does get easier.

Good luck on your journey : )

Instructure Alumni
Instructure Alumni

For anyone interested in this topic, be sure to RSVP to the CanvasLIVE event Getting Started with LTIs which is coming up this Tuesday, December 6. RSVP “yes” if you will be there--and if you’re interested, but your schedule doesn’t allow you to attend in real time, RSVP "no" or "maybe" to receive all event updates. Your RSVP ensures that you will receive a notification should the event be cancelled or changed.

Community Contributor

Hi  @sonya_corcoran1 ‌

Firstly, thanks so much for doing this! I've watched a couple of videos and this is no doubt a real goldmine. Do you have any advice for a non-dev, complete noob - the sort that should take one look at this and run for the hills... but is too stubborn to admit defeat? I ventured into coding via  @jperkins ‌' excellent course, so this is the level I'm coming in at. Thanks for anything you can't point me towards that would get me prepared to have another go at digesting these videos Smiley Happy

 @a_craik , If you really want to get into developing Apps and LTI's you may want to take a self-paced developer course. If you want to keep with Ruby you could take a course like

Community Contributor

I'm signing up now Smiley Happy

Thanks once again Jeremy - one day I will get a ticket to Instructurecon and buy you a drink for all the learning! 

New Member

By far the best resource available on LTI that I have came across yet in my last 2 weeks of stumbling with the LTI.

This has given me a great clarity on how basic-launch request works and how content-item-requests work. 

I am sort of using Laravel (instead of ruby) / Vue.js (instead of react.js) and still stuck at how i can manage content-item-requests.

Unfortunately I was handed over an unfinished code which has bits and pieces of working LTI functionality and I am looking to do embed in RCE with no luck yet. Currently its only passing the lti_message_type = basic-lti-launch-request and i am not sure how to change that request to contentItemSelectionRequest for embedding to work..

Any help would be appreciated or even any pointers to good resources for contentItemSelectionRequest ..

Thank you. 


So I figured out that there was a missing piece of code in my xml settings for contentItemSelectionRequest. It was just using the blti launch url as I had not specified the contentItemSelectionRequest in editor_button options.. 
I am now very near to my goal.

Below is my xml if anyone is looking for a reference:

<?xml version="1.0" encoding="utf-8"?>
<cartridge_basiclti_link xmlns="" xmlns:xsi="" xmlns:blti="" xmlns:lticm="" xmlns:lticp="" xsi:schemalocation="">
<blti:title>My Video Picker</blti:title>
<blti:description>A video</blti:description>
<blti:extensions platform="">
<lticm:property name="privacy_level">public</lticm:property>
<lticm:options name="editor_button">
<lticm:property name="enabled">true</lticm:property>
<lticm:property name="url">http://localhost/myltiproject/lti/launch/video</lticm:property>
<lticm:property name="icon_url">http://localhost/myltiproject/favicon-16x16.png</lticm:property>
<lticm:property name="message_type">ContentItemSelectionRequest</lticm:property>

In your ToolProvider class you can have 2 functions onLaunch and OnContentItem and redirect as per the request you get from the launch.. This will help if you have 2 seperate workflows for Editor_button and usual launch.

Hope it helps.

New Member

Glad the videos have been helpful. 

For anyone that finds this thread be sure to also look at LTI 1.3 and LTI Advantage. LTI 1.2 will be supported for a long time to come. However, LTI 1.3 is coming and Dr Chuck claims that the "big 4" LMS - Canvas, Blackboard, Sakai and Moodle have been certified. (Around minute 6). 

Specifically related to this thread content item select has been replaced by Deep Linking.

We're working to add support for it to the LTI Starter App which will hopefully help others down the path of adopting the newer standard. 

Note that if you want to use LTI 1.3 with Canvas you'll need to contact your representative at Instructure and have them enable it. You will only be able to use it in the beta environment for now.

There are more LTI 1.3 in Canvas discussions in this thread.