{"id":13807909,"url":"https://github.com/getstrm/pace","last_synced_at":"2025-10-13T13:35:58.335Z","repository":{"id":211242947,"uuid":"706692316","full_name":"getstrm/pace","owner":"getstrm","description":"Data policy IN, dynamic view OUT: PACE is the Policy As Code Engine. It helps you to programatically create and apply a data policy to a processing platform like Databricks, Snowflake or BigQuery (or plain 'ol Postgres, even!) with definitions imported from Collibra, Datahub, ODD and the like. ","archived":false,"fork":false,"pushed_at":"2025-10-13T12:57:54.000Z","size":13956,"stargazers_count":37,"open_issues_count":16,"forks_count":1,"subscribers_count":4,"default_branch":"alpha","last_synced_at":"2025-10-13T13:35:57.867Z","etag":null,"topics":["bigquery","data-catalog","data-contracts","data-governance","data-processing","databricks","policy-enforcement","snowflake"],"latest_commit_sha":null,"homepage":"https://pace.getstrm.com","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getstrm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-10-18T12:49:26.000Z","updated_at":"2025-09-05T01:38:45.000Z","dependencies_parsed_at":"2023-12-19T15:57:51.341Z","dependency_job_id":"b7e5b9aa-0c19-44d4-9db9-35c3c13ca0b5","html_url":"https://github.com/getstrm/pace","commit_stats":{"total_commits":593,"total_committers":15,"mean_commits":39.53333333333333,"dds":0.7689713322091063,"last_synced_commit":"1ce2992fe7824e1d48451ba9ce9bf37b66f2131d"},"previous_names":["getstrm/pace"],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/getstrm/pace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getstrm%2Fpace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getstrm%2Fpace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getstrm%2Fpace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getstrm%2Fpace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getstrm","download_url":"https://codeload.github.com/getstrm/pace/tar.gz/refs/heads/alpha","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getstrm%2Fpace/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279015351,"owners_count":26085684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bigquery","data-catalog","data-contracts","data-governance","data-processing","databricks","policy-enforcement","snowflake"],"created_at":"2024-08-04T01:01:31.979Z","updated_at":"2025-10-13T13:35:58.319Z","avatar_url":"https://github.com/getstrm.png","language":"Kotlin","readme":"\u003cp align=\"center\" style=\"margin-top: 250px\"\u003e\n  \u003ca href=\"https://github.com/getstrm/pace\"\u003e\n   \u003cimg src=\"./assets/svg/pace-logo-orange-filled.svg\" alt=\"Logo\"\u003e\n\u003c!--    \u003cimg src=\"./assets/svg/pace-logo-black.svg\" alt=\"Logo\"\u003e\n   \u003cimg src=\"./assets/svg/pace-logo-orange-outline.svg\" alt=\"Logo\"\u003e --\u003e\n  \u003c/a\u003e\n\n\u003ch3 align=\"center\"\u003ePACE \u0026#8212; Policy As Code Engine\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    The open-source Data Security Engine.\n    \u003cbr /\u003e\n    \u003ca href=\"https://getstrm.com\"\u003e\u003cstrong\u003eLearn more »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://join.slack.com/t/pace-getstrm/shared_invite/zt-27egzg7ye-iGANVdQZO6ov6ZMVzmsA4Q\"\u003eSlack\u003c/a\u003e\n    ·\n    \u003ca href=\"https://getstrm.com\"\u003eWebsite\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/getstrm/pace/issues\"\u003eIssues\u003c/a\u003e\n    ·\n    \u003ca href=\"https://pace.getstrm.com/docs/\"\u003eDocs\u003c/a\u003e\n    ·\n    \u003ca href=\"https://pace.getstrm.com/docs/integrations-and-reference/roadmap\"\u003eRoadmap\u003c/a\u003e\n    ·\n    \u003ca href=\"https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2LEfEsn2MEyofbffgDmtVP32lvvYi209gTuIZ33YOBbTIw9j9KjH90MFrrNXsjAE3nTuLYfUqA\"\u003eBook a meeting\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n   \u003ca href=\"https://github.com/getstrm/pace/tree/alpha\"\u003e\u003cimg src=\"https://img.shields.io/badge/release_status-alpha-orange\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://join.slack.com/t/pace-getstrm/shared_invite/zt-27egzg7ye-iGANVdQZO6ov6ZMVzmsA4Q\"\u003e\u003cimg src=\"https://img.shields.io/badge/Slack-PACE-%2336C5F0?logo=slack\" alt=\"Join PACE on Slack\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/getstrm/pace/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/getstrm/pace\" alt=\"Github Stars\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/getstrm/pace/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/getstrm/pace?include_prereleases\u0026label=release\u0026logo=github\" alt=\"Latest release\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/getstrm/pace/blob/alpha/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-Apache License 2.0-2EB67D\" alt=\"License\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/getstrm/pace/pulse\"\u003e\u003cimg src=\"https://img.shields.io/github/commit-activity/m/getstrm/pace\" alt=\"Commits-per-month\"\u003e\u003c/a\u003e\n   \u003ca href=\"CODE_OF_CONDUCT.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/Contributor%20Covenant-2.1-ECB22E.svg\" alt=\"Contributor Covenant\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e PACE is the _Policy As Code Engine_. It helps you to programmatically create and apply a data policy to a\n\u003e processing platform (like Databricks, Snowflake or BigQuery). Through a data contract, you can apply filters, field\n\u003e transforms, tag-based conditions and access settings to create a view inside a data platform. With Pace, you can enforce\n\u003e policies to data to ensure that data is only used by those allowed and in the way it was intended to be used.\n\nFollow the [quickstart](https://pace.getstrm.com/docs/readme/quickstart) if you want to dive right in, [join on Slack](https://join.slack.com/t/pace-getstrm/shared_invite/zt-27egzg7ye-iGANVdQZO6ov6ZMVzmsA4Q) to discuss with us, and use issues and PR's if you want to contribute or miss a feature!\n\n## Motivation and problem\n\nPACE is designed to remove friction and cost from using data in real-world organisational settings. In other words:\ndefine and implement a policy to \"just build\" with data, instead of jumping through hoop after hoop.\n\nIf (one of) these sound familiar and you're using one of the currently supported platforms, PACE is worth a try:\n\n* You have to navigate many (competing) policies, constraints and stakeholders to access data.\n* The data approval process is complicated, costly and lengthy. \"Approval\" is only a ticket, configuration is not done\n  automatically.\n* Data policies cannot be configured uniformly over hybrid and multi-cloud setups.\n* Governance and processing are done in different, unconnected tools.\n\n## Positioning\n\nOnce installed, PACE sits between your data definitions (often a catalog) and processing platform. The deep dive below\nprovides more background.\n\n## Supported platforms\n\nPace currently supports Collibra, Datahub and Open Data Discovery on the catalog side, connecting to Snowflake,\nDatabricks, Google BigQuery, and PostgreSQL for creating your dynamic views.\n\n## Supported policy methods\n\nIt's early for PACE (we're in alpha). The following policy methods are currently available,\nand when put together form \"rule sets\", the basis of data policies in PACE:\n\n- Field transforms, e.g. \"replace everything before the @ in the column `email`, or \"nullify the `phone number`\", including access definitions to differentiate between data consumers.\n- Filter conditions, e.g. \"analysts in Greece can only see transaction from our Greek stores\".\n- Tag-based rules, e.g. \"do `something` if data is tagged `Greece`\".\n- Global rule sets, e.g. \"All data tagged `PII` should always be masked\".\n\nThese policy methods can be layered to create a powerful programmatic interface to define, implement, maintain and\nupdate policies. Create an issue if you think a valuable policy method is missing!\n\n## Let's go\n\nTo install and use PACE, you need:\n\n- The PACE app (as Spring Boot app or Docker image)\n- The PACE CLI to interact with your deployment\n\n## Learn more\n\nHead over to the [docs](https://pace.getstrm.com/docs/readme/quickstart) for more info, [join on Slack](https://join.slack.com/t/pace-getstrm/shared_invite/zt-27egzg7ye-iGANVdQZO6ov6ZMVzmsA4Q) to discuss or reach out to the [STRM](https://getstrm.com/contact) team for more info and/or to test and implement PACE together.\n\n## Deep dive\n\nPACE is built to connect the world of descriptive data tools to the actual data processing platforms (where all that\ndata stuff takes place!).\n\nIt's designed to make sure your data governance can follow this pattern:\n\u003e Various **data consumers** (1), should only be shown **a representation of data** (2) that is **tailored to who they\nare and what they're allowed to see** (3), regardless of **the data catalog** (4) in which they explore and find data,\n\u003e and regardless of the **data processing platform** (5) on which they consume the data.\n\n### Definitions\n\n1. **Data Consumers**  \n   The end-user that uses data for a specific purpose, i.e. a Data Analyst or Data Scientist\n2. **Representation of the data**  \n   End-users should not see the raw data, but a representation of these data. This way the access to the raw data can be\n   limited to those that administer these data.\n3. **Tailored to who they are and what they're allowed to see**  \n   Classically this is about authentication and authorization. The difference here, is that these are used as inputs for\n   the actual representation of the data, instead of classical RBAC.\n4. **The Data Catalog**  \n   Data catalogs are used as a central marketplace for producers and consumers of data. Therefore, a system that is able\n   to create representations of data, should be able to integrate with data catalogs.\n5. **The Data Processing Platform**  \n   Data processing platforms often have various responsibilities, but it at least includes a storage layer (e.g. data\n   lake / data warehouse) and an interfacing layer to the storage layer. This is where producers store data and where\n   consumers use data.\n\n### Solution\n\nTo solve this, PACE focuses on creating representations of data (e.g. by generating views), based on so-called **Data\nPolicies**.\n\nA [**Data Policy**](https://github.com/getstrm/pace/blob/alpha/protos/getstrm/pace/api/entities/v1alpha/entities.proto)\nis a structured (human-defined but machine-readable) document, that aims at capturing how source data should be\npresented to various\nprincipals (i.e. a data accessor), and which transformations should be applied to the data, to create a representation\nof the source data on the data processing platform.\n\nData Policies are constructed by retrieving the data schema (the structure of the data) from either a data catalog or a\ndata processing platform. Next, various rule sets can be created, that determine how source data is transformed and/or\nfiltered to create a representation of data on the processing platform.\nDefining rule sets is a cooperation between various teams: data consumers, data producers, and most important, the legal\nteam.\n\n\u003e Want to learn more about how to facilitate this cooperation between various teams? Navigate\n\u003e to https://pace.getstrm.com to see how we can help you!\n\n### Brand assets\nLooking for a visual of PACE to include somewhere (preferably the blog you're writing about that awesome PACE use case!)? Please use one of the variations of the PACE logo to match your brand style and include the link to this repo:\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/getstrm/pace\"\u003e\n   \u003cimg src=\"./assets/svg/pace-logo-orange-filled.svg\" alt=\"Logo\"\u003e\n   \u003cimg src=\"./assets/svg/pace-logo-black.svg\" alt=\"Logo\"\u003e\n   \u003cimg src=\"./assets/svg/pace-logo-orange-outline.svg\" alt=\"Logo\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n","funding_links":[],"categories":["Workflow"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetstrm%2Fpace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetstrm%2Fpace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetstrm%2Fpace/lists"}