Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdOtl-0005Yj-1x for pgsql-announce@arkaria.postgresql.org; Wed, 07 Jan 2026 08:28:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vdOtk-00CjEc-10 for pgsql-announce@arkaria.postgresql.org; Wed, 07 Jan 2026 08:28:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdOtj-00CjEK-0s for pgsql-announce@lists.postgresql.org; Wed, 07 Jan 2026 08:28:08 +0000 Received: from mahout.postgresql.org ([2001:4800:3e1:1::227]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdOth-004gMR-1X for pgsql-announce@lists.postgresql.org; Wed, 07 Jan 2026 08:28:07 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Message-ID:Date:Reply-To:From:To:Subject: MIME-Version:Content-Type:Sender:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:In-Reply-To:References; bh=2QiY4wTsMlyLv8WNA1m4nay7UOWMv//aa2t882ac3Gg=; b=1aKELdorDhaJxq3YNdNhsFSFyr e5LbHEn7kkfgIj6YfI5FFtv2n5y8yV2u6hM+hWCA2ro6Og+yOxvEyHFQvJxChUnxqRo/symMVk7sf Eo+NSHJT6bAL0Q1k5C0lRWbjPXPdCarIfJaa5Yx6MpzkFdWv2CFe52hQ/+5JT2t6Umob+GzFn81jO ODzRxxOrNGdVnNOSepBWY/zldTfUGhz2yl+3203+KwuhnKvGKC73yHErIV6alVW0t91lBEuaxCRyR mNnPtoNcSpzuANLm3Mxf2WD3NETnf6gsZXwc43+NNK9RI9Y1yjXVdDnR03tsH05OnJjwCVbM/A8bs 1Z+mp+0Q==; Received: from wrigleys.postgresql.org ([2a02:16a8:dc51::60]) by mahout.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vdOtg-00Dj08-2T for pgsql-announce@lists.postgresql.org; Wed, 07 Jan 2026 08:28:04 +0000 Received: from localhost ([127.0.0.1] helo=wrigleys.postgresql.org) by wrigleys.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vdOte-005hKt-1I for pgsql-announce@lists.postgresql.org; Wed, 07 Jan 2026 08:28:03 +0000 Content-Type: multipart/mixed; boundary="===============7686901760775230585==" MIME-Version: 1.0 Subject: Introducing pgpm: A Package Manager for Modular PostgreSQL To: PostgreSQL Announce From: Constructive via PostgreSQL Announce Reply-To: developers@constructive.io Date: Wed, 07 Jan 2026 08:27:22 +0000 Message-ID: <176777444253.1084079.12409976411087842190@wrigleys.postgresql.org> X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-pglister-tags: related X-pglister-tagsig: 9a559de9546abfb63aeda71d52a53cadb7d783867b3af0582eb372959fd9d70b List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --===============7686901760775230585== Content-Type: multipart/alternative; boundary="===============6613922753152994791==" MIME-Version: 1.0 --===============6613922753152994791== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable PostgreSQL has a rich ecosystem of extensions=E2=80=94versioned, installabl= e components that extend the database engine itself. Extensions have enable= d powerful capabilities such as custom data types, operators, and index met= hods, and they remain a cornerstone of the PostgreSQL ecosystem. But application developers face a different problem. They want to **share and reuse application-level PostgreSQL logic**: schema= s, tables, functions, row-level security policies, and triggers written in = pure SQL. While PostgreSQL provides excellent primitives, there has never b= een a standard, application-layer workflow to publish, install, test, and v= ersion this kind of reusable database logic. PostgreSQL extensions have historically been the primary first-class mechan= ism for packaging database functionality. While they are well-suited for sy= stem-level features, extensions are often constrained or selectively suppor= ted on managed PostgreSQL services, making them a poor fit for sharing appl= ication-layer SQL across environments. [pgpm](https://pgpm.io) addresses this gap. It brings modular packaging, dependency management, and versioned distribut= ion to application-level PostgreSQL code=E2=80=94giving developers a first-= class way to package, test, and reuse database logic as part of their norma= l development workflow. ## The Reuse Problem in Database Development In application development, reuse is fundamental. Developers compose system= s from packages=E2=80=94declaring dependencies, resolving version constrain= ts, and relying on tooling to install components in the correct order. This= modularity accelerates development and enables entire ecosystems of shared= building blocks. Database development has historically lacked this layer. Most teams still m= anage database changes as linear migration files=E2=80=94often copied betwe= en projects, with limited reuse, weak dependency modeling, and no standard = way to publish tested schema modules as installable units. pgpm brings this layer to database development. It doesn't replace migratio= ns=E2=80=94it organizes them into reusable, versioned modules with explicit= dependencies. ## Application-Layer Modules pgpm operates at the **application layer,** where developers define schemas= , tables, functions, policies, and other database logic directly in SQL. Th= is is the layer where application behavior is expressed, rather than where = the database engine itself is extended. Greg Kemnitz, who served as Chief Programmer on the original Postgres proje= ct at UC Berkeley and worked on the original implementation with Michael St= onebraker, put it this way: > "What pgpm is doing isn't extension management=E2=80=94it's application-l= evel modularity for Postgres. That distinction matters, because it lets dev= elopers think about their database the same way they think about their appl= ication: as composable, installable building blocks." Because pgpm modules are written in pure SQL, they run with standard databa= se permissions and do not require compilation or superuser access. They can= be deployed consistently across local development, CI, and managed Postgre= s environments, making them practical to share and reuse across teams and p= latforms. When traditional deployment models require it, the same modules can also be= packaged as native PostgreSQL extensions=E2=80=94without changing the unde= rlying application-level design. ## Workspaces and Modules pgpm organizes database development around [**workspaces**](https://constru= ctive.io/learn/modular-postgres/workspaces-organize-postgres) that contain = multiple related modules. A workspace provides shared configuration and a c= lear structure for composing modules together, while each module remains se= lf-contained with its own migrations, dependencies, and version. This structure encourages small, focused modules and makes dependency relat= ionships explicit. When deploying or testing, pgpm scans the workspace, bui= lds the full dependency graph across modules, and applies changes in the co= rrect order automatically. This workflow promotes modular design and enable= s test-driven development against real PostgreSQL from the start. ## What pgpm Does pgpm is a package manager for PostgreSQL that manages database modules=E2= =80=94self-contained packages of schemas, tables, functions, policies, and = triggers. Key characteristics: * **Modules declare dependencies explicitly.** pgpm resolves dependency gra= phs and deploys changes in the correct order. * **Every change is reversible.** Each migration includes deploy, revert, a= nd verify scripts. * **Modules are distributed via npm.** npm acts as the artifact registry fo= r versioned SQL modules. * **Portable by default.** Modules run with standard database permissions a= nd can be deployed consistently across local, CI, and managed PostgreSQL en= vironments. * **Structured boilerplates.** pgpm provides a consistent workspace and mod= ule layout, allowing developers to scaffold new projects quickly and adopt = modular, test-driven workflows from the start. * **First-class testability.** Modules are designed to be tested end-to-end= against real PostgreSQL, including validation of Row-Level Security (RLS) = policies as part of normal development and CI workflows. ## Testing and Deployment pgpm encourages end-to-end, test-driven database development against real P= ostgreSQL instances. Workspaces can include CI/CD workflows by default, mak= ing it straightforward to spin up ephemeral databases, install versioned mo= dules, run integration tests, and tear them down automatically. The underly= ing test harness is provided by [pgsql-test](https://constructive.io/stack/= pgsql-test). This approach treats schemas, RLS policies, functions, and triggers as test= able units rather than mocks, and works consistently across local developme= nt, CI, and platform-specific workflows. ## Design Philosophy pgpm draws inspiration from David Wheeler=E2=80=99s Sqitch and builds aroun= d its file format and workflow=E2=80=94framework-free, pure SQL, and human-= readable change files=E2=80=94while extending those ideas beyond individual= projects into a modular, application-layer packaging system for PostgreSQL= . The key extension is recursive composition: modules can depend on other m= odules, and pgpm resolves and deploys the full dependency graph determinist= ically. By staying low-level and Postgres-native, pgpm keeps developers clo= se to the database without introducing an ORM abstraction. This foundation has proven adaptable across very different parts of the Pos= tgreSQL ecosystem, from packaging full backend platforms such as Supabase f= or isolated testing against real infrastructure to integrating cleanly with= developer-first ORMs like Drizzle. Where pgpm extends these ideas is in tr= eating PostgreSQL schemas as modular, composable units with deterministic i= nstalls, dependency resolution, and first-class testing. ## Getting Started pgpm is open source and available via npm. * Project site: [pgpm](https://pgpm.io) * Documentation and tutorials: [constructive.io/learn](https://constructive= .io/learn) The PostgreSQL ecosystem has long benefited from shared knowledge and reusa= ble components. pgpm aims to make that sharing easier at the application la= yer=E2=80=94so the next time you build something useful, you can package it= for others to use. As more teams adopt modular patterns, the ecosystem compounds: shared authe= ntication schemas, tested RLS policies, auditing modules that work out of t= he box. One long-term goal is not just better tooling, but shared infrastru= cture that makes PostgreSQL applications easier to build and maintain. --===============6613922753152994791== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Introducing pgpm: A Package Manager for Modular PostgreSQL</titl= e> <style> @media only screen and (max-width: 620px) { table[class=3Dbody] h1 { font-size: 28px !important; margin-bottom: 10px !important; } table[class=3Dbody] p, table[class=3Dbody] ul, table[class=3Dbody] ol, table[class=3Dbody] td, table[class=3Dbody] span, table[class=3Dbody] a { font-size: 16px !important; } table[class=3Dbody] .wrapper, table[class=3Dbody] .article { padding: 10px !important; } table[class=3Dbody] .content { padding: 0 !important; } table[class=3Dbody] .container { padding: 0 !important; width: 100% !important; } table[class=3Dbody] .main { border-left-width: 0 !important; border-radius: 0 !important; border-right-width: 0 !important; } table[class=3Dbody] .btn table { width: 100% !important; } table[class=3Dbody] .btn a { width: 100% !important; } table[class=3Dbody] .img-responsive { height: auto !important; max-width: 100% !important; width: auto !important; } } @media all { .ExternalClass { width: 100%; } .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div { line-height: 100%; } .apple-link a { color: inherit !important; font-family: inherit !important; font-size: inherit !important; font-weight: inherit !important; line-height: inherit !important; text-decoration: none !important; } #MessageViewBody a { color: inherit; text-decoration: none; font-size: inherit; font-family: inherit; font-weight: inherit; line-height: inherit; } .btn-primary table td:hover { background-color: #34495e !important; } .btn-primary a:hover { background-color: #34495e !important; border-color: #34495e !important; } } </style> </head> <body class=3D"" style=3D"background-color: #f6f6f6; font-family: sans-se= rif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4= ; margin: 0; padding: 0; -ms-text-size-adjust: 100%; -webkit-text-size-adju= st: 100%;"> <table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" class=3D"body" = style=3D"border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace= : 0pt; width: 100%; background-color: #f6f6f6;"> <tr> <td style=3D"font-family: sans-serif; font-size: 14px; vertical-ali= gn: top;"> </td> <td class=3D"container" style=3D"font-family: sans-serif; font-size= : 14px; vertical-align: top; display: block; Margin: 0 auto; max-width: 580= px; padding: 10px; width: 580px;"> <div class=3D"content" style=3D"box-sizing: border-box; display: = block; Margin: 0 auto; max-width: 580px; padding: 10px;"> <span class=3D"preheader" style=3D"color: transparent; display:= none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden= ; mso-hide: all; visibility: hidden; width: 0;"></span> <table class=3D"main" style=3D"border-collapse: separate; mso-t= able-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: #ffffff; = border-radius: 3px;"> <tr> <td class=3D"wrapper" style=3D"font-family: sans-serif; fon= t-size: 14px; vertical-align: top; box-sizing: border-box; padding: 20px;"> <table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" s= tyle=3D"border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace:= 0pt; width: 100%;"> <tr> <td style=3D"font-family: sans-serif; font-size: 14px= ; vertical-align: top;"> <div> <h1 style=3D"color: #000; font-family: sans-serif; line-height: 1.4; margin= : 0; margin-bottom: 30px; font-size: 25px; font-weight: 300; text-align: ce= nter">Introducing pgpm: A Package Manager for Modular PostgreSQL</h1> </div> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">PostgreSQL has a rich ecosystem of extensio= ns=E2=80=94versioned, installable components that extend the database engin= e itself. Extensions have enabled powerful capabilities such as custom data= types, operators, and index methods, and they remain a cornerstone of the = PostgreSQL ecosystem.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">But application developers face a different= problem.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">They want to <strong>share and reuse applic= ation-level PostgreSQL logic</strong>: schemas, tables, functions, row-leve= l security policies, and triggers written in pure SQL. While PostgreSQL pro= vides excellent primitives, there has never been a standard, application-la= yer workflow to publish, install, test, and version this kind of reusable d= atabase logic.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">PostgreSQL extensions have historically bee= n the primary first-class mechanism for packaging database functionality. W= hile they are well-suited for system-level features, extensions are often c= onstrained or selectively supported on managed PostgreSQL services, making = them a poor fit for sharing application-layer SQL across environments.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px"><a href=3D"https://pgpm.io" style=3D"color:= #3498db; text-decoration: underline">pgpm</a> addresses this gap.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">It brings modular packaging, dependency man= agement, and versioned distribution to application-level PostgreSQL code=E2= =80=94giving developers a first-class way to package, test, and reuse datab= ase logic as part of their normal development workflow.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">The Reuse Problem in Database D= evelopment</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">In application development, reuse is fundam= ental. Developers compose systems from packages=E2=80=94declaring dependenc= ies, resolving version constraints, and relying on tooling to install compo= nents in the correct order. This modularity accelerates development and ena= bles entire ecosystems of shared building blocks.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">Database development has historically lacke= d this layer. Most teams still manage database changes as linear migration = files=E2=80=94often copied between projects, with limited reuse, weak depen= dency modeling, and no standard way to publish tested schema modules as ins= tallable units.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm brings this layer to database developm= ent. It doesn't replace migrations=E2=80=94it organizes them into reusable,= versioned modules with explicit dependencies.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">Application-Layer Modules</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm operates at the <strong>application la= yer,</strong> where developers define schemas, tables, functions, policies,= and other database logic directly in SQL. This is the layer where applicat= ion behavior is expressed, rather than where the database engine itself is = extended.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">Greg Kemnitz, who served as Chief Programme= r on the original Postgres project at UC Berkeley and worked on the origina= l implementation with Michael Stonebraker, put it this way:</p> <blockquote> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">"What pgpm is doing isn't extension managem= ent=E2=80=94it's application-level modularity for Postgres. That distinctio= n matters, because it lets developers think about their database the same w= ay they think about their application: as composable, installable building = blocks."</p> </blockquote> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">Because pgpm modules are written in pure SQ= L, they run with standard database permissions and do not require compilati= on or superuser access. They can be deployed consistently across local deve= lopment, CI, and managed Postgres environments, making them practical to sh= are and reuse across teams and platforms.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">When traditional deployment models require = it, the same modules can also be packaged as native PostgreSQL extensions= =E2=80=94without changing the underlying application-level design.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">Workspaces and Modules</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm organizes database development around = <a href=3D"https://constructive.io/learn/modular-postgres/workspaces-organi= ze-postgres" style=3D"color: #3498db; text-decoration: underline"><strong>w= orkspaces</strong></a> that contain multiple related modules. A workspace p= rovides shared configuration and a clear structure for composing modules to= gether, while each module remains self-contained with its own migrations, d= ependencies, and version.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">This structure encourages small, focused mo= dules and makes dependency relationships explicit. When deploying or testin= g, pgpm scans the workspace, builds the full dependency graph across module= s, and applies changes in the correct order automatically. This workflow pr= omotes modular design and enables test-driven development against real Post= greSQL from the start.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">What pgpm Does</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm is a package manager for PostgreSQL th= at manages database modules=E2=80=94self-contained packages of schemas, tab= les, functions, policies, and triggers.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">Key characteristics:</p> <ul style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal;= margin: 0; margin-bottom: 15px"> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>Modules= declare dependencies explicitly.</strong> pgpm resolves dependency graphs = and deploys changes in the correct order.</li> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>Every c= hange is reversible.</strong> Each migration includes deploy, revert, and v= erify scripts.</li> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>Modules= are distributed via npm.</strong> npm acts as the artifact registry for ve= rsioned SQL modules.</li> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>Portabl= e by default.</strong> Modules run with standard database permissions and c= an be deployed consistently across local, CI, and managed PostgreSQL enviro= nments.</li> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>Structu= red boilerplates.</strong> pgpm provides a consistent workspace and module = layout, allowing developers to scaffold new projects quickly and adopt modu= lar, test-driven workflows from the start.</li> <li style=3D"list-style-position: inside; margin-left: 5px"><strong>First-c= lass testability.</strong> Modules are designed to be tested end-to-end aga= inst real PostgreSQL, including validation of Row-Level Security (RLS) poli= cies as part of normal development and CI workflows.</li> </ul> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">Testing and Deployment</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm encourages end-to-end, test-driven dat= abase development against real PostgreSQL instances. Workspaces can include= CI/CD workflows by default, making it straightforward to spin up ephemeral= databases, install versioned modules, run integration tests, and tear them= down automatically. The underlying test harness is provided by <a href=3D"= https://constructive.io/stack/pgsql-test" style=3D"color: #3498db; text-dec= oration: underline">pgsql-test</a>.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">This approach treats schemas, RLS policies,= functions, and triggers as testable units rather than mocks, and works con= sistently across local development, CI, and platform-specific workflows.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">Design Philosophy</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm draws inspiration from David Wheeler= =E2=80=99s Sqitch and builds around its file format and workflow=E2=80=94fr= amework-free, pure SQL, and human-readable change files=E2=80=94while exten= ding those ideas beyond individual projects into a modular, application-lay= er packaging system for PostgreSQL. The key extension is recursive composit= ion: modules can depend on other modules, and pgpm resolves and deploys the= full dependency graph deterministically. By staying low-level and Postgres= -native, pgpm keeps developers close to the database without introducing an= ORM abstraction.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">This foundation has proven adaptable across= very different parts of the PostgreSQL ecosystem, from packaging full back= end platforms such as Supabase for isolated testing against real infrastruc= ture to integrating cleanly with developer-first ORMs like Drizzle. Where p= gpm extends these ideas is in treating PostgreSQL schemas as modular, compo= sable units with deterministic installs, dependency resolution, and first-c= lass testing.</p> <h2 style=3D"color: #000; font-family: sans-serif; font-weight: 400; line-h= eight: 1.4; margin: 0; margin-bottom: 30px">Getting Started</h2> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">pgpm is open source and available via npm.<= /p> <ul style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal;= margin: 0; margin-bottom: 15px"> <li style=3D"list-style-position: inside; margin-left: 5px">Project site: <= a href=3D"https://pgpm.io" style=3D"color: #3498db; text-decoration: underl= ine">pgpm</a></li> <li style=3D"list-style-position: inside; margin-left: 5px">Documentation a= nd tutorials: <a href=3D"https://constructive.io/learn" style=3D"color: #34= 98db; text-decoration: underline">constructive.io/learn</a></li> </ul> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">The PostgreSQL ecosystem has long benefited= from shared knowledge and reusable components. pgpm aims to make that shar= ing easier at the application layer=E2=80=94so the next time you build some= thing useful, you can package it for others to use.</p> <p style=3D"font-family: sans-serif; font-size: 14px; font-weight: normal; = margin: 0; margin-bottom: 15px">As more teams adopt modular patterns, the e= cosystem compounds: shared authentication schemas, tested RLS policies, aud= iting modules that work out of the box. One long-term goal is not just bett= er tooling, but shared infrastructure that makes PostgreSQL applications ea= sier to build and maintain.</p> </td> </tr> </table> </td> </tr> </table> <div class=3D"footer" style=3D"clear: both; Margin-top: 10px; t= ext-align: center; width: 100%;"> <table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" style= =3D"border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt= ; width: 100%;"> <tr> <td class=3D"content-block" style=3D"font-family: sans-se= rif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; font-siz= e: 12px; color: #999999; text-align: center;"> <span class=3D"apple-link" style=3D"color: #999999; fon= t-size: 12px; text-align: center;"> This email was sent to you from Constructive. It was delivered on their beh= alf by the PostgreSQL project. Any questions about the content of the message shou= ld be sent to Constructive. </span> <br><br> You were sent this email as a subscriber of the <em>pgsql-announce</em> mai= linglist, for the content tag Related Open Source. To unsubscribe from further emails, or change which emails you want to receive, please click th= e personal unsubscribe link that you can find in the headers of this email, or visit <a href=3D"https://lists.postgresql.org/unsubscribe/" style=3D"color: #3498= db; text-decoration: underline">https://lists.postgresql.org/unsubscribe/</= a>. </td> </tr> </table> </div> </div> </td> <td style=3D"font-family: sans-serif; font-size: 14px; vertical-ali= gn: top;"> </td> </tr> </table> </body> </html> --===============6613922753152994791==-- --===============7686901760775230585==--