diff --git a/ios/Podfile b/ios/Podfile
index 7af792c..2e353a9 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -36,6 +36,11 @@ target 'Runner' do
     inherit! :search_paths
   end
 
+  target 'SolarNotifyService' do
+    inherit! :search_paths
+    pod 'Kingfisher', '~> 8.0'
+  end
+
   target 'SolarWidgetExtension' do
     inherit! :search_paths
     pod 'Kingfisher', '~> 8.0'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 918fec9..6cad00e 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -394,6 +394,6 @@ SPEC CHECKSUMS:
   WebRTC-SDK: 79942c006ea64f6fb48d7da8a4786dfc820bc1db
   workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
 
-PODFILE CHECKSUM: f36978bb00ec01cd27f69faaf9a821024de98fcc
+PODFILE CHECKSUM: 91f63c7518ec23e05bec109c56194c4b282abbd1
 
 COCOAPODS: 1.16.2
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 2ba3a46..8cf6749 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 77;
+	objectVersion = 54;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -22,6 +22,7 @@
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+		A0DA907BED0C7BC1351253EC /* Pods_SolarNotifyService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */; };
 		CED170BFB6A72CDDAC285637 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDF483E994343CDFBF9BA347 /* Pods_Runner.framework */; };
 		F51C4E3C8FA95426C91FC0A4 /* Pods_SolarShare.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16F41E029731EA30268EDE2A /* Pods_SolarShare.framework */; };
 /* End PBXBuildFile section */
@@ -96,6 +97,7 @@
 		40B53769EB464E54DACA7CE4 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
 		48AE73F9950AF4FB02B5E9F4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
 		4A2F84B6033057E3BD2C7CB8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.profile.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.profile.xcconfig"; sourceTree = "<group>"; };
 		5922A50B1231B06B92E31F20 /* Pods-SolarShare.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarShare.debug.xcconfig"; path = "Target Support Files/Pods-SolarShare/Pods-SolarShare.debug.xcconfig"; sourceTree = "<group>"; };
 		64FBE78F9C282712818D6D95 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
 		6618E2E3015264643175B43D /* Pods-SolarWidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarWidgetExtension.release.xcconfig"; path = "Target Support Files/Pods-SolarWidgetExtension/Pods-SolarWidgetExtension.release.xcconfig"; sourceTree = "<group>"; };
@@ -120,7 +122,10 @@
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		A2C24C5238FAC44EA2CCF738 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
 		B1763F1D7318A2745CA7EDFE /* Pods-SolarShare.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarShare.release.xcconfig"; path = "Target Support Files/Pods-SolarShare/Pods-SolarShare.release.xcconfig"; sourceTree = "<group>"; };
+		B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SolarNotifyService.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		BCE0C4086B776A27B202B373 /* Pods-SolarWidgetExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarWidgetExtension.profile.xcconfig"; path = "Target Support Files/Pods-SolarWidgetExtension/Pods-SolarWidgetExtension.profile.xcconfig"; sourceTree = "<group>"; };
+		D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.release.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.release.xcconfig"; sourceTree = "<group>"; };
+		D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.debug.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.debug.xcconfig"; sourceTree = "<group>"; };
 		EDF483E994343CDFBF9BA347 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		F357CFDA89A0D9E5692846D4 /* Pods_SolarWidgetExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SolarWidgetExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
@@ -238,6 +243,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A0DA907BED0C7BC1351253EC /* Pods_SolarNotifyService.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -269,6 +275,7 @@
 				731B7B6D2D0D6CE000CEB9B7 /* SwiftUI.framework */,
 				16F41E029731EA30268EDE2A /* Pods_SolarShare.framework */,
 				F357CFDA89A0D9E5692846D4 /* Pods_SolarWidgetExtension.framework */,
+				B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -354,6 +361,9 @@
 				2134F3903A0E8EB8CC2670BE /* Pods-SolarWidgetExtension.debug.xcconfig */,
 				6618E2E3015264643175B43D /* Pods-SolarWidgetExtension.release.xcconfig */,
 				BCE0C4086B776A27B202B373 /* Pods-SolarWidgetExtension.profile.xcconfig */,
+				D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */,
+				D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */,
+				4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */,
 			);
 			path = Pods;
 			sourceTree = "<group>";
@@ -427,6 +437,7 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 73DA8A072D05C7620024A03E /* Build configuration list for PBXNativeTarget "SolarNotifyService" */;
 			buildPhases = (
+				50F5704AB2E7309C916CA2E7 /* [CP] Check Pods Manifest.lock */,
 				73DA89F62D05C7620024A03E /* Sources */,
 				73DA89F72D05C7620024A03E /* Frameworks */,
 				73DA89F82D05C7620024A03E /* Resources */,
@@ -622,6 +633,28 @@
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
+		50F5704AB2E7309C916CA2E7 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-SolarNotifyService-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
 		738C1EBE2D0D76C500A215F3 /* Copy Bundle Version */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -1229,6 +1262,7 @@
 		};
 		73DA8A032D05C7620024A03E /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -1270,6 +1304,7 @@
 		};
 		73DA8A042D05C7620024A03E /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -1308,6 +1343,7 @@
 		};
 		73DA8A052D05C7620024A03E /* Profile */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
diff --git a/ios/SolarNotifyService/NotificationService.swift b/ios/SolarNotifyService/NotificationService.swift
index bb89595..72b31f2 100644
--- a/ios/SolarNotifyService/NotificationService.swift
+++ b/ios/SolarNotifyService/NotificationService.swift
@@ -7,6 +7,7 @@
 
 import UserNotifications
 import Intents
+import Kingfisher
 
 enum ParseNotificationPayloadError: Error {
     case missingMetadata(String)
@@ -18,58 +19,6 @@ class NotificationService: UNNotificationServiceExtension {
     private var contentHandler: ((UNNotificationContent) -> Void)?
     private var bestAttemptContent: UNMutableNotificationContent?
     
-    private func fetchAvatarImage(from url: String, completion: @escaping (INImage?) -> Void) {
-        guard let imageURL = URL(string: url) else {
-            completion(nil)
-            return
-        }
-        
-        // Define a cache location based on the URL hash
-        let cacheFileName = imageURL.lastPathComponent
-        let tempDirectory = FileManager.default.temporaryDirectory
-        let cachedFileUrl = tempDirectory.appendingPathComponent(cacheFileName)
-        
-        // Check if the image is already cached
-        if FileManager.default.fileExists(atPath: cachedFileUrl.path) {
-            do {
-                let data = try Data(contentsOf: cachedFileUrl)
-                let cachedImage = INImage(imageData: data) // No optional binding here
-                completion(cachedImage)
-                return
-            } catch {
-                print("Failed to load cached avatar image: \(error.localizedDescription)")
-                try? FileManager.default.removeItem(at: cachedFileUrl) // Clear corrupted cache
-            }
-        }
-        
-        // Download the image if not cached
-        let session = URLSession(configuration: .default)
-        session.downloadTask(with: imageURL) { localUrl, response, error in
-            if let error = error {
-                print("Failed to fetch avatar image: \(error.localizedDescription)")
-                completion(nil)
-                return
-            }
-            
-            guard let localUrl = localUrl, let data = try? Data(contentsOf: localUrl) else {
-                print("Failed to fetch data for avatar image.")
-                completion(nil)
-                return
-            }
-            
-            do {
-                // Cache the downloaded file
-                try FileManager.default.moveItem(at: localUrl, to: cachedFileUrl)
-            } catch {
-                print("Failed to cache avatar image: \(error.localizedDescription)")
-            }
-            
-            // Create INImage from the downloaded data
-            let inImage = INImage(imageData: data) // Create directly
-            completion(inImage)
-        }.resume()
-    }
-    
     override func didReceive(
         _ request: UNNotificationRequest,
         withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
@@ -112,16 +61,23 @@ class NotificationService: UNNotificationServiceExtension {
             throw ParseNotificationPayloadError.missingAvatarUrl("The notification has no avatar.")
         }
         
+        let metadataCopy = metadata as? [String: String] ?? [:]
         let avatarUrl = getAttachmentUrl(for: avatarIdentifier)
-        fetchAvatarImage(from: avatarUrl) { [weak self] inImage in
-            guard let self = self else { return }
-            
-            let handle = INPersonHandle(value: "\(metadata["user_id"] ?? "")", type: .unknown)
+        KingfisherManager.shared.retrieveImage(with: URL(string: avatarUrl)!, completionHandler: { result in
+            var image: Data?
+            switch result {
+            case .success(let value):
+                image = value.image.pngData()
+            case .failure(let error):
+                print("Unable to get avatar url: \(error)")
+            }
+    
+            let handle = INPersonHandle(value: "\(metadataCopy["user_id"] ?? "")", type: .unknown)
             let sender = INPerson(
                 personHandle: handle,
                 nameComponents: nil,
                 displayName: content.title,
-                image: inImage,
+                image: image == nil ? nil : INImage(imageData: image!),
                 contactIdentifier: nil,
                 customIdentifier: nil
             )
@@ -132,12 +88,12 @@ class NotificationService: UNNotificationServiceExtension {
                 let updatedContent = try? request.content.updating(from: intent)
                 self.contentHandler?(updatedContent ?? content)
             } else {
-                let intent = self.createMessageIntent(with: sender, metadata: metadata, body: content.body)
+                let intent = self.createMessageIntent(with: sender, metadata: metadataCopy, body: content.body)
                 self.donateInteraction(for: intent)
                 let updatedContent = try? request.content.updating(from: intent)
                 self.contentHandler?(updatedContent ?? content)
             }
-        }
+        })
     }
     
     private func handleDefaultNotification(content: UNMutableNotificationContent) throws {
diff --git a/ios/SolarWidget/RandomPostWidget.swift b/ios/SolarWidget/RandomPostWidget.swift
index ce85cfa..d7d292f 100644
--- a/ios/SolarWidget/RandomPostWidget.swift
+++ b/ios/SolarWidget/RandomPostWidget.swift
@@ -76,13 +76,18 @@ struct RandomPostWidgetEntryView : View {
                             
                             KFImage.url(URL(string: avatarUrl))
                                 .resizable()
-                                .setProcessor(ResizingImageProcessor(referenceSize: CGSize(width: size, height: size), mode: .aspectFit))
+                                .setProcessor(DownsamplingImageProcessor(size: CGSize(width: size, height: size)))
+                                .transition(.opacity)
                                 .aspectRatio(contentMode: .fit)
                                 .frame(width: size, height: size)
                                 .cornerRadius(size / 2)
                                 .frame(width: size, height: size, alignment: .center)
                         }
                         
+                        Text(randomPost.publisher.nick)
+                            .font(.system(size: 15))
+                            .opacity(0.9)
+                        
                         Text("@\(randomPost.publisher.name)")
                             .font(.system(size: 13, design: .monospaced))
                             .opacity(0.9)
diff --git a/macos/Podfile.lock b/macos/Podfile.lock
index d378ea2..33f68e6 100644
--- a/macos/Podfile.lock
+++ b/macos/Podfile.lock
@@ -26,7 +26,7 @@ PODS:
     - Firebase/Analytics (= 11.4.0)
     - firebase_core
     - FlutterMacOS
-  - firebase_core (3.8.1):
+  - firebase_core (3.9.0):
     - Firebase/CoreOnly (~> 11.4.0)
     - FlutterMacOS
   - firebase_messaging (15.1.6):
@@ -279,7 +279,7 @@ SPEC CHECKSUMS:
   file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d
   Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99
   firebase_analytics: a80b3d6645f2f12d626fde928b61dae12e5ea2ef
-  firebase_core: e4a35c426636a2cce00a5163df7ba69bfd0cca57
+  firebase_core: 1dfe1f4d02ad78be0277e320aa3d8384cf46231f
   firebase_messaging: 61f678060b69a7ae1013e3a939ec8e1c56ef6fcf
   FirebaseAnalytics: 3feef9ae8733c567866342a1000691baaa7cad49
   FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771
diff --git a/pubspec.yaml b/pubspec.yaml
index 3998aa5..3f07b1a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 # In Windows, build-name is used as the major, minor, and patch parts
 # of the product and file versions while build-number is used as the build suffix.
-version: 2.1.1+34
+version: 2.1.1+35
 
 environment:
   sdk: ^3.5.4