{"id":53226,"date":"2026-09-17T14:32:38","date_gmt":"2026-09-17T18:32:38","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=53226"},"modified":"2026-09-17T14:32:38","modified_gmt":"2026-09-17T18:32:38","slug":"xcodes-new-xcproj-files-are-json","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/09\/17\/xcodes-new-xcproj-files-are-json\/","title":{"rendered":"Xcode&rsquo;s New .xcproj Files Are JSON"},"content":{"rendered":"<p><a href=\"https:\/\/developer.apple.com\/documentation\/xcode-release-notes\/xcode-27_2-release-notes\">Apple<\/a>:<\/p>\n<blockquote cite=\"https:\/\/developer.apple.com\/documentation\/xcode-release-notes\/xcode-27_2-release-notes\">\n<p>Xcode now supports a JSON-based project format (.xcproj) that&rsquo;s more readable, merge-friendly, and easier for coding agents to edit. Enable it in the file inspector. Projects using .xcproj also open in earlier versions of Xcode 27. Learn more in <a href=\"https:\/\/developer.apple.com\/documentation\/xcode\/updating-your-xcode-project-configuration-file-format\">Updating your Xcode project configuration file format<\/a>.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/fatbobman.com\/en\/posts\/from-pbxproj-to-xcproj\/\">Fatbobman<\/a>:<\/p>\n<blockquote cite=\"https:\/\/fatbobman.com\/en\/posts\/from-pbxproj-to-xcproj\/\">\n<p>[The] new <code>project.xcproj<\/code> caught my eye. What it replaces is <code>project.pbxproj<\/code>, the build graph inside the <code>.xcodeproj<\/code> bundle, not the bundle itself.<\/p>\n<p>[&#8230;]<\/p>\n<p>In the age of agents, the drawbacks of <code>pbxproj<\/code> are amplified further. A great many IDs carry both object identity and cross-references, so an agent modifying a project usually has to locate the right object in a flat table, then update several mutually referencing places in step, all while trying to keep the serialized output faithful to Xcode&rsquo;s conventions.<\/p>\n<p>[&#8230;]<\/p>\n<p>From a flat ID table to a tree that mirrors the UI: instead of dumping everything into <code>objects<\/code>, it unfolds into structures like <code>files<\/code> \/ <code>targets<\/code> \/ <code>build-settings<\/code>, so diffs look closer to the operations you actually performed in the interface;<\/p>\n<p>The direction of relationships is reversed: a file can declare which targets it belongs to via <code>target-membership<\/code>, so adding a file no longer means editing several mutually referencing places at once;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@simonbs\/117282260955657402\">Simon B. St&oslash;vring<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@simonbs\/117282260955657402\">\n<p>Developers have been screaming for a friendlier Xcode project format for years. I&rsquo;m one of them.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@tonyarnold\/117283237592284302\">Tony Arnold<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@tonyarnold\/117283237592284302\">\n<p>I&rsquo;ve been waiting for something like this for most of my career! &#x1F389;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@cocoaphony\/117284198012341992\">Rob Napier<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@cocoaphony\/117284198012341992\">\n<p>It does feel like another case of &ldquo;we&rsquo;ve quickly done a thing to help AI that we&rsquo;ve been unwilling to do for years to help humans.&rdquo; I&rsquo;m seeing that happen across the industry.<\/p>\n<p>It is very welcome and appreciated, and lots of thanks to the teams involved. It&rsquo;s also frustrating that it took &ldquo;it can help AI&rdquo; to make it happen.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/github.com\/apple\/xcode-project-format\">Apple<\/a>:<\/p>\n<blockquote cite=\"https:\/\/github.com\/apple\/xcode-project-format\">\n<p><code>xcode-project-format<\/code> is a Swift library for reading, writing, and manipulating Xcode&rsquo;s JSON-based <code>project.xcproj<\/code> format. It models the format as a rich set of value types nested under a single namespace, <code>XCSchema<\/code>, so consumers get precise, typed access to a project&rsquo;s structure instead of hand-parsing JSON.<\/p>\n<p>The goal is to give the ecosystem a shared, accurate model of the Xcode project format &mdash; so tools like generators, linters, verifiers, and validators don&rsquo;t each have to reverse-engineer the format from scratch.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@helge\/117283813243369884\">Helge He&szlig;<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@helge\/117283813243369884\">\n<p>Didn&rsquo;t most people switch to local SPM projects anyways? Those are the new xcproj that have to be replaced with sth sensible &#x1F643;<\/p>\n<\/blockquote>\n\n\n<p><a href=\"https:\/\/fatbobman.com\/en\/posts\/from-pbxproj-to-xcproj\/\">Fatbobman<\/a>:<\/p>\n<blockquote cite=\"https:\/\/fatbobman.com\/en\/posts\/from-pbxproj-to-xcproj\/\">\n<p>What the community has actually been waiting years for is a project manifest along the lines of <code>Package.swift<\/code>: something written by people, read by people, and reviewed by people, rather than a more modern encoding of the IDE&rsquo;s internal database.<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/06\/06\/wwdc-2025-wish-lists\/\">WWDC 2025 Wish Lists<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2024\/10\/07\/xcode-16-folders-and-groups\/\">Xcode 16 Folders and Groups<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2024\/08\/29\/editorconfig-files-in-xcode\/\">EditorConfig Files in Xcode<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2017\/10\/23\/why-work-without-a-nib\/\">Why Work Without a Nib?<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2013\/08\/14\/xcode-5s-new-xib-format\/\">Xcode 5&rsquo;s New XIB Format<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Apple: Xcode now supports a JSON-based project format (.xcproj) that&rsquo;s more readable, merge-friendly, and easier for coding agents to edit. Enable it in the file inspector. Projects using .xcproj also open in earlier versions of Xcode 27. Learn more in Updating your Xcode project configuration file format. Fatbobman: [The] new project.xcproj caught my eye. What [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-09-17T18:32:42Z","apple_news_api_id":"9637a6e9-22cb-40db-b8a9-e0eb2c1d1fa5","apple_news_api_modified_at":"2026-09-17T18:32:42Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/Aljem6SLLQNu4qeDrLB0fpQ","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[1351,507,991,71,901,226],"class_list":["post-53226","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-artificial-intelligence","tag-json","tag-open-source-software","tag-programming","tag-swift-programming-language","tag-xcode"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=53226"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53226\/revisions"}],"predecessor-version":[{"id":53227,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53226\/revisions\/53227"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=53226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=53226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=53226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}