diff --git a/api_koreader/models.py b/api_koreader/models.py
index 8ad3bc5b8ca8a6d0c9e60c71741e8e3e4ffb537d..e51a94ca60bac5651569b56688a00ee4fcaf5344 100644
--- a/api_koreader/models.py
+++ b/api_koreader/models.py
@@ -1,3 +1,4 @@
+import hashlib
 import io
 
 from django.db import models
@@ -24,6 +25,9 @@ class SyncDocumentEntry(models.Model):
 
 @receiver(post_save, sender=SyncDocumentEntry)
 def post_save_document(sender, instance: SyncDocumentEntry, **kwargs):
+    # Stop recursion
+    if not instance.device.startswith("KoReader"):
+        return
     book_matches: QuerySet[Book] = Book.objects.filter(partial_md5__iexact=instance.key)
     if book_matches:
         book = book_matches.first()
@@ -43,6 +47,9 @@ def post_save_document(sender, instance: SyncDocumentEntry, **kwargs):
 
 @receiver(post_save, sender=UserBook)
 def post_save_userbook(sender, instance: UserBook, **kwargs):
+    # Stop recursion
+    if instance.last_progress_device.startswith("KoReader"):
+        return
     # Find the corresponding SyncDocumentEntry
     sync_doc_q: QuerySet[SyncDocumentEntry] = SyncDocumentEntry.objects.filter(user=instance.user, key__iexact=instance.book.partial_md5)
     if sync_doc_q.first():
@@ -54,4 +61,5 @@ def post_save_userbook(sender, instance: UserBook, **kwargs):
         sync_doc.percentage = instance.percentage_read
         sync_doc.device = instance.last_progress_device
         sync_doc.updated_at = instance.last_read
+        sync_doc.device_id = hashlib.md5(sync_doc.device.encode()).hexdigest() # Generate a device ID
         sync_doc.save()
\ No newline at end of file
diff --git a/api_koreader/views.py b/api_koreader/views.py
index ebed2ecd1636045a8d114b43be394b060ec00757..c9299f77aea2270715931c3a1c525228852631dc 100644
--- a/api_koreader/views.py
+++ b/api_koreader/views.py
@@ -1,6 +1,7 @@
 import json
 from json import JSONDecodeError
 
+from django.db.transaction import commit
 from django.http import JsonResponse, HttpResponse
 from django.utils import timezone
 from django.views.decorators.csrf import csrf_exempt
@@ -99,7 +100,9 @@ def update_progress(request):
             form = SyncDocumentEntryForm(body_object, instance=existing_object)
 
     if form.is_valid():
-        obj = form.save()
+        obj: SyncDocumentEntry = form.save(commit=False)
+        obj.device = "KoReader - " + obj.device
+        obj.save()
         return JsonResponse({"document": obj.key, "timestamp": int(obj.updated_at.timestamp())}, status=200)
 
     print(form.errors)