diff --git a/Shared/ShareExtension/ExtensionFeedAddRequestFile.swift b/Shared/ShareExtension/ExtensionFeedAddRequestFile.swift
index f23038645..6c70d5961 100644
--- a/Shared/ShareExtension/ExtensionFeedAddRequestFile.swift
+++ b/Shared/ShareExtension/ExtensionFeedAddRequestFile.swift
@@ -12,9 +12,9 @@ import Account
 
 final class ExtensionFeedAddRequestFile: NSObject, NSFilePresenter {
 	
-	private static var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "extensionFeedAddRequestFile")
+	private static let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "extensionFeedAddRequestFile")
 
-	private static var filePath: String = {
+	private static let filePath: String = {
 		let appGroup = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as! String
 		let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup)
 		return containerURL!.appendingPathComponent("extension_feed_add_request.plist").path
diff --git a/iOS/Article/ArticleIconSchemeHandler.swift b/iOS/Article/ArticleIconSchemeHandler.swift
index c1bc6df7c..64b81b300 100644
--- a/iOS/Article/ArticleIconSchemeHandler.swift
+++ b/iOS/Article/ArticleIconSchemeHandler.swift
@@ -38,20 +38,23 @@ final class ArticleIconSchemeHandler: NSObject, WKURLSchemeHandler {
 			return
 		}
 
-		let iconView = IconView(frame: CGRect(x: 0, y: 0, width: 48, height: 48))
-		iconView.iconImage = iconImage
-		let renderedImage = iconView.asImage()
-		
-		guard let data = renderedImage.dataRepresentation() else {
-			urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
-			return
-		}
-		
-		let headerFields = ["Cache-Control": "no-cache"]
-		if let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: headerFields) {
-			urlSchemeTask.didReceive(response)
-			urlSchemeTask.didReceive(data)
-			urlSchemeTask.didFinish()
+		Task { @MainActor in
+
+			let iconView = IconView(frame: CGRect(x: 0, y: 0, width: 48, height: 48))
+			iconView.iconImage = iconImage
+			let renderedImage = iconView.asImage()
+
+			guard let data = renderedImage.dataRepresentation() else {
+				urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
+				return
+			}
+			
+			let headerFields = ["Cache-Control": "no-cache"]
+			if let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: headerFields) {
+				urlSchemeTask.didReceive(response)
+				urlSchemeTask.didReceive(data)
+				urlSchemeTask.didFinish()
+			}
 		}
 	}
 	
diff --git a/iOS/ErrorHandler.swift b/iOS/ErrorHandler.swift
index 64957ad3b..f726cd0ce 100644
--- a/iOS/ErrorHandler.swift
+++ b/iOS/ErrorHandler.swift
@@ -15,7 +15,7 @@ struct ErrorHandler {
 	private static var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application")
 
 	public static func present(_ viewController: UIViewController) -> (Error) -> () {
-		return { [weak viewController] error in
+		return { @MainActor [weak viewController] error in
 			if UIApplication.shared.applicationState == .active {
 				viewController?.presentError(error)
 			} else {
diff --git a/iOS/Feeds/Cell/FeedTableViewSectionHeaderLayout.swift b/iOS/Feeds/Cell/FeedTableViewSectionHeaderLayout.swift
index 6cdefefb4..1c0dd8f55 100644
--- a/iOS/Feeds/Cell/FeedTableViewSectionHeaderLayout.swift
+++ b/iOS/Feeds/Cell/FeedTableViewSectionHeaderLayout.swift
@@ -9,7 +9,7 @@
 import UIKit
 import RSCore
 
-struct FeedTableViewSectionHeaderLayout {
+@MainActor struct FeedTableViewSectionHeaderLayout {
 
 	private static let labelMarginRight = CGFloat(integerLiteral: 8)
 	private static let unreadCountMarginRight = CGFloat(integerLiteral: 16)
diff --git a/iOS/KeyboardManager.swift b/iOS/KeyboardManager.swift
index 1de01f5ab..c78a94e03 100644
--- a/iOS/KeyboardManager.swift
+++ b/iOS/KeyboardManager.swift
@@ -15,7 +15,7 @@ enum KeyboardType: String {
 	case detail = "DetailKeyboardShortcuts"
 }
 
-class KeyboardManager {
+@MainActor final class KeyboardManager {
 	
 	private(set) var _keyCommands: [UIKeyCommand]
 	var keyCommands: [UIKeyCommand] {
diff --git a/iOS/Settings/ArticleThemeImporter.swift b/iOS/Settings/ArticleThemeImporter.swift
index 4a6996831..e32d0476d 100644
--- a/iOS/Settings/ArticleThemeImporter.swift
+++ b/iOS/Settings/ArticleThemeImporter.swift
@@ -8,7 +8,7 @@
 
 import UIKit
 
-struct ArticleThemeImporter {
+@MainActor struct ArticleThemeImporter {
 	
 	static func importTheme(controller: UIViewController, filename: String) throws {
 		let theme = try ArticleTheme(path: filename, isAppTheme: false)
diff --git a/xcconfig/NetNewsWire_project.xcconfig b/xcconfig/NetNewsWire_project.xcconfig
index 56d11f1b5..134e1da54 100644
--- a/xcconfig/NetNewsWire_project.xcconfig
+++ b/xcconfig/NetNewsWire_project.xcconfig
@@ -44,7 +44,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 17.0
 //SDKROOT = macosx
 SWIFT_SWIFT3_OBJC_INFERENCE = Off
 SWIFT_VERSION = 5.10
-SWIFT_STRICT_CONCURRENCY = targeted
+SWIFT_STRICT_CONCURRENCY = complete
 
 // https://forums.swift.org/t/swift-packages-in-multiple-targets-results-in-this-will-result-in-duplication-of-library-code-errors/34892/33
 DISABLE_DIAMOND_PROBLEM_DIAGNOSTIC = YES