Try this simple code:
import SwiftUI
import StoreKit
struct ReviewView: View {
@Environment(\.requestReview) var requestReview
var body: some View {
Button("Leave a review") {
requestReview()
}
}
}
When the Review Alert shows, the "Not Now" button is disabled for some reason!? It was always tappable in all iOS versions that I remember. And there is no way to opt out, unless the user taps on the stars first. Is it a bug or a feature?
Thanks for looking into it!
General
RSS for tagExplore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
After updating to iOS 26.1, the popover opened from a menu bar button closes automatically without any user interaction.
When debugging, I found that onPop is being triggered on its own.
This behavior did not occur in previous versions of iOS, and there have been no code changes on the app side, so I suspect this may be due to a system behavior change or a potential OS bug.
main.dart
import 'package:flutter/material.dart';
import 'package:popover/popover.dart' as popover;
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.cyan[100],
title: const Text('Popover Example'),
actions: const [
Padding(
padding: EdgeInsets.only(right: 8.0),
child: PopoverButton(),
),
],
),
body: const Center(child: PopoverButton(),),
),
);
}
}
class PopoverButton extends StatelessWidget {
const PopoverButton({super.key});
@override
Widget build(BuildContext context) {
return CupertinoButton(
padding: EdgeInsets.zero,
color: Colors.pink[100],
onPressed: () async {
final res = await popover.showPopover<bool>(
context: context,
transitionDuration: const Duration(milliseconds: 30),
bodyBuilder: (context) {
return SizedBox(
height: 100,
width: 100,
child: const Center(
child: Text(
'aaa',
style: TextStyle(fontSize: 24, color: Colors.black),
),
),
);
},
barrierDismissible: true,
direction: popover.PopoverDirection.bottom,
arrowHeight: 15,
arrowWidth: 30,
barrierColor: Colors.black.withValues(alpha: 0),
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width,
maxHeight: MediaQuery.of(context).size.height * 2,
),
shadow: const [
BoxShadow(
color: Colors.black26,
spreadRadius: 10,
blurRadius: 80,
offset: Offset.zero,
),
],
);
},
child: const Text('menu'),
);
}
}
pubspec.yaml
description: "A new Flutter project."
# The following line prevents the package from being accidentally published to
# pub.dev using flutter pub publish. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
# Read more about iOS versioning at
# 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: 1.0.0+1
environment:
sdk: ^3.6.0
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running flutter pub upgrade --major-versions. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run flutter pub outdated.
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
popover: 0.2.6+2
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the analysis_options.yaml file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^5.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/to/resolution-aware-images
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/to/asset-from-package
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/to/font-from-package
I’m developing a share extension for iOS 26 with Xcode 26. When the extension’s sheet appears, it always shows a full white background, even though iOS 26 introduces a new “Liquid Glass” effect for partial sheets.
Expected:
The sheet background should use the iOS 26 glassmorphism effect as seen in full apps.
Actual behavior:
Custom sheets in my app get the glass effect, but the native system sheet in the share extension always opens as plain white.
Steps to reproduce:
Create a share extension using UIKit
Present any UIViewController as the main view
Set modalPresentationStyle = .pageSheet (or leave as default)
Observe solid white background, not glassmorphism
Sample code:
swift
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 300)
}
Troubleshooting attempted:
Tried adding UIVisualEffectView with system blur/materials
Removed all custom backgrounds
Set modalPresentationStyle explicitly
Questions:
Is it possible to enable or force the Liquid Glass effect in share extensions on iOS 26?
Is this a limitation by design or a potential bug?
Any workaround to make extension sheet backgrounds match system glass appearance?
I’m developing a React Native application using AWS Cognito Hosted UI with Google Sign-In for authentication.My setup uses:
React Native: 0.76.9
Library: react-native-app-auth version 8.0.3
Xcode Minimum Deployment Target: 13.4
The same implementation works perfectly on Android, but on iOS it behaves inconsistently.
Here’s the issue:
Login flow completes successfully.
However, access tokens and ID tokens are often null or malformed on iOS.
This results in 401 Invalid Token errors when calling backend APIs.
I’ve also tried using react-native-inappbrowser-reborn, but the issue persists.I’m currently using both the client ID and reverse client ID correctly as callback URLs in Cognito’s configuration".
So my questions are:
"Is it better to continue using react-native-app-auth and @react-native-google-signin/google-signin with improved configuration for iOS?
Or is there a more reliable approach/library for handling Cognito authentication and token management on iOS (especially for Hosted UI with Google Sign-In)?
Looking forward to any suggestions or best practices from those who’ve implemented Cognito + Google Sign-In on iOS using React Native.If you’ve found a stable setup for managing tokens and callbacks on iOS, please share your approach". Thank you!
Hello. I am searching the appearance icons from System Settings to select Dark Mode, Light Mode or Auto.
I am searching for the path (including file name) in Finder so that my app can use it no matter the macOS version. I will gladly include a screenshot of what I am looking for.
(sorry for the french)
I hope I will find an answer that will work out, as this is a personal project that I am most interested in to work for
Topic:
UI Frameworks
SubTopic:
General
Hi there! I'm making an app that stores data for the user's profile in SwiftData. I was originally going to use UserDefaults but I thought SwiftData could save Images natively but this is not true so I really could switch back to UserDefaults and save images as Data but I'd like to try to get this to work first. So essentially I have textfields and I save the values of them through a class allProfileData. Here's the code for that:
import SwiftData
import SwiftUI
@Model
class allProfileData {
var profileImageData: Data?
var email: String
var bio: String
var username: String
var profileImage: Image {
if let data = profileImageData,
let uiImage = UIImage(data: data) {
return Image(uiImage: uiImage)
} else {
return Image("DefaultProfile")
}
}
init(email:String, profileImageData: Data?, bio: String, username:String) {
self.profileImageData = profileImageData
self.email = email
self.bio = bio
self.username = username
}
}
To save this I create a new class (I think, I'm new) and save it through ModelContext
import SwiftUI
import SwiftData
struct CreateAccountView: View {
@Query var profiledata: [allProfileData]
@Environment(\.modelContext) private var modelContext
let newData = allProfileData(email: "", profileImageData: nil, bio: "", username: "")
var body: some View {
Button("Button") {
newData.email = email
modelContext.insert(newData)
try? modelContext.save()
print(newData.email)
}
}
}
To fetch the data, I originally thought that @Query would fetch that data but I saw that it fetches it asynchronously so I attempted to manually fetch it, but they both fetched nothing
import SwiftData
import SwiftUI
@Query var profiledata: [allProfileData]
@Environment(\.modelContext) private var modelContext
let fetchRequest = FetchDescriptor<allProfileData>()
let fetchedData = try? modelContext.fetch(fetchRequest)
print("Fetched count: \(fetchedData?.count ?? 0)")
if let imageData = profiledata.first?.profileImageData,
let uiImage = UIImage(data: imageData) {
profileImage = Image(uiImage: uiImage)
} else {
profileImage = Image("DefaultProfile")
}
No errors. Thanks in advance
Sidebars for mac Catalyst apps running with UIDesignRequiresCompatibility flag render their active items with a white bg tint – resulting in labels and icons being not visible.
mac OS Tahoe 26.1 Beta 3 (25B5062e)
FB20765036
Example (Apple Developer App):
The WatchOS app and view lifecycles for WatchKit and SwiftUI are documented in https://developer.apple.com/documentation/watchkit/working-with-the-watchos-app-life-cycle and https://developer.apple.com/documentation/swiftui/migrating-to-the-swiftui-life-cycle.
WatchOS 26 appears to change the app & view lifecycle from the behavior in WatchOS 11, and no longer matches the documented lifecycles.
On WatchOS 11, with a @WKApplicationDelegateAdaptor set, the following sequence of events would occur on app launch:
WKApplicationDelegate applicationDidFinishLaunching in WKApplicationState .inactive.
WKApplicationDelegate applicationWillEnterForeground in WKApplicationState .inactive.
View .onAppear @Environment(.scenePhase) .inactive
App onChange(of: @Environment(.scenePhase)): .active
WKApplicationDelegate applicationDidBecomeActive in WKApplicationState .active.
App onReceive(.didBecomeActiveNotification): WKApplicationState(rawValue: 0)
View .onChange of: .@Environment(.scenePhase) .active
In WatchOS 26, this is now:
WKApplicationDelegate applicationDidFinishLaunching in WKApplicationState .inactive.
WKApplicationDelegate applicationWillEnterForeground in WKApplicationState .inactive.
App onChange(of: @Environment(.scenePhase)): .active
WKApplicationDelegate applicationDidBecomeActive in WKApplicationState .active.
View .onAppear @Environment(.scenePhase) .active
When resuming from the background in WatchOS 11:
App onChange(of: @Environment(.scenePhase)): inactive
WKApplicationDelegate applicationWillEnterForeground in WKApplicationState .background.
App onReceive(.willEnterForegroundNotification): WKApplicationState(rawValue: 2)
View .onChange of: .@Environment(.scenePhase) inactive
App onChange(of: @Environment(.scenePhase)): active
WKApplicationDelegate applicationDidBecomeActive in WKApplicationState .active.
App onReceive(.didBecomeActiveNotification): WKApplicationState(rawValue: 0)
View .onChange of: .@Environment(.scenePhase) active
The resume from background process in WatchOS 26 is baffling and seems like it must be a bug:
App onChange(of: @Environment(.scenePhase)): inactive
WKApplicationDelegate applicationWillEnterForeground in WKApplicationState .background.
App onReceive(.willEnterForegroundNotification): WKApplicationState(rawValue: 2)
App onChange(of: @Environment(.scenePhase)): active
WKApplicationDelegate applicationDidBecomeActive in WKApplicationState .active.
App onReceive(.didBecomeActiveNotification): WKApplicationState(rawValue: 0)
View .onChange of: @Environment(.scenePhase) active
App onChange(of: @Environment(.scenePhase)): inactive
WKApplicationDelegate applicationWillResignActive in WKApplicationState .active.
App onReceive(.willResignActiveNotification): WKApplicationState(rawValue: 0)
View .onChange of: @Environment(.scenePhase) inactive
App onChange(of: @Environment(.scenePhase)): active
WKApplicationDelegate applicationDidBecomeActive in WKApplicationState .active.
App onReceive(.didBecomeActiveNotification): WKApplicationState(rawValue: 0)
View .onChange of: @Environment(.scenePhase) active
The app becomes active, then inactive, then active again.
The issues with these undocumented changes are:
It is undocumented.
If you relied on the previous process, this change can break your app.
A view no longer receives .onChange of: .@Environment(.scenePhase) .active state change during the launch process.
This bizarre applicationWillEnterForeground - applicationDidBecomeActive - applicationWillResignActive - applicationDidBecomeActive process on app resume does not match the documented process and is just...strange.
Is this new process what is intended? Is it a bug? Can an Apple engineer explain this new App resume from background process and why the View is created slightly later in the App launch process, so it does not receive the .onChange of @Environment(.scenePhase) message?
In contrast, the iOS 26 app lifecycle has not changed, and the iOS 18/26 app lifecycle closely follows the watchOS 11 app lifecycle (or watchOS 11 closely mimics iOS 18/26 with the exception that watchOS does not have a SceneDelegate).
We're seeing a high velocity crash with our users in background tasks in an internal Apple Framework. It seems to have started in iOS 17/18, but has increased heavily in iOS 26+.
EXC_BREAKPOINT ·
0
BackBoardServices
-[BKSHIDEventDeliveryManager _initWithConnectionFactory:forTesting:]
1
BackBoardServices
___44+[BKSHIDEventDeliveryManager sharedInstance]_block_invoke
2
libdispatch.dylib
__dispatch_client_callout
3
libdispatch.dylib
__dispatch_once_callout
4
BackBoardServices
+[BKSHIDEventDeliveryManager sharedInstance]
5
UIKitCore
_stateMachineSpec_block_invoke_3
6
UIKitCore
_handleEvent
7
UIKitCore
-[_UIEventDeferringManager _processEventDeferringActions:actionsCount:inScope:forDeferringToken:environments:target:addingRecreationReason:removingRecreationReason:forReason:]
8
UIKitCore
-[_UIEventDeferringManager _sceneWillInvalidate:]
9
UIKitCore
-[UIScene _invalidate]
10
UIKitCore
-[UIWindowScene _invalidate]
11
UIKitCore
-[UIApplication workspace:willDestroyScene:withTransitionContext:completion:]
12
UIKitCore
-[UIApplicationSceneClientAgent scene:willInvalidateWithEvent:completion:]
13
FrontBoardServices
-[FBSScene _callOutQueue_willDestroyWithTransitionContext:completion:]
14
FrontBoardServices
___84-[FBSWorkspaceScenesClient _queue_invalidateScene:withTransitionContext:completion:]_block_invoke_3
15
FrontBoardServices
-[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:]
16
libdispatch.dylib
__dispatch_client_callout
17
libdispatch.dylib
__dispatch_block_invoke_direct
18
BoardServices
___BSSERVICEMAINRUNLOOPQUEUE_IS_CALLING_OUT_TO_A_BLOCK__
19
BoardServices
_BSServiceMainRunLoopSourceHandler
20
CoreFoundation
___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
21
CoreFoundation
___CFRunLoopDoSource0
22
CoreFoundation
___CFRunLoopDoSources0
23
CoreFoundation
___CFRunLoopRun
24
CoreFoundation
__CFRunLoopRunSpecificWithOptions
25
GraphicsServices
_GSEventRunModal
26
UIKitCore
-[UIApplication _run]
27
UIKitCore
_UIApplicationMain
28
Aura
main.m
main
29
dyld
start
I am developing a live activity for my app and am running into issues on devices with dynamic islands. The live activity will randomly get in a state where it displays a spinner and does not update. For devices without dynamic islands, the activity works perfectly fine.
I have tried breaking down the views to determine the root cause, but at times it seems very random. These are all TestFlight builds as we are currently developing the feature.
I have tried using the console app and looking at the various processes that have been called out in other threads and cannot see any actual errors being logged.
Looking for any pointers on how to pinpoint the root cause of this issue.
I’m developing a share extension for iOS 26 with Xcode 26. When the extension’s sheet appears, it always shows a full white background, even though iOS 26 introduces a new “Liquid Glass” effect for partial sheets.
Expected:
The sheet background should use the iOS 26 glassmorphism effect as seen in full apps.
Actual behavior:
Custom sheets in my app get the glass effect, but the native system sheet in the share extension always opens as plain white.
Steps to reproduce:
Create a share extension using UIKit
Present any UIViewController as the main view
Set modalPresentationStyle = .pageSheet (or leave as default)
Observe solid white background, not glassmorphism
Sample code:
swift
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 300)
}
Troubleshooting attempted:
Tried adding UIVisualEffectView with system blur/materials
Removed all custom backgrounds
Set modalPresentationStyle explicitly
Questions:
Is it possible to enable or force the Liquid Glass effect in share extensions on iOS 26?
Is this a limitation by design or a potential bug?
Any workaround to make extension sheet backgrounds match system glass appearance?
Hi @DTS Engineer
in tvOS 26.2 Beta is still this annoying Shadow Glitch…
I have submitted an Bug-Report, but dont get an Answer… FB20049524
The Animation is not smooth and the Shadow is abruptly „jumping“…
I don’t get any Response from the Apple Engineers. But this GUI Glitch makes the otherwise very high-quality tvOS GUI appear very unprofessional.
Could you please help me? 🤔
The keyboard looks dimmed/disabled on every keyboard and every keyboard type inside my app, but is still fully functional. The dimmed/disabled effect includes keyboards shown inside the WebView.
The bug only appears in iOS26 and iOS26.0.1, but not on any previous versions of iOS.
It seems to me that NSStagedMigrationManager has algorithmic issues. It doesn't perform staged migration, if all its stages are NSLightweightMigrationStage.
You can try it yourself. There is a test project with three model versions V1, V2, V3, V4. Migrating V1->V2 is compatible with lightweight migration, V2->V3, V3->V4 is also compatible, but V1->V3 is not. I have following output:
Migrating V1->V2, error: nil
Migrating V2->V3, error: nil
Migrating V3->V4, error: nil
Migrating V1->V3, no manager, error: Optional("Persistent store migration failed, missing mapping model.")
Migrating V1->V3, lightweight[1, 2, 3], error: Optional("Persistent store migration failed, missing mapping model.")
Migrating V1->V3, lightweight[1]->lightweight[2]->lightweight[3], error: Optional("Persistent store migration failed, missing mapping model.")
Migrating V1->V3, custom[1->2]->lightweight[3], error: nil
Migrating V1->V3, lightweight[1]->custom[2->3], error: nil
Migrating V1->V3, custom[1->2]->custom[2->3], error: nil
Migrating V1->V4, error: Optional("Persistent store migration failed, missing mapping model.")
Migrating V2->V4, error: nil
Migrating V1->V4, custom[1->2]->lightweight[3, 4], error: nil
Migrating V1->V4, lightweight[3, 4]->custom[1->2], error: Optional("A store file cannot be migrated backwards with staged migration.")
Migrating V1->V4, lightweight[1, 2]->lightweight[3, 4], error: Optional("Persistent store migration failed, missing mapping model.")
Migrating V1->V4, lightweight[1]->custom[2->3]->lightweight[4], error: nil
Migrating V1->V4, lightweight[1,4]->custom[2->3], error: nil
Migrating V1->V4, custom[2->3]->lightweight[1,4], error: Optional("Persistent store migration failed, missing mapping model.")
I think that staged migration should satisfy the following rules for two consecutive stages:
Any version of lightweight stage to any version of lightweight stage;
Any version of lightweight stage to current version of custom stage;
Next version of custom stage to any version of lightweight stage;
Next version of custom stage to current version of custom stage.
However, rule 1 doesn't work, because migration manager skips intermediate versions if they are inside lightweight stages, even different ones.
Note that lightweight[3, 4]->custom[1->2] doesn't work, lightweight[1,4]->custom[2->3] works, but custom[2->3]->lightweight[1,4] doesn't work again.
Would like to hear your opinion on that, especially, from Core Data team, if possible.
Thanks!
We are having an issue with our app after upgrading to WatchOS 26. After some time our complication disappears from the watch face. If you go to add it back, our app shows up with an empty icon placeholder and you are unable to tap it to add it back. Sometimes restarting the watch will bring it back, sometimes it does not. Has anyone experienced this? What should we be looking at to figure out why this is happening? Or could this be a bug in WatchOS 26?
Hello,
I'm trying to build a MailKit extension that parses PDFs.
My extension initially gets the call for decide action, I request invokeAgain.
func decideAction(for message: MEMessage, completionHandler: @escaping (MEMessageActionDecision?) -> Void) {
guard let data = message.rawData else {
completionHandler(MEMessageActionDecision.invokeAgainWithBody)
return
}
let content = String(data: data, encoding: .utf8)
print(content)
When I try to reconstruct the PDF attached:
I find the headers, and the text content, but I don't see the base64 content of the PDF file.
Is there something I'm missing here?
Thanks in advance
In the iOS Photos app there is a caption field the user can write to. How can you write to this value from Swift when creating a photo?
I see apps that do this, but there doesn't seem to be any official way to do this using the Photo library through PHAssetCreationRequest or PHAssetResourceCreationOptions or setting EXIF values, I tried settings a bunch of values there including IPTC values but nothing appears in the caption field in the iOS photos app.
There must be some way to do it since I see other apps setting that value somehow after capturing a photo.
Hi,
I develop a 3D molecular editor, so the Writing Tools and AutoFill menu items don't make much sense. Is it possible to hide these menu items in my app? In the case of dictation and the character palette, I can do this:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSDisabledDictationMenuItem"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSDisabledCharacterPaletteMenuItem"];
Is there some similar way to remove the Writing Tools and AutoFill menu items for apps in which they don't make sense?
Topic:
UI Frameworks
SubTopic:
General
I'm updating some of the views for a Live Activity, now that CarPlay can display Live Activities in iOS 26. My Activity is updated only with local updates from the iPhone (no push notifications), displaying a user's blood glucose.
The activity updates fine in both CarPlay and in the Apple Watch Smart Stack, but in CarPlay, the previous values are not cleared when the new values are displayed, resulting in superimposed text and making it essentially unreadable. This only happens when the iPhone screen is off. As soon as the phone screen is woken up, even if the phone is not unlocked, the old values disappear and the display looks fine.
I can't find anything in the API about clearing a display, so I'm wondering if this is a bug (especially since it clears when waking the phone screen). I'm running iOS 26.0.1 on my test phone.
Thanks for any thoughts!
Hello,
I’ve created a custom SDK from my iOS application to be integrated into another app. The SDK depends on Google Maps and payment gateway libraries.
If I exclude these third-party libraries from the SDK, I encounter multiple errors. However, if I include them, the host app throws errors due to duplicate dependencies, since it already integrates the same libraries.
I understand that third-party dependencies can be downloaded separately by adding them through Swift Package Manager (SPM). However, the issue is that if I exclude these dependencies from my SDK, I get compilation errors wherever I’ve used import GoogleMaps or similar statements in my code.
Could you please guide me — or share documentation — on the correct approach to create an SDK that excludes third-party libraries?