{"id":31013,"date":"2025-08-10T23:57:51","date_gmt":"2025-08-10T21:57:51","guid":{"rendered":"https:\/\/www.angulararchitects.io\/blog\/cross-repo-conformance-with-nx-polygraph\/"},"modified":"2025-08-11T00:04:58","modified_gmt":"2025-08-10T22:04:58","slug":"cross-repo-conformance-with-nx-polygraph","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/","title":{"rendered":"Cross-Repo Conformance with Nx Polygraph"},"content":{"rendered":"<p>While tech giants like Google and Facebook rely on monorepos, the reality for many companies is different: Business software is often developed in multiple project- or product-related repos. The relatively new <a href=\"https:\/\/nx.dev\/blog\/nx-cloud-introducing-polygraph\">Nx Polygraph<\/a> takes this into account by visualizing dependencies between repos and enforcing common policies.<\/p>\n<p>In this article, I'll provide an overview of Polygraph and show how to develop a conformance rule that ensures the use of a specific Angular version across all repos. This check is especially essential for Micro Frontend projects, where you want to limit yourself to a single version for simplicity.<\/p>\n<p>\ud83d\udcc2 <a href=\"https:\/\/github.com\/manfredsteyer\/polygraph-rules\">Source Code<\/a><\/p>\n<blockquote><p>\nBig thanks to Juri Strumpflohner, Sr. Director of Developer Experience for Nx, for reviewing this article.\n<\/p><\/blockquote>\n<h2>Overview<\/h2>\n<p>Nx Polygraph is part of the <a href=\"https:\/\/nx.dev\/enterprise\">enterprise version of Nx Cloud<\/a>, the commercial extension of the popular open-source solution Nx for managing workspaces. Polygraph currently consists of three features, accessible directly from the Nx Cloud Dashboard:<\/p>\n<ul>\n<li><strong>Workspace Graph:<\/strong> Visualizes dependencies between different repositories<\/li>\n<li><strong>Conformance:<\/strong> Manages cross-repo conformance rules and informs about rule violations<\/li>\n<li><strong>Custom Workflows:<\/strong> Manages batch runs that collect information about the workspace graph or check connected repos for compliance with conformance rules<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/dashboard.png\" alt=\"The Nx Cloud Dashboard presents the capabilities of Nx Polygraph\" \/><\/p>\n<p>To connect an Nx workspace to <a href=\"https:\/\/nx.dev\/nx-cloud\">Nx Cloud<\/a>, use the statement<\/p>\n<pre><code class=\"language-bash\">npx nx connect<\/code><\/pre>\n<p>Alternatively, <\/p>\n<ul>\n<li>you can specify that you want to use Nx Cloud when setting up your workspace with <code>create-nx-workspace<\/code><\/li>\n<li>Go to <a href=\"https:\/\/cloud.nx.app\/get-started\/\">https:\/\/cloud.nx.app\/get-started\/<\/a> to create a new workspace or connect an existing one<\/li>\n<\/ul>\n<p>You can also generate a build script for the CI environment:<\/p>\n<pre><code class=\"language-bash\">npx nx g ci-workflow<\/code><\/pre>\n<p>The workspace must then be checked into source code management (e.g. GitHub) and added to your organization in the Nx Cloud Portal:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/add-workspace.png\" alt=\"Add Nx Workspace to the organization in the Nx Cloud\" width=\"300\" style=\"max-width:300px\"><\/p>\n<h2>Workspace Graph<\/h2>\n<p>The workspace graph shows how the individual repos are connected. You can drill into the individual connected repos and see the applications and libraries managed there, as well as their dependencies. Dependencies between repos are npm packages that originate from one repo and are consumed by other repos.<\/p>\n<p>For example, the following screenshot shows that <em>project-a<\/em> and <em>project-b<\/em> are located in different repos. However, the latter uses the <em>calc<\/em> library from <em>project-a<\/em>, which was deployed via an npm registry:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/workspace-graph.png\" alt=\"The workspace graph shows that project -b accesses the calc library from another repo\" \/><\/p>\n<p>Nx automatically collects the information for the Workspace Graph when Nx (e.g., <em>nx build<\/em> or <em>nx run-many<\/em>) is executed as part of a build script in a CI environment, thus guaranteeing an <strong>always up to date representation of your dependencies<\/strong> even across repository boundaries.<\/p>\n<h2>Conformance<\/h2>\n<p>The Conformance Dashboard provides information about whether the connected repos comply with the configured rules. The following image, for example, shows four projects in my demo organization and three conformance rules. Unfortunately, <em>project-b does<\/em> not comply with the first one:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/conformance-dashboard.png\" alt=\"Conformance Dashboard shows rule violations\" \/><\/p>\n<p>Under &quot;Notifications&quot;, you can also enter email addresses for each project that should be notified in the event of a rule violation. The individual conformance rules are activated for individual or all projects and are configured accordingly. For example, the <em>angular-version-rule<\/em>, whose implementation I'll discuss below, receives the expected Angular version via its configuration. It checks the entries in the <em>package.json<\/em> against this version:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/configure-conformance.png\" alt=\"Configure Conformance Rule\" \/><\/p>\n<p>On request, the Nx Cloud provides further details on failed conformance rules:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/details.png\" alt=\"Details of the failed conformance rule\" \/><\/p>\n<p>To ensure that Nx Cloud checks the rules in the configured projects, a custom workflow must be set up. The available screens can be accessed via the dashboard.<\/p>\n<h2>More on this: Angular Architecture Workshop (Remote, Interactive, Advanced)<\/h2>\n<p>Become an expert for enterprise-scale and maintainable Angular applications with our <a href=\"https:\/\/www.angulararchitects.io\/en\/angular-workshops\/advanced-angular-enterprise-architecture-incl-ivy\/\">Angular Architecture workshop!<\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/sujet-en.jpg\" alt=\"\" style=\"width:600px; max-width:100%; display: block; margin-left: auto; margin-right:auto\" \/><\/p>\n<p><a href=\"https:\/\/www.angulararchitects.io\/en\/angular-workshops\/advanced-angular-enterprise-architecture-incl-ivy\/\">English Version<\/a> | <a href=\"https:\/\/www.angulararchitects.io\/schulungen\/advanced-angular-enterprise-anwendungen-und-architektur\/\">German Version<\/a><\/p>\n<h2>Implementing a Conformance Rule<\/h2>\n<p>Nx gives us a lot of freedom when designing conformance rules, as they are technically JavaScript objects with metadata and an <em>implementation<\/em> method. This method reads selected files from the project to analyze, checks them, and returns an array containing the detected rule violations.<\/p>\n<p>The following statement generates an Nx project for Conformance Rules:<\/p>\n<pre><code class=\"language-bash\">npx create-nx-workspace more-rules --preset=@nx\/conformance<\/code><\/pre>\n<p>Such a project already contains an initial rule that can be used as a template for your own projects. Our conformance rule consists of a <em>schema.json<\/em> file, which describes the rule's configuration options using a JSON schema, and an <em>index.ts<\/em> file.<\/p>\n<p>The <em>schema.json<\/em> for the <em>angular-version-rule<\/em> defines a property <em>version<\/em> of type <em>string<\/em>:<\/p>\n<pre><code class=\"language-ts\">{\n  &quot;$schema&quot;: &quot;http:\/\/json-schema.org\/schema&quot;,\n  &quot;$id&quot;: &quot;angular-version-rule&quot;,\n  &quot;title&quot;: &quot;options for example conformance-rule rule checking for a specific Angular version&quot;,\n  &quot;type&quot;: &quot;object&quot;,\n  &quot;properties&quot;: {\n    &quot;version&quot;: {\n      &quot;type&quot;: &quot;string&quot;\n    }\n  },\n  &quot;required&quot;: [&quot;version&quot;],\n  &quot;additionalProperties&quot;: false\n}<\/code><\/pre>\n<p>To use the stored configuration in the program code, a corresponding type is also required:<\/p>\n<pre><code class=\"language-ts\">export type AngularVersionConformanceOptions = {\n  version: string;\n};<\/code><\/pre>\n<p>For simplicity, I created this type manually. For larger projects, it is recommended to generate such types. Npm packages such as <em>json-schema-to-typescript<\/em> can be used for this purpose.<\/p>\n<p>The <em>index.ts<\/em> file publishes the conformance rule based on it as a <em>default export<\/em>. It is configured with <em>createConformanceRule<\/em> and receives metadata such as name, category, and description.<\/p>\n<pre><code class=\"language-ts\">import { createConformanceRule, ConformanceViolation } from &#039;@nx\/conformance&#039;;\n\n[\u2026]\n\nexport default createConformanceRule({\n  name: &#039;angular-version-rule&#039;,\n  category: &#039;consistency&#039;,\n  description: &#039;An example conformance rule checking for a specific Angular version&#039;,\n  implementation: async (context) =&gt; {\n\n    const options = context.ruleOptions as AngularVersionConformanceOptions;\n    const version = options.version;\n    const violations: ConformanceViolation[] = [];\n    const packagePath = path.join(workspaceRoot, &#039;package.json&#039;);\n\n    try {\n      const versionViolations = checkVersions(packagePath, version);\n      violations.push(...versionViolations);\n    }\n    catch(e) {\n      violations.push({\n        workspaceViolation: true,\n        message: <code>Error reading package.json: ${e}<\/code>,\n      });\n    }\n\n    return {\n      severity: &#039;high&#039;,\n      details: {\n        violations,\n      },\n    };\n  },\n});<\/code><\/pre>\n<p>The defined <em>name<\/em> must be unique in order to avoid issues when deploying the rule later. The rule implementation first retrieves the configured <em>ruleOptions<\/em> from the <em>context<\/em> object passed by Nx. After a type assertion to <em>AngularVersionConformanceOptions<\/em>, the configured version number is read. It then delegates to the <em>checkVersions<\/em> function. This function goes through all dependencies in the <em>dependencies<\/em> node and checks all those that start with @angular\/ for the desired version number:<\/p>\n<pre><code class=\"language-ts\">export type PackageJson = {\n  dependencies: Record&lt;string, string&gt;\n};\n\nfunction checkVersions(packagePath: string, version: string) {\n  const packageInfo = readJsonFile(packagePath) as PackageJson;\n  const deps = packageInfo.dependencies;\n\n  const versionViolations: ConformanceViolation[] = [];\n\n  for (const dep of Object.keys(deps)) {\n    if (dep.startsWith(&#039;@angular\/&#039;) &amp;&amp; deps[dep] !== version) {\n      versionViolations.push({\n        workspaceViolation: true,\n        message: `Unexpected version of ${dep} configured in package.json. \nExpected: ${version}; found: ${deps[dep]}.`,\n      });\n    }\n  }\n  return versionViolations;\n}<\/code><\/pre>\n<p>This is primarily for illustrative purposes. In practice, you would also need to check for <em>devDependencies<\/em> like @angular\/build, as well as other packages that interact with the respective Angular core packages but have different versions themselves. Examples include Nx itself and component libraries.<\/p>\n<h2>Trying out a Conformance Rule<\/h2>\n<p>To try out the conformance rule locally, it must be registered in your workspace's <em>nx.json<\/em>:<\/p>\n<pre><code class=\"language-json\">{\n  [\u2026],  \n  &quot;conformance&quot;: {\n    &quot;rules&quot;: [\n      {\n        &quot;rule&quot;: &quot;.\/packages\/conformance-rules\/src\/angular-version-rule&quot;,\n        &quot;options&quot;: {\n          &quot;version&quot;: &quot;20.1.0&quot;\n        }\n      }\n    ]\n  }\n}<\/code><\/pre>\n<p>The <em>rule<\/em> property points to the directory containing <em>index.ts<\/em>, and <em>options<\/em> specifies the configuration options described by the schema.<\/p>\n<p>To execute the registered rules in the local project, simply call<\/p>\n<pre><code class=\"language-sh\">npx nx conformance check<\/code><\/pre>\n<h2>Publishing a Conformance Rule<\/h2>\n<p>In order for the rule to be configured in the Nx Cloud for the connected projects, it must be deployed. For security reasons, a <a href=\"https:\/\/nx.dev\/ci\/recipes\/security\/personal-access-tokens\">Personal Access Token<\/a> must be set up in the project containing the rules. This token can be obtained in the Nx Cloud in the profile area of the respective user:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/profile.png\" alt=\"Link to profile area of the current user\" width=\"300\" style=\"max-width:300px !important\"><\/p>\n<p>The token can then be configured for the current project using the following statement:<\/p>\n<pre><code class=\"language-sh\">npx nx-cloud configure --personal-access-token NzQ2MD...<\/code><\/pre>\n<p>The following statement is then used to deploy the rule:<\/p>\n<pre><code class=\"language-sh\">npx nx publish-conformance-rules --project conformance-rules<\/code><\/pre>\n<p>To run the rule for any connected project in the Nx Cloud, execute the following statement in this project:<\/p>\n<pre><code class=\"language-sh\">npx nx-cloud conformance check<\/code><\/pre>\n<p>After deployment, you can also see the rule in the Nx Cloud and configure it for different projects. To ensure it is executed regularly and the Conformance Dashboard displays the current results, you still need to <strong>set up the custom workflow<\/strong> briefly mentioned above.<\/p>\n<h2>Conclusion<\/h2>\n<p>Nx Polygraph helps bring order to complex, distributed repository landscapes. One example is Micro Frontend scenarios where multiple projects are built on the same stack. Conformance rules ensure consistency and transparency.<\/p>\n<p>The ability to define your own rules and deploy them via the Nx Cloud opens up scope for cross-team quality standards. This transforms a previously difficult-to-understand, heterogeneous project landscape into controlled and consistent workspaces.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>While tech giants like Google and Facebook rely on monorepos, the reality for many companies is different: Business software is often developed in multiple project- or product-related repos. The relatively new Nx Polygraph takes this into account by visualizing dependencies between repos and enforcing common policies. In this article, I&#8217;ll provide an overview of Polygraph [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":31011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-31013","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"While tech giants like Google and Facebook rely on monorepos, the reality for many companies is different: Business software is often developed in multiple project- or product-related repos. The relatively new Nx Polygraph takes this into account by visualizing dependencies between repos and enforcing common policies. In this article, I&#039;ll provide an overview of Polygraph [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-10T21:57:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-10T22:04:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/sujet-conformance-1024x536.png\" \/>\n<meta name=\"author\" content=\"Manfred Steyer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/sujet-conformance-1-1024x536.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\"},\"author\":{\"name\":\"Manfred Steyer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a\"},\"headline\":\"Cross-Repo Conformance with Nx Polygraph\",\"datePublished\":\"2025-08-10T21:57:51+00:00\",\"dateModified\":\"2025-08-10T22:04:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\"},\"wordCount\":1144,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\",\"name\":\"Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg\",\"datePublished\":\"2025-08-10T21:57:51+00:00\",\"dateModified\":\"2025-08-10T22:04:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg\",\"width\":1000,\"height\":667},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cross-Repo Conformance with Nx Polygraph\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a\",\"name\":\"Manfred Steyer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects","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:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/","og_locale":"en_US","og_type":"article","og_title":"Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects","og_description":"While tech giants like Google and Facebook rely on monorepos, the reality for many companies is different: Business software is often developed in multiple project- or product-related repos. The relatively new Nx Polygraph takes this into account by visualizing dependencies between repos and enforcing common policies. In this article, I'll provide an overview of Polygraph [&hellip;]","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/","og_site_name":"ANGULARarchitects","article_published_time":"2025-08-10T21:57:51+00:00","article_modified_time":"2025-08-10T22:04:58+00:00","og_image":[{"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/sujet-conformance-1024x536.png","type":"","width":"","height":""}],"author":"Manfred Steyer","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/sujet-conformance-1-1024x536.png","twitter_misc":{"Written by":"Manfred Steyer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/"},"author":{"name":"Manfred Steyer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a"},"headline":"Cross-Repo Conformance with Nx Polygraph","datePublished":"2025-08-10T21:57:51+00:00","dateModified":"2025-08-10T22:04:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/"},"wordCount":1144,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/","name":"Cross-Repo Conformance with Nx Polygraph - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg","datePublished":"2025-08-10T21:57:51+00:00","dateModified":"2025-08-10T22:04:58+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/08\/shutterstock_2411435881.jpg","width":1000,"height":667},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/cross-repo-conformance-with-nx-polygraph\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Cross-Repo Conformance with Nx Polygraph"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a","name":"Manfred Steyer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","caption":"Manfred Steyer"}}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/31013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=31013"}],"version-history":[{"count":3,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/31013\/revisions"}],"predecessor-version":[{"id":31018,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/31013\/revisions\/31018"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/31011"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=31013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=31013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=31013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}