diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py
index 38fb03d404a36e490def8acdfa5f86f6b03eef96..df90a6f04d86ad51e5f7d9fab8d0fa2929c03b37 100644
--- a/aleksis/apps/paweljong/forms.py
+++ b/aleksis/apps/paweljong/forms.py
@@ -505,7 +505,7 @@ class PersonGroupFormPerson(forms.Form):
 
 class EventCheckpointForm(forms.Form):
     class Media:
-        js = ("js/paweljong/checkpoint.js",)
+        js = ("https://unpkg.com/html5-qrcode", "js/paweljong/checkpoint.js")
 
     layout = Layout(
         "username", "comment".
diff --git a/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js b/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
index 6ca40adbb2ae228eba2cd658acbb457850864521..74524accf227c3f6c6bcd69843bf45f6b2e434be 100644
--- a/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
+++ b/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
@@ -11,8 +11,22 @@ function setCheckpointCoords(position) {
     }, 3000);
 }
 
+function onScanSuccess(decodedText, decodedResult) {
+    $("[name='username']").val(decodedText);
+    if ($("[name='username']").is(":focus") && $("[name='comment']").val()) {
+        $("[name='username']").closest("form").submit();
+    }
+}
+
+function onScanFailure(error) {
+    alert(`Code scan error: ${error}`);
+}
+
 $(document).ready(function($) {
     if (navigator.geolocation) {
         getCheckpointCoords();
     }
+
+    var scanner = new Html5QrcodeScanner("reader", { fps: 10, qrbox: {width: 250, height: 250} }, false);
+    scanner.render(onScanSuccess, onScanError);
 });
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html b/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
index 29eb19d1233bbf03430f4b7624e3a9f4ef10e600..c683717b394f33014d9078a660a9792524c712a3 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
@@ -15,6 +15,9 @@
     {% form form=form %}{% form %}
     {% include "core/partials/save_button.html" %}
   </form>
+
+  <div id="reader"></div>
+
   {{ form.media.js }}
 
 {% endblock %}