diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28033c2..fd95435 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 
-## [0.3.41] - 2024.12.21
+## [0.3.42] - 2024.12.27
+### Added
+- Link from certificate page to the claim
+### Changed
+- Contact data sharing is now a verified JWT.
+- Feed pictures are larger.
+
+
+## [0.3.41] - 2024.12.21 - ff6d14138f26daea6216b051562f0a04681f69fc
 ### Added
 - Link from certificate page to the claim
 
diff --git a/package-lock.json b/package-lock.json
index ab52a00..0b93e74 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "TimeSafari",
-  "version": "0.3.41",
+  "version": "0.3.42",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "TimeSafari",
-      "version": "0.3.41",
+      "version": "0.3.42",
       "dependencies": {
         "@capacitor/android": "^6.1.2",
         "@capacitor/cli": "^6.1.2",
diff --git a/package.json b/package.json
index b938f1d..6ab2af8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "TimeSafari",
-  "version": "0.3.41",
+  "version": "0.3.42",
   "scripts": {
     "dev": "vite",
     "serve": "vite preview",
diff --git a/src/views/ContactImportView.vue b/src/views/ContactImportView.vue
index 24d0b86..9946e28 100644
--- a/src/views/ContactImportView.vue
+++ b/src/views/ContactImportView.vue
@@ -16,7 +16,10 @@
       Contact Import
     </h1>
 
-    <span v-if="contactsImporting.length > sameCount" class="flex justify-center">
+    <span
+      v-if="contactsImporting.length > sameCount"
+      class="flex justify-center"
+    >
       <input type="checkbox" v-model="makeVisible" class="mr-2" />
       Make my activity visible to these contacts.
     </span>
@@ -31,7 +34,10 @@
     </div>
 
     <!-- Results List -->
-    <ul v-if="contactsImporting.length > sameCount" class="border-t border-slate-300">
+    <ul
+      v-if="contactsImporting.length > sameCount"
+      class="border-t border-slate-300"
+    >
       <li v-for="(contact, index) in contactsImporting" :key="contact.did">
         <div
           v-if="
diff --git a/src/views/InviteOneAcceptView.vue b/src/views/InviteOneAcceptView.vue
index f8ea042..9c8ef42 100644
--- a/src/views/InviteOneAcceptView.vue
+++ b/src/views/InviteOneAcceptView.vue
@@ -7,12 +7,18 @@
         Go back to your invite message and copy the entire text, then paste it
         here.
       </p>
-      <input
+      <p class="mt-2">
+        If the link looks correct, try Chrome. (For example, iOS Safari does not
+        work well with the invite link.)
+      </p>
+      <textarea
         v-model="inputJwt"
-        type="text"
         placeholder="Paste invitation..."
         class="mt-4 border-2 border-gray-300 p-2 rounded"
+        cols="40"
+        @input="() => checkInvite(inputJwt)"
       />
+      <br />
       <button
         @click="() => processInvite(inputJwt, true)"
         class="ml-2 p-2 bg-blue-500 text-white rounded"
@@ -134,5 +140,23 @@ export default class InviteOneAcceptView extends Vue {
     }
     this.checkingInvite = false;
   }
+
+  // check the invite JWT
+  async checkInvite(jwtInput: string) {
+    if (
+      jwtInput.endsWith("invite-one-accept") ||
+      jwtInput.endsWith("invite-one-accept/")
+    ) {
+      this.$notify(
+        {
+          group: "alert",
+          type: "danger",
+          title: "Error",
+          text: "That is only part of the invite link; it's missing data at the end. Try another way to get the full link.",
+        },
+        5000,
+      );
+    }
+  }
 }
 </script>