{"id":1188,"date":"2026-09-01T17:00:00","date_gmt":"2026-09-01T11:30:00","guid":{"rendered":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/"},"modified":"2026-09-01T17:00:00","modified_gmt":"2026-09-01T11:30:00","slug":"salesforce-dx-project-structure","status":"publish","type":"post","link":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/","title":{"rendered":"Salesforce DX Project Structure and Source Format Explained"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A Salesforce DX Project is the folder on your computer that holds all the metadata for your app. In the last post, you created one called <code>brightpath-app<\/code> during the <a href=\"https:\/\/swapnilzambare.com\/blog\/salesforce-cli-setup-vs-code\/\">Salesforce CLI setup<\/a>. Now it is time to open it and understand what every folder and file does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This matters because every developer task touches these files. When you know where things live, you find code faster and make fewer deployment mistakes. If the word &#8220;metadata&#8221; still feels fuzzy, read our post on <a href=\"https:\/\/swapnilzambare.com\/blog\/salesforce-multi-tenant-architecture-metadata\/\">multi-tenant architecture and metadata<\/a> first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is a Salesforce DX Project?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Salesforce DX Project is a local folder that stores your org&#8217;s metadata as plain files. It follows a fixed layout that the Salesforce CLI and VS Code understand. DX stands for Developer Experience, which is Salesforce&#8217;s name for its modern, source-driven way of working.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a simple way to think about it. Your org is a finished house. The project folder is the set of building plans for that house. If you have the plans, you can build the same house again in any other org.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why a Salesforce DX Project Matters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before Salesforce DX, the org itself was the &#8220;truth&#8221;. Developers changed things directly in Setup, and nobody had a full history. That made teamwork hard and mistakes hard to undo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With a Salesforce DX Project, the files become the truth. This gives you clear benefits.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>History.<\/strong> Every change sits in Git, so you can see who changed what and when.<\/li>\n\n<li><strong>Teamwork.<\/strong> Many developers work on the same project and merge their changes.<\/li>\n\n<li><strong>Repeatable deploys.<\/strong> The same files can go to a sandbox, a scratch org or production.<\/li>\n\n<li><strong>Code review.<\/strong> Teammates review changes in a pull request before they reach users.<\/li>\n\n<li><strong>Automation.<\/strong> Pipelines can test and deploy the files without human clicks.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How a Salesforce DX Project Is Organised<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When you create a project with the Standard template, the CLI builds this folder layout for you. Here is a short version of the tree.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brightpath-app\/\n  .forceignore\n  .gitignore\n  .vscode\/\n  config\/\n    project-scratch-def.json\n  force-app\/\n    main\/\n      default\/\n        classes\/\n        lwc\/\n        objects\/\n        layouts\/\n        flows\/\n        permissionsets\/\n        triggers\/\n  scripts\/\n    apex\/\n    soql\/\n  package.json\n  README.md\n  sfdx-project.json<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not worry if your tree has a few more files. Newer templates add tool settings for formatting and testing. The core folders stay the same.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-1024x640.png\" alt=\"Salesforce DX Project diagram showing the main folders and files\" class=\"wp-image-1186\" srcset=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-1024x640.png 1024w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-300x188.png 300w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-768x480.png 768w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-1536x960.png 1536w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-1-2048x1280.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">The main folders and files inside a Salesforce DX project.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">The force-app Folder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the heart of the project. All your metadata lives inside <code>force-app\/main\/default<\/code>. Each metadata type gets its own sub-folder, such as <code>classes<\/code> for Apex and <code>lwc<\/code> for Lightning Web Components.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The config Folder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This folder holds <code>project-scratch-def.json<\/code>. It describes the shape of a scratch org, such as its edition and features. We will use it in the next post on scratch orgs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The scripts Folder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here you will find sample files, such as <code>scripts\/apex\/hello.apex<\/code> and <code>scripts\/soql\/account.soql<\/code>. You can run them from VS Code to test anonymous Apex or a quick query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The .forceignore File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This file tells the CLI which files to skip during deploy and retrieve. It works like <code>.gitignore<\/code>, but for Salesforce. For example, it skips Jest test folders, because Salesforce does not need them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The .vscode Folder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This folder stores VS Code settings for the project. For example, it can recommend the Salesforce extensions to anyone who opens the folder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The sfdx-project.json File<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every Salesforce DX Project must have this file in its root folder. VS Code looks for it to turn on Salesforce features. Here is a typical example.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"packageDirectories\": [\n    {\n      \"path\": \"force-app\",\n      \"default\": true\n    }\n  ],\n  \"name\": \"brightpath-app\",\n  \"namespace\": \"\",\n  \"sfdcLoginUrl\": \"https:\/\/login.salesforce.com\",\n  \"sourceApiVersion\": \"65.0\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The table below explains each key in plain words.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Key<\/th><th>What it means<\/th><\/tr><\/thead><tbody><tr><td>packageDirectories<\/td><td>Folders that hold your metadata<\/td><\/tr><tr><td>path<\/td><td>The folder name, usually force-app<\/td><\/tr><tr><td>default<\/td><td>The folder where new files go<\/td><\/tr><tr><td>name<\/td><td>Your project name<\/td><\/tr><tr><td>namespace<\/td><td>Empty unless you build a managed package<\/td><\/tr><tr><td>sfdcLoginUrl<\/td><td>The default login page for this project<\/td><\/tr><tr><td>sourceApiVersion<\/td><td>The API version used for deploy and retrieve<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The CLI fills in the API version when it creates the project, so yours may show a newer number. Keep it close to your org&#8217;s current version.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Source Format vs Metadata API Format<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Salesforce supports two file layouts for metadata. The Salesforce CLI uses source format by default, but you will still meet the older format in real projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source format splits big files into small ones. For example, each field of an object gets its own file. Metadata API format keeps a whole object in one large file. Here is how Course__c looks in source format.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>force-app\/main\/default\/objects\/Course__c\/\n  Course__c.object-meta.xml\n  fields\/\n    Fee__c.field-meta.xml\n    Level__c.field-meta.xml\n    Start_Date__c.field-meta.xml\n  validationRules\/\n    Fee_Minimum.validationRule-meta.xml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The object file holds settings like the label and sharing model. Each field file holds one field only. As a result, two developers can change two different fields without touching the same file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The table below compares both formats side by side.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Feature<\/th><th>Source format<\/th><th>Metadata API format<\/th><\/tr><\/thead><tbody><tr><td>Used by<\/td><td>Salesforce CLI, VS Code<\/td><td>Older tools, change set exports<\/td><\/tr><tr><td>Object files<\/td><td>Split into many small files<\/td><td>One large .object file<\/td><\/tr><tr><td>File endings<\/td><td>-meta.xml<\/td><td>.object, .cls and others<\/td><\/tr><tr><td>Merge conflicts in Git<\/td><td>Fewer<\/td><td>More common<\/td><\/tr><tr><td>Needs package.xml<\/td><td>No<\/td><td>Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When to use which is easy. Use source format for daily work. Convert to Metadata API format only when an older tool needs it.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-1024x640.png\" alt=\"Salesforce DX Project diagram comparing source format and Metadata API format\" class=\"wp-image-1187\" srcset=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-1024x640.png 1024w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-300x188.png 300w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-768x480.png 768w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-1536x960.png 1536w, https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-diagram-2-2048x1280.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Source format vs Metadata API format.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can convert between the two formats with these commands.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sf project convert source --output-dir mdapi_output\nsf project convert mdapi --root-dir mdapi_output<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first command turns source format into Metadata API format. The second command does the opposite.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Real Salesforce DX Project Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s add a new field to Course__c using only files. This shows how metadata really works inside a Salesforce DX Project. We will add a field called Max_Students__c.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In VS Code, open <code>force-app\/main\/default\/objects\/Course__c\/fields<\/code>.<\/li>\n\n<li>Create a new file named <code>Max_Students__c.field-meta.xml<\/code>.<\/li>\n\n<li>Paste the XML below into the file and save it.<\/li>\n\n<li>Right-click the file and choose &#8220;SFDX: Deploy This Source to Org&#8221;.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;CustomField xmlns=\"http:\/\/soap.sforce.com\/2006\/04\/metadata\"&gt;\n    &lt;fullName&gt;Max_Students__c&lt;\/fullName&gt;\n    &lt;label&gt;Max Students&lt;\/label&gt;\n    &lt;type&gt;Number&lt;\/type&gt;\n    &lt;precision&gt;3&lt;\/precision&gt;\n    &lt;scale&gt;0&lt;\/scale&gt;\n    &lt;required&gt;false&lt;\/required&gt;\n    &lt;description&gt;Largest batch size for this course&lt;\/description&gt;\n&lt;\/CustomField&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>fullName<\/code> is the API name. The <code>type<\/code> is Number, and <code>precision<\/code> 3 with <code>scale<\/code> 0 allows whole numbers up to 999. After the deploy, open Object Manager &gt; Course &gt; Fields &amp; Relationships to see the new field. Also, give users access through a permission set, because Salesforce hides new fields by default.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How VS Code Uses the Salesforce DX Project<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">VS Code reads the project layout to decide what to show you. When you right-click a file inside <code>force-app<\/code>, it offers deploy and retrieve options. When you open a <code>.cls<\/code> file, the Apex language server checks your code as you type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Org Browser in the left sidebar also depends on the project. It lists every metadata type in your default org. You can click the cloud icon next to any item to retrieve it straight into the right folder. This is a handy way to learn the file names for each type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, the status bar shows your default org for this project. Each project can point to a different org, so switching folders can switch orgs too. Always glance at it before you deploy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Keeping Your Salesforce DX Project in Sync<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Admins and developers often change the same org. For example, an admin may add a picklist value in Setup while you write Apex. If you never pull that change into your files, the next deploy may undo it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, make retrieving a regular habit. You can retrieve one item, a whole folder or everything listed in a manifest. Here is a quick example that pulls the Course object and one class.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sf project retrieve start --metadata CustomObject:Course__c ApexClass:CourseService<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This command downloads the latest version of both items from your default org. Then it writes them into the right folders under <code>force-app<\/code>. If the files already exist, the CLI updates them in place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will cover deploy and retrieve fully in a later post in this series. For now, remember one rule. The project files should always match what is in your main development org.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Files You Should Not Commit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Some folders in a Salesforce DX Project are only for your computer. The CLI creates <code>.sf<\/code> and <code>.sfdx<\/code> to store local state, such as which org is your default. These folders can also hold details about your login, so never push them to Git.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The default <code>.gitignore<\/code> already skips them. It also skips <code>node_modules<\/code>, which can hold thousands of files from npm. Check this file once, and add any other local folders your team uses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good test is simple. If a file only makes sense on your laptop, keep it out of Git. However, if a teammate needs it to build the same app, commit it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common Mistakes with a Salesforce DX Project<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Opening a sub-folder in VS Code. Always open the root folder that contains <code>sfdx-project.json<\/code>.<\/li>\n\n<li>Deleting <code>.forceignore<\/code>. Then the CLI may try to deploy files that Salesforce rejects.<\/li>\n\n<li>Mixing both formats in one folder. Keep Metadata API files out of <code>force-app<\/code>.<\/li>\n\n<li>Renaming files by hand. The file name must match the API name inside the XML.<\/li>\n\n<li>Forgetting permissions. A new field deploys fine but stays invisible without field access.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices for a Salesforce DX Project<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep one project per app or team, so the structure stays clear.<\/li>\n\n<li>Commit the whole project to Git, except the local <code>.sf<\/code> and <code>.sfdx<\/code> folders.<\/li>\n\n<li>Retrieve changes made in Setup back into the project, so files stay the truth.<\/li>\n\n<li>Use sub-folders under <code>force-app<\/code> only when a team agrees on the layout.<\/li>\n\n<li>Keep <code>sourceApiVersion<\/code> up to date after each major release.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Practice Task<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create the Max_Students__c field from this post and deploy it. Then add a permission set file that grants edit access to it. Hint: retrieve an existing permission set first, and copy its <code>fieldPermissions<\/code> block as a pattern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Official Resources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_source_file_format.htm\" target=\"_blank\" rel=\"noopener noreferrer\">Salesforce DX Project Structure and Source Format<\/a><\/li>\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_ws_config.htm\" target=\"_blank\" rel=\"noopener noreferrer\">Salesforce DX Project Configuration<\/a><\/li>\n\n<li><a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/sfdx_app_dev\" target=\"_blank\" rel=\"noopener noreferrer\">Trailhead: App Development with Salesforce DX<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Quick Recap<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A Salesforce DX Project stores your org&#8217;s metadata as files on your computer.<\/li>\n\n<li>All metadata lives under <code>force-app\/main\/default<\/code>.<\/li>\n\n<li><code>sfdx-project.json<\/code> marks the root of the project.<\/li>\n\n<li>Source format splits objects into small files, which reduces merge conflicts.<\/li>\n\n<li>You can convert to and from Metadata API format with the CLI.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your project needs an org to deploy to. In the next post, we compare <a href=\"https:\/\/swapnilzambare.com\/blog\/scratch-orgs-vs-sandboxes-developer-edition\/\">scratch orgs, sandboxes and Developer Edition orgs<\/a> and show when to use each one.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Salesforce DX Project is the folder on your computer that holds all the metadata for your app. In the last post, you created&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1185,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_swapz_level":"","_swapz_series_part":0,"_swapz_hide_toc":false,"_swapz_hide_featured":false,"_swapz_description":"","footnotes":""},"categories":[8,96],"tags":[15,7,97,102],"swapz_series":[],"class_list":["post-1188","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-salesforce","category-salesforce-developer","tag-beginner","tag-salesforce","tag-salesforce-developer","tag-salesforce-dx"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Salesforce DX Project Structure and Source Format<\/title>\n<meta name=\"description\" content=\"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Salesforce DX Project Structure and Source Format\" \/>\n<meta property=\"og:description\" content=\"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/\" \/>\n<meta property=\"og:site_name\" content=\"Swapnil Zambare - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-01T11:30:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Swapnil Zambare\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Swapnil Zambare\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/\"},\"author\":{\"name\":\"Swapnil Zambare\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#\\\/schema\\\/person\\\/922ac0131aaa7088c78c2cb1700e0c9a\"},\"headline\":\"Salesforce DX Project Structure and Source Format Explained\",\"datePublished\":\"2026-09-01T11:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/\"},\"wordCount\":1634,\"publisher\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/salesforce-dx-project-structure-featured.png\",\"keywords\":[\"Beginner\",\"Salesforce\",\"Salesforce Developer\",\"Salesforce DX\"],\"articleSection\":[\"Salesforce\",\"Salesforce Developer\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/\",\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/\",\"name\":\"Salesforce DX Project Structure and Source Format\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/salesforce-dx-project-structure-featured.png\",\"datePublished\":\"2026-09-01T11:30:00+00:00\",\"description\":\"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#primaryimage\",\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/salesforce-dx-project-structure-featured.png\",\"contentUrl\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/salesforce-dx-project-structure-featured.png\",\"width\":2400,\"height\":1260,\"caption\":\"Salesforce DX Project featured image: title card with a folder tree\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/salesforce-dx-project-structure\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Salesforce DX Project Structure and Source Format Explained\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/\",\"name\":\"Swapnil Zambare - Blog\",\"description\":\"Salesforce &amp; Tech Guides\",\"publisher\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#organization\",\"name\":\"Swapnil Zambare - Blog\",\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/site-icon-512.png\",\"contentUrl\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/site-icon-512.png\",\"width\":512,\"height\":512,\"caption\":\"Swapnil Zambare - Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/theSwapnilZambare\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/#\\\/schema\\\/person\\\/922ac0131aaa7088c78c2cb1700e0c9a\",\"name\":\"Swapnil Zambare\",\"sameAs\":[\"https:\\\/\\\/swapnilzambare.com\\\/blog\"],\"url\":\"https:\\\/\\\/swapnilzambare.com\\\/blog\\\/author\\\/swapnil-zambare\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Salesforce DX Project Structure and Source Format","description":"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/","og_locale":"en_US","og_type":"article","og_title":"Salesforce DX Project Structure and Source Format","og_description":"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.","og_url":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/","og_site_name":"Swapnil Zambare - Blog","article_published_time":"2026-09-01T11:30:00+00:00","og_image":[{"width":2400,"height":1260,"url":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png","type":"image\/png"}],"author":"Swapnil Zambare","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Swapnil Zambare","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#article","isPartOf":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/"},"author":{"name":"Swapnil Zambare","@id":"https:\/\/swapnilzambare.com\/blog\/#\/schema\/person\/922ac0131aaa7088c78c2cb1700e0c9a"},"headline":"Salesforce DX Project Structure and Source Format Explained","datePublished":"2026-09-01T11:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/"},"wordCount":1634,"publisher":{"@id":"https:\/\/swapnilzambare.com\/blog\/#organization"},"image":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#primaryimage"},"thumbnailUrl":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png","keywords":["Beginner","Salesforce","Salesforce Developer","Salesforce DX"],"articleSection":["Salesforce","Salesforce Developer"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/","url":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/","name":"Salesforce DX Project Structure and Source Format","isPartOf":{"@id":"https:\/\/swapnilzambare.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#primaryimage"},"image":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#primaryimage"},"thumbnailUrl":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png","datePublished":"2026-09-01T11:30:00+00:00","description":"Salesforce DX Project structure explained: every folder and file, sfdx-project.json, source format vs Metadata API format, with real examples.","breadcrumb":{"@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#primaryimage","url":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png","contentUrl":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/10\/salesforce-dx-project-structure-featured.png","width":2400,"height":1260,"caption":"Salesforce DX Project featured image: title card with a folder tree"},{"@type":"BreadcrumbList","@id":"https:\/\/swapnilzambare.com\/blog\/salesforce-dx-project-structure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/swapnilzambare.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Salesforce DX Project Structure and Source Format Explained"}]},{"@type":"WebSite","@id":"https:\/\/swapnilzambare.com\/blog\/#website","url":"https:\/\/swapnilzambare.com\/blog\/","name":"Swapnil Zambare - Blog","description":"Salesforce &amp; Tech Guides","publisher":{"@id":"https:\/\/swapnilzambare.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/swapnilzambare.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/swapnilzambare.com\/blog\/#organization","name":"Swapnil Zambare - Blog","url":"https:\/\/swapnilzambare.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/swapnilzambare.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/09\/site-icon-512.png","contentUrl":"https:\/\/swapnilzambare.com\/blog\/wp-content\/uploads\/2026\/09\/site-icon-512.png","width":512,"height":512,"caption":"Swapnil Zambare - Blog"},"image":{"@id":"https:\/\/swapnilzambare.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/theSwapnilZambare"]},{"@type":"Person","@id":"https:\/\/swapnilzambare.com\/blog\/#\/schema\/person\/922ac0131aaa7088c78c2cb1700e0c9a","name":"Swapnil Zambare","sameAs":["https:\/\/swapnilzambare.com\/blog"],"url":"https:\/\/swapnilzambare.com\/blog\/author\/swapnil-zambare\/"}]}},"_links":{"self":[{"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/posts\/1188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/comments?post=1188"}],"version-history":[{"count":0,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/posts\/1188\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/media\/1185"}],"wp:attachment":[{"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/media?parent=1188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/categories?post=1188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/tags?post=1188"},{"taxonomy":"swapz_series","embeddable":true,"href":"https:\/\/swapnilzambare.com\/blog\/wp-json\/wp\/v2\/swapz_series?post=1188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}