diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Elastic Container Registry Public SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-10-30@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-ecr-public)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.ECRPublic](http://hackage.haskell.org/package/amazonka-ecr-public/docs/Amazonka-ECRPublic.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-ecr-public` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-ecr-public.cabal b/amazonka-ecr-public.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-ecr-public.cabal
@@ -0,0 +1,126 @@
+cabal-version:      2.2
+name:               amazonka-ecr-public
+version:            2.0
+synopsis:           Amazon Elastic Container Registry Public SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2020-10-30@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.ECRPublic.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.ECRPublic" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-ecr-public
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.ECRPublic
+    Amazonka.ECRPublic.BatchCheckLayerAvailability
+    Amazonka.ECRPublic.BatchDeleteImage
+    Amazonka.ECRPublic.CompleteLayerUpload
+    Amazonka.ECRPublic.CreateRepository
+    Amazonka.ECRPublic.DeleteRepository
+    Amazonka.ECRPublic.DeleteRepositoryPolicy
+    Amazonka.ECRPublic.DescribeImages
+    Amazonka.ECRPublic.DescribeImageTags
+    Amazonka.ECRPublic.DescribeRegistries
+    Amazonka.ECRPublic.DescribeRepositories
+    Amazonka.ECRPublic.GetAuthorizationToken
+    Amazonka.ECRPublic.GetRegistryCatalogData
+    Amazonka.ECRPublic.GetRepositoryCatalogData
+    Amazonka.ECRPublic.GetRepositoryPolicy
+    Amazonka.ECRPublic.InitiateLayerUpload
+    Amazonka.ECRPublic.Lens
+    Amazonka.ECRPublic.ListTagsForResource
+    Amazonka.ECRPublic.PutImage
+    Amazonka.ECRPublic.PutRegistryCatalogData
+    Amazonka.ECRPublic.PutRepositoryCatalogData
+    Amazonka.ECRPublic.SetRepositoryPolicy
+    Amazonka.ECRPublic.TagResource
+    Amazonka.ECRPublic.Types
+    Amazonka.ECRPublic.Types.AuthorizationData
+    Amazonka.ECRPublic.Types.Image
+    Amazonka.ECRPublic.Types.ImageDetail
+    Amazonka.ECRPublic.Types.ImageFailure
+    Amazonka.ECRPublic.Types.ImageFailureCode
+    Amazonka.ECRPublic.Types.ImageIdentifier
+    Amazonka.ECRPublic.Types.ImageTagDetail
+    Amazonka.ECRPublic.Types.Layer
+    Amazonka.ECRPublic.Types.LayerAvailability
+    Amazonka.ECRPublic.Types.LayerFailure
+    Amazonka.ECRPublic.Types.LayerFailureCode
+    Amazonka.ECRPublic.Types.ReferencedImageDetail
+    Amazonka.ECRPublic.Types.Registry
+    Amazonka.ECRPublic.Types.RegistryAlias
+    Amazonka.ECRPublic.Types.RegistryAliasStatus
+    Amazonka.ECRPublic.Types.RegistryCatalogData
+    Amazonka.ECRPublic.Types.Repository
+    Amazonka.ECRPublic.Types.RepositoryCatalogData
+    Amazonka.ECRPublic.Types.RepositoryCatalogDataInput
+    Amazonka.ECRPublic.Types.Tag
+    Amazonka.ECRPublic.UntagResource
+    Amazonka.ECRPublic.UploadLayerPart
+    Amazonka.ECRPublic.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-ecr-public-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.ECRPublic
+    Test.Amazonka.ECRPublic.Internal
+    Test.Amazonka.Gen.ECRPublic
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-ecr-public
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchCheckLayerAvailability.yaml b/fixture/BatchCheckLayerAvailability.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCheckLayerAvailability.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchCheckLayerAvailabilityResponse.proto b/fixture/BatchCheckLayerAvailabilityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCheckLayerAvailabilityResponse.proto
diff --git a/fixture/BatchDeleteImage.yaml b/fixture/BatchDeleteImage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteImage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchDeleteImageResponse.proto b/fixture/BatchDeleteImageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteImageResponse.proto
diff --git a/fixture/CompleteLayerUpload.yaml b/fixture/CompleteLayerUpload.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CompleteLayerUpload.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CompleteLayerUploadResponse.proto b/fixture/CompleteLayerUploadResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CompleteLayerUploadResponse.proto
diff --git a/fixture/CreateRepository.yaml b/fixture/CreateRepository.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRepository.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateRepositoryResponse.proto b/fixture/CreateRepositoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRepositoryResponse.proto
diff --git a/fixture/DeleteRepository.yaml b/fixture/DeleteRepository.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRepository.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteRepositoryPolicy.yaml b/fixture/DeleteRepositoryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteRepositoryPolicyResponse.proto b/fixture/DeleteRepositoryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRepositoryPolicyResponse.proto
diff --git a/fixture/DeleteRepositoryResponse.proto b/fixture/DeleteRepositoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRepositoryResponse.proto
diff --git a/fixture/DescribeImageTags.yaml b/fixture/DescribeImageTags.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageTags.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeImageTagsResponse.proto b/fixture/DescribeImageTagsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageTagsResponse.proto
diff --git a/fixture/DescribeImages.yaml b/fixture/DescribeImages.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImages.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeImagesResponse.proto b/fixture/DescribeImagesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImagesResponse.proto
diff --git a/fixture/DescribeRegistries.yaml b/fixture/DescribeRegistries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRegistries.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeRegistriesResponse.proto b/fixture/DescribeRegistriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRegistriesResponse.proto
diff --git a/fixture/DescribeRepositories.yaml b/fixture/DescribeRepositories.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRepositories.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeRepositoriesResponse.proto b/fixture/DescribeRepositoriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRepositoriesResponse.proto
diff --git a/fixture/GetAuthorizationToken.yaml b/fixture/GetAuthorizationToken.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAuthorizationToken.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetAuthorizationTokenResponse.proto b/fixture/GetAuthorizationTokenResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAuthorizationTokenResponse.proto
diff --git a/fixture/GetRegistryCatalogData.yaml b/fixture/GetRegistryCatalogData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryCatalogData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetRegistryCatalogDataResponse.proto b/fixture/GetRegistryCatalogDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryCatalogDataResponse.proto
diff --git a/fixture/GetRepositoryCatalogData.yaml b/fixture/GetRepositoryCatalogData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRepositoryCatalogData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetRepositoryCatalogDataResponse.proto b/fixture/GetRepositoryCatalogDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRepositoryCatalogDataResponse.proto
diff --git a/fixture/GetRepositoryPolicy.yaml b/fixture/GetRepositoryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetRepositoryPolicyResponse.proto b/fixture/GetRepositoryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRepositoryPolicyResponse.proto
diff --git a/fixture/InitiateLayerUpload.yaml b/fixture/InitiateLayerUpload.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/InitiateLayerUpload.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/InitiateLayerUploadResponse.proto b/fixture/InitiateLayerUploadResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/InitiateLayerUploadResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/PutImage.yaml b/fixture/PutImage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutImage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutImageResponse.proto b/fixture/PutImageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutImageResponse.proto
diff --git a/fixture/PutRegistryCatalogData.yaml b/fixture/PutRegistryCatalogData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryCatalogData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutRegistryCatalogDataResponse.proto b/fixture/PutRegistryCatalogDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryCatalogDataResponse.proto
diff --git a/fixture/PutRepositoryCatalogData.yaml b/fixture/PutRepositoryCatalogData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRepositoryCatalogData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutRepositoryCatalogDataResponse.proto b/fixture/PutRepositoryCatalogDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRepositoryCatalogDataResponse.proto
diff --git a/fixture/SetRepositoryPolicy.yaml b/fixture/SetRepositoryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SetRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/SetRepositoryPolicyResponse.proto b/fixture/SetRepositoryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SetRepositoryPolicyResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UploadLayerPart.yaml b/fixture/UploadLayerPart.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UploadLayerPart.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr-public/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr-public.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UploadLayerPartResponse.proto b/fixture/UploadLayerPartResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UploadLayerPartResponse.proto
diff --git a/gen/Amazonka/ECRPublic.hs b/gen/Amazonka/ECRPublic.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic.hs
@@ -0,0 +1,377 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.ECRPublic
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2020-10-30@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Elastic Container Registry Public
+--
+-- Amazon Elastic Container Registry (Amazon ECR) is a managed container
+-- image registry service. Amazon ECR provides both public and private
+-- registries to host your container images. You can use the familiar
+-- Docker CLI, or their preferred client, to push, pull, and manage images.
+-- Amazon ECR provides a secure, scalable, and reliable registry for your
+-- Docker or Open Container Initiative (OCI) images. Amazon ECR supports
+-- public repositories with this API. For information about the Amazon ECR
+-- API for private repositories, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html Amazon Elastic Container Registry API Reference>.
+module Amazonka.ECRPublic
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** EmptyUploadException
+    _EmptyUploadException,
+
+    -- ** ImageAlreadyExistsException
+    _ImageAlreadyExistsException,
+
+    -- ** ImageDigestDoesNotMatchException
+    _ImageDigestDoesNotMatchException,
+
+    -- ** ImageNotFoundException
+    _ImageNotFoundException,
+
+    -- ** ImageTagAlreadyExistsException
+    _ImageTagAlreadyExistsException,
+
+    -- ** InvalidLayerException
+    _InvalidLayerException,
+
+    -- ** InvalidLayerPartException
+    _InvalidLayerPartException,
+
+    -- ** InvalidParameterException
+    _InvalidParameterException,
+
+    -- ** InvalidTagParameterException
+    _InvalidTagParameterException,
+
+    -- ** LayerAlreadyExistsException
+    _LayerAlreadyExistsException,
+
+    -- ** LayerPartTooSmallException
+    _LayerPartTooSmallException,
+
+    -- ** LayersNotFoundException
+    _LayersNotFoundException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ReferencedImagesNotFoundException
+    _ReferencedImagesNotFoundException,
+
+    -- ** RegistryNotFoundException
+    _RegistryNotFoundException,
+
+    -- ** RepositoryAlreadyExistsException
+    _RepositoryAlreadyExistsException,
+
+    -- ** RepositoryNotEmptyException
+    _RepositoryNotEmptyException,
+
+    -- ** RepositoryNotFoundException
+    _RepositoryNotFoundException,
+
+    -- ** RepositoryPolicyNotFoundException
+    _RepositoryPolicyNotFoundException,
+
+    -- ** ServerException
+    _ServerException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- ** UnsupportedCommandException
+    _UnsupportedCommandException,
+
+    -- ** UploadNotFoundException
+    _UploadNotFoundException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchCheckLayerAvailability
+    BatchCheckLayerAvailability (BatchCheckLayerAvailability'),
+    newBatchCheckLayerAvailability,
+    BatchCheckLayerAvailabilityResponse (BatchCheckLayerAvailabilityResponse'),
+    newBatchCheckLayerAvailabilityResponse,
+
+    -- ** BatchDeleteImage
+    BatchDeleteImage (BatchDeleteImage'),
+    newBatchDeleteImage,
+    BatchDeleteImageResponse (BatchDeleteImageResponse'),
+    newBatchDeleteImageResponse,
+
+    -- ** CompleteLayerUpload
+    CompleteLayerUpload (CompleteLayerUpload'),
+    newCompleteLayerUpload,
+    CompleteLayerUploadResponse (CompleteLayerUploadResponse'),
+    newCompleteLayerUploadResponse,
+
+    -- ** CreateRepository
+    CreateRepository (CreateRepository'),
+    newCreateRepository,
+    CreateRepositoryResponse (CreateRepositoryResponse'),
+    newCreateRepositoryResponse,
+
+    -- ** DeleteRepository
+    DeleteRepository (DeleteRepository'),
+    newDeleteRepository,
+    DeleteRepositoryResponse (DeleteRepositoryResponse'),
+    newDeleteRepositoryResponse,
+
+    -- ** DeleteRepositoryPolicy
+    DeleteRepositoryPolicy (DeleteRepositoryPolicy'),
+    newDeleteRepositoryPolicy,
+    DeleteRepositoryPolicyResponse (DeleteRepositoryPolicyResponse'),
+    newDeleteRepositoryPolicyResponse,
+
+    -- ** DescribeImageTags (Paginated)
+    DescribeImageTags (DescribeImageTags'),
+    newDescribeImageTags,
+    DescribeImageTagsResponse (DescribeImageTagsResponse'),
+    newDescribeImageTagsResponse,
+
+    -- ** DescribeImages (Paginated)
+    DescribeImages (DescribeImages'),
+    newDescribeImages,
+    DescribeImagesResponse (DescribeImagesResponse'),
+    newDescribeImagesResponse,
+
+    -- ** DescribeRegistries (Paginated)
+    DescribeRegistries (DescribeRegistries'),
+    newDescribeRegistries,
+    DescribeRegistriesResponse (DescribeRegistriesResponse'),
+    newDescribeRegistriesResponse,
+
+    -- ** DescribeRepositories (Paginated)
+    DescribeRepositories (DescribeRepositories'),
+    newDescribeRepositories,
+    DescribeRepositoriesResponse (DescribeRepositoriesResponse'),
+    newDescribeRepositoriesResponse,
+
+    -- ** GetAuthorizationToken
+    GetAuthorizationToken (GetAuthorizationToken'),
+    newGetAuthorizationToken,
+    GetAuthorizationTokenResponse (GetAuthorizationTokenResponse'),
+    newGetAuthorizationTokenResponse,
+
+    -- ** GetRegistryCatalogData
+    GetRegistryCatalogData (GetRegistryCatalogData'),
+    newGetRegistryCatalogData,
+    GetRegistryCatalogDataResponse (GetRegistryCatalogDataResponse'),
+    newGetRegistryCatalogDataResponse,
+
+    -- ** GetRepositoryCatalogData
+    GetRepositoryCatalogData (GetRepositoryCatalogData'),
+    newGetRepositoryCatalogData,
+    GetRepositoryCatalogDataResponse (GetRepositoryCatalogDataResponse'),
+    newGetRepositoryCatalogDataResponse,
+
+    -- ** GetRepositoryPolicy
+    GetRepositoryPolicy (GetRepositoryPolicy'),
+    newGetRepositoryPolicy,
+    GetRepositoryPolicyResponse (GetRepositoryPolicyResponse'),
+    newGetRepositoryPolicyResponse,
+
+    -- ** InitiateLayerUpload
+    InitiateLayerUpload (InitiateLayerUpload'),
+    newInitiateLayerUpload,
+    InitiateLayerUploadResponse (InitiateLayerUploadResponse'),
+    newInitiateLayerUploadResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutImage
+    PutImage (PutImage'),
+    newPutImage,
+    PutImageResponse (PutImageResponse'),
+    newPutImageResponse,
+
+    -- ** PutRegistryCatalogData
+    PutRegistryCatalogData (PutRegistryCatalogData'),
+    newPutRegistryCatalogData,
+    PutRegistryCatalogDataResponse (PutRegistryCatalogDataResponse'),
+    newPutRegistryCatalogDataResponse,
+
+    -- ** PutRepositoryCatalogData
+    PutRepositoryCatalogData (PutRepositoryCatalogData'),
+    newPutRepositoryCatalogData,
+    PutRepositoryCatalogDataResponse (PutRepositoryCatalogDataResponse'),
+    newPutRepositoryCatalogDataResponse,
+
+    -- ** SetRepositoryPolicy
+    SetRepositoryPolicy (SetRepositoryPolicy'),
+    newSetRepositoryPolicy,
+    SetRepositoryPolicyResponse (SetRepositoryPolicyResponse'),
+    newSetRepositoryPolicyResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UploadLayerPart
+    UploadLayerPart (UploadLayerPart'),
+    newUploadLayerPart,
+    UploadLayerPartResponse (UploadLayerPartResponse'),
+    newUploadLayerPartResponse,
+
+    -- * Types
+
+    -- ** ImageFailureCode
+    ImageFailureCode (..),
+
+    -- ** LayerAvailability
+    LayerAvailability (..),
+
+    -- ** LayerFailureCode
+    LayerFailureCode (..),
+
+    -- ** RegistryAliasStatus
+    RegistryAliasStatus (..),
+
+    -- ** AuthorizationData
+    AuthorizationData (AuthorizationData'),
+    newAuthorizationData,
+
+    -- ** Image
+    Image (Image'),
+    newImage,
+
+    -- ** ImageDetail
+    ImageDetail (ImageDetail'),
+    newImageDetail,
+
+    -- ** ImageFailure
+    ImageFailure (ImageFailure'),
+    newImageFailure,
+
+    -- ** ImageIdentifier
+    ImageIdentifier (ImageIdentifier'),
+    newImageIdentifier,
+
+    -- ** ImageTagDetail
+    ImageTagDetail (ImageTagDetail'),
+    newImageTagDetail,
+
+    -- ** Layer
+    Layer (Layer'),
+    newLayer,
+
+    -- ** LayerFailure
+    LayerFailure (LayerFailure'),
+    newLayerFailure,
+
+    -- ** ReferencedImageDetail
+    ReferencedImageDetail (ReferencedImageDetail'),
+    newReferencedImageDetail,
+
+    -- ** Registry
+    Registry (Registry'),
+    newRegistry,
+
+    -- ** RegistryAlias
+    RegistryAlias (RegistryAlias'),
+    newRegistryAlias,
+
+    -- ** RegistryCatalogData
+    RegistryCatalogData (RegistryCatalogData'),
+    newRegistryCatalogData,
+
+    -- ** Repository
+    Repository (Repository'),
+    newRepository,
+
+    -- ** RepositoryCatalogData
+    RepositoryCatalogData (RepositoryCatalogData'),
+    newRepositoryCatalogData,
+
+    -- ** RepositoryCatalogDataInput
+    RepositoryCatalogDataInput (RepositoryCatalogDataInput'),
+    newRepositoryCatalogDataInput,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+  )
+where
+
+import Amazonka.ECRPublic.BatchCheckLayerAvailability
+import Amazonka.ECRPublic.BatchDeleteImage
+import Amazonka.ECRPublic.CompleteLayerUpload
+import Amazonka.ECRPublic.CreateRepository
+import Amazonka.ECRPublic.DeleteRepository
+import Amazonka.ECRPublic.DeleteRepositoryPolicy
+import Amazonka.ECRPublic.DescribeImageTags
+import Amazonka.ECRPublic.DescribeImages
+import Amazonka.ECRPublic.DescribeRegistries
+import Amazonka.ECRPublic.DescribeRepositories
+import Amazonka.ECRPublic.GetAuthorizationToken
+import Amazonka.ECRPublic.GetRegistryCatalogData
+import Amazonka.ECRPublic.GetRepositoryCatalogData
+import Amazonka.ECRPublic.GetRepositoryPolicy
+import Amazonka.ECRPublic.InitiateLayerUpload
+import Amazonka.ECRPublic.Lens
+import Amazonka.ECRPublic.ListTagsForResource
+import Amazonka.ECRPublic.PutImage
+import Amazonka.ECRPublic.PutRegistryCatalogData
+import Amazonka.ECRPublic.PutRepositoryCatalogData
+import Amazonka.ECRPublic.SetRepositoryPolicy
+import Amazonka.ECRPublic.TagResource
+import Amazonka.ECRPublic.Types
+import Amazonka.ECRPublic.UntagResource
+import Amazonka.ECRPublic.UploadLayerPart
+import Amazonka.ECRPublic.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'ECRPublic'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/ECRPublic/BatchCheckLayerAvailability.hs b/gen/Amazonka/ECRPublic/BatchCheckLayerAvailability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/BatchCheckLayerAvailability.hs
@@ -0,0 +1,240 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.BatchCheckLayerAvailability
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Checks the availability of one or more image layers within a repository
+-- in a public registry. When an image is pushed to a repository, each
+-- image layer is checked to verify if it has been uploaded before. If it
+-- has been uploaded, then the image layer is skipped.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECRPublic.BatchCheckLayerAvailability
+  ( -- * Creating a Request
+    BatchCheckLayerAvailability (..),
+    newBatchCheckLayerAvailability,
+
+    -- * Request Lenses
+    batchCheckLayerAvailability_registryId,
+    batchCheckLayerAvailability_repositoryName,
+    batchCheckLayerAvailability_layerDigests,
+
+    -- * Destructuring the Response
+    BatchCheckLayerAvailabilityResponse (..),
+    newBatchCheckLayerAvailabilityResponse,
+
+    -- * Response Lenses
+    batchCheckLayerAvailabilityResponse_failures,
+    batchCheckLayerAvailabilityResponse_layers,
+    batchCheckLayerAvailabilityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchCheckLayerAvailability' smart constructor.
+data BatchCheckLayerAvailability = BatchCheckLayerAvailability'
+  { -- | The AWS account ID associated with the public registry that contains the
+    -- image layers to check. If you do not specify a registry, the default
+    -- public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that is associated with the image layers to
+    -- check.
+    repositoryName :: Prelude.Text,
+    -- | The digests of the image layers to check.
+    layerDigests :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCheckLayerAvailability' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'batchCheckLayerAvailability_registryId' - The AWS account ID associated with the public registry that contains the
+-- image layers to check. If you do not specify a registry, the default
+-- public registry is assumed.
+--
+-- 'repositoryName', 'batchCheckLayerAvailability_repositoryName' - The name of the repository that is associated with the image layers to
+-- check.
+--
+-- 'layerDigests', 'batchCheckLayerAvailability_layerDigests' - The digests of the image layers to check.
+newBatchCheckLayerAvailability ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'layerDigests'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchCheckLayerAvailability
+newBatchCheckLayerAvailability
+  pRepositoryName_
+  pLayerDigests_ =
+    BatchCheckLayerAvailability'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        layerDigests =
+          Lens.coerced Lens.# pLayerDigests_
+      }
+
+-- | The AWS account ID associated with the public registry that contains the
+-- image layers to check. If you do not specify a registry, the default
+-- public registry is assumed.
+batchCheckLayerAvailability_registryId :: Lens.Lens' BatchCheckLayerAvailability (Prelude.Maybe Prelude.Text)
+batchCheckLayerAvailability_registryId = Lens.lens (\BatchCheckLayerAvailability' {registryId} -> registryId) (\s@BatchCheckLayerAvailability' {} a -> s {registryId = a} :: BatchCheckLayerAvailability)
+
+-- | The name of the repository that is associated with the image layers to
+-- check.
+batchCheckLayerAvailability_repositoryName :: Lens.Lens' BatchCheckLayerAvailability Prelude.Text
+batchCheckLayerAvailability_repositoryName = Lens.lens (\BatchCheckLayerAvailability' {repositoryName} -> repositoryName) (\s@BatchCheckLayerAvailability' {} a -> s {repositoryName = a} :: BatchCheckLayerAvailability)
+
+-- | The digests of the image layers to check.
+batchCheckLayerAvailability_layerDigests :: Lens.Lens' BatchCheckLayerAvailability (Prelude.NonEmpty Prelude.Text)
+batchCheckLayerAvailability_layerDigests = Lens.lens (\BatchCheckLayerAvailability' {layerDigests} -> layerDigests) (\s@BatchCheckLayerAvailability' {} a -> s {layerDigests = a} :: BatchCheckLayerAvailability) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchCheckLayerAvailability where
+  type
+    AWSResponse BatchCheckLayerAvailability =
+      BatchCheckLayerAvailabilityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchCheckLayerAvailabilityResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "layers" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchCheckLayerAvailability where
+  hashWithSalt _salt BatchCheckLayerAvailability' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` layerDigests
+
+instance Prelude.NFData BatchCheckLayerAvailability where
+  rnf BatchCheckLayerAvailability' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf layerDigests
+
+instance Data.ToHeaders BatchCheckLayerAvailability where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.BatchCheckLayerAvailability" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchCheckLayerAvailability where
+  toJSON BatchCheckLayerAvailability' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("layerDigests" Data..= layerDigests)
+          ]
+      )
+
+instance Data.ToPath BatchCheckLayerAvailability where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchCheckLayerAvailability where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchCheckLayerAvailabilityResponse' smart constructor.
+data BatchCheckLayerAvailabilityResponse = BatchCheckLayerAvailabilityResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [LayerFailure],
+    -- | A list of image layer objects corresponding to the image layer
+    -- references in the request.
+    layers :: Prelude.Maybe [Layer],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCheckLayerAvailabilityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchCheckLayerAvailabilityResponse_failures' - Any failures associated with the call.
+--
+-- 'layers', 'batchCheckLayerAvailabilityResponse_layers' - A list of image layer objects corresponding to the image layer
+-- references in the request.
+--
+-- 'httpStatus', 'batchCheckLayerAvailabilityResponse_httpStatus' - The response's http status code.
+newBatchCheckLayerAvailabilityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchCheckLayerAvailabilityResponse
+newBatchCheckLayerAvailabilityResponse pHttpStatus_ =
+  BatchCheckLayerAvailabilityResponse'
+    { failures =
+        Prelude.Nothing,
+      layers = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Any failures associated with the call.
+batchCheckLayerAvailabilityResponse_failures :: Lens.Lens' BatchCheckLayerAvailabilityResponse (Prelude.Maybe [LayerFailure])
+batchCheckLayerAvailabilityResponse_failures = Lens.lens (\BatchCheckLayerAvailabilityResponse' {failures} -> failures) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {failures = a} :: BatchCheckLayerAvailabilityResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of image layer objects corresponding to the image layer
+-- references in the request.
+batchCheckLayerAvailabilityResponse_layers :: Lens.Lens' BatchCheckLayerAvailabilityResponse (Prelude.Maybe [Layer])
+batchCheckLayerAvailabilityResponse_layers = Lens.lens (\BatchCheckLayerAvailabilityResponse' {layers} -> layers) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {layers = a} :: BatchCheckLayerAvailabilityResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchCheckLayerAvailabilityResponse_httpStatus :: Lens.Lens' BatchCheckLayerAvailabilityResponse Prelude.Int
+batchCheckLayerAvailabilityResponse_httpStatus = Lens.lens (\BatchCheckLayerAvailabilityResponse' {httpStatus} -> httpStatus) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {httpStatus = a} :: BatchCheckLayerAvailabilityResponse)
+
+instance
+  Prelude.NFData
+    BatchCheckLayerAvailabilityResponse
+  where
+  rnf BatchCheckLayerAvailabilityResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf layers
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/BatchDeleteImage.hs b/gen/Amazonka/ECRPublic/BatchDeleteImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/BatchDeleteImage.hs
@@ -0,0 +1,235 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.BatchDeleteImage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a list of specified images within a repository in a public
+-- registry. Images are specified with either an @imageTag@ or
+-- @imageDigest@.
+--
+-- You can remove a tag from an image by specifying the image\'s tag in
+-- your request. When you remove the last tag from an image, the image is
+-- deleted from your repository.
+--
+-- You can completely delete an image (and all of its tags) by specifying
+-- the image\'s digest in your request.
+module Amazonka.ECRPublic.BatchDeleteImage
+  ( -- * Creating a Request
+    BatchDeleteImage (..),
+    newBatchDeleteImage,
+
+    -- * Request Lenses
+    batchDeleteImage_registryId,
+    batchDeleteImage_repositoryName,
+    batchDeleteImage_imageIds,
+
+    -- * Destructuring the Response
+    BatchDeleteImageResponse (..),
+    newBatchDeleteImageResponse,
+
+    -- * Response Lenses
+    batchDeleteImageResponse_failures,
+    batchDeleteImageResponse_imageIds,
+    batchDeleteImageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchDeleteImage' smart constructor.
+data BatchDeleteImage = BatchDeleteImage'
+  { -- | The AWS account ID associated with the registry that contains the image
+    -- to delete. If you do not specify a registry, the default public registry
+    -- is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository in a public registry that contains the image to delete.
+    repositoryName :: Prelude.Text,
+    -- | A list of image ID references that correspond to images to delete. The
+    -- format of the @imageIds@ reference is @imageTag=tag@ or
+    -- @imageDigest=digest@.
+    imageIds :: Prelude.NonEmpty ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'batchDeleteImage_registryId' - The AWS account ID associated with the registry that contains the image
+-- to delete. If you do not specify a registry, the default public registry
+-- is assumed.
+--
+-- 'repositoryName', 'batchDeleteImage_repositoryName' - The repository in a public registry that contains the image to delete.
+--
+-- 'imageIds', 'batchDeleteImage_imageIds' - A list of image ID references that correspond to images to delete. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+newBatchDeleteImage ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageIds'
+  Prelude.NonEmpty ImageIdentifier ->
+  BatchDeleteImage
+newBatchDeleteImage pRepositoryName_ pImageIds_ =
+  BatchDeleteImage'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageIds = Lens.coerced Lens.# pImageIds_
+    }
+
+-- | The AWS account ID associated with the registry that contains the image
+-- to delete. If you do not specify a registry, the default public registry
+-- is assumed.
+batchDeleteImage_registryId :: Lens.Lens' BatchDeleteImage (Prelude.Maybe Prelude.Text)
+batchDeleteImage_registryId = Lens.lens (\BatchDeleteImage' {registryId} -> registryId) (\s@BatchDeleteImage' {} a -> s {registryId = a} :: BatchDeleteImage)
+
+-- | The repository in a public registry that contains the image to delete.
+batchDeleteImage_repositoryName :: Lens.Lens' BatchDeleteImage Prelude.Text
+batchDeleteImage_repositoryName = Lens.lens (\BatchDeleteImage' {repositoryName} -> repositoryName) (\s@BatchDeleteImage' {} a -> s {repositoryName = a} :: BatchDeleteImage)
+
+-- | A list of image ID references that correspond to images to delete. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+batchDeleteImage_imageIds :: Lens.Lens' BatchDeleteImage (Prelude.NonEmpty ImageIdentifier)
+batchDeleteImage_imageIds = Lens.lens (\BatchDeleteImage' {imageIds} -> imageIds) (\s@BatchDeleteImage' {} a -> s {imageIds = a} :: BatchDeleteImage) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchDeleteImage where
+  type
+    AWSResponse BatchDeleteImage =
+      BatchDeleteImageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDeleteImageResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "imageIds")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchDeleteImage where
+  hashWithSalt _salt BatchDeleteImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageIds
+
+instance Prelude.NFData BatchDeleteImage where
+  rnf BatchDeleteImage' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageIds
+
+instance Data.ToHeaders BatchDeleteImage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.BatchDeleteImage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchDeleteImage where
+  toJSON BatchDeleteImage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageIds" Data..= imageIds)
+          ]
+      )
+
+instance Data.ToPath BatchDeleteImage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchDeleteImage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDeleteImageResponse' smart constructor.
+data BatchDeleteImageResponse = BatchDeleteImageResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [ImageFailure],
+    -- | The image IDs of the deleted images.
+    imageIds :: Prelude.Maybe (Prelude.NonEmpty ImageIdentifier),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteImageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchDeleteImageResponse_failures' - Any failures associated with the call.
+--
+-- 'imageIds', 'batchDeleteImageResponse_imageIds' - The image IDs of the deleted images.
+--
+-- 'httpStatus', 'batchDeleteImageResponse_httpStatus' - The response's http status code.
+newBatchDeleteImageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDeleteImageResponse
+newBatchDeleteImageResponse pHttpStatus_ =
+  BatchDeleteImageResponse'
+    { failures =
+        Prelude.Nothing,
+      imageIds = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Any failures associated with the call.
+batchDeleteImageResponse_failures :: Lens.Lens' BatchDeleteImageResponse (Prelude.Maybe [ImageFailure])
+batchDeleteImageResponse_failures = Lens.lens (\BatchDeleteImageResponse' {failures} -> failures) (\s@BatchDeleteImageResponse' {} a -> s {failures = a} :: BatchDeleteImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The image IDs of the deleted images.
+batchDeleteImageResponse_imageIds :: Lens.Lens' BatchDeleteImageResponse (Prelude.Maybe (Prelude.NonEmpty ImageIdentifier))
+batchDeleteImageResponse_imageIds = Lens.lens (\BatchDeleteImageResponse' {imageIds} -> imageIds) (\s@BatchDeleteImageResponse' {} a -> s {imageIds = a} :: BatchDeleteImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDeleteImageResponse_httpStatus :: Lens.Lens' BatchDeleteImageResponse Prelude.Int
+batchDeleteImageResponse_httpStatus = Lens.lens (\BatchDeleteImageResponse' {httpStatus} -> httpStatus) (\s@BatchDeleteImageResponse' {} a -> s {httpStatus = a} :: BatchDeleteImageResponse)
+
+instance Prelude.NFData BatchDeleteImageResponse where
+  rnf BatchDeleteImageResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/CompleteLayerUpload.hs b/gen/Amazonka/ECRPublic/CompleteLayerUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/CompleteLayerUpload.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.CompleteLayerUpload
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Informs Amazon ECR that the image layer upload has completed for a
+-- specified public registry, repository name, and upload ID. You can
+-- optionally provide a @sha256@ digest of the image layer for data
+-- validation purposes.
+--
+-- When an image is pushed, the CompleteLayerUpload API is called once per
+-- each new image layer to verify that the upload has completed.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECRPublic.CompleteLayerUpload
+  ( -- * Creating a Request
+    CompleteLayerUpload (..),
+    newCompleteLayerUpload,
+
+    -- * Request Lenses
+    completeLayerUpload_registryId,
+    completeLayerUpload_repositoryName,
+    completeLayerUpload_uploadId,
+    completeLayerUpload_layerDigests,
+
+    -- * Destructuring the Response
+    CompleteLayerUploadResponse (..),
+    newCompleteLayerUploadResponse,
+
+    -- * Response Lenses
+    completeLayerUploadResponse_layerDigest,
+    completeLayerUploadResponse_registryId,
+    completeLayerUploadResponse_repositoryName,
+    completeLayerUploadResponse_uploadId,
+    completeLayerUploadResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCompleteLayerUpload' smart constructor.
+data CompleteLayerUpload = CompleteLayerUpload'
+  { -- | The AWS account ID associated with the registry to which to upload
+    -- layers. If you do not specify a registry, the default public registry is
+    -- assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository in a public registry to associate with the
+    -- image layer.
+    repositoryName :: Prelude.Text,
+    -- | The upload ID from a previous InitiateLayerUpload operation to associate
+    -- with the image layer.
+    uploadId :: Prelude.Text,
+    -- | The @sha256@ digest of the image layer.
+    layerDigests :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompleteLayerUpload' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'completeLayerUpload_registryId' - The AWS account ID associated with the registry to which to upload
+-- layers. If you do not specify a registry, the default public registry is
+-- assumed.
+--
+-- 'repositoryName', 'completeLayerUpload_repositoryName' - The name of the repository in a public registry to associate with the
+-- image layer.
+--
+-- 'uploadId', 'completeLayerUpload_uploadId' - The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the image layer.
+--
+-- 'layerDigests', 'completeLayerUpload_layerDigests' - The @sha256@ digest of the image layer.
+newCompleteLayerUpload ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'uploadId'
+  Prelude.Text ->
+  -- | 'layerDigests'
+  Prelude.NonEmpty Prelude.Text ->
+  CompleteLayerUpload
+newCompleteLayerUpload
+  pRepositoryName_
+  pUploadId_
+  pLayerDigests_ =
+    CompleteLayerUpload'
+      { registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        uploadId = pUploadId_,
+        layerDigests = Lens.coerced Lens.# pLayerDigests_
+      }
+
+-- | The AWS account ID associated with the registry to which to upload
+-- layers. If you do not specify a registry, the default public registry is
+-- assumed.
+completeLayerUpload_registryId :: Lens.Lens' CompleteLayerUpload (Prelude.Maybe Prelude.Text)
+completeLayerUpload_registryId = Lens.lens (\CompleteLayerUpload' {registryId} -> registryId) (\s@CompleteLayerUpload' {} a -> s {registryId = a} :: CompleteLayerUpload)
+
+-- | The name of the repository in a public registry to associate with the
+-- image layer.
+completeLayerUpload_repositoryName :: Lens.Lens' CompleteLayerUpload Prelude.Text
+completeLayerUpload_repositoryName = Lens.lens (\CompleteLayerUpload' {repositoryName} -> repositoryName) (\s@CompleteLayerUpload' {} a -> s {repositoryName = a} :: CompleteLayerUpload)
+
+-- | The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the image layer.
+completeLayerUpload_uploadId :: Lens.Lens' CompleteLayerUpload Prelude.Text
+completeLayerUpload_uploadId = Lens.lens (\CompleteLayerUpload' {uploadId} -> uploadId) (\s@CompleteLayerUpload' {} a -> s {uploadId = a} :: CompleteLayerUpload)
+
+-- | The @sha256@ digest of the image layer.
+completeLayerUpload_layerDigests :: Lens.Lens' CompleteLayerUpload (Prelude.NonEmpty Prelude.Text)
+completeLayerUpload_layerDigests = Lens.lens (\CompleteLayerUpload' {layerDigests} -> layerDigests) (\s@CompleteLayerUpload' {} a -> s {layerDigests = a} :: CompleteLayerUpload) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CompleteLayerUpload where
+  type
+    AWSResponse CompleteLayerUpload =
+      CompleteLayerUploadResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CompleteLayerUploadResponse'
+            Prelude.<$> (x Data..?> "layerDigest")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CompleteLayerUpload where
+  hashWithSalt _salt CompleteLayerUpload' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` uploadId
+      `Prelude.hashWithSalt` layerDigests
+
+instance Prelude.NFData CompleteLayerUpload where
+  rnf CompleteLayerUpload' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf layerDigests
+
+instance Data.ToHeaders CompleteLayerUpload where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.CompleteLayerUpload" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CompleteLayerUpload where
+  toJSON CompleteLayerUpload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("uploadId" Data..= uploadId),
+            Prelude.Just ("layerDigests" Data..= layerDigests)
+          ]
+      )
+
+instance Data.ToPath CompleteLayerUpload where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CompleteLayerUpload where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCompleteLayerUploadResponse' smart constructor.
+data CompleteLayerUploadResponse = CompleteLayerUploadResponse'
+  { -- | The @sha256@ digest of the image layer.
+    layerDigest :: Prelude.Maybe Prelude.Text,
+    -- | The public registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The upload ID associated with the layer.
+    uploadId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompleteLayerUploadResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'layerDigest', 'completeLayerUploadResponse_layerDigest' - The @sha256@ digest of the image layer.
+--
+-- 'registryId', 'completeLayerUploadResponse_registryId' - The public registry ID associated with the request.
+--
+-- 'repositoryName', 'completeLayerUploadResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'uploadId', 'completeLayerUploadResponse_uploadId' - The upload ID associated with the layer.
+--
+-- 'httpStatus', 'completeLayerUploadResponse_httpStatus' - The response's http status code.
+newCompleteLayerUploadResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CompleteLayerUploadResponse
+newCompleteLayerUploadResponse pHttpStatus_ =
+  CompleteLayerUploadResponse'
+    { layerDigest =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The @sha256@ digest of the image layer.
+completeLayerUploadResponse_layerDigest :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_layerDigest = Lens.lens (\CompleteLayerUploadResponse' {layerDigest} -> layerDigest) (\s@CompleteLayerUploadResponse' {} a -> s {layerDigest = a} :: CompleteLayerUploadResponse)
+
+-- | The public registry ID associated with the request.
+completeLayerUploadResponse_registryId :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_registryId = Lens.lens (\CompleteLayerUploadResponse' {registryId} -> registryId) (\s@CompleteLayerUploadResponse' {} a -> s {registryId = a} :: CompleteLayerUploadResponse)
+
+-- | The repository name associated with the request.
+completeLayerUploadResponse_repositoryName :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_repositoryName = Lens.lens (\CompleteLayerUploadResponse' {repositoryName} -> repositoryName) (\s@CompleteLayerUploadResponse' {} a -> s {repositoryName = a} :: CompleteLayerUploadResponse)
+
+-- | The upload ID associated with the layer.
+completeLayerUploadResponse_uploadId :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_uploadId = Lens.lens (\CompleteLayerUploadResponse' {uploadId} -> uploadId) (\s@CompleteLayerUploadResponse' {} a -> s {uploadId = a} :: CompleteLayerUploadResponse)
+
+-- | The response's http status code.
+completeLayerUploadResponse_httpStatus :: Lens.Lens' CompleteLayerUploadResponse Prelude.Int
+completeLayerUploadResponse_httpStatus = Lens.lens (\CompleteLayerUploadResponse' {httpStatus} -> httpStatus) (\s@CompleteLayerUploadResponse' {} a -> s {httpStatus = a} :: CompleteLayerUploadResponse)
+
+instance Prelude.NFData CompleteLayerUploadResponse where
+  rnf CompleteLayerUploadResponse' {..} =
+    Prelude.rnf layerDigest
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/CreateRepository.hs b/gen/Amazonka/ECRPublic/CreateRepository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/CreateRepository.hs
@@ -0,0 +1,237 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.CreateRepository
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a repository in a public registry. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html Amazon ECR repositories>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECRPublic.CreateRepository
+  ( -- * Creating a Request
+    CreateRepository (..),
+    newCreateRepository,
+
+    -- * Request Lenses
+    createRepository_catalogData,
+    createRepository_tags,
+    createRepository_repositoryName,
+
+    -- * Destructuring the Response
+    CreateRepositoryResponse (..),
+    newCreateRepositoryResponse,
+
+    -- * Response Lenses
+    createRepositoryResponse_catalogData,
+    createRepositoryResponse_repository,
+    createRepositoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateRepository' smart constructor.
+data CreateRepository = CreateRepository'
+  { -- | The details about the repository that are publicly visible in the Amazon
+    -- ECR Public Gallery.
+    catalogData :: Prelude.Maybe RepositoryCatalogDataInput,
+    -- | The metadata that you apply to the repository to help you categorize and
+    -- organize them. Each tag consists of a key and an optional value, both of
+    -- which you define. Tag keys can have a maximum character length of 128
+    -- characters, and tag values can have a maximum length of 256 characters.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name to use for the repository. This appears publicly in the Amazon
+    -- ECR Public Gallery. The repository name may be specified on its own
+    -- (such as @nginx-web-app@) or it can be prepended with a namespace to
+    -- group the repository into a category (such as
+    -- @project-a\/nginx-web-app@).
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRepository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'catalogData', 'createRepository_catalogData' - The details about the repository that are publicly visible in the Amazon
+-- ECR Public Gallery.
+--
+-- 'tags', 'createRepository_tags' - The metadata that you apply to the repository to help you categorize and
+-- organize them. Each tag consists of a key and an optional value, both of
+-- which you define. Tag keys can have a maximum character length of 128
+-- characters, and tag values can have a maximum length of 256 characters.
+--
+-- 'repositoryName', 'createRepository_repositoryName' - The name to use for the repository. This appears publicly in the Amazon
+-- ECR Public Gallery. The repository name may be specified on its own
+-- (such as @nginx-web-app@) or it can be prepended with a namespace to
+-- group the repository into a category (such as
+-- @project-a\/nginx-web-app@).
+newCreateRepository ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  CreateRepository
+newCreateRepository pRepositoryName_ =
+  CreateRepository'
+    { catalogData = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The details about the repository that are publicly visible in the Amazon
+-- ECR Public Gallery.
+createRepository_catalogData :: Lens.Lens' CreateRepository (Prelude.Maybe RepositoryCatalogDataInput)
+createRepository_catalogData = Lens.lens (\CreateRepository' {catalogData} -> catalogData) (\s@CreateRepository' {} a -> s {catalogData = a} :: CreateRepository)
+
+-- | The metadata that you apply to the repository to help you categorize and
+-- organize them. Each tag consists of a key and an optional value, both of
+-- which you define. Tag keys can have a maximum character length of 128
+-- characters, and tag values can have a maximum length of 256 characters.
+createRepository_tags :: Lens.Lens' CreateRepository (Prelude.Maybe [Tag])
+createRepository_tags = Lens.lens (\CreateRepository' {tags} -> tags) (\s@CreateRepository' {} a -> s {tags = a} :: CreateRepository) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name to use for the repository. This appears publicly in the Amazon
+-- ECR Public Gallery. The repository name may be specified on its own
+-- (such as @nginx-web-app@) or it can be prepended with a namespace to
+-- group the repository into a category (such as
+-- @project-a\/nginx-web-app@).
+createRepository_repositoryName :: Lens.Lens' CreateRepository Prelude.Text
+createRepository_repositoryName = Lens.lens (\CreateRepository' {repositoryName} -> repositoryName) (\s@CreateRepository' {} a -> s {repositoryName = a} :: CreateRepository)
+
+instance Core.AWSRequest CreateRepository where
+  type
+    AWSResponse CreateRepository =
+      CreateRepositoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRepositoryResponse'
+            Prelude.<$> (x Data..?> "catalogData")
+            Prelude.<*> (x Data..?> "repository")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateRepository where
+  hashWithSalt _salt CreateRepository' {..} =
+    _salt
+      `Prelude.hashWithSalt` catalogData
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData CreateRepository where
+  rnf CreateRepository' {..} =
+    Prelude.rnf catalogData
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders CreateRepository where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.CreateRepository" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRepository where
+  toJSON CreateRepository' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("catalogData" Data..=) Prelude.<$> catalogData,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath CreateRepository where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateRepository where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateRepositoryResponse' smart constructor.
+data CreateRepositoryResponse = CreateRepositoryResponse'
+  { catalogData :: Prelude.Maybe RepositoryCatalogData,
+    -- | The repository that was created.
+    repository :: Prelude.Maybe Repository,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRepositoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'catalogData', 'createRepositoryResponse_catalogData' - Undocumented member.
+--
+-- 'repository', 'createRepositoryResponse_repository' - The repository that was created.
+--
+-- 'httpStatus', 'createRepositoryResponse_httpStatus' - The response's http status code.
+newCreateRepositoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateRepositoryResponse
+newCreateRepositoryResponse pHttpStatus_ =
+  CreateRepositoryResponse'
+    { catalogData =
+        Prelude.Nothing,
+      repository = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+createRepositoryResponse_catalogData :: Lens.Lens' CreateRepositoryResponse (Prelude.Maybe RepositoryCatalogData)
+createRepositoryResponse_catalogData = Lens.lens (\CreateRepositoryResponse' {catalogData} -> catalogData) (\s@CreateRepositoryResponse' {} a -> s {catalogData = a} :: CreateRepositoryResponse)
+
+-- | The repository that was created.
+createRepositoryResponse_repository :: Lens.Lens' CreateRepositoryResponse (Prelude.Maybe Repository)
+createRepositoryResponse_repository = Lens.lens (\CreateRepositoryResponse' {repository} -> repository) (\s@CreateRepositoryResponse' {} a -> s {repository = a} :: CreateRepositoryResponse)
+
+-- | The response's http status code.
+createRepositoryResponse_httpStatus :: Lens.Lens' CreateRepositoryResponse Prelude.Int
+createRepositoryResponse_httpStatus = Lens.lens (\CreateRepositoryResponse' {httpStatus} -> httpStatus) (\s@CreateRepositoryResponse' {} a -> s {httpStatus = a} :: CreateRepositoryResponse)
+
+instance Prelude.NFData CreateRepositoryResponse where
+  rnf CreateRepositoryResponse' {..} =
+    Prelude.rnf catalogData
+      `Prelude.seq` Prelude.rnf repository
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/DeleteRepository.hs b/gen/Amazonka/ECRPublic/DeleteRepository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DeleteRepository.hs
@@ -0,0 +1,209 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DeleteRepository
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a repository in a public registry. If the repository contains
+-- images, you must either delete all images in the repository or use the
+-- @force@ option which deletes all images on your behalf before deleting
+-- the repository.
+module Amazonka.ECRPublic.DeleteRepository
+  ( -- * Creating a Request
+    DeleteRepository (..),
+    newDeleteRepository,
+
+    -- * Request Lenses
+    deleteRepository_force,
+    deleteRepository_registryId,
+    deleteRepository_repositoryName,
+
+    -- * Destructuring the Response
+    DeleteRepositoryResponse (..),
+    newDeleteRepositoryResponse,
+
+    -- * Response Lenses
+    deleteRepositoryResponse_repository,
+    deleteRepositoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRepository' smart constructor.
+data DeleteRepository = DeleteRepository'
+  { -- | If a repository contains images, forces the deletion.
+    force :: Prelude.Maybe Prelude.Bool,
+    -- | The AWS account ID associated with the public registry that contains the
+    -- repository to delete. If you do not specify a registry, the default
+    -- public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to delete.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'force', 'deleteRepository_force' - If a repository contains images, forces the deletion.
+--
+-- 'registryId', 'deleteRepository_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository to delete. If you do not specify a registry, the default
+-- public registry is assumed.
+--
+-- 'repositoryName', 'deleteRepository_repositoryName' - The name of the repository to delete.
+newDeleteRepository ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DeleteRepository
+newDeleteRepository pRepositoryName_ =
+  DeleteRepository'
+    { force = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | If a repository contains images, forces the deletion.
+deleteRepository_force :: Lens.Lens' DeleteRepository (Prelude.Maybe Prelude.Bool)
+deleteRepository_force = Lens.lens (\DeleteRepository' {force} -> force) (\s@DeleteRepository' {} a -> s {force = a} :: DeleteRepository)
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository to delete. If you do not specify a registry, the default
+-- public registry is assumed.
+deleteRepository_registryId :: Lens.Lens' DeleteRepository (Prelude.Maybe Prelude.Text)
+deleteRepository_registryId = Lens.lens (\DeleteRepository' {registryId} -> registryId) (\s@DeleteRepository' {} a -> s {registryId = a} :: DeleteRepository)
+
+-- | The name of the repository to delete.
+deleteRepository_repositoryName :: Lens.Lens' DeleteRepository Prelude.Text
+deleteRepository_repositoryName = Lens.lens (\DeleteRepository' {repositoryName} -> repositoryName) (\s@DeleteRepository' {} a -> s {repositoryName = a} :: DeleteRepository)
+
+instance Core.AWSRequest DeleteRepository where
+  type
+    AWSResponse DeleteRepository =
+      DeleteRepositoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRepositoryResponse'
+            Prelude.<$> (x Data..?> "repository")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRepository where
+  hashWithSalt _salt DeleteRepository' {..} =
+    _salt
+      `Prelude.hashWithSalt` force
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DeleteRepository where
+  rnf DeleteRepository' {..} =
+    Prelude.rnf force
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DeleteRepository where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DeleteRepository" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRepository where
+  toJSON DeleteRepository' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("force" Data..=) Prelude.<$> force,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DeleteRepository where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRepository where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRepositoryResponse' smart constructor.
+data DeleteRepositoryResponse = DeleteRepositoryResponse'
+  { -- | The repository that was deleted.
+    repository :: Prelude.Maybe Repository,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepositoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'repository', 'deleteRepositoryResponse_repository' - The repository that was deleted.
+--
+-- 'httpStatus', 'deleteRepositoryResponse_httpStatus' - The response's http status code.
+newDeleteRepositoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRepositoryResponse
+newDeleteRepositoryResponse pHttpStatus_ =
+  DeleteRepositoryResponse'
+    { repository =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The repository that was deleted.
+deleteRepositoryResponse_repository :: Lens.Lens' DeleteRepositoryResponse (Prelude.Maybe Repository)
+deleteRepositoryResponse_repository = Lens.lens (\DeleteRepositoryResponse' {repository} -> repository) (\s@DeleteRepositoryResponse' {} a -> s {repository = a} :: DeleteRepositoryResponse)
+
+-- | The response's http status code.
+deleteRepositoryResponse_httpStatus :: Lens.Lens' DeleteRepositoryResponse Prelude.Int
+deleteRepositoryResponse_httpStatus = Lens.lens (\DeleteRepositoryResponse' {httpStatus} -> httpStatus) (\s@DeleteRepositoryResponse' {} a -> s {httpStatus = a} :: DeleteRepositoryResponse)
+
+instance Prelude.NFData DeleteRepositoryResponse where
+  rnf DeleteRepositoryResponse' {..} =
+    Prelude.rnf repository
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/DeleteRepositoryPolicy.hs b/gen/Amazonka/ECRPublic/DeleteRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DeleteRepositoryPolicy.hs
@@ -0,0 +1,224 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DeleteRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the repository policy associated with the specified repository.
+module Amazonka.ECRPublic.DeleteRepositoryPolicy
+  ( -- * Creating a Request
+    DeleteRepositoryPolicy (..),
+    newDeleteRepositoryPolicy,
+
+    -- * Request Lenses
+    deleteRepositoryPolicy_registryId,
+    deleteRepositoryPolicy_repositoryName,
+
+    -- * Destructuring the Response
+    DeleteRepositoryPolicyResponse (..),
+    newDeleteRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    deleteRepositoryPolicyResponse_policyText,
+    deleteRepositoryPolicyResponse_registryId,
+    deleteRepositoryPolicyResponse_repositoryName,
+    deleteRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRepositoryPolicy' smart constructor.
+data DeleteRepositoryPolicy = DeleteRepositoryPolicy'
+  { -- | The AWS account ID associated with the public registry that contains the
+    -- repository policy to delete. If you do not specify a registry, the
+    -- default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that is associated with the repository policy
+    -- to delete.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'deleteRepositoryPolicy_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository policy to delete. If you do not specify a registry, the
+-- default public registry is assumed.
+--
+-- 'repositoryName', 'deleteRepositoryPolicy_repositoryName' - The name of the repository that is associated with the repository policy
+-- to delete.
+newDeleteRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DeleteRepositoryPolicy
+newDeleteRepositoryPolicy pRepositoryName_ =
+  DeleteRepositoryPolicy'
+    { registryId =
+        Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository policy to delete. If you do not specify a registry, the
+-- default public registry is assumed.
+deleteRepositoryPolicy_registryId :: Lens.Lens' DeleteRepositoryPolicy (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicy_registryId = Lens.lens (\DeleteRepositoryPolicy' {registryId} -> registryId) (\s@DeleteRepositoryPolicy' {} a -> s {registryId = a} :: DeleteRepositoryPolicy)
+
+-- | The name of the repository that is associated with the repository policy
+-- to delete.
+deleteRepositoryPolicy_repositoryName :: Lens.Lens' DeleteRepositoryPolicy Prelude.Text
+deleteRepositoryPolicy_repositoryName = Lens.lens (\DeleteRepositoryPolicy' {repositoryName} -> repositoryName) (\s@DeleteRepositoryPolicy' {} a -> s {repositoryName = a} :: DeleteRepositoryPolicy)
+
+instance Core.AWSRequest DeleteRepositoryPolicy where
+  type
+    AWSResponse DeleteRepositoryPolicy =
+      DeleteRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRepositoryPolicy where
+  hashWithSalt _salt DeleteRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DeleteRepositoryPolicy where
+  rnf DeleteRepositoryPolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DeleteRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DeleteRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRepositoryPolicy where
+  toJSON DeleteRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DeleteRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRepositoryPolicyResponse' smart constructor.
+data DeleteRepositoryPolicyResponse = DeleteRepositoryPolicyResponse'
+  { -- | The JSON repository policy that was deleted from the repository.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'deleteRepositoryPolicyResponse_policyText' - The JSON repository policy that was deleted from the repository.
+--
+-- 'registryId', 'deleteRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'deleteRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'deleteRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newDeleteRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRepositoryPolicyResponse
+newDeleteRepositoryPolicyResponse pHttpStatus_ =
+  DeleteRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy that was deleted from the repository.
+deleteRepositoryPolicyResponse_policyText :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_policyText = Lens.lens (\DeleteRepositoryPolicyResponse' {policyText} -> policyText) (\s@DeleteRepositoryPolicyResponse' {} a -> s {policyText = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+deleteRepositoryPolicyResponse_registryId :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_registryId = Lens.lens (\DeleteRepositoryPolicyResponse' {registryId} -> registryId) (\s@DeleteRepositoryPolicyResponse' {} a -> s {registryId = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+deleteRepositoryPolicyResponse_repositoryName :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_repositoryName = Lens.lens (\DeleteRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@DeleteRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The response's http status code.
+deleteRepositoryPolicyResponse_httpStatus :: Lens.Lens' DeleteRepositoryPolicyResponse Prelude.Int
+deleteRepositoryPolicyResponse_httpStatus = Lens.lens (\DeleteRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@DeleteRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: DeleteRepositoryPolicyResponse)
+
+instance
+  Prelude.NFData
+    DeleteRepositoryPolicyResponse
+  where
+  rnf DeleteRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/DescribeImageTags.hs b/gen/Amazonka/ECRPublic/DescribeImageTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DescribeImageTags.hs
@@ -0,0 +1,309 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DescribeImageTags
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the image tag details for a repository in a public registry.
+--
+-- This operation returns paginated results.
+module Amazonka.ECRPublic.DescribeImageTags
+  ( -- * Creating a Request
+    DescribeImageTags (..),
+    newDescribeImageTags,
+
+    -- * Request Lenses
+    describeImageTags_maxResults,
+    describeImageTags_nextToken,
+    describeImageTags_registryId,
+    describeImageTags_repositoryName,
+
+    -- * Destructuring the Response
+    DescribeImageTagsResponse (..),
+    newDescribeImageTagsResponse,
+
+    -- * Response Lenses
+    describeImageTagsResponse_imageTagDetails,
+    describeImageTagsResponse_nextToken,
+    describeImageTagsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeImageTags' smart constructor.
+data DescribeImageTags = DescribeImageTags'
+  { -- | The maximum number of repository results returned by @DescribeImageTags@
+    -- in paginated output. When this parameter is used, @DescribeImageTags@
+    -- only returns @maxResults@ results in a single page along with a
+    -- @nextToken@ response element. The remaining results of the initial
+    -- request can be seen by sending another @DescribeImageTags@ request with
+    -- the returned @nextToken@ value. This value can be between 1 and 1000. If
+    -- this parameter is not used, then @DescribeImageTags@ returns up to 100
+    -- results and a @nextToken@ value, if applicable. This option cannot be
+    -- used when you specify images with @imageIds@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeImageTags@ request where @maxResults@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value. This value
+    -- is @null@ when there are no more results to return. This option cannot
+    -- be used when you specify images with @imageIds@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID associated with the public registry that contains the
+    -- repository in which to describe images. If you do not specify a
+    -- registry, the default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that contains the image tag details to
+    -- describe.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImageTags' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeImageTags_maxResults' - The maximum number of repository results returned by @DescribeImageTags@
+-- in paginated output. When this parameter is used, @DescribeImageTags@
+-- only returns @maxResults@ results in a single page along with a
+-- @nextToken@ response element. The remaining results of the initial
+-- request can be seen by sending another @DescribeImageTags@ request with
+-- the returned @nextToken@ value. This value can be between 1 and 1000. If
+-- this parameter is not used, then @DescribeImageTags@ returns up to 100
+-- results and a @nextToken@ value, if applicable. This option cannot be
+-- used when you specify images with @imageIds@.
+--
+-- 'nextToken', 'describeImageTags_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeImageTags@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+--
+-- 'registryId', 'describeImageTags_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository in which to describe images. If you do not specify a
+-- registry, the default public registry is assumed.
+--
+-- 'repositoryName', 'describeImageTags_repositoryName' - The name of the repository that contains the image tag details to
+-- describe.
+newDescribeImageTags ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DescribeImageTags
+newDescribeImageTags pRepositoryName_ =
+  DescribeImageTags'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The maximum number of repository results returned by @DescribeImageTags@
+-- in paginated output. When this parameter is used, @DescribeImageTags@
+-- only returns @maxResults@ results in a single page along with a
+-- @nextToken@ response element. The remaining results of the initial
+-- request can be seen by sending another @DescribeImageTags@ request with
+-- the returned @nextToken@ value. This value can be between 1 and 1000. If
+-- this parameter is not used, then @DescribeImageTags@ returns up to 100
+-- results and a @nextToken@ value, if applicable. This option cannot be
+-- used when you specify images with @imageIds@.
+describeImageTags_maxResults :: Lens.Lens' DescribeImageTags (Prelude.Maybe Prelude.Natural)
+describeImageTags_maxResults = Lens.lens (\DescribeImageTags' {maxResults} -> maxResults) (\s@DescribeImageTags' {} a -> s {maxResults = a} :: DescribeImageTags)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeImageTags@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+describeImageTags_nextToken :: Lens.Lens' DescribeImageTags (Prelude.Maybe Prelude.Text)
+describeImageTags_nextToken = Lens.lens (\DescribeImageTags' {nextToken} -> nextToken) (\s@DescribeImageTags' {} a -> s {nextToken = a} :: DescribeImageTags)
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository in which to describe images. If you do not specify a
+-- registry, the default public registry is assumed.
+describeImageTags_registryId :: Lens.Lens' DescribeImageTags (Prelude.Maybe Prelude.Text)
+describeImageTags_registryId = Lens.lens (\DescribeImageTags' {registryId} -> registryId) (\s@DescribeImageTags' {} a -> s {registryId = a} :: DescribeImageTags)
+
+-- | The name of the repository that contains the image tag details to
+-- describe.
+describeImageTags_repositoryName :: Lens.Lens' DescribeImageTags Prelude.Text
+describeImageTags_repositoryName = Lens.lens (\DescribeImageTags' {repositoryName} -> repositoryName) (\s@DescribeImageTags' {} a -> s {repositoryName = a} :: DescribeImageTags)
+
+instance Core.AWSPager DescribeImageTags where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeImageTagsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeImageTagsResponse_imageTagDetails
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeImageTags_nextToken
+          Lens..~ rs
+          Lens.^? describeImageTagsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeImageTags where
+  type
+    AWSResponse DescribeImageTags =
+      DescribeImageTagsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeImageTagsResponse'
+            Prelude.<$> ( x
+                            Data..?> "imageTagDetails"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeImageTags where
+  hashWithSalt _salt DescribeImageTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DescribeImageTags where
+  rnf DescribeImageTags' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DescribeImageTags where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DescribeImageTags" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeImageTags where
+  toJSON DescribeImageTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DescribeImageTags where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeImageTags where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeImageTagsResponse' smart constructor.
+data DescribeImageTagsResponse = DescribeImageTagsResponse'
+  { -- | The image tag details for the images in the requested repository.
+    imageTagDetails :: Prelude.Maybe [ImageTagDetail],
+    -- | The @nextToken@ value to include in a future @DescribeImageTags@
+    -- request. When the results of a @DescribeImageTags@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImageTagsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageTagDetails', 'describeImageTagsResponse_imageTagDetails' - The image tag details for the images in the requested repository.
+--
+-- 'nextToken', 'describeImageTagsResponse_nextToken' - The @nextToken@ value to include in a future @DescribeImageTags@
+-- request. When the results of a @DescribeImageTags@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'describeImageTagsResponse_httpStatus' - The response's http status code.
+newDescribeImageTagsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeImageTagsResponse
+newDescribeImageTagsResponse pHttpStatus_ =
+  DescribeImageTagsResponse'
+    { imageTagDetails =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The image tag details for the images in the requested repository.
+describeImageTagsResponse_imageTagDetails :: Lens.Lens' DescribeImageTagsResponse (Prelude.Maybe [ImageTagDetail])
+describeImageTagsResponse_imageTagDetails = Lens.lens (\DescribeImageTagsResponse' {imageTagDetails} -> imageTagDetails) (\s@DescribeImageTagsResponse' {} a -> s {imageTagDetails = a} :: DescribeImageTagsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The @nextToken@ value to include in a future @DescribeImageTags@
+-- request. When the results of a @DescribeImageTags@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+describeImageTagsResponse_nextToken :: Lens.Lens' DescribeImageTagsResponse (Prelude.Maybe Prelude.Text)
+describeImageTagsResponse_nextToken = Lens.lens (\DescribeImageTagsResponse' {nextToken} -> nextToken) (\s@DescribeImageTagsResponse' {} a -> s {nextToken = a} :: DescribeImageTagsResponse)
+
+-- | The response's http status code.
+describeImageTagsResponse_httpStatus :: Lens.Lens' DescribeImageTagsResponse Prelude.Int
+describeImageTagsResponse_httpStatus = Lens.lens (\DescribeImageTagsResponse' {httpStatus} -> httpStatus) (\s@DescribeImageTagsResponse' {} a -> s {httpStatus = a} :: DescribeImageTagsResponse)
+
+instance Prelude.NFData DescribeImageTagsResponse where
+  rnf DescribeImageTagsResponse' {..} =
+    Prelude.rnf imageTagDetails
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/DescribeImages.hs b/gen/Amazonka/ECRPublic/DescribeImages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DescribeImages.hs
@@ -0,0 +1,322 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DescribeImages
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns metadata about the images in a repository in a public registry.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+--
+-- This operation returns paginated results.
+module Amazonka.ECRPublic.DescribeImages
+  ( -- * Creating a Request
+    DescribeImages (..),
+    newDescribeImages,
+
+    -- * Request Lenses
+    describeImages_imageIds,
+    describeImages_maxResults,
+    describeImages_nextToken,
+    describeImages_registryId,
+    describeImages_repositoryName,
+
+    -- * Destructuring the Response
+    DescribeImagesResponse (..),
+    newDescribeImagesResponse,
+
+    -- * Response Lenses
+    describeImagesResponse_imageDetails,
+    describeImagesResponse_nextToken,
+    describeImagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeImages' smart constructor.
+data DescribeImages = DescribeImages'
+  { -- | The list of image IDs for the requested repository.
+    imageIds :: Prelude.Maybe (Prelude.NonEmpty ImageIdentifier),
+    -- | The maximum number of repository results returned by @DescribeImages@ in
+    -- paginated output. When this parameter is used, @DescribeImages@ only
+    -- returns @maxResults@ results in a single page along with a @nextToken@
+    -- response element. The remaining results of the initial request can be
+    -- seen by sending another @DescribeImages@ request with the returned
+    -- @nextToken@ value. This value can be between 1 and 1000. If this
+    -- parameter is not used, then @DescribeImages@ returns up to 100 results
+    -- and a @nextToken@ value, if applicable. This option cannot be used when
+    -- you specify images with @imageIds@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeImages@ request where @maxResults@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value. This value
+    -- is @null@ when there are no more results to return. This option cannot
+    -- be used when you specify images with @imageIds@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID associated with the public registry that contains the
+    -- repository in which to describe images. If you do not specify a
+    -- registry, the default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository that contains the images to describe.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImages' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageIds', 'describeImages_imageIds' - The list of image IDs for the requested repository.
+--
+-- 'maxResults', 'describeImages_maxResults' - The maximum number of repository results returned by @DescribeImages@ in
+-- paginated output. When this parameter is used, @DescribeImages@ only
+-- returns @maxResults@ results in a single page along with a @nextToken@
+-- response element. The remaining results of the initial request can be
+-- seen by sending another @DescribeImages@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 1000. If this
+-- parameter is not used, then @DescribeImages@ returns up to 100 results
+-- and a @nextToken@ value, if applicable. This option cannot be used when
+-- you specify images with @imageIds@.
+--
+-- 'nextToken', 'describeImages_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeImages@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+--
+-- 'registryId', 'describeImages_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository in which to describe images. If you do not specify a
+-- registry, the default public registry is assumed.
+--
+-- 'repositoryName', 'describeImages_repositoryName' - The repository that contains the images to describe.
+newDescribeImages ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DescribeImages
+newDescribeImages pRepositoryName_ =
+  DescribeImages'
+    { imageIds = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The list of image IDs for the requested repository.
+describeImages_imageIds :: Lens.Lens' DescribeImages (Prelude.Maybe (Prelude.NonEmpty ImageIdentifier))
+describeImages_imageIds = Lens.lens (\DescribeImages' {imageIds} -> imageIds) (\s@DescribeImages' {} a -> s {imageIds = a} :: DescribeImages) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of repository results returned by @DescribeImages@ in
+-- paginated output. When this parameter is used, @DescribeImages@ only
+-- returns @maxResults@ results in a single page along with a @nextToken@
+-- response element. The remaining results of the initial request can be
+-- seen by sending another @DescribeImages@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 1000. If this
+-- parameter is not used, then @DescribeImages@ returns up to 100 results
+-- and a @nextToken@ value, if applicable. This option cannot be used when
+-- you specify images with @imageIds@.
+describeImages_maxResults :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Natural)
+describeImages_maxResults = Lens.lens (\DescribeImages' {maxResults} -> maxResults) (\s@DescribeImages' {} a -> s {maxResults = a} :: DescribeImages)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeImages@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+describeImages_nextToken :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Text)
+describeImages_nextToken = Lens.lens (\DescribeImages' {nextToken} -> nextToken) (\s@DescribeImages' {} a -> s {nextToken = a} :: DescribeImages)
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository in which to describe images. If you do not specify a
+-- registry, the default public registry is assumed.
+describeImages_registryId :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Text)
+describeImages_registryId = Lens.lens (\DescribeImages' {registryId} -> registryId) (\s@DescribeImages' {} a -> s {registryId = a} :: DescribeImages)
+
+-- | The repository that contains the images to describe.
+describeImages_repositoryName :: Lens.Lens' DescribeImages Prelude.Text
+describeImages_repositoryName = Lens.lens (\DescribeImages' {repositoryName} -> repositoryName) (\s@DescribeImages' {} a -> s {repositoryName = a} :: DescribeImages)
+
+instance Core.AWSPager DescribeImages where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeImagesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeImagesResponse_imageDetails
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeImages_nextToken
+          Lens..~ rs
+          Lens.^? describeImagesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeImages where
+  type
+    AWSResponse DescribeImages =
+      DescribeImagesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeImagesResponse'
+            Prelude.<$> (x Data..?> "imageDetails" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeImages where
+  hashWithSalt _salt DescribeImages' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageIds
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DescribeImages where
+  rnf DescribeImages' {..} =
+    Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DescribeImages where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DescribeImages" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeImages where
+  toJSON DescribeImages' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("imageIds" Data..=) Prelude.<$> imageIds,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DescribeImages where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeImages where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeImagesResponse' smart constructor.
+data DescribeImagesResponse = DescribeImagesResponse'
+  { -- | A list of ImageDetail objects that contain data about the image.
+    imageDetails :: Prelude.Maybe [ImageDetail],
+    -- | The @nextToken@ value to include in a future @DescribeImages@ request.
+    -- When the results of a @DescribeImages@ request exceed @maxResults@, this
+    -- value can be used to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImagesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDetails', 'describeImagesResponse_imageDetails' - A list of ImageDetail objects that contain data about the image.
+--
+-- 'nextToken', 'describeImagesResponse_nextToken' - The @nextToken@ value to include in a future @DescribeImages@ request.
+-- When the results of a @DescribeImages@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'describeImagesResponse_httpStatus' - The response's http status code.
+newDescribeImagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeImagesResponse
+newDescribeImagesResponse pHttpStatus_ =
+  DescribeImagesResponse'
+    { imageDetails =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of ImageDetail objects that contain data about the image.
+describeImagesResponse_imageDetails :: Lens.Lens' DescribeImagesResponse (Prelude.Maybe [ImageDetail])
+describeImagesResponse_imageDetails = Lens.lens (\DescribeImagesResponse' {imageDetails} -> imageDetails) (\s@DescribeImagesResponse' {} a -> s {imageDetails = a} :: DescribeImagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The @nextToken@ value to include in a future @DescribeImages@ request.
+-- When the results of a @DescribeImages@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+describeImagesResponse_nextToken :: Lens.Lens' DescribeImagesResponse (Prelude.Maybe Prelude.Text)
+describeImagesResponse_nextToken = Lens.lens (\DescribeImagesResponse' {nextToken} -> nextToken) (\s@DescribeImagesResponse' {} a -> s {nextToken = a} :: DescribeImagesResponse)
+
+-- | The response's http status code.
+describeImagesResponse_httpStatus :: Lens.Lens' DescribeImagesResponse Prelude.Int
+describeImagesResponse_httpStatus = Lens.lens (\DescribeImagesResponse' {httpStatus} -> httpStatus) (\s@DescribeImagesResponse' {} a -> s {httpStatus = a} :: DescribeImagesResponse)
+
+instance Prelude.NFData DescribeImagesResponse where
+  rnf DescribeImagesResponse' {..} =
+    Prelude.rnf imageDetails
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/DescribeRegistries.hs b/gen/Amazonka/ECRPublic/DescribeRegistries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DescribeRegistries.hs
@@ -0,0 +1,271 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DescribeRegistries
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns details for a public registry.
+--
+-- This operation returns paginated results.
+module Amazonka.ECRPublic.DescribeRegistries
+  ( -- * Creating a Request
+    DescribeRegistries (..),
+    newDescribeRegistries,
+
+    -- * Request Lenses
+    describeRegistries_maxResults,
+    describeRegistries_nextToken,
+
+    -- * Destructuring the Response
+    DescribeRegistriesResponse (..),
+    newDescribeRegistriesResponse,
+
+    -- * Response Lenses
+    describeRegistriesResponse_nextToken,
+    describeRegistriesResponse_httpStatus,
+    describeRegistriesResponse_registries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRegistries' smart constructor.
+data DescribeRegistries = DescribeRegistries'
+  { -- | The maximum number of repository results returned by
+    -- @DescribeRegistries@ in paginated output. When this parameter is used,
+    -- @DescribeRegistries@ only returns @maxResults@ results in a single page
+    -- along with a @nextToken@ response element. The remaining results of the
+    -- initial request can be seen by sending another @DescribeRegistries@
+    -- request with the returned @nextToken@ value. This value can be between 1
+    -- and 1000. If this parameter is not used, then @DescribeRegistries@
+    -- returns up to 100 results and a @nextToken@ value, if applicable.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeRegistries@ request where @maxResults@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value. This value
+    -- is @null@ when there are no more results to return.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRegistries' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeRegistries_maxResults' - The maximum number of repository results returned by
+-- @DescribeRegistries@ in paginated output. When this parameter is used,
+-- @DescribeRegistries@ only returns @maxResults@ results in a single page
+-- along with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @DescribeRegistries@
+-- request with the returned @nextToken@ value. This value can be between 1
+-- and 1000. If this parameter is not used, then @DescribeRegistries@
+-- returns up to 100 results and a @nextToken@ value, if applicable.
+--
+-- 'nextToken', 'describeRegistries_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeRegistries@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+newDescribeRegistries ::
+  DescribeRegistries
+newDescribeRegistries =
+  DescribeRegistries'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of repository results returned by
+-- @DescribeRegistries@ in paginated output. When this parameter is used,
+-- @DescribeRegistries@ only returns @maxResults@ results in a single page
+-- along with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @DescribeRegistries@
+-- request with the returned @nextToken@ value. This value can be between 1
+-- and 1000. If this parameter is not used, then @DescribeRegistries@
+-- returns up to 100 results and a @nextToken@ value, if applicable.
+describeRegistries_maxResults :: Lens.Lens' DescribeRegistries (Prelude.Maybe Prelude.Natural)
+describeRegistries_maxResults = Lens.lens (\DescribeRegistries' {maxResults} -> maxResults) (\s@DescribeRegistries' {} a -> s {maxResults = a} :: DescribeRegistries)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeRegistries@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+describeRegistries_nextToken :: Lens.Lens' DescribeRegistries (Prelude.Maybe Prelude.Text)
+describeRegistries_nextToken = Lens.lens (\DescribeRegistries' {nextToken} -> nextToken) (\s@DescribeRegistries' {} a -> s {nextToken = a} :: DescribeRegistries)
+
+instance Core.AWSPager DescribeRegistries where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeRegistriesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. describeRegistriesResponse_registries) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeRegistries_nextToken
+          Lens..~ rs
+          Lens.^? describeRegistriesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeRegistries where
+  type
+    AWSResponse DescribeRegistries =
+      DescribeRegistriesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRegistriesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "registries" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable DescribeRegistries where
+  hashWithSalt _salt DescribeRegistries' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData DescribeRegistries where
+  rnf DescribeRegistries' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders DescribeRegistries where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DescribeRegistries" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRegistries where
+  toJSON DescribeRegistries' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath DescribeRegistries where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRegistries where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRegistriesResponse' smart constructor.
+data DescribeRegistriesResponse = DescribeRegistriesResponse'
+  { -- | The @nextToken@ value to include in a future @DescribeRepositories@
+    -- request. When the results of a @DescribeRepositories@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An object containing the details for a public registry.
+    registries :: [Registry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRegistriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeRegistriesResponse_nextToken' - The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'describeRegistriesResponse_httpStatus' - The response's http status code.
+--
+-- 'registries', 'describeRegistriesResponse_registries' - An object containing the details for a public registry.
+newDescribeRegistriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRegistriesResponse
+newDescribeRegistriesResponse pHttpStatus_ =
+  DescribeRegistriesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      registries = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+describeRegistriesResponse_nextToken :: Lens.Lens' DescribeRegistriesResponse (Prelude.Maybe Prelude.Text)
+describeRegistriesResponse_nextToken = Lens.lens (\DescribeRegistriesResponse' {nextToken} -> nextToken) (\s@DescribeRegistriesResponse' {} a -> s {nextToken = a} :: DescribeRegistriesResponse)
+
+-- | The response's http status code.
+describeRegistriesResponse_httpStatus :: Lens.Lens' DescribeRegistriesResponse Prelude.Int
+describeRegistriesResponse_httpStatus = Lens.lens (\DescribeRegistriesResponse' {httpStatus} -> httpStatus) (\s@DescribeRegistriesResponse' {} a -> s {httpStatus = a} :: DescribeRegistriesResponse)
+
+-- | An object containing the details for a public registry.
+describeRegistriesResponse_registries :: Lens.Lens' DescribeRegistriesResponse [Registry]
+describeRegistriesResponse_registries = Lens.lens (\DescribeRegistriesResponse' {registries} -> registries) (\s@DescribeRegistriesResponse' {} a -> s {registries = a} :: DescribeRegistriesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData DescribeRegistriesResponse where
+  rnf DescribeRegistriesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf registries
diff --git a/gen/Amazonka/ECRPublic/DescribeRepositories.hs b/gen/Amazonka/ECRPublic/DescribeRepositories.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/DescribeRepositories.hs
@@ -0,0 +1,322 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.DescribeRepositories
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes repositories in a public registry.
+--
+-- This operation returns paginated results.
+module Amazonka.ECRPublic.DescribeRepositories
+  ( -- * Creating a Request
+    DescribeRepositories (..),
+    newDescribeRepositories,
+
+    -- * Request Lenses
+    describeRepositories_maxResults,
+    describeRepositories_nextToken,
+    describeRepositories_registryId,
+    describeRepositories_repositoryNames,
+
+    -- * Destructuring the Response
+    DescribeRepositoriesResponse (..),
+    newDescribeRepositoriesResponse,
+
+    -- * Response Lenses
+    describeRepositoriesResponse_nextToken,
+    describeRepositoriesResponse_repositories,
+    describeRepositoriesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRepositories' smart constructor.
+data DescribeRepositories = DescribeRepositories'
+  { -- | The maximum number of repository results returned by
+    -- @DescribeRepositories@ in paginated output. When this parameter is used,
+    -- @DescribeRepositories@ only returns @maxResults@ results in a single
+    -- page along with a @nextToken@ response element. The remaining results of
+    -- the initial request can be seen by sending another
+    -- @DescribeRepositories@ request with the returned @nextToken@ value. This
+    -- value can be between 1 and 1000. If this parameter is not used, then
+    -- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+    -- value, if applicable. This option cannot be used when you specify
+    -- repositories with @repositoryNames@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeRepositories@ request where @maxResults@ was used and the
+    -- results exceeded the value of that parameter. Pagination continues from
+    -- the end of the previous results that returned the @nextToken@ value.
+    -- This value is @null@ when there are no more results to return. This
+    -- option cannot be used when you specify repositories with
+    -- @repositoryNames@.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID associated with the registry that contains the
+    -- repositories to be described. If you do not specify a registry, the
+    -- default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | A list of repositories to describe. If this parameter is omitted, then
+    -- all repositories in a registry are described.
+    repositoryNames :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRepositories' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'describeRepositories_maxResults' - The maximum number of repository results returned by
+-- @DescribeRepositories@ in paginated output. When this parameter is used,
+-- @DescribeRepositories@ only returns @maxResults@ results in a single
+-- page along with a @nextToken@ response element. The remaining results of
+-- the initial request can be seen by sending another
+-- @DescribeRepositories@ request with the returned @nextToken@ value. This
+-- value can be between 1 and 1000. If this parameter is not used, then
+-- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+-- value, if applicable. This option cannot be used when you specify
+-- repositories with @repositoryNames@.
+--
+-- 'nextToken', 'describeRepositories_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeRepositories@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is @null@ when there are no more results to return. This
+-- option cannot be used when you specify repositories with
+-- @repositoryNames@.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+--
+-- 'registryId', 'describeRepositories_registryId' - The AWS account ID associated with the registry that contains the
+-- repositories to be described. If you do not specify a registry, the
+-- default public registry is assumed.
+--
+-- 'repositoryNames', 'describeRepositories_repositoryNames' - A list of repositories to describe. If this parameter is omitted, then
+-- all repositories in a registry are described.
+newDescribeRepositories ::
+  DescribeRepositories
+newDescribeRepositories =
+  DescribeRepositories'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryNames = Prelude.Nothing
+    }
+
+-- | The maximum number of repository results returned by
+-- @DescribeRepositories@ in paginated output. When this parameter is used,
+-- @DescribeRepositories@ only returns @maxResults@ results in a single
+-- page along with a @nextToken@ response element. The remaining results of
+-- the initial request can be seen by sending another
+-- @DescribeRepositories@ request with the returned @nextToken@ value. This
+-- value can be between 1 and 1000. If this parameter is not used, then
+-- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+-- value, if applicable. This option cannot be used when you specify
+-- repositories with @repositoryNames@.
+describeRepositories_maxResults :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Natural)
+describeRepositories_maxResults = Lens.lens (\DescribeRepositories' {maxResults} -> maxResults) (\s@DescribeRepositories' {} a -> s {maxResults = a} :: DescribeRepositories)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeRepositories@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is @null@ when there are no more results to return. This
+-- option cannot be used when you specify repositories with
+-- @repositoryNames@.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+describeRepositories_nextToken :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Text)
+describeRepositories_nextToken = Lens.lens (\DescribeRepositories' {nextToken} -> nextToken) (\s@DescribeRepositories' {} a -> s {nextToken = a} :: DescribeRepositories)
+
+-- | The AWS account ID associated with the registry that contains the
+-- repositories to be described. If you do not specify a registry, the
+-- default public registry is assumed.
+describeRepositories_registryId :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Text)
+describeRepositories_registryId = Lens.lens (\DescribeRepositories' {registryId} -> registryId) (\s@DescribeRepositories' {} a -> s {registryId = a} :: DescribeRepositories)
+
+-- | A list of repositories to describe. If this parameter is omitted, then
+-- all repositories in a registry are described.
+describeRepositories_repositoryNames :: Lens.Lens' DescribeRepositories (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+describeRepositories_repositoryNames = Lens.lens (\DescribeRepositories' {repositoryNames} -> repositoryNames) (\s@DescribeRepositories' {} a -> s {repositoryNames = a} :: DescribeRepositories) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribeRepositories where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeRepositoriesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeRepositoriesResponse_repositories
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeRepositories_nextToken
+          Lens..~ rs
+          Lens.^? describeRepositoriesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeRepositories where
+  type
+    AWSResponse DescribeRepositories =
+      DescribeRepositoriesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRepositoriesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "repositories" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRepositories where
+  hashWithSalt _salt DescribeRepositories' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryNames
+
+instance Prelude.NFData DescribeRepositories where
+  rnf DescribeRepositories' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryNames
+
+instance Data.ToHeaders DescribeRepositories where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.DescribeRepositories" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRepositories where
+  toJSON DescribeRepositories' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            ("repositoryNames" Data..=)
+              Prelude.<$> repositoryNames
+          ]
+      )
+
+instance Data.ToPath DescribeRepositories where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRepositories where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRepositoriesResponse' smart constructor.
+data DescribeRepositoriesResponse = DescribeRepositoriesResponse'
+  { -- | The @nextToken@ value to include in a future @DescribeRepositories@
+    -- request. When the results of a @DescribeRepositories@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of repository objects corresponding to valid repositories.
+    repositories :: Prelude.Maybe [Repository],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRepositoriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'describeRepositoriesResponse_nextToken' - The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'repositories', 'describeRepositoriesResponse_repositories' - A list of repository objects corresponding to valid repositories.
+--
+-- 'httpStatus', 'describeRepositoriesResponse_httpStatus' - The response's http status code.
+newDescribeRepositoriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRepositoriesResponse
+newDescribeRepositoriesResponse pHttpStatus_ =
+  DescribeRepositoriesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      repositories = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+describeRepositoriesResponse_nextToken :: Lens.Lens' DescribeRepositoriesResponse (Prelude.Maybe Prelude.Text)
+describeRepositoriesResponse_nextToken = Lens.lens (\DescribeRepositoriesResponse' {nextToken} -> nextToken) (\s@DescribeRepositoriesResponse' {} a -> s {nextToken = a} :: DescribeRepositoriesResponse)
+
+-- | A list of repository objects corresponding to valid repositories.
+describeRepositoriesResponse_repositories :: Lens.Lens' DescribeRepositoriesResponse (Prelude.Maybe [Repository])
+describeRepositoriesResponse_repositories = Lens.lens (\DescribeRepositoriesResponse' {repositories} -> repositories) (\s@DescribeRepositoriesResponse' {} a -> s {repositories = a} :: DescribeRepositoriesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeRepositoriesResponse_httpStatus :: Lens.Lens' DescribeRepositoriesResponse Prelude.Int
+describeRepositoriesResponse_httpStatus = Lens.lens (\DescribeRepositoriesResponse' {httpStatus} -> httpStatus) (\s@DescribeRepositoriesResponse' {} a -> s {httpStatus = a} :: DescribeRepositoriesResponse)
+
+instance Prelude.NFData DescribeRepositoriesResponse where
+  rnf DescribeRepositoriesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf repositories
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/GetAuthorizationToken.hs b/gen/Amazonka/ECRPublic/GetAuthorizationToken.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/GetAuthorizationToken.hs
@@ -0,0 +1,156 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.GetAuthorizationToken
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves an authorization token. An authorization token represents your
+-- IAM authentication credentials and can be used to access any Amazon ECR
+-- registry that your IAM principal has access to. The authorization token
+-- is valid for 12 hours. This API requires the
+-- @ecr-public:GetAuthorizationToken@ and @sts:GetServiceBearerToken@
+-- permissions.
+module Amazonka.ECRPublic.GetAuthorizationToken
+  ( -- * Creating a Request
+    GetAuthorizationToken (..),
+    newGetAuthorizationToken,
+
+    -- * Destructuring the Response
+    GetAuthorizationTokenResponse (..),
+    newGetAuthorizationTokenResponse,
+
+    -- * Response Lenses
+    getAuthorizationTokenResponse_authorizationData,
+    getAuthorizationTokenResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAuthorizationToken' smart constructor.
+data GetAuthorizationToken = GetAuthorizationToken'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAuthorizationToken' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newGetAuthorizationToken ::
+  GetAuthorizationToken
+newGetAuthorizationToken = GetAuthorizationToken'
+
+instance Core.AWSRequest GetAuthorizationToken where
+  type
+    AWSResponse GetAuthorizationToken =
+      GetAuthorizationTokenResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAuthorizationTokenResponse'
+            Prelude.<$> (x Data..?> "authorizationData")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAuthorizationToken where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData GetAuthorizationToken where
+  rnf _ = ()
+
+instance Data.ToHeaders GetAuthorizationToken where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.GetAuthorizationToken" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetAuthorizationToken where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath GetAuthorizationToken where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetAuthorizationToken where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetAuthorizationTokenResponse' smart constructor.
+data GetAuthorizationTokenResponse = GetAuthorizationTokenResponse'
+  { -- | An authorization token data object that corresponds to a public
+    -- registry.
+    authorizationData :: Prelude.Maybe AuthorizationData,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAuthorizationTokenResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'authorizationData', 'getAuthorizationTokenResponse_authorizationData' - An authorization token data object that corresponds to a public
+-- registry.
+--
+-- 'httpStatus', 'getAuthorizationTokenResponse_httpStatus' - The response's http status code.
+newGetAuthorizationTokenResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAuthorizationTokenResponse
+newGetAuthorizationTokenResponse pHttpStatus_ =
+  GetAuthorizationTokenResponse'
+    { authorizationData =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An authorization token data object that corresponds to a public
+-- registry.
+getAuthorizationTokenResponse_authorizationData :: Lens.Lens' GetAuthorizationTokenResponse (Prelude.Maybe AuthorizationData)
+getAuthorizationTokenResponse_authorizationData = Lens.lens (\GetAuthorizationTokenResponse' {authorizationData} -> authorizationData) (\s@GetAuthorizationTokenResponse' {} a -> s {authorizationData = a} :: GetAuthorizationTokenResponse)
+
+-- | The response's http status code.
+getAuthorizationTokenResponse_httpStatus :: Lens.Lens' GetAuthorizationTokenResponse Prelude.Int
+getAuthorizationTokenResponse_httpStatus = Lens.lens (\GetAuthorizationTokenResponse' {httpStatus} -> httpStatus) (\s@GetAuthorizationTokenResponse' {} a -> s {httpStatus = a} :: GetAuthorizationTokenResponse)
+
+instance Prelude.NFData GetAuthorizationTokenResponse where
+  rnf GetAuthorizationTokenResponse' {..} =
+    Prelude.rnf authorizationData
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/GetRegistryCatalogData.hs b/gen/Amazonka/ECRPublic/GetRegistryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/GetRegistryCatalogData.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.GetRegistryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves catalog metadata for a public registry.
+module Amazonka.ECRPublic.GetRegistryCatalogData
+  ( -- * Creating a Request
+    GetRegistryCatalogData (..),
+    newGetRegistryCatalogData,
+
+    -- * Destructuring the Response
+    GetRegistryCatalogDataResponse (..),
+    newGetRegistryCatalogDataResponse,
+
+    -- * Response Lenses
+    getRegistryCatalogDataResponse_httpStatus,
+    getRegistryCatalogDataResponse_registryCatalogData,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRegistryCatalogData' smart constructor.
+data GetRegistryCatalogData = GetRegistryCatalogData'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRegistryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newGetRegistryCatalogData ::
+  GetRegistryCatalogData
+newGetRegistryCatalogData = GetRegistryCatalogData'
+
+instance Core.AWSRequest GetRegistryCatalogData where
+  type
+    AWSResponse GetRegistryCatalogData =
+      GetRegistryCatalogDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRegistryCatalogDataResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "registryCatalogData")
+      )
+
+instance Prelude.Hashable GetRegistryCatalogData where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData GetRegistryCatalogData where
+  rnf _ = ()
+
+instance Data.ToHeaders GetRegistryCatalogData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.GetRegistryCatalogData" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRegistryCatalogData where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath GetRegistryCatalogData where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRegistryCatalogData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRegistryCatalogDataResponse' smart constructor.
+data GetRegistryCatalogDataResponse = GetRegistryCatalogDataResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The catalog metadata for the public registry.
+    registryCatalogData :: RegistryCatalogData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRegistryCatalogDataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'getRegistryCatalogDataResponse_httpStatus' - The response's http status code.
+--
+-- 'registryCatalogData', 'getRegistryCatalogDataResponse_registryCatalogData' - The catalog metadata for the public registry.
+newGetRegistryCatalogDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'registryCatalogData'
+  RegistryCatalogData ->
+  GetRegistryCatalogDataResponse
+newGetRegistryCatalogDataResponse
+  pHttpStatus_
+  pRegistryCatalogData_ =
+    GetRegistryCatalogDataResponse'
+      { httpStatus =
+          pHttpStatus_,
+        registryCatalogData = pRegistryCatalogData_
+      }
+
+-- | The response's http status code.
+getRegistryCatalogDataResponse_httpStatus :: Lens.Lens' GetRegistryCatalogDataResponse Prelude.Int
+getRegistryCatalogDataResponse_httpStatus = Lens.lens (\GetRegistryCatalogDataResponse' {httpStatus} -> httpStatus) (\s@GetRegistryCatalogDataResponse' {} a -> s {httpStatus = a} :: GetRegistryCatalogDataResponse)
+
+-- | The catalog metadata for the public registry.
+getRegistryCatalogDataResponse_registryCatalogData :: Lens.Lens' GetRegistryCatalogDataResponse RegistryCatalogData
+getRegistryCatalogDataResponse_registryCatalogData = Lens.lens (\GetRegistryCatalogDataResponse' {registryCatalogData} -> registryCatalogData) (\s@GetRegistryCatalogDataResponse' {} a -> s {registryCatalogData = a} :: GetRegistryCatalogDataResponse)
+
+instance
+  Prelude.NFData
+    GetRegistryCatalogDataResponse
+  where
+  rnf GetRegistryCatalogDataResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf registryCatalogData
diff --git a/gen/Amazonka/ECRPublic/GetRepositoryCatalogData.hs b/gen/Amazonka/ECRPublic/GetRepositoryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/GetRepositoryCatalogData.hs
@@ -0,0 +1,198 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.GetRepositoryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieve catalog metadata for a repository in a public registry. This
+-- metadata is displayed publicly in the Amazon ECR Public Gallery.
+module Amazonka.ECRPublic.GetRepositoryCatalogData
+  ( -- * Creating a Request
+    GetRepositoryCatalogData (..),
+    newGetRepositoryCatalogData,
+
+    -- * Request Lenses
+    getRepositoryCatalogData_registryId,
+    getRepositoryCatalogData_repositoryName,
+
+    -- * Destructuring the Response
+    GetRepositoryCatalogDataResponse (..),
+    newGetRepositoryCatalogDataResponse,
+
+    -- * Response Lenses
+    getRepositoryCatalogDataResponse_catalogData,
+    getRepositoryCatalogDataResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRepositoryCatalogData' smart constructor.
+data GetRepositoryCatalogData = GetRepositoryCatalogData'
+  { -- | The AWS account ID associated with the registry that contains the
+    -- repositories to be described. If you do not specify a registry, the
+    -- default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to retrieve the catalog metadata for.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRepositoryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getRepositoryCatalogData_registryId' - The AWS account ID associated with the registry that contains the
+-- repositories to be described. If you do not specify a registry, the
+-- default public registry is assumed.
+--
+-- 'repositoryName', 'getRepositoryCatalogData_repositoryName' - The name of the repository to retrieve the catalog metadata for.
+newGetRepositoryCatalogData ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  GetRepositoryCatalogData
+newGetRepositoryCatalogData pRepositoryName_ =
+  GetRepositoryCatalogData'
+    { registryId =
+        Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The AWS account ID associated with the registry that contains the
+-- repositories to be described. If you do not specify a registry, the
+-- default public registry is assumed.
+getRepositoryCatalogData_registryId :: Lens.Lens' GetRepositoryCatalogData (Prelude.Maybe Prelude.Text)
+getRepositoryCatalogData_registryId = Lens.lens (\GetRepositoryCatalogData' {registryId} -> registryId) (\s@GetRepositoryCatalogData' {} a -> s {registryId = a} :: GetRepositoryCatalogData)
+
+-- | The name of the repository to retrieve the catalog metadata for.
+getRepositoryCatalogData_repositoryName :: Lens.Lens' GetRepositoryCatalogData Prelude.Text
+getRepositoryCatalogData_repositoryName = Lens.lens (\GetRepositoryCatalogData' {repositoryName} -> repositoryName) (\s@GetRepositoryCatalogData' {} a -> s {repositoryName = a} :: GetRepositoryCatalogData)
+
+instance Core.AWSRequest GetRepositoryCatalogData where
+  type
+    AWSResponse GetRepositoryCatalogData =
+      GetRepositoryCatalogDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRepositoryCatalogDataResponse'
+            Prelude.<$> (x Data..?> "catalogData")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRepositoryCatalogData where
+  hashWithSalt _salt GetRepositoryCatalogData' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData GetRepositoryCatalogData where
+  rnf GetRepositoryCatalogData' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders GetRepositoryCatalogData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.GetRepositoryCatalogData" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRepositoryCatalogData where
+  toJSON GetRepositoryCatalogData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath GetRepositoryCatalogData where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRepositoryCatalogData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRepositoryCatalogDataResponse' smart constructor.
+data GetRepositoryCatalogDataResponse = GetRepositoryCatalogDataResponse'
+  { -- | The catalog metadata for the repository.
+    catalogData :: Prelude.Maybe RepositoryCatalogData,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRepositoryCatalogDataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'catalogData', 'getRepositoryCatalogDataResponse_catalogData' - The catalog metadata for the repository.
+--
+-- 'httpStatus', 'getRepositoryCatalogDataResponse_httpStatus' - The response's http status code.
+newGetRepositoryCatalogDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRepositoryCatalogDataResponse
+newGetRepositoryCatalogDataResponse pHttpStatus_ =
+  GetRepositoryCatalogDataResponse'
+    { catalogData =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The catalog metadata for the repository.
+getRepositoryCatalogDataResponse_catalogData :: Lens.Lens' GetRepositoryCatalogDataResponse (Prelude.Maybe RepositoryCatalogData)
+getRepositoryCatalogDataResponse_catalogData = Lens.lens (\GetRepositoryCatalogDataResponse' {catalogData} -> catalogData) (\s@GetRepositoryCatalogDataResponse' {} a -> s {catalogData = a} :: GetRepositoryCatalogDataResponse)
+
+-- | The response's http status code.
+getRepositoryCatalogDataResponse_httpStatus :: Lens.Lens' GetRepositoryCatalogDataResponse Prelude.Int
+getRepositoryCatalogDataResponse_httpStatus = Lens.lens (\GetRepositoryCatalogDataResponse' {httpStatus} -> httpStatus) (\s@GetRepositoryCatalogDataResponse' {} a -> s {httpStatus = a} :: GetRepositoryCatalogDataResponse)
+
+instance
+  Prelude.NFData
+    GetRepositoryCatalogDataResponse
+  where
+  rnf GetRepositoryCatalogDataResponse' {..} =
+    Prelude.rnf catalogData
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/GetRepositoryPolicy.hs b/gen/Amazonka/ECRPublic/GetRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/GetRepositoryPolicy.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.GetRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the repository policy for the specified repository.
+module Amazonka.ECRPublic.GetRepositoryPolicy
+  ( -- * Creating a Request
+    GetRepositoryPolicy (..),
+    newGetRepositoryPolicy,
+
+    -- * Request Lenses
+    getRepositoryPolicy_registryId,
+    getRepositoryPolicy_repositoryName,
+
+    -- * Destructuring the Response
+    GetRepositoryPolicyResponse (..),
+    newGetRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    getRepositoryPolicyResponse_policyText,
+    getRepositoryPolicyResponse_registryId,
+    getRepositoryPolicyResponse_repositoryName,
+    getRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRepositoryPolicy' smart constructor.
+data GetRepositoryPolicy = GetRepositoryPolicy'
+  { -- | The AWS account ID associated with the public registry that contains the
+    -- repository. If you do not specify a registry, the default public
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository with the policy to retrieve.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getRepositoryPolicy_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository. If you do not specify a registry, the default public
+-- registry is assumed.
+--
+-- 'repositoryName', 'getRepositoryPolicy_repositoryName' - The name of the repository with the policy to retrieve.
+newGetRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  GetRepositoryPolicy
+newGetRepositoryPolicy pRepositoryName_ =
+  GetRepositoryPolicy'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository. If you do not specify a registry, the default public
+-- registry is assumed.
+getRepositoryPolicy_registryId :: Lens.Lens' GetRepositoryPolicy (Prelude.Maybe Prelude.Text)
+getRepositoryPolicy_registryId = Lens.lens (\GetRepositoryPolicy' {registryId} -> registryId) (\s@GetRepositoryPolicy' {} a -> s {registryId = a} :: GetRepositoryPolicy)
+
+-- | The name of the repository with the policy to retrieve.
+getRepositoryPolicy_repositoryName :: Lens.Lens' GetRepositoryPolicy Prelude.Text
+getRepositoryPolicy_repositoryName = Lens.lens (\GetRepositoryPolicy' {repositoryName} -> repositoryName) (\s@GetRepositoryPolicy' {} a -> s {repositoryName = a} :: GetRepositoryPolicy)
+
+instance Core.AWSRequest GetRepositoryPolicy where
+  type
+    AWSResponse GetRepositoryPolicy =
+      GetRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRepositoryPolicy where
+  hashWithSalt _salt GetRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData GetRepositoryPolicy where
+  rnf GetRepositoryPolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders GetRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.GetRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRepositoryPolicy where
+  toJSON GetRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath GetRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRepositoryPolicyResponse' smart constructor.
+data GetRepositoryPolicyResponse = GetRepositoryPolicyResponse'
+  { -- | The repository policy text associated with the repository. The policy
+    -- text will be in JSON format.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'getRepositoryPolicyResponse_policyText' - The repository policy text associated with the repository. The policy
+-- text will be in JSON format.
+--
+-- 'registryId', 'getRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'getRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'getRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newGetRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRepositoryPolicyResponse
+newGetRepositoryPolicyResponse pHttpStatus_ =
+  GetRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The repository policy text associated with the repository. The policy
+-- text will be in JSON format.
+getRepositoryPolicyResponse_policyText :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_policyText = Lens.lens (\GetRepositoryPolicyResponse' {policyText} -> policyText) (\s@GetRepositoryPolicyResponse' {} a -> s {policyText = a} :: GetRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+getRepositoryPolicyResponse_registryId :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_registryId = Lens.lens (\GetRepositoryPolicyResponse' {registryId} -> registryId) (\s@GetRepositoryPolicyResponse' {} a -> s {registryId = a} :: GetRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+getRepositoryPolicyResponse_repositoryName :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_repositoryName = Lens.lens (\GetRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@GetRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: GetRepositoryPolicyResponse)
+
+-- | The response's http status code.
+getRepositoryPolicyResponse_httpStatus :: Lens.Lens' GetRepositoryPolicyResponse Prelude.Int
+getRepositoryPolicyResponse_httpStatus = Lens.lens (\GetRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@GetRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: GetRepositoryPolicyResponse)
+
+instance Prelude.NFData GetRepositoryPolicyResponse where
+  rnf GetRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/InitiateLayerUpload.hs b/gen/Amazonka/ECRPublic/InitiateLayerUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/InitiateLayerUpload.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.InitiateLayerUpload
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Notifies Amazon ECR that you intend to upload an image layer.
+--
+-- When an image is pushed, the InitiateLayerUpload API is called once per
+-- image layer that has not already been uploaded. Whether or not an image
+-- layer has been uploaded is determined by the BatchCheckLayerAvailability
+-- API action.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECRPublic.InitiateLayerUpload
+  ( -- * Creating a Request
+    InitiateLayerUpload (..),
+    newInitiateLayerUpload,
+
+    -- * Request Lenses
+    initiateLayerUpload_registryId,
+    initiateLayerUpload_repositoryName,
+
+    -- * Destructuring the Response
+    InitiateLayerUploadResponse (..),
+    newInitiateLayerUploadResponse,
+
+    -- * Response Lenses
+    initiateLayerUploadResponse_partSize,
+    initiateLayerUploadResponse_uploadId,
+    initiateLayerUploadResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newInitiateLayerUpload' smart constructor.
+data InitiateLayerUpload = InitiateLayerUpload'
+  { -- | The AWS account ID associated with the registry to which you intend to
+    -- upload layers. If you do not specify a registry, the default public
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which you intend to upload layers.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InitiateLayerUpload' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'initiateLayerUpload_registryId' - The AWS account ID associated with the registry to which you intend to
+-- upload layers. If you do not specify a registry, the default public
+-- registry is assumed.
+--
+-- 'repositoryName', 'initiateLayerUpload_repositoryName' - The name of the repository to which you intend to upload layers.
+newInitiateLayerUpload ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  InitiateLayerUpload
+newInitiateLayerUpload pRepositoryName_ =
+  InitiateLayerUpload'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The AWS account ID associated with the registry to which you intend to
+-- upload layers. If you do not specify a registry, the default public
+-- registry is assumed.
+initiateLayerUpload_registryId :: Lens.Lens' InitiateLayerUpload (Prelude.Maybe Prelude.Text)
+initiateLayerUpload_registryId = Lens.lens (\InitiateLayerUpload' {registryId} -> registryId) (\s@InitiateLayerUpload' {} a -> s {registryId = a} :: InitiateLayerUpload)
+
+-- | The name of the repository to which you intend to upload layers.
+initiateLayerUpload_repositoryName :: Lens.Lens' InitiateLayerUpload Prelude.Text
+initiateLayerUpload_repositoryName = Lens.lens (\InitiateLayerUpload' {repositoryName} -> repositoryName) (\s@InitiateLayerUpload' {} a -> s {repositoryName = a} :: InitiateLayerUpload)
+
+instance Core.AWSRequest InitiateLayerUpload where
+  type
+    AWSResponse InitiateLayerUpload =
+      InitiateLayerUploadResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          InitiateLayerUploadResponse'
+            Prelude.<$> (x Data..?> "partSize")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable InitiateLayerUpload where
+  hashWithSalt _salt InitiateLayerUpload' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData InitiateLayerUpload where
+  rnf InitiateLayerUpload' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders InitiateLayerUpload where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.InitiateLayerUpload" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON InitiateLayerUpload where
+  toJSON InitiateLayerUpload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath InitiateLayerUpload where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery InitiateLayerUpload where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newInitiateLayerUploadResponse' smart constructor.
+data InitiateLayerUploadResponse = InitiateLayerUploadResponse'
+  { -- | The size, in bytes, that Amazon ECR expects future layer part uploads to
+    -- be.
+    partSize :: Prelude.Maybe Prelude.Natural,
+    -- | The upload ID for the layer upload. This parameter is passed to further
+    -- UploadLayerPart and CompleteLayerUpload operations.
+    uploadId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InitiateLayerUploadResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'partSize', 'initiateLayerUploadResponse_partSize' - The size, in bytes, that Amazon ECR expects future layer part uploads to
+-- be.
+--
+-- 'uploadId', 'initiateLayerUploadResponse_uploadId' - The upload ID for the layer upload. This parameter is passed to further
+-- UploadLayerPart and CompleteLayerUpload operations.
+--
+-- 'httpStatus', 'initiateLayerUploadResponse_httpStatus' - The response's http status code.
+newInitiateLayerUploadResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  InitiateLayerUploadResponse
+newInitiateLayerUploadResponse pHttpStatus_ =
+  InitiateLayerUploadResponse'
+    { partSize =
+        Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The size, in bytes, that Amazon ECR expects future layer part uploads to
+-- be.
+initiateLayerUploadResponse_partSize :: Lens.Lens' InitiateLayerUploadResponse (Prelude.Maybe Prelude.Natural)
+initiateLayerUploadResponse_partSize = Lens.lens (\InitiateLayerUploadResponse' {partSize} -> partSize) (\s@InitiateLayerUploadResponse' {} a -> s {partSize = a} :: InitiateLayerUploadResponse)
+
+-- | The upload ID for the layer upload. This parameter is passed to further
+-- UploadLayerPart and CompleteLayerUpload operations.
+initiateLayerUploadResponse_uploadId :: Lens.Lens' InitiateLayerUploadResponse (Prelude.Maybe Prelude.Text)
+initiateLayerUploadResponse_uploadId = Lens.lens (\InitiateLayerUploadResponse' {uploadId} -> uploadId) (\s@InitiateLayerUploadResponse' {} a -> s {uploadId = a} :: InitiateLayerUploadResponse)
+
+-- | The response's http status code.
+initiateLayerUploadResponse_httpStatus :: Lens.Lens' InitiateLayerUploadResponse Prelude.Int
+initiateLayerUploadResponse_httpStatus = Lens.lens (\InitiateLayerUploadResponse' {httpStatus} -> httpStatus) (\s@InitiateLayerUploadResponse' {} a -> s {httpStatus = a} :: InitiateLayerUploadResponse)
+
+instance Prelude.NFData InitiateLayerUploadResponse where
+  rnf InitiateLayerUploadResponse' {..} =
+    Prelude.rnf partSize
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/Lens.hs b/gen/Amazonka/ECRPublic/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Lens.hs
@@ -0,0 +1,330 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Lens
+  ( -- * Operations
+
+    -- ** BatchCheckLayerAvailability
+    batchCheckLayerAvailability_registryId,
+    batchCheckLayerAvailability_repositoryName,
+    batchCheckLayerAvailability_layerDigests,
+    batchCheckLayerAvailabilityResponse_failures,
+    batchCheckLayerAvailabilityResponse_layers,
+    batchCheckLayerAvailabilityResponse_httpStatus,
+
+    -- ** BatchDeleteImage
+    batchDeleteImage_registryId,
+    batchDeleteImage_repositoryName,
+    batchDeleteImage_imageIds,
+    batchDeleteImageResponse_failures,
+    batchDeleteImageResponse_imageIds,
+    batchDeleteImageResponse_httpStatus,
+
+    -- ** CompleteLayerUpload
+    completeLayerUpload_registryId,
+    completeLayerUpload_repositoryName,
+    completeLayerUpload_uploadId,
+    completeLayerUpload_layerDigests,
+    completeLayerUploadResponse_layerDigest,
+    completeLayerUploadResponse_registryId,
+    completeLayerUploadResponse_repositoryName,
+    completeLayerUploadResponse_uploadId,
+    completeLayerUploadResponse_httpStatus,
+
+    -- ** CreateRepository
+    createRepository_catalogData,
+    createRepository_tags,
+    createRepository_repositoryName,
+    createRepositoryResponse_catalogData,
+    createRepositoryResponse_repository,
+    createRepositoryResponse_httpStatus,
+
+    -- ** DeleteRepository
+    deleteRepository_force,
+    deleteRepository_registryId,
+    deleteRepository_repositoryName,
+    deleteRepositoryResponse_repository,
+    deleteRepositoryResponse_httpStatus,
+
+    -- ** DeleteRepositoryPolicy
+    deleteRepositoryPolicy_registryId,
+    deleteRepositoryPolicy_repositoryName,
+    deleteRepositoryPolicyResponse_policyText,
+    deleteRepositoryPolicyResponse_registryId,
+    deleteRepositoryPolicyResponse_repositoryName,
+    deleteRepositoryPolicyResponse_httpStatus,
+
+    -- ** DescribeImageTags
+    describeImageTags_maxResults,
+    describeImageTags_nextToken,
+    describeImageTags_registryId,
+    describeImageTags_repositoryName,
+    describeImageTagsResponse_imageTagDetails,
+    describeImageTagsResponse_nextToken,
+    describeImageTagsResponse_httpStatus,
+
+    -- ** DescribeImages
+    describeImages_imageIds,
+    describeImages_maxResults,
+    describeImages_nextToken,
+    describeImages_registryId,
+    describeImages_repositoryName,
+    describeImagesResponse_imageDetails,
+    describeImagesResponse_nextToken,
+    describeImagesResponse_httpStatus,
+
+    -- ** DescribeRegistries
+    describeRegistries_maxResults,
+    describeRegistries_nextToken,
+    describeRegistriesResponse_nextToken,
+    describeRegistriesResponse_httpStatus,
+    describeRegistriesResponse_registries,
+
+    -- ** DescribeRepositories
+    describeRepositories_maxResults,
+    describeRepositories_nextToken,
+    describeRepositories_registryId,
+    describeRepositories_repositoryNames,
+    describeRepositoriesResponse_nextToken,
+    describeRepositoriesResponse_repositories,
+    describeRepositoriesResponse_httpStatus,
+
+    -- ** GetAuthorizationToken
+    getAuthorizationTokenResponse_authorizationData,
+    getAuthorizationTokenResponse_httpStatus,
+
+    -- ** GetRegistryCatalogData
+    getRegistryCatalogDataResponse_httpStatus,
+    getRegistryCatalogDataResponse_registryCatalogData,
+
+    -- ** GetRepositoryCatalogData
+    getRepositoryCatalogData_registryId,
+    getRepositoryCatalogData_repositoryName,
+    getRepositoryCatalogDataResponse_catalogData,
+    getRepositoryCatalogDataResponse_httpStatus,
+
+    -- ** GetRepositoryPolicy
+    getRepositoryPolicy_registryId,
+    getRepositoryPolicy_repositoryName,
+    getRepositoryPolicyResponse_policyText,
+    getRepositoryPolicyResponse_registryId,
+    getRepositoryPolicyResponse_repositoryName,
+    getRepositoryPolicyResponse_httpStatus,
+
+    -- ** InitiateLayerUpload
+    initiateLayerUpload_registryId,
+    initiateLayerUpload_repositoryName,
+    initiateLayerUploadResponse_partSize,
+    initiateLayerUploadResponse_uploadId,
+    initiateLayerUploadResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** PutImage
+    putImage_imageDigest,
+    putImage_imageManifestMediaType,
+    putImage_imageTag,
+    putImage_registryId,
+    putImage_repositoryName,
+    putImage_imageManifest,
+    putImageResponse_image,
+    putImageResponse_httpStatus,
+
+    -- ** PutRegistryCatalogData
+    putRegistryCatalogData_displayName,
+    putRegistryCatalogDataResponse_httpStatus,
+    putRegistryCatalogDataResponse_registryCatalogData,
+
+    -- ** PutRepositoryCatalogData
+    putRepositoryCatalogData_registryId,
+    putRepositoryCatalogData_repositoryName,
+    putRepositoryCatalogData_catalogData,
+    putRepositoryCatalogDataResponse_catalogData,
+    putRepositoryCatalogDataResponse_httpStatus,
+
+    -- ** SetRepositoryPolicy
+    setRepositoryPolicy_force,
+    setRepositoryPolicy_registryId,
+    setRepositoryPolicy_repositoryName,
+    setRepositoryPolicy_policyText,
+    setRepositoryPolicyResponse_policyText,
+    setRepositoryPolicyResponse_registryId,
+    setRepositoryPolicyResponse_repositoryName,
+    setRepositoryPolicyResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UploadLayerPart
+    uploadLayerPart_registryId,
+    uploadLayerPart_repositoryName,
+    uploadLayerPart_uploadId,
+    uploadLayerPart_partFirstByte,
+    uploadLayerPart_partLastByte,
+    uploadLayerPart_layerPartBlob,
+    uploadLayerPartResponse_lastByteReceived,
+    uploadLayerPartResponse_registryId,
+    uploadLayerPartResponse_repositoryName,
+    uploadLayerPartResponse_uploadId,
+    uploadLayerPartResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AuthorizationData
+    authorizationData_authorizationToken,
+    authorizationData_expiresAt,
+
+    -- ** Image
+    image_imageId,
+    image_imageManifest,
+    image_imageManifestMediaType,
+    image_registryId,
+    image_repositoryName,
+
+    -- ** ImageDetail
+    imageDetail_artifactMediaType,
+    imageDetail_imageDigest,
+    imageDetail_imageManifestMediaType,
+    imageDetail_imagePushedAt,
+    imageDetail_imageSizeInBytes,
+    imageDetail_imageTags,
+    imageDetail_registryId,
+    imageDetail_repositoryName,
+
+    -- ** ImageFailure
+    imageFailure_failureCode,
+    imageFailure_failureReason,
+    imageFailure_imageId,
+
+    -- ** ImageIdentifier
+    imageIdentifier_imageDigest,
+    imageIdentifier_imageTag,
+
+    -- ** ImageTagDetail
+    imageTagDetail_createdAt,
+    imageTagDetail_imageDetail,
+    imageTagDetail_imageTag,
+
+    -- ** Layer
+    layer_layerAvailability,
+    layer_layerDigest,
+    layer_layerSize,
+    layer_mediaType,
+
+    -- ** LayerFailure
+    layerFailure_failureCode,
+    layerFailure_failureReason,
+    layerFailure_layerDigest,
+
+    -- ** ReferencedImageDetail
+    referencedImageDetail_artifactMediaType,
+    referencedImageDetail_imageDigest,
+    referencedImageDetail_imageManifestMediaType,
+    referencedImageDetail_imagePushedAt,
+    referencedImageDetail_imageSizeInBytes,
+
+    -- ** Registry
+    registry_registryId,
+    registry_registryArn,
+    registry_registryUri,
+    registry_verified,
+    registry_aliases,
+
+    -- ** RegistryAlias
+    registryAlias_name,
+    registryAlias_status,
+    registryAlias_primaryRegistryAlias,
+    registryAlias_defaultRegistryAlias,
+
+    -- ** RegistryCatalogData
+    registryCatalogData_displayName,
+
+    -- ** Repository
+    repository_createdAt,
+    repository_registryId,
+    repository_repositoryArn,
+    repository_repositoryName,
+    repository_repositoryUri,
+
+    -- ** RepositoryCatalogData
+    repositoryCatalogData_aboutText,
+    repositoryCatalogData_architectures,
+    repositoryCatalogData_description,
+    repositoryCatalogData_logoUrl,
+    repositoryCatalogData_marketplaceCertified,
+    repositoryCatalogData_operatingSystems,
+    repositoryCatalogData_usageText,
+
+    -- ** RepositoryCatalogDataInput
+    repositoryCatalogDataInput_aboutText,
+    repositoryCatalogDataInput_architectures,
+    repositoryCatalogDataInput_description,
+    repositoryCatalogDataInput_logoImageBlob,
+    repositoryCatalogDataInput_operatingSystems,
+    repositoryCatalogDataInput_usageText,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+  )
+where
+
+import Amazonka.ECRPublic.BatchCheckLayerAvailability
+import Amazonka.ECRPublic.BatchDeleteImage
+import Amazonka.ECRPublic.CompleteLayerUpload
+import Amazonka.ECRPublic.CreateRepository
+import Amazonka.ECRPublic.DeleteRepository
+import Amazonka.ECRPublic.DeleteRepositoryPolicy
+import Amazonka.ECRPublic.DescribeImageTags
+import Amazonka.ECRPublic.DescribeImages
+import Amazonka.ECRPublic.DescribeRegistries
+import Amazonka.ECRPublic.DescribeRepositories
+import Amazonka.ECRPublic.GetAuthorizationToken
+import Amazonka.ECRPublic.GetRegistryCatalogData
+import Amazonka.ECRPublic.GetRepositoryCatalogData
+import Amazonka.ECRPublic.GetRepositoryPolicy
+import Amazonka.ECRPublic.InitiateLayerUpload
+import Amazonka.ECRPublic.ListTagsForResource
+import Amazonka.ECRPublic.PutImage
+import Amazonka.ECRPublic.PutRegistryCatalogData
+import Amazonka.ECRPublic.PutRepositoryCatalogData
+import Amazonka.ECRPublic.SetRepositoryPolicy
+import Amazonka.ECRPublic.TagResource
+import Amazonka.ECRPublic.Types.AuthorizationData
+import Amazonka.ECRPublic.Types.Image
+import Amazonka.ECRPublic.Types.ImageDetail
+import Amazonka.ECRPublic.Types.ImageFailure
+import Amazonka.ECRPublic.Types.ImageIdentifier
+import Amazonka.ECRPublic.Types.ImageTagDetail
+import Amazonka.ECRPublic.Types.Layer
+import Amazonka.ECRPublic.Types.LayerFailure
+import Amazonka.ECRPublic.Types.ReferencedImageDetail
+import Amazonka.ECRPublic.Types.Registry
+import Amazonka.ECRPublic.Types.RegistryAlias
+import Amazonka.ECRPublic.Types.RegistryCatalogData
+import Amazonka.ECRPublic.Types.Repository
+import Amazonka.ECRPublic.Types.RepositoryCatalogData
+import Amazonka.ECRPublic.Types.RepositoryCatalogDataInput
+import Amazonka.ECRPublic.Types.Tag
+import Amazonka.ECRPublic.UntagResource
+import Amazonka.ECRPublic.UploadLayerPart
diff --git a/gen/Amazonka/ECRPublic/ListTagsForResource.hs b/gen/Amazonka/ECRPublic/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/ListTagsForResource.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List the tags for an Amazon ECR Public resource.
+module Amazonka.ECRPublic.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) that identifies the resource for which to
+    -- list the tags. Currently, the supported resource is an Amazon ECR Public
+    -- repository.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) that identifies the resource for which to
+-- list the tags. Currently, the supported resource is an Amazon ECR Public
+-- repository.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) that identifies the resource for which to
+-- list the tags. Currently, the supported resource is an Amazon ECR Public
+-- repository.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("resourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The tags for the resource.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags for the resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags for the resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/PutImage.hs b/gen/Amazonka/ECRPublic/PutImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/PutImage.hs
@@ -0,0 +1,266 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.PutImage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or updates the image manifest and tags associated with an image.
+--
+-- When an image is pushed and all new image layers have been uploaded, the
+-- PutImage API is called once to create or update the image manifest and
+-- the tags associated with the image.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECRPublic.PutImage
+  ( -- * Creating a Request
+    PutImage (..),
+    newPutImage,
+
+    -- * Request Lenses
+    putImage_imageDigest,
+    putImage_imageManifestMediaType,
+    putImage_imageTag,
+    putImage_registryId,
+    putImage_repositoryName,
+    putImage_imageManifest,
+
+    -- * Destructuring the Response
+    PutImageResponse (..),
+    newPutImageResponse,
+
+    -- * Response Lenses
+    putImageResponse_image,
+    putImageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutImage' smart constructor.
+data PutImage = PutImage'
+  { -- | The image digest of the image manifest corresponding to the image.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The media type of the image manifest. If you push an image manifest that
+    -- does not contain the @mediaType@ field, you must specify the
+    -- @imageManifestMediaType@ in the request.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The tag to associate with the image. This parameter is required for
+    -- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+    -- Initiative (OCI) formats.
+    imageTag :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID associated with the public registry that contains the
+    -- repository in which to put the image. If you do not specify a registry,
+    -- the default public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository in which to put the image.
+    repositoryName :: Prelude.Text,
+    -- | The image manifest corresponding to the image to be uploaded.
+    imageManifest :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDigest', 'putImage_imageDigest' - The image digest of the image manifest corresponding to the image.
+--
+-- 'imageManifestMediaType', 'putImage_imageManifestMediaType' - The media type of the image manifest. If you push an image manifest that
+-- does not contain the @mediaType@ field, you must specify the
+-- @imageManifestMediaType@ in the request.
+--
+-- 'imageTag', 'putImage_imageTag' - The tag to associate with the image. This parameter is required for
+-- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+-- Initiative (OCI) formats.
+--
+-- 'registryId', 'putImage_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository in which to put the image. If you do not specify a registry,
+-- the default public registry is assumed.
+--
+-- 'repositoryName', 'putImage_repositoryName' - The name of the repository in which to put the image.
+--
+-- 'imageManifest', 'putImage_imageManifest' - The image manifest corresponding to the image to be uploaded.
+newPutImage ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageManifest'
+  Prelude.Text ->
+  PutImage
+newPutImage pRepositoryName_ pImageManifest_ =
+  PutImage'
+    { imageDigest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      imageTag = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageManifest = pImageManifest_
+    }
+
+-- | The image digest of the image manifest corresponding to the image.
+putImage_imageDigest :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageDigest = Lens.lens (\PutImage' {imageDigest} -> imageDigest) (\s@PutImage' {} a -> s {imageDigest = a} :: PutImage)
+
+-- | The media type of the image manifest. If you push an image manifest that
+-- does not contain the @mediaType@ field, you must specify the
+-- @imageManifestMediaType@ in the request.
+putImage_imageManifestMediaType :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageManifestMediaType = Lens.lens (\PutImage' {imageManifestMediaType} -> imageManifestMediaType) (\s@PutImage' {} a -> s {imageManifestMediaType = a} :: PutImage)
+
+-- | The tag to associate with the image. This parameter is required for
+-- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+-- Initiative (OCI) formats.
+putImage_imageTag :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageTag = Lens.lens (\PutImage' {imageTag} -> imageTag) (\s@PutImage' {} a -> s {imageTag = a} :: PutImage)
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository in which to put the image. If you do not specify a registry,
+-- the default public registry is assumed.
+putImage_registryId :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_registryId = Lens.lens (\PutImage' {registryId} -> registryId) (\s@PutImage' {} a -> s {registryId = a} :: PutImage)
+
+-- | The name of the repository in which to put the image.
+putImage_repositoryName :: Lens.Lens' PutImage Prelude.Text
+putImage_repositoryName = Lens.lens (\PutImage' {repositoryName} -> repositoryName) (\s@PutImage' {} a -> s {repositoryName = a} :: PutImage)
+
+-- | The image manifest corresponding to the image to be uploaded.
+putImage_imageManifest :: Lens.Lens' PutImage Prelude.Text
+putImage_imageManifest = Lens.lens (\PutImage' {imageManifest} -> imageManifest) (\s@PutImage' {} a -> s {imageManifest = a} :: PutImage)
+
+instance Core.AWSRequest PutImage where
+  type AWSResponse PutImage = PutImageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutImageResponse'
+            Prelude.<$> (x Data..?> "image")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutImage where
+  hashWithSalt _salt PutImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` imageTag
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageManifest
+
+instance Prelude.NFData PutImage where
+  rnf PutImage' {..} =
+    Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf imageTag
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageManifest
+
+instance Data.ToHeaders PutImage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.PutImage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutImage where
+  toJSON PutImage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("imageDigest" Data..=) Prelude.<$> imageDigest,
+            ("imageManifestMediaType" Data..=)
+              Prelude.<$> imageManifestMediaType,
+            ("imageTag" Data..=) Prelude.<$> imageTag,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just
+              ("imageManifest" Data..= imageManifest)
+          ]
+      )
+
+instance Data.ToPath PutImage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutImage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutImageResponse' smart constructor.
+data PutImageResponse = PutImageResponse'
+  { -- | Details of the image uploaded.
+    image :: Prelude.Maybe Image,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'image', 'putImageResponse_image' - Details of the image uploaded.
+--
+-- 'httpStatus', 'putImageResponse_httpStatus' - The response's http status code.
+newPutImageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutImageResponse
+newPutImageResponse pHttpStatus_ =
+  PutImageResponse'
+    { image = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details of the image uploaded.
+putImageResponse_image :: Lens.Lens' PutImageResponse (Prelude.Maybe Image)
+putImageResponse_image = Lens.lens (\PutImageResponse' {image} -> image) (\s@PutImageResponse' {} a -> s {image = a} :: PutImageResponse)
+
+-- | The response's http status code.
+putImageResponse_httpStatus :: Lens.Lens' PutImageResponse Prelude.Int
+putImageResponse_httpStatus = Lens.lens (\PutImageResponse' {httpStatus} -> httpStatus) (\s@PutImageResponse' {} a -> s {httpStatus = a} :: PutImageResponse)
+
+instance Prelude.NFData PutImageResponse where
+  rnf PutImageResponse' {..} =
+    Prelude.rnf image
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/PutRegistryCatalogData.hs b/gen/Amazonka/ECRPublic/PutRegistryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/PutRegistryCatalogData.hs
@@ -0,0 +1,189 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.PutRegistryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Create or updates the catalog data for a public registry.
+module Amazonka.ECRPublic.PutRegistryCatalogData
+  ( -- * Creating a Request
+    PutRegistryCatalogData (..),
+    newPutRegistryCatalogData,
+
+    -- * Request Lenses
+    putRegistryCatalogData_displayName,
+
+    -- * Destructuring the Response
+    PutRegistryCatalogDataResponse (..),
+    newPutRegistryCatalogDataResponse,
+
+    -- * Response Lenses
+    putRegistryCatalogDataResponse_httpStatus,
+    putRegistryCatalogDataResponse_registryCatalogData,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutRegistryCatalogData' smart constructor.
+data PutRegistryCatalogData = PutRegistryCatalogData'
+  { -- | The display name for a public registry. The display name is shown as the
+    -- repository author in the Amazon ECR Public Gallery.
+    --
+    -- The registry display name is only publicly visible in the Amazon ECR
+    -- Public Gallery for verified accounts.
+    displayName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRegistryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'displayName', 'putRegistryCatalogData_displayName' - The display name for a public registry. The display name is shown as the
+-- repository author in the Amazon ECR Public Gallery.
+--
+-- The registry display name is only publicly visible in the Amazon ECR
+-- Public Gallery for verified accounts.
+newPutRegistryCatalogData ::
+  PutRegistryCatalogData
+newPutRegistryCatalogData =
+  PutRegistryCatalogData'
+    { displayName =
+        Prelude.Nothing
+    }
+
+-- | The display name for a public registry. The display name is shown as the
+-- repository author in the Amazon ECR Public Gallery.
+--
+-- The registry display name is only publicly visible in the Amazon ECR
+-- Public Gallery for verified accounts.
+putRegistryCatalogData_displayName :: Lens.Lens' PutRegistryCatalogData (Prelude.Maybe Prelude.Text)
+putRegistryCatalogData_displayName = Lens.lens (\PutRegistryCatalogData' {displayName} -> displayName) (\s@PutRegistryCatalogData' {} a -> s {displayName = a} :: PutRegistryCatalogData)
+
+instance Core.AWSRequest PutRegistryCatalogData where
+  type
+    AWSResponse PutRegistryCatalogData =
+      PutRegistryCatalogDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutRegistryCatalogDataResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "registryCatalogData")
+      )
+
+instance Prelude.Hashable PutRegistryCatalogData where
+  hashWithSalt _salt PutRegistryCatalogData' {..} =
+    _salt `Prelude.hashWithSalt` displayName
+
+instance Prelude.NFData PutRegistryCatalogData where
+  rnf PutRegistryCatalogData' {..} =
+    Prelude.rnf displayName
+
+instance Data.ToHeaders PutRegistryCatalogData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.PutRegistryCatalogData" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRegistryCatalogData where
+  toJSON PutRegistryCatalogData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("displayName" Data..=) Prelude.<$> displayName]
+      )
+
+instance Data.ToPath PutRegistryCatalogData where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutRegistryCatalogData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRegistryCatalogDataResponse' smart constructor.
+data PutRegistryCatalogDataResponse = PutRegistryCatalogDataResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The catalog data for the public registry.
+    registryCatalogData :: RegistryCatalogData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRegistryCatalogDataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'putRegistryCatalogDataResponse_httpStatus' - The response's http status code.
+--
+-- 'registryCatalogData', 'putRegistryCatalogDataResponse_registryCatalogData' - The catalog data for the public registry.
+newPutRegistryCatalogDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'registryCatalogData'
+  RegistryCatalogData ->
+  PutRegistryCatalogDataResponse
+newPutRegistryCatalogDataResponse
+  pHttpStatus_
+  pRegistryCatalogData_ =
+    PutRegistryCatalogDataResponse'
+      { httpStatus =
+          pHttpStatus_,
+        registryCatalogData = pRegistryCatalogData_
+      }
+
+-- | The response's http status code.
+putRegistryCatalogDataResponse_httpStatus :: Lens.Lens' PutRegistryCatalogDataResponse Prelude.Int
+putRegistryCatalogDataResponse_httpStatus = Lens.lens (\PutRegistryCatalogDataResponse' {httpStatus} -> httpStatus) (\s@PutRegistryCatalogDataResponse' {} a -> s {httpStatus = a} :: PutRegistryCatalogDataResponse)
+
+-- | The catalog data for the public registry.
+putRegistryCatalogDataResponse_registryCatalogData :: Lens.Lens' PutRegistryCatalogDataResponse RegistryCatalogData
+putRegistryCatalogDataResponse_registryCatalogData = Lens.lens (\PutRegistryCatalogDataResponse' {registryCatalogData} -> registryCatalogData) (\s@PutRegistryCatalogDataResponse' {} a -> s {registryCatalogData = a} :: PutRegistryCatalogDataResponse)
+
+instance
+  Prelude.NFData
+    PutRegistryCatalogDataResponse
+  where
+  rnf PutRegistryCatalogDataResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf registryCatalogData
diff --git a/gen/Amazonka/ECRPublic/PutRepositoryCatalogData.hs b/gen/Amazonka/ECRPublic/PutRepositoryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/PutRepositoryCatalogData.hs
@@ -0,0 +1,218 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.PutRepositoryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates or updates the catalog data for a repository in a public
+-- registry.
+module Amazonka.ECRPublic.PutRepositoryCatalogData
+  ( -- * Creating a Request
+    PutRepositoryCatalogData (..),
+    newPutRepositoryCatalogData,
+
+    -- * Request Lenses
+    putRepositoryCatalogData_registryId,
+    putRepositoryCatalogData_repositoryName,
+    putRepositoryCatalogData_catalogData,
+
+    -- * Destructuring the Response
+    PutRepositoryCatalogDataResponse (..),
+    newPutRepositoryCatalogDataResponse,
+
+    -- * Response Lenses
+    putRepositoryCatalogDataResponse_catalogData,
+    putRepositoryCatalogDataResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutRepositoryCatalogData' smart constructor.
+data PutRepositoryCatalogData = PutRepositoryCatalogData'
+  { -- | The AWS account ID associated with the public registry the repository is
+    -- in. If you do not specify a registry, the default public registry is
+    -- assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to create or update the catalog data for.
+    repositoryName :: Prelude.Text,
+    -- | An object containing the catalog data for a repository. This data is
+    -- publicly visible in the Amazon ECR Public Gallery.
+    catalogData :: RepositoryCatalogDataInput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRepositoryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'putRepositoryCatalogData_registryId' - The AWS account ID associated with the public registry the repository is
+-- in. If you do not specify a registry, the default public registry is
+-- assumed.
+--
+-- 'repositoryName', 'putRepositoryCatalogData_repositoryName' - The name of the repository to create or update the catalog data for.
+--
+-- 'catalogData', 'putRepositoryCatalogData_catalogData' - An object containing the catalog data for a repository. This data is
+-- publicly visible in the Amazon ECR Public Gallery.
+newPutRepositoryCatalogData ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'catalogData'
+  RepositoryCatalogDataInput ->
+  PutRepositoryCatalogData
+newPutRepositoryCatalogData
+  pRepositoryName_
+  pCatalogData_ =
+    PutRepositoryCatalogData'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        catalogData = pCatalogData_
+      }
+
+-- | The AWS account ID associated with the public registry the repository is
+-- in. If you do not specify a registry, the default public registry is
+-- assumed.
+putRepositoryCatalogData_registryId :: Lens.Lens' PutRepositoryCatalogData (Prelude.Maybe Prelude.Text)
+putRepositoryCatalogData_registryId = Lens.lens (\PutRepositoryCatalogData' {registryId} -> registryId) (\s@PutRepositoryCatalogData' {} a -> s {registryId = a} :: PutRepositoryCatalogData)
+
+-- | The name of the repository to create or update the catalog data for.
+putRepositoryCatalogData_repositoryName :: Lens.Lens' PutRepositoryCatalogData Prelude.Text
+putRepositoryCatalogData_repositoryName = Lens.lens (\PutRepositoryCatalogData' {repositoryName} -> repositoryName) (\s@PutRepositoryCatalogData' {} a -> s {repositoryName = a} :: PutRepositoryCatalogData)
+
+-- | An object containing the catalog data for a repository. This data is
+-- publicly visible in the Amazon ECR Public Gallery.
+putRepositoryCatalogData_catalogData :: Lens.Lens' PutRepositoryCatalogData RepositoryCatalogDataInput
+putRepositoryCatalogData_catalogData = Lens.lens (\PutRepositoryCatalogData' {catalogData} -> catalogData) (\s@PutRepositoryCatalogData' {} a -> s {catalogData = a} :: PutRepositoryCatalogData)
+
+instance Core.AWSRequest PutRepositoryCatalogData where
+  type
+    AWSResponse PutRepositoryCatalogData =
+      PutRepositoryCatalogDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutRepositoryCatalogDataResponse'
+            Prelude.<$> (x Data..?> "catalogData")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutRepositoryCatalogData where
+  hashWithSalt _salt PutRepositoryCatalogData' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` catalogData
+
+instance Prelude.NFData PutRepositoryCatalogData where
+  rnf PutRepositoryCatalogData' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf catalogData
+
+instance Data.ToHeaders PutRepositoryCatalogData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.PutRepositoryCatalogData" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRepositoryCatalogData where
+  toJSON PutRepositoryCatalogData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("catalogData" Data..= catalogData)
+          ]
+      )
+
+instance Data.ToPath PutRepositoryCatalogData where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutRepositoryCatalogData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRepositoryCatalogDataResponse' smart constructor.
+data PutRepositoryCatalogDataResponse = PutRepositoryCatalogDataResponse'
+  { -- | The catalog data for the repository.
+    catalogData :: Prelude.Maybe RepositoryCatalogData,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRepositoryCatalogDataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'catalogData', 'putRepositoryCatalogDataResponse_catalogData' - The catalog data for the repository.
+--
+-- 'httpStatus', 'putRepositoryCatalogDataResponse_httpStatus' - The response's http status code.
+newPutRepositoryCatalogDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutRepositoryCatalogDataResponse
+newPutRepositoryCatalogDataResponse pHttpStatus_ =
+  PutRepositoryCatalogDataResponse'
+    { catalogData =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The catalog data for the repository.
+putRepositoryCatalogDataResponse_catalogData :: Lens.Lens' PutRepositoryCatalogDataResponse (Prelude.Maybe RepositoryCatalogData)
+putRepositoryCatalogDataResponse_catalogData = Lens.lens (\PutRepositoryCatalogDataResponse' {catalogData} -> catalogData) (\s@PutRepositoryCatalogDataResponse' {} a -> s {catalogData = a} :: PutRepositoryCatalogDataResponse)
+
+-- | The response's http status code.
+putRepositoryCatalogDataResponse_httpStatus :: Lens.Lens' PutRepositoryCatalogDataResponse Prelude.Int
+putRepositoryCatalogDataResponse_httpStatus = Lens.lens (\PutRepositoryCatalogDataResponse' {httpStatus} -> httpStatus) (\s@PutRepositoryCatalogDataResponse' {} a -> s {httpStatus = a} :: PutRepositoryCatalogDataResponse)
+
+instance
+  Prelude.NFData
+    PutRepositoryCatalogDataResponse
+  where
+  rnf PutRepositoryCatalogDataResponse' {..} =
+    Prelude.rnf catalogData
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/SetRepositoryPolicy.hs b/gen/Amazonka/ECRPublic/SetRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/SetRepositoryPolicy.hs
@@ -0,0 +1,266 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.SetRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Applies a repository policy to the specified public repository to
+-- control access permissions. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html Amazon ECR Repository Policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECRPublic.SetRepositoryPolicy
+  ( -- * Creating a Request
+    SetRepositoryPolicy (..),
+    newSetRepositoryPolicy,
+
+    -- * Request Lenses
+    setRepositoryPolicy_force,
+    setRepositoryPolicy_registryId,
+    setRepositoryPolicy_repositoryName,
+    setRepositoryPolicy_policyText,
+
+    -- * Destructuring the Response
+    SetRepositoryPolicyResponse (..),
+    newSetRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    setRepositoryPolicyResponse_policyText,
+    setRepositoryPolicyResponse_registryId,
+    setRepositoryPolicyResponse_repositoryName,
+    setRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetRepositoryPolicy' smart constructor.
+data SetRepositoryPolicy = SetRepositoryPolicy'
+  { -- | If the policy you are attempting to set on a repository policy would
+    -- prevent you from setting another policy in the future, you must force
+    -- the SetRepositoryPolicy operation. This is intended to prevent
+    -- accidental repository lock outs.
+    force :: Prelude.Maybe Prelude.Bool,
+    -- | The AWS account ID associated with the registry that contains the
+    -- repository. If you do not specify a registry, the default public
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to receive the policy.
+    repositoryName :: Prelude.Text,
+    -- | The JSON repository policy text to apply to the repository. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR Repository Policies>
+    -- in the /Amazon Elastic Container Registry User Guide/.
+    policyText :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'force', 'setRepositoryPolicy_force' - If the policy you are attempting to set on a repository policy would
+-- prevent you from setting another policy in the future, you must force
+-- the SetRepositoryPolicy operation. This is intended to prevent
+-- accidental repository lock outs.
+--
+-- 'registryId', 'setRepositoryPolicy_registryId' - The AWS account ID associated with the registry that contains the
+-- repository. If you do not specify a registry, the default public
+-- registry is assumed.
+--
+-- 'repositoryName', 'setRepositoryPolicy_repositoryName' - The name of the repository to receive the policy.
+--
+-- 'policyText', 'setRepositoryPolicy_policyText' - The JSON repository policy text to apply to the repository. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR Repository Policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+newSetRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'policyText'
+  Prelude.Text ->
+  SetRepositoryPolicy
+newSetRepositoryPolicy pRepositoryName_ pPolicyText_ =
+  SetRepositoryPolicy'
+    { force = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      policyText = pPolicyText_
+    }
+
+-- | If the policy you are attempting to set on a repository policy would
+-- prevent you from setting another policy in the future, you must force
+-- the SetRepositoryPolicy operation. This is intended to prevent
+-- accidental repository lock outs.
+setRepositoryPolicy_force :: Lens.Lens' SetRepositoryPolicy (Prelude.Maybe Prelude.Bool)
+setRepositoryPolicy_force = Lens.lens (\SetRepositoryPolicy' {force} -> force) (\s@SetRepositoryPolicy' {} a -> s {force = a} :: SetRepositoryPolicy)
+
+-- | The AWS account ID associated with the registry that contains the
+-- repository. If you do not specify a registry, the default public
+-- registry is assumed.
+setRepositoryPolicy_registryId :: Lens.Lens' SetRepositoryPolicy (Prelude.Maybe Prelude.Text)
+setRepositoryPolicy_registryId = Lens.lens (\SetRepositoryPolicy' {registryId} -> registryId) (\s@SetRepositoryPolicy' {} a -> s {registryId = a} :: SetRepositoryPolicy)
+
+-- | The name of the repository to receive the policy.
+setRepositoryPolicy_repositoryName :: Lens.Lens' SetRepositoryPolicy Prelude.Text
+setRepositoryPolicy_repositoryName = Lens.lens (\SetRepositoryPolicy' {repositoryName} -> repositoryName) (\s@SetRepositoryPolicy' {} a -> s {repositoryName = a} :: SetRepositoryPolicy)
+
+-- | The JSON repository policy text to apply to the repository. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR Repository Policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+setRepositoryPolicy_policyText :: Lens.Lens' SetRepositoryPolicy Prelude.Text
+setRepositoryPolicy_policyText = Lens.lens (\SetRepositoryPolicy' {policyText} -> policyText) (\s@SetRepositoryPolicy' {} a -> s {policyText = a} :: SetRepositoryPolicy)
+
+instance Core.AWSRequest SetRepositoryPolicy where
+  type
+    AWSResponse SetRepositoryPolicy =
+      SetRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SetRepositoryPolicy where
+  hashWithSalt _salt SetRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` force
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` policyText
+
+instance Prelude.NFData SetRepositoryPolicy where
+  rnf SetRepositoryPolicy' {..} =
+    Prelude.rnf force
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf policyText
+
+instance Data.ToHeaders SetRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.SetRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SetRepositoryPolicy where
+  toJSON SetRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("force" Data..=) Prelude.<$> force,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("policyText" Data..= policyText)
+          ]
+      )
+
+instance Data.ToPath SetRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SetRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetRepositoryPolicyResponse' smart constructor.
+data SetRepositoryPolicyResponse = SetRepositoryPolicyResponse'
+  { -- | The JSON repository policy text applied to the repository.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'setRepositoryPolicyResponse_policyText' - The JSON repository policy text applied to the repository.
+--
+-- 'registryId', 'setRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'setRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'setRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newSetRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetRepositoryPolicyResponse
+newSetRepositoryPolicyResponse pHttpStatus_ =
+  SetRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy text applied to the repository.
+setRepositoryPolicyResponse_policyText :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_policyText = Lens.lens (\SetRepositoryPolicyResponse' {policyText} -> policyText) (\s@SetRepositoryPolicyResponse' {} a -> s {policyText = a} :: SetRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+setRepositoryPolicyResponse_registryId :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_registryId = Lens.lens (\SetRepositoryPolicyResponse' {registryId} -> registryId) (\s@SetRepositoryPolicyResponse' {} a -> s {registryId = a} :: SetRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+setRepositoryPolicyResponse_repositoryName :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_repositoryName = Lens.lens (\SetRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@SetRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: SetRepositoryPolicyResponse)
+
+-- | The response's http status code.
+setRepositoryPolicyResponse_httpStatus :: Lens.Lens' SetRepositoryPolicyResponse Prelude.Int
+setRepositoryPolicyResponse_httpStatus = Lens.lens (\SetRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@SetRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: SetRepositoryPolicyResponse)
+
+instance Prelude.NFData SetRepositoryPolicyResponse where
+  rnf SetRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/TagResource.hs b/gen/Amazonka/ECRPublic/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/TagResource.hs
@@ -0,0 +1,180 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates the specified tags to a resource with the specified
+-- @resourceArn@. If existing tags on a resource are not specified in the
+-- request parameters, they are not changed. When a resource is deleted,
+-- the tags associated with that resource are deleted as well.
+module Amazonka.ECRPublic.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to which to add tags.
+    -- Currently, the supported resource is an Amazon ECR Public repository.
+    resourceArn :: Prelude.Text,
+    -- | The tags to add to the resource. A tag is an array of key-value pairs.
+    -- Tag keys can have a maximum character length of 128 characters, and tag
+    -- values can have a maximum length of 256 characters.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to which to add tags.
+-- Currently, the supported resource is an Amazon ECR Public repository.
+--
+-- 'tags', 'tagResource_tags' - The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource to which to add tags.
+-- Currently, the supported resource is an Amazon ECR Public repository.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.TagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/Types.hs b/gen/Amazonka/ECRPublic/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types.hs
@@ -0,0 +1,460 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _EmptyUploadException,
+    _ImageAlreadyExistsException,
+    _ImageDigestDoesNotMatchException,
+    _ImageNotFoundException,
+    _ImageTagAlreadyExistsException,
+    _InvalidLayerException,
+    _InvalidLayerPartException,
+    _InvalidParameterException,
+    _InvalidTagParameterException,
+    _LayerAlreadyExistsException,
+    _LayerPartTooSmallException,
+    _LayersNotFoundException,
+    _LimitExceededException,
+    _ReferencedImagesNotFoundException,
+    _RegistryNotFoundException,
+    _RepositoryAlreadyExistsException,
+    _RepositoryNotEmptyException,
+    _RepositoryNotFoundException,
+    _RepositoryPolicyNotFoundException,
+    _ServerException,
+    _TooManyTagsException,
+    _UnsupportedCommandException,
+    _UploadNotFoundException,
+
+    -- * ImageFailureCode
+    ImageFailureCode (..),
+
+    -- * LayerAvailability
+    LayerAvailability (..),
+
+    -- * LayerFailureCode
+    LayerFailureCode (..),
+
+    -- * RegistryAliasStatus
+    RegistryAliasStatus (..),
+
+    -- * AuthorizationData
+    AuthorizationData (..),
+    newAuthorizationData,
+    authorizationData_authorizationToken,
+    authorizationData_expiresAt,
+
+    -- * Image
+    Image (..),
+    newImage,
+    image_imageId,
+    image_imageManifest,
+    image_imageManifestMediaType,
+    image_registryId,
+    image_repositoryName,
+
+    -- * ImageDetail
+    ImageDetail (..),
+    newImageDetail,
+    imageDetail_artifactMediaType,
+    imageDetail_imageDigest,
+    imageDetail_imageManifestMediaType,
+    imageDetail_imagePushedAt,
+    imageDetail_imageSizeInBytes,
+    imageDetail_imageTags,
+    imageDetail_registryId,
+    imageDetail_repositoryName,
+
+    -- * ImageFailure
+    ImageFailure (..),
+    newImageFailure,
+    imageFailure_failureCode,
+    imageFailure_failureReason,
+    imageFailure_imageId,
+
+    -- * ImageIdentifier
+    ImageIdentifier (..),
+    newImageIdentifier,
+    imageIdentifier_imageDigest,
+    imageIdentifier_imageTag,
+
+    -- * ImageTagDetail
+    ImageTagDetail (..),
+    newImageTagDetail,
+    imageTagDetail_createdAt,
+    imageTagDetail_imageDetail,
+    imageTagDetail_imageTag,
+
+    -- * Layer
+    Layer (..),
+    newLayer,
+    layer_layerAvailability,
+    layer_layerDigest,
+    layer_layerSize,
+    layer_mediaType,
+
+    -- * LayerFailure
+    LayerFailure (..),
+    newLayerFailure,
+    layerFailure_failureCode,
+    layerFailure_failureReason,
+    layerFailure_layerDigest,
+
+    -- * ReferencedImageDetail
+    ReferencedImageDetail (..),
+    newReferencedImageDetail,
+    referencedImageDetail_artifactMediaType,
+    referencedImageDetail_imageDigest,
+    referencedImageDetail_imageManifestMediaType,
+    referencedImageDetail_imagePushedAt,
+    referencedImageDetail_imageSizeInBytes,
+
+    -- * Registry
+    Registry (..),
+    newRegistry,
+    registry_registryId,
+    registry_registryArn,
+    registry_registryUri,
+    registry_verified,
+    registry_aliases,
+
+    -- * RegistryAlias
+    RegistryAlias (..),
+    newRegistryAlias,
+    registryAlias_name,
+    registryAlias_status,
+    registryAlias_primaryRegistryAlias,
+    registryAlias_defaultRegistryAlias,
+
+    -- * RegistryCatalogData
+    RegistryCatalogData (..),
+    newRegistryCatalogData,
+    registryCatalogData_displayName,
+
+    -- * Repository
+    Repository (..),
+    newRepository,
+    repository_createdAt,
+    repository_registryId,
+    repository_repositoryArn,
+    repository_repositoryName,
+    repository_repositoryUri,
+
+    -- * RepositoryCatalogData
+    RepositoryCatalogData (..),
+    newRepositoryCatalogData,
+    repositoryCatalogData_aboutText,
+    repositoryCatalogData_architectures,
+    repositoryCatalogData_description,
+    repositoryCatalogData_logoUrl,
+    repositoryCatalogData_marketplaceCertified,
+    repositoryCatalogData_operatingSystems,
+    repositoryCatalogData_usageText,
+
+    -- * RepositoryCatalogDataInput
+    RepositoryCatalogDataInput (..),
+    newRepositoryCatalogDataInput,
+    repositoryCatalogDataInput_aboutText,
+    repositoryCatalogDataInput_architectures,
+    repositoryCatalogDataInput_description,
+    repositoryCatalogDataInput_logoImageBlob,
+    repositoryCatalogDataInput_operatingSystems,
+    repositoryCatalogDataInput_usageText,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.ECRPublic.Types.AuthorizationData
+import Amazonka.ECRPublic.Types.Image
+import Amazonka.ECRPublic.Types.ImageDetail
+import Amazonka.ECRPublic.Types.ImageFailure
+import Amazonka.ECRPublic.Types.ImageFailureCode
+import Amazonka.ECRPublic.Types.ImageIdentifier
+import Amazonka.ECRPublic.Types.ImageTagDetail
+import Amazonka.ECRPublic.Types.Layer
+import Amazonka.ECRPublic.Types.LayerAvailability
+import Amazonka.ECRPublic.Types.LayerFailure
+import Amazonka.ECRPublic.Types.LayerFailureCode
+import Amazonka.ECRPublic.Types.ReferencedImageDetail
+import Amazonka.ECRPublic.Types.Registry
+import Amazonka.ECRPublic.Types.RegistryAlias
+import Amazonka.ECRPublic.Types.RegistryAliasStatus
+import Amazonka.ECRPublic.Types.RegistryCatalogData
+import Amazonka.ECRPublic.Types.Repository
+import Amazonka.ECRPublic.Types.RepositoryCatalogData
+import Amazonka.ECRPublic.Types.RepositoryCatalogDataInput
+import Amazonka.ECRPublic.Types.Tag
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-10-30@ of the Amazon Elastic Container Registry Public SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "ECRPublic",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "api.ecr-public",
+      Core.signingName = "ecr-public",
+      Core.version = "2020-10-30",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "ECRPublic",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The specified layer upload does not contain any layer parts.
+_EmptyUploadException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_EmptyUploadException =
+  Core._MatchServiceError
+    defaultService
+    "EmptyUploadException"
+
+-- | The specified image has already been pushed, and there were no changes
+-- to the manifest or image tag after the last push.
+_ImageAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ImageAlreadyExistsException"
+
+-- | The specified image digest does not match the digest that Amazon ECR
+-- calculated for the image.
+_ImageDigestDoesNotMatchException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageDigestDoesNotMatchException =
+  Core._MatchServiceError
+    defaultService
+    "ImageDigestDoesNotMatchException"
+
+-- | The image requested does not exist in the specified repository.
+_ImageNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ImageNotFoundException"
+
+-- | The specified image is tagged with a tag that already exists. The
+-- repository is configured for tag immutability.
+_ImageTagAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageTagAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ImageTagAlreadyExistsException"
+
+-- | The layer digest calculation performed by Amazon ECR upon receipt of the
+-- image layer does not match the digest specified.
+_InvalidLayerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidLayerException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidLayerException"
+
+-- | The layer part size is not valid, or the first byte specified is not
+-- consecutive to the last byte of a previous layer part upload.
+_InvalidLayerPartException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidLayerPartException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidLayerPartException"
+
+-- | The specified parameter is invalid. Review the available parameters for
+-- the API request.
+_InvalidParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterException"
+
+-- | An invalid parameter has been specified. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+_InvalidTagParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidTagParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidTagParameterException"
+
+-- | The image layer already exists in the associated repository.
+_LayerAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayerAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "LayerAlreadyExistsException"
+
+-- | Layer parts must be at least 5 MiB in size.
+_LayerPartTooSmallException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayerPartTooSmallException =
+  Core._MatchServiceError
+    defaultService
+    "LayerPartTooSmallException"
+
+-- | The specified layers could not be found, or the specified layer is not
+-- valid for this repository.
+_LayersNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayersNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "LayersNotFoundException"
+
+-- | The operation did not succeed because it would have exceeded a service
+-- limit for your account. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html Amazon ECR Service Quotas>
+-- in the Amazon Elastic Container Registry User Guide.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | The manifest list is referencing an image that does not exist.
+_ReferencedImagesNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReferencedImagesNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ReferencedImagesNotFoundException"
+
+-- | The registry does not exist.
+_RegistryNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RegistryNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RegistryNotFoundException"
+
+-- | The specified repository already exists in the specified registry.
+_RepositoryAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryAlreadyExistsException"
+
+-- | The specified repository contains images. To delete a repository that
+-- contains images, you must force the deletion with the @force@ parameter.
+_RepositoryNotEmptyException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryNotEmptyException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryNotEmptyException"
+
+-- | The specified repository could not be found. Check the spelling of the
+-- specified repository and ensure that you are performing operations on
+-- the correct registry.
+_RepositoryNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryNotFoundException"
+
+-- | The specified repository and registry combination does not have an
+-- associated repository policy.
+_RepositoryPolicyNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryPolicyNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryPolicyNotFoundException"
+
+-- | These errors are usually caused by a server-side issue.
+_ServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServerException =
+  Core._MatchServiceError
+    defaultService
+    "ServerException"
+
+-- | The list of tags on the repository is over the limit. The maximum number
+-- of tags that can be applied to a repository is 50.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
+
+-- | The action is not supported in this Region.
+_UnsupportedCommandException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnsupportedCommandException =
+  Core._MatchServiceError
+    defaultService
+    "UnsupportedCommandException"
+
+-- | The upload could not be found, or the specified upload ID is not valid
+-- for this repository.
+_UploadNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UploadNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "UploadNotFoundException"
diff --git a/gen/Amazonka/ECRPublic/Types/AuthorizationData.hs b/gen/Amazonka/ECRPublic/Types/AuthorizationData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/AuthorizationData.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.AuthorizationData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.AuthorizationData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An authorization token data object that corresponds to a public
+-- registry.
+--
+-- /See:/ 'newAuthorizationData' smart constructor.
+data AuthorizationData = AuthorizationData'
+  { -- | A base64-encoded string that contains authorization data for a public
+    -- Amazon ECR registry. When the string is decoded, it is presented in the
+    -- format @user:password@ for public registry authentication using
+    -- @docker login@.
+    authorizationToken :: Prelude.Maybe Prelude.Text,
+    -- | The Unix time in seconds and milliseconds when the authorization token
+    -- expires. Authorization tokens are valid for 12 hours.
+    expiresAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthorizationData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'authorizationToken', 'authorizationData_authorizationToken' - A base64-encoded string that contains authorization data for a public
+-- Amazon ECR registry. When the string is decoded, it is presented in the
+-- format @user:password@ for public registry authentication using
+-- @docker login@.
+--
+-- 'expiresAt', 'authorizationData_expiresAt' - The Unix time in seconds and milliseconds when the authorization token
+-- expires. Authorization tokens are valid for 12 hours.
+newAuthorizationData ::
+  AuthorizationData
+newAuthorizationData =
+  AuthorizationData'
+    { authorizationToken =
+        Prelude.Nothing,
+      expiresAt = Prelude.Nothing
+    }
+
+-- | A base64-encoded string that contains authorization data for a public
+-- Amazon ECR registry. When the string is decoded, it is presented in the
+-- format @user:password@ for public registry authentication using
+-- @docker login@.
+authorizationData_authorizationToken :: Lens.Lens' AuthorizationData (Prelude.Maybe Prelude.Text)
+authorizationData_authorizationToken = Lens.lens (\AuthorizationData' {authorizationToken} -> authorizationToken) (\s@AuthorizationData' {} a -> s {authorizationToken = a} :: AuthorizationData)
+
+-- | The Unix time in seconds and milliseconds when the authorization token
+-- expires. Authorization tokens are valid for 12 hours.
+authorizationData_expiresAt :: Lens.Lens' AuthorizationData (Prelude.Maybe Prelude.UTCTime)
+authorizationData_expiresAt = Lens.lens (\AuthorizationData' {expiresAt} -> expiresAt) (\s@AuthorizationData' {} a -> s {expiresAt = a} :: AuthorizationData) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON AuthorizationData where
+  parseJSON =
+    Data.withObject
+      "AuthorizationData"
+      ( \x ->
+          AuthorizationData'
+            Prelude.<$> (x Data..:? "authorizationToken")
+            Prelude.<*> (x Data..:? "expiresAt")
+      )
+
+instance Prelude.Hashable AuthorizationData where
+  hashWithSalt _salt AuthorizationData' {..} =
+    _salt
+      `Prelude.hashWithSalt` authorizationToken
+      `Prelude.hashWithSalt` expiresAt
+
+instance Prelude.NFData AuthorizationData where
+  rnf AuthorizationData' {..} =
+    Prelude.rnf authorizationToken
+      `Prelude.seq` Prelude.rnf expiresAt
diff --git a/gen/Amazonka/ECRPublic/Types/Image.hs b/gen/Amazonka/ECRPublic/Types/Image.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/Image.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.Image
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.Image where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.ImageIdentifier
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image.
+--
+-- /See:/ 'newImage' smart constructor.
+data Image = Image'
+  { -- | An object containing the image tag and image digest associated with an
+    -- image.
+    imageId :: Prelude.Maybe ImageIdentifier,
+    -- | The image manifest associated with the image.
+    imageManifest :: Prelude.Maybe Prelude.Text,
+    -- | The manifest media type of the image.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The AWS account ID associated with the registry containing the image.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository associated with the image.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Image' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageId', 'image_imageId' - An object containing the image tag and image digest associated with an
+-- image.
+--
+-- 'imageManifest', 'image_imageManifest' - The image manifest associated with the image.
+--
+-- 'imageManifestMediaType', 'image_imageManifestMediaType' - The manifest media type of the image.
+--
+-- 'registryId', 'image_registryId' - The AWS account ID associated with the registry containing the image.
+--
+-- 'repositoryName', 'image_repositoryName' - The name of the repository associated with the image.
+newImage ::
+  Image
+newImage =
+  Image'
+    { imageId = Prelude.Nothing,
+      imageManifest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | An object containing the image tag and image digest associated with an
+-- image.
+image_imageId :: Lens.Lens' Image (Prelude.Maybe ImageIdentifier)
+image_imageId = Lens.lens (\Image' {imageId} -> imageId) (\s@Image' {} a -> s {imageId = a} :: Image)
+
+-- | The image manifest associated with the image.
+image_imageManifest :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_imageManifest = Lens.lens (\Image' {imageManifest} -> imageManifest) (\s@Image' {} a -> s {imageManifest = a} :: Image)
+
+-- | The manifest media type of the image.
+image_imageManifestMediaType :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_imageManifestMediaType = Lens.lens (\Image' {imageManifestMediaType} -> imageManifestMediaType) (\s@Image' {} a -> s {imageManifestMediaType = a} :: Image)
+
+-- | The AWS account ID associated with the registry containing the image.
+image_registryId :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_registryId = Lens.lens (\Image' {registryId} -> registryId) (\s@Image' {} a -> s {registryId = a} :: Image)
+
+-- | The name of the repository associated with the image.
+image_repositoryName :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_repositoryName = Lens.lens (\Image' {repositoryName} -> repositoryName) (\s@Image' {} a -> s {repositoryName = a} :: Image)
+
+instance Data.FromJSON Image where
+  parseJSON =
+    Data.withObject
+      "Image"
+      ( \x ->
+          Image'
+            Prelude.<$> (x Data..:? "imageId")
+            Prelude.<*> (x Data..:? "imageManifest")
+            Prelude.<*> (x Data..:? "imageManifestMediaType")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance Prelude.Hashable Image where
+  hashWithSalt _salt Image' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageId
+      `Prelude.hashWithSalt` imageManifest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData Image where
+  rnf Image' {..} =
+    Prelude.rnf imageId
+      `Prelude.seq` Prelude.rnf imageManifest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECRPublic/Types/ImageDetail.hs b/gen/Amazonka/ECRPublic/Types/ImageDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ImageDetail.hs
@@ -0,0 +1,190 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ImageDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ImageDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that describes an image returned by a DescribeImages
+-- operation.
+--
+-- /See:/ 'newImageDetail' smart constructor.
+data ImageDetail = ImageDetail'
+  { -- | The artifact media type of the image.
+    artifactMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The media type of the image manifest.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The date and time, expressed in standard JavaScript date format, at
+    -- which the current image was pushed to the repository.
+    imagePushedAt :: Prelude.Maybe Data.POSIX,
+    -- | The size, in bytes, of the image in the repository.
+    --
+    -- If the image is a manifest list, this will be the max size of all
+    -- manifests in the list.
+    --
+    -- Beginning with Docker version 1.9, the Docker client compresses image
+    -- layers before pushing them to a V2 Docker registry. The output of the
+    -- @docker images@ command shows the uncompressed image size, so it may
+    -- return a larger image size than the image sizes returned by
+    -- DescribeImages.
+    imageSizeInBytes :: Prelude.Maybe Prelude.Integer,
+    -- | The list of tags associated with this image.
+    imageTags :: Prelude.Maybe [Prelude.Text],
+    -- | The AWS account ID associated with the public registry to which this
+    -- image belongs.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which this image belongs.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'artifactMediaType', 'imageDetail_artifactMediaType' - The artifact media type of the image.
+--
+-- 'imageDigest', 'imageDetail_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imageManifestMediaType', 'imageDetail_imageManifestMediaType' - The media type of the image manifest.
+--
+-- 'imagePushedAt', 'imageDetail_imagePushedAt' - The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+--
+-- 'imageSizeInBytes', 'imageDetail_imageSizeInBytes' - The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+--
+-- 'imageTags', 'imageDetail_imageTags' - The list of tags associated with this image.
+--
+-- 'registryId', 'imageDetail_registryId' - The AWS account ID associated with the public registry to which this
+-- image belongs.
+--
+-- 'repositoryName', 'imageDetail_repositoryName' - The name of the repository to which this image belongs.
+newImageDetail ::
+  ImageDetail
+newImageDetail =
+  ImageDetail'
+    { artifactMediaType = Prelude.Nothing,
+      imageDigest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      imagePushedAt = Prelude.Nothing,
+      imageSizeInBytes = Prelude.Nothing,
+      imageTags = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | The artifact media type of the image.
+imageDetail_artifactMediaType :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_artifactMediaType = Lens.lens (\ImageDetail' {artifactMediaType} -> artifactMediaType) (\s@ImageDetail' {} a -> s {artifactMediaType = a} :: ImageDetail)
+
+-- | The @sha256@ digest of the image manifest.
+imageDetail_imageDigest :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_imageDigest = Lens.lens (\ImageDetail' {imageDigest} -> imageDigest) (\s@ImageDetail' {} a -> s {imageDigest = a} :: ImageDetail)
+
+-- | The media type of the image manifest.
+imageDetail_imageManifestMediaType :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_imageManifestMediaType = Lens.lens (\ImageDetail' {imageManifestMediaType} -> imageManifestMediaType) (\s@ImageDetail' {} a -> s {imageManifestMediaType = a} :: ImageDetail)
+
+-- | The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+imageDetail_imagePushedAt :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.UTCTime)
+imageDetail_imagePushedAt = Lens.lens (\ImageDetail' {imagePushedAt} -> imagePushedAt) (\s@ImageDetail' {} a -> s {imagePushedAt = a} :: ImageDetail) Prelude.. Lens.mapping Data._Time
+
+-- | The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+imageDetail_imageSizeInBytes :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Integer)
+imageDetail_imageSizeInBytes = Lens.lens (\ImageDetail' {imageSizeInBytes} -> imageSizeInBytes) (\s@ImageDetail' {} a -> s {imageSizeInBytes = a} :: ImageDetail)
+
+-- | The list of tags associated with this image.
+imageDetail_imageTags :: Lens.Lens' ImageDetail (Prelude.Maybe [Prelude.Text])
+imageDetail_imageTags = Lens.lens (\ImageDetail' {imageTags} -> imageTags) (\s@ImageDetail' {} a -> s {imageTags = a} :: ImageDetail) Prelude.. Lens.mapping Lens.coerced
+
+-- | The AWS account ID associated with the public registry to which this
+-- image belongs.
+imageDetail_registryId :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_registryId = Lens.lens (\ImageDetail' {registryId} -> registryId) (\s@ImageDetail' {} a -> s {registryId = a} :: ImageDetail)
+
+-- | The name of the repository to which this image belongs.
+imageDetail_repositoryName :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_repositoryName = Lens.lens (\ImageDetail' {repositoryName} -> repositoryName) (\s@ImageDetail' {} a -> s {repositoryName = a} :: ImageDetail)
+
+instance Data.FromJSON ImageDetail where
+  parseJSON =
+    Data.withObject
+      "ImageDetail"
+      ( \x ->
+          ImageDetail'
+            Prelude.<$> (x Data..:? "artifactMediaType")
+            Prelude.<*> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imageManifestMediaType")
+            Prelude.<*> (x Data..:? "imagePushedAt")
+            Prelude.<*> (x Data..:? "imageSizeInBytes")
+            Prelude.<*> (x Data..:? "imageTags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance Prelude.Hashable ImageDetail where
+  hashWithSalt _salt ImageDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` artifactMediaType
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` imagePushedAt
+      `Prelude.hashWithSalt` imageSizeInBytes
+      `Prelude.hashWithSalt` imageTags
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData ImageDetail where
+  rnf ImageDetail' {..} =
+    Prelude.rnf artifactMediaType
+      `Prelude.seq` Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf imagePushedAt
+      `Prelude.seq` Prelude.rnf imageSizeInBytes
+      `Prelude.seq` Prelude.rnf imageTags
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECRPublic/Types/ImageFailure.hs b/gen/Amazonka/ECRPublic/Types/ImageFailure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ImageFailure.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ImageFailure
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ImageFailure where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.ImageFailureCode
+import Amazonka.ECRPublic.Types.ImageIdentifier
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image failure.
+--
+-- /See:/ 'newImageFailure' smart constructor.
+data ImageFailure = ImageFailure'
+  { -- | The code associated with the failure.
+    failureCode :: Prelude.Maybe ImageFailureCode,
+    -- | The reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The image ID associated with the failure.
+    imageId :: Prelude.Maybe ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageFailure' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'imageFailure_failureCode' - The code associated with the failure.
+--
+-- 'failureReason', 'imageFailure_failureReason' - The reason for the failure.
+--
+-- 'imageId', 'imageFailure_imageId' - The image ID associated with the failure.
+newImageFailure ::
+  ImageFailure
+newImageFailure =
+  ImageFailure'
+    { failureCode = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      imageId = Prelude.Nothing
+    }
+
+-- | The code associated with the failure.
+imageFailure_failureCode :: Lens.Lens' ImageFailure (Prelude.Maybe ImageFailureCode)
+imageFailure_failureCode = Lens.lens (\ImageFailure' {failureCode} -> failureCode) (\s@ImageFailure' {} a -> s {failureCode = a} :: ImageFailure)
+
+-- | The reason for the failure.
+imageFailure_failureReason :: Lens.Lens' ImageFailure (Prelude.Maybe Prelude.Text)
+imageFailure_failureReason = Lens.lens (\ImageFailure' {failureReason} -> failureReason) (\s@ImageFailure' {} a -> s {failureReason = a} :: ImageFailure)
+
+-- | The image ID associated with the failure.
+imageFailure_imageId :: Lens.Lens' ImageFailure (Prelude.Maybe ImageIdentifier)
+imageFailure_imageId = Lens.lens (\ImageFailure' {imageId} -> imageId) (\s@ImageFailure' {} a -> s {imageId = a} :: ImageFailure)
+
+instance Data.FromJSON ImageFailure where
+  parseJSON =
+    Data.withObject
+      "ImageFailure"
+      ( \x ->
+          ImageFailure'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "imageId")
+      )
+
+instance Prelude.Hashable ImageFailure where
+  hashWithSalt _salt ImageFailure' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureCode
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` imageId
+
+instance Prelude.NFData ImageFailure where
+  rnf ImageFailure' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf imageId
diff --git a/gen/Amazonka/ECRPublic/Types/ImageFailureCode.hs b/gen/Amazonka/ECRPublic/Types/ImageFailureCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ImageFailureCode.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ImageFailureCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ImageFailureCode
+  ( ImageFailureCode
+      ( ..,
+        ImageFailureCode_ImageNotFound,
+        ImageFailureCode_ImageReferencedByManifestList,
+        ImageFailureCode_ImageTagDoesNotMatchDigest,
+        ImageFailureCode_InvalidImageDigest,
+        ImageFailureCode_InvalidImageTag,
+        ImageFailureCode_KmsError,
+        ImageFailureCode_MissingDigestAndTag
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImageFailureCode = ImageFailureCode'
+  { fromImageFailureCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ImageFailureCode_ImageNotFound :: ImageFailureCode
+pattern ImageFailureCode_ImageNotFound = ImageFailureCode' "ImageNotFound"
+
+pattern ImageFailureCode_ImageReferencedByManifestList :: ImageFailureCode
+pattern ImageFailureCode_ImageReferencedByManifestList = ImageFailureCode' "ImageReferencedByManifestList"
+
+pattern ImageFailureCode_ImageTagDoesNotMatchDigest :: ImageFailureCode
+pattern ImageFailureCode_ImageTagDoesNotMatchDigest = ImageFailureCode' "ImageTagDoesNotMatchDigest"
+
+pattern ImageFailureCode_InvalidImageDigest :: ImageFailureCode
+pattern ImageFailureCode_InvalidImageDigest = ImageFailureCode' "InvalidImageDigest"
+
+pattern ImageFailureCode_InvalidImageTag :: ImageFailureCode
+pattern ImageFailureCode_InvalidImageTag = ImageFailureCode' "InvalidImageTag"
+
+pattern ImageFailureCode_KmsError :: ImageFailureCode
+pattern ImageFailureCode_KmsError = ImageFailureCode' "KmsError"
+
+pattern ImageFailureCode_MissingDigestAndTag :: ImageFailureCode
+pattern ImageFailureCode_MissingDigestAndTag = ImageFailureCode' "MissingDigestAndTag"
+
+{-# COMPLETE
+  ImageFailureCode_ImageNotFound,
+  ImageFailureCode_ImageReferencedByManifestList,
+  ImageFailureCode_ImageTagDoesNotMatchDigest,
+  ImageFailureCode_InvalidImageDigest,
+  ImageFailureCode_InvalidImageTag,
+  ImageFailureCode_KmsError,
+  ImageFailureCode_MissingDigestAndTag,
+  ImageFailureCode'
+  #-}
diff --git a/gen/Amazonka/ECRPublic/Types/ImageIdentifier.hs b/gen/Amazonka/ECRPublic/Types/ImageIdentifier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ImageIdentifier.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ImageIdentifier
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ImageIdentifier where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object with identifying information for an Amazon ECR image.
+--
+-- /See:/ 'newImageIdentifier' smart constructor.
+data ImageIdentifier = ImageIdentifier'
+  { -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The tag used for the image.
+    imageTag :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageIdentifier' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDigest', 'imageIdentifier_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imageTag', 'imageIdentifier_imageTag' - The tag used for the image.
+newImageIdentifier ::
+  ImageIdentifier
+newImageIdentifier =
+  ImageIdentifier'
+    { imageDigest = Prelude.Nothing,
+      imageTag = Prelude.Nothing
+    }
+
+-- | The @sha256@ digest of the image manifest.
+imageIdentifier_imageDigest :: Lens.Lens' ImageIdentifier (Prelude.Maybe Prelude.Text)
+imageIdentifier_imageDigest = Lens.lens (\ImageIdentifier' {imageDigest} -> imageDigest) (\s@ImageIdentifier' {} a -> s {imageDigest = a} :: ImageIdentifier)
+
+-- | The tag used for the image.
+imageIdentifier_imageTag :: Lens.Lens' ImageIdentifier (Prelude.Maybe Prelude.Text)
+imageIdentifier_imageTag = Lens.lens (\ImageIdentifier' {imageTag} -> imageTag) (\s@ImageIdentifier' {} a -> s {imageTag = a} :: ImageIdentifier)
+
+instance Data.FromJSON ImageIdentifier where
+  parseJSON =
+    Data.withObject
+      "ImageIdentifier"
+      ( \x ->
+          ImageIdentifier'
+            Prelude.<$> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imageTag")
+      )
+
+instance Prelude.Hashable ImageIdentifier where
+  hashWithSalt _salt ImageIdentifier' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageTag
+
+instance Prelude.NFData ImageIdentifier where
+  rnf ImageIdentifier' {..} =
+    Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageTag
+
+instance Data.ToJSON ImageIdentifier where
+  toJSON ImageIdentifier' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("imageDigest" Data..=) Prelude.<$> imageDigest,
+            ("imageTag" Data..=) Prelude.<$> imageTag
+          ]
+      )
diff --git a/gen/Amazonka/ECRPublic/Types/ImageTagDetail.hs b/gen/Amazonka/ECRPublic/Types/ImageTagDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ImageTagDetail.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ImageTagDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ImageTagDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.ReferencedImageDetail
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the image tag details for an image.
+--
+-- /See:/ 'newImageTagDetail' smart constructor.
+data ImageTagDetail = ImageTagDetail'
+  { -- | The time stamp indicating when the image tag was created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | An object that describes the details of an image.
+    imageDetail :: Prelude.Maybe ReferencedImageDetail,
+    -- | The tag associated with the image.
+    imageTag :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageTagDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'imageTagDetail_createdAt' - The time stamp indicating when the image tag was created.
+--
+-- 'imageDetail', 'imageTagDetail_imageDetail' - An object that describes the details of an image.
+--
+-- 'imageTag', 'imageTagDetail_imageTag' - The tag associated with the image.
+newImageTagDetail ::
+  ImageTagDetail
+newImageTagDetail =
+  ImageTagDetail'
+    { createdAt = Prelude.Nothing,
+      imageDetail = Prelude.Nothing,
+      imageTag = Prelude.Nothing
+    }
+
+-- | The time stamp indicating when the image tag was created.
+imageTagDetail_createdAt :: Lens.Lens' ImageTagDetail (Prelude.Maybe Prelude.UTCTime)
+imageTagDetail_createdAt = Lens.lens (\ImageTagDetail' {createdAt} -> createdAt) (\s@ImageTagDetail' {} a -> s {createdAt = a} :: ImageTagDetail) Prelude.. Lens.mapping Data._Time
+
+-- | An object that describes the details of an image.
+imageTagDetail_imageDetail :: Lens.Lens' ImageTagDetail (Prelude.Maybe ReferencedImageDetail)
+imageTagDetail_imageDetail = Lens.lens (\ImageTagDetail' {imageDetail} -> imageDetail) (\s@ImageTagDetail' {} a -> s {imageDetail = a} :: ImageTagDetail)
+
+-- | The tag associated with the image.
+imageTagDetail_imageTag :: Lens.Lens' ImageTagDetail (Prelude.Maybe Prelude.Text)
+imageTagDetail_imageTag = Lens.lens (\ImageTagDetail' {imageTag} -> imageTag) (\s@ImageTagDetail' {} a -> s {imageTag = a} :: ImageTagDetail)
+
+instance Data.FromJSON ImageTagDetail where
+  parseJSON =
+    Data.withObject
+      "ImageTagDetail"
+      ( \x ->
+          ImageTagDetail'
+            Prelude.<$> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "imageDetail")
+            Prelude.<*> (x Data..:? "imageTag")
+      )
+
+instance Prelude.Hashable ImageTagDetail where
+  hashWithSalt _salt ImageTagDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` imageDetail
+      `Prelude.hashWithSalt` imageTag
+
+instance Prelude.NFData ImageTagDetail where
+  rnf ImageTagDetail' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf imageDetail
+      `Prelude.seq` Prelude.rnf imageTag
diff --git a/gen/Amazonka/ECRPublic/Types/Layer.hs b/gen/Amazonka/ECRPublic/Types/Layer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/Layer.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.Layer
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.Layer where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.LayerAvailability
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image layer.
+--
+-- /See:/ 'newLayer' smart constructor.
+data Layer = Layer'
+  { -- | The availability status of the image layer.
+    layerAvailability :: Prelude.Maybe LayerAvailability,
+    -- | The @sha256@ digest of the image layer.
+    layerDigest :: Prelude.Maybe Prelude.Text,
+    -- | The size, in bytes, of the image layer.
+    layerSize :: Prelude.Maybe Prelude.Integer,
+    -- | The media type of the layer, such as
+    -- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+    -- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+    mediaType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Layer' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'layerAvailability', 'layer_layerAvailability' - The availability status of the image layer.
+--
+-- 'layerDigest', 'layer_layerDigest' - The @sha256@ digest of the image layer.
+--
+-- 'layerSize', 'layer_layerSize' - The size, in bytes, of the image layer.
+--
+-- 'mediaType', 'layer_mediaType' - The media type of the layer, such as
+-- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+-- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+newLayer ::
+  Layer
+newLayer =
+  Layer'
+    { layerAvailability = Prelude.Nothing,
+      layerDigest = Prelude.Nothing,
+      layerSize = Prelude.Nothing,
+      mediaType = Prelude.Nothing
+    }
+
+-- | The availability status of the image layer.
+layer_layerAvailability :: Lens.Lens' Layer (Prelude.Maybe LayerAvailability)
+layer_layerAvailability = Lens.lens (\Layer' {layerAvailability} -> layerAvailability) (\s@Layer' {} a -> s {layerAvailability = a} :: Layer)
+
+-- | The @sha256@ digest of the image layer.
+layer_layerDigest :: Lens.Lens' Layer (Prelude.Maybe Prelude.Text)
+layer_layerDigest = Lens.lens (\Layer' {layerDigest} -> layerDigest) (\s@Layer' {} a -> s {layerDigest = a} :: Layer)
+
+-- | The size, in bytes, of the image layer.
+layer_layerSize :: Lens.Lens' Layer (Prelude.Maybe Prelude.Integer)
+layer_layerSize = Lens.lens (\Layer' {layerSize} -> layerSize) (\s@Layer' {} a -> s {layerSize = a} :: Layer)
+
+-- | The media type of the layer, such as
+-- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+-- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+layer_mediaType :: Lens.Lens' Layer (Prelude.Maybe Prelude.Text)
+layer_mediaType = Lens.lens (\Layer' {mediaType} -> mediaType) (\s@Layer' {} a -> s {mediaType = a} :: Layer)
+
+instance Data.FromJSON Layer where
+  parseJSON =
+    Data.withObject
+      "Layer"
+      ( \x ->
+          Layer'
+            Prelude.<$> (x Data..:? "layerAvailability")
+            Prelude.<*> (x Data..:? "layerDigest")
+            Prelude.<*> (x Data..:? "layerSize")
+            Prelude.<*> (x Data..:? "mediaType")
+      )
+
+instance Prelude.Hashable Layer where
+  hashWithSalt _salt Layer' {..} =
+    _salt
+      `Prelude.hashWithSalt` layerAvailability
+      `Prelude.hashWithSalt` layerDigest
+      `Prelude.hashWithSalt` layerSize
+      `Prelude.hashWithSalt` mediaType
+
+instance Prelude.NFData Layer where
+  rnf Layer' {..} =
+    Prelude.rnf layerAvailability
+      `Prelude.seq` Prelude.rnf layerDigest
+      `Prelude.seq` Prelude.rnf layerSize
+      `Prelude.seq` Prelude.rnf mediaType
diff --git a/gen/Amazonka/ECRPublic/Types/LayerAvailability.hs b/gen/Amazonka/ECRPublic/Types/LayerAvailability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/LayerAvailability.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.LayerAvailability
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.LayerAvailability
+  ( LayerAvailability
+      ( ..,
+        LayerAvailability_AVAILABLE,
+        LayerAvailability_UNAVAILABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LayerAvailability = LayerAvailability'
+  { fromLayerAvailability ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern LayerAvailability_AVAILABLE :: LayerAvailability
+pattern LayerAvailability_AVAILABLE = LayerAvailability' "AVAILABLE"
+
+pattern LayerAvailability_UNAVAILABLE :: LayerAvailability
+pattern LayerAvailability_UNAVAILABLE = LayerAvailability' "UNAVAILABLE"
+
+{-# COMPLETE
+  LayerAvailability_AVAILABLE,
+  LayerAvailability_UNAVAILABLE,
+  LayerAvailability'
+  #-}
diff --git a/gen/Amazonka/ECRPublic/Types/LayerFailure.hs b/gen/Amazonka/ECRPublic/Types/LayerFailure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/LayerFailure.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.LayerFailure
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.LayerFailure where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.LayerFailureCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image layer failure.
+--
+-- /See:/ 'newLayerFailure' smart constructor.
+data LayerFailure = LayerFailure'
+  { -- | The failure code associated with the failure.
+    failureCode :: Prelude.Maybe LayerFailureCode,
+    -- | The reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The layer digest associated with the failure.
+    layerDigest :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LayerFailure' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'layerFailure_failureCode' - The failure code associated with the failure.
+--
+-- 'failureReason', 'layerFailure_failureReason' - The reason for the failure.
+--
+-- 'layerDigest', 'layerFailure_layerDigest' - The layer digest associated with the failure.
+newLayerFailure ::
+  LayerFailure
+newLayerFailure =
+  LayerFailure'
+    { failureCode = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      layerDigest = Prelude.Nothing
+    }
+
+-- | The failure code associated with the failure.
+layerFailure_failureCode :: Lens.Lens' LayerFailure (Prelude.Maybe LayerFailureCode)
+layerFailure_failureCode = Lens.lens (\LayerFailure' {failureCode} -> failureCode) (\s@LayerFailure' {} a -> s {failureCode = a} :: LayerFailure)
+
+-- | The reason for the failure.
+layerFailure_failureReason :: Lens.Lens' LayerFailure (Prelude.Maybe Prelude.Text)
+layerFailure_failureReason = Lens.lens (\LayerFailure' {failureReason} -> failureReason) (\s@LayerFailure' {} a -> s {failureReason = a} :: LayerFailure)
+
+-- | The layer digest associated with the failure.
+layerFailure_layerDigest :: Lens.Lens' LayerFailure (Prelude.Maybe Prelude.Text)
+layerFailure_layerDigest = Lens.lens (\LayerFailure' {layerDigest} -> layerDigest) (\s@LayerFailure' {} a -> s {layerDigest = a} :: LayerFailure)
+
+instance Data.FromJSON LayerFailure where
+  parseJSON =
+    Data.withObject
+      "LayerFailure"
+      ( \x ->
+          LayerFailure'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "layerDigest")
+      )
+
+instance Prelude.Hashable LayerFailure where
+  hashWithSalt _salt LayerFailure' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureCode
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` layerDigest
+
+instance Prelude.NFData LayerFailure where
+  rnf LayerFailure' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf layerDigest
diff --git a/gen/Amazonka/ECRPublic/Types/LayerFailureCode.hs b/gen/Amazonka/ECRPublic/Types/LayerFailureCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/LayerFailureCode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.LayerFailureCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.LayerFailureCode
+  ( LayerFailureCode
+      ( ..,
+        LayerFailureCode_InvalidLayerDigest,
+        LayerFailureCode_MissingLayerDigest
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LayerFailureCode = LayerFailureCode'
+  { fromLayerFailureCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern LayerFailureCode_InvalidLayerDigest :: LayerFailureCode
+pattern LayerFailureCode_InvalidLayerDigest = LayerFailureCode' "InvalidLayerDigest"
+
+pattern LayerFailureCode_MissingLayerDigest :: LayerFailureCode
+pattern LayerFailureCode_MissingLayerDigest = LayerFailureCode' "MissingLayerDigest"
+
+{-# COMPLETE
+  LayerFailureCode_InvalidLayerDigest,
+  LayerFailureCode_MissingLayerDigest,
+  LayerFailureCode'
+  #-}
diff --git a/gen/Amazonka/ECRPublic/Types/ReferencedImageDetail.hs b/gen/Amazonka/ECRPublic/Types/ReferencedImageDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/ReferencedImageDetail.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.ReferencedImageDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.ReferencedImageDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that describes the image tag details returned by a
+-- DescribeImageTags action.
+--
+-- /See:/ 'newReferencedImageDetail' smart constructor.
+data ReferencedImageDetail = ReferencedImageDetail'
+  { -- | The artifact media type of the image.
+    artifactMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The media type of the image manifest.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The date and time, expressed in standard JavaScript date format, at
+    -- which the current image tag was pushed to the repository.
+    imagePushedAt :: Prelude.Maybe Data.POSIX,
+    -- | The size, in bytes, of the image in the repository.
+    --
+    -- If the image is a manifest list, this will be the max size of all
+    -- manifests in the list.
+    --
+    -- Beginning with Docker version 1.9, the Docker client compresses image
+    -- layers before pushing them to a V2 Docker registry. The output of the
+    -- @docker images@ command shows the uncompressed image size, so it may
+    -- return a larger image size than the image sizes returned by
+    -- DescribeImages.
+    imageSizeInBytes :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReferencedImageDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'artifactMediaType', 'referencedImageDetail_artifactMediaType' - The artifact media type of the image.
+--
+-- 'imageDigest', 'referencedImageDetail_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imageManifestMediaType', 'referencedImageDetail_imageManifestMediaType' - The media type of the image manifest.
+--
+-- 'imagePushedAt', 'referencedImageDetail_imagePushedAt' - The date and time, expressed in standard JavaScript date format, at
+-- which the current image tag was pushed to the repository.
+--
+-- 'imageSizeInBytes', 'referencedImageDetail_imageSizeInBytes' - The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+newReferencedImageDetail ::
+  ReferencedImageDetail
+newReferencedImageDetail =
+  ReferencedImageDetail'
+    { artifactMediaType =
+        Prelude.Nothing,
+      imageDigest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      imagePushedAt = Prelude.Nothing,
+      imageSizeInBytes = Prelude.Nothing
+    }
+
+-- | The artifact media type of the image.
+referencedImageDetail_artifactMediaType :: Lens.Lens' ReferencedImageDetail (Prelude.Maybe Prelude.Text)
+referencedImageDetail_artifactMediaType = Lens.lens (\ReferencedImageDetail' {artifactMediaType} -> artifactMediaType) (\s@ReferencedImageDetail' {} a -> s {artifactMediaType = a} :: ReferencedImageDetail)
+
+-- | The @sha256@ digest of the image manifest.
+referencedImageDetail_imageDigest :: Lens.Lens' ReferencedImageDetail (Prelude.Maybe Prelude.Text)
+referencedImageDetail_imageDigest = Lens.lens (\ReferencedImageDetail' {imageDigest} -> imageDigest) (\s@ReferencedImageDetail' {} a -> s {imageDigest = a} :: ReferencedImageDetail)
+
+-- | The media type of the image manifest.
+referencedImageDetail_imageManifestMediaType :: Lens.Lens' ReferencedImageDetail (Prelude.Maybe Prelude.Text)
+referencedImageDetail_imageManifestMediaType = Lens.lens (\ReferencedImageDetail' {imageManifestMediaType} -> imageManifestMediaType) (\s@ReferencedImageDetail' {} a -> s {imageManifestMediaType = a} :: ReferencedImageDetail)
+
+-- | The date and time, expressed in standard JavaScript date format, at
+-- which the current image tag was pushed to the repository.
+referencedImageDetail_imagePushedAt :: Lens.Lens' ReferencedImageDetail (Prelude.Maybe Prelude.UTCTime)
+referencedImageDetail_imagePushedAt = Lens.lens (\ReferencedImageDetail' {imagePushedAt} -> imagePushedAt) (\s@ReferencedImageDetail' {} a -> s {imagePushedAt = a} :: ReferencedImageDetail) Prelude.. Lens.mapping Data._Time
+
+-- | The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+referencedImageDetail_imageSizeInBytes :: Lens.Lens' ReferencedImageDetail (Prelude.Maybe Prelude.Integer)
+referencedImageDetail_imageSizeInBytes = Lens.lens (\ReferencedImageDetail' {imageSizeInBytes} -> imageSizeInBytes) (\s@ReferencedImageDetail' {} a -> s {imageSizeInBytes = a} :: ReferencedImageDetail)
+
+instance Data.FromJSON ReferencedImageDetail where
+  parseJSON =
+    Data.withObject
+      "ReferencedImageDetail"
+      ( \x ->
+          ReferencedImageDetail'
+            Prelude.<$> (x Data..:? "artifactMediaType")
+            Prelude.<*> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imageManifestMediaType")
+            Prelude.<*> (x Data..:? "imagePushedAt")
+            Prelude.<*> (x Data..:? "imageSizeInBytes")
+      )
+
+instance Prelude.Hashable ReferencedImageDetail where
+  hashWithSalt _salt ReferencedImageDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` artifactMediaType
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` imagePushedAt
+      `Prelude.hashWithSalt` imageSizeInBytes
+
+instance Prelude.NFData ReferencedImageDetail where
+  rnf ReferencedImageDetail' {..} =
+    Prelude.rnf artifactMediaType
+      `Prelude.seq` Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf imagePushedAt
+      `Prelude.seq` Prelude.rnf imageSizeInBytes
diff --git a/gen/Amazonka/ECRPublic/Types/Registry.hs b/gen/Amazonka/ECRPublic/Types/Registry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/Registry.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.Registry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.Registry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.RegistryAlias
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of a public registry.
+--
+-- /See:/ 'newRegistry' smart constructor.
+data Registry = Registry'
+  { -- | The AWS account ID associated with the registry. If you do not specify a
+    -- registry, the default public registry is assumed.
+    registryId :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the public registry.
+    registryArn :: Prelude.Text,
+    -- | The URI of a public registry. The URI contains a universal prefix and
+    -- the registry alias.
+    registryUri :: Prelude.Text,
+    -- | Whether the account is verified. This indicates whether the account is
+    -- an AWS Marketplace vendor. If an account is verified, each public
+    -- repository will received a verified account badge on the Amazon ECR
+    -- Public Gallery.
+    verified :: Prelude.Bool,
+    -- | An array of objects representing the aliases for a public registry.
+    aliases :: [RegistryAlias]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Registry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'registry_registryId' - The AWS account ID associated with the registry. If you do not specify a
+-- registry, the default public registry is assumed.
+--
+-- 'registryArn', 'registry_registryArn' - The Amazon Resource Name (ARN) of the public registry.
+--
+-- 'registryUri', 'registry_registryUri' - The URI of a public registry. The URI contains a universal prefix and
+-- the registry alias.
+--
+-- 'verified', 'registry_verified' - Whether the account is verified. This indicates whether the account is
+-- an AWS Marketplace vendor. If an account is verified, each public
+-- repository will received a verified account badge on the Amazon ECR
+-- Public Gallery.
+--
+-- 'aliases', 'registry_aliases' - An array of objects representing the aliases for a public registry.
+newRegistry ::
+  -- | 'registryId'
+  Prelude.Text ->
+  -- | 'registryArn'
+  Prelude.Text ->
+  -- | 'registryUri'
+  Prelude.Text ->
+  -- | 'verified'
+  Prelude.Bool ->
+  Registry
+newRegistry
+  pRegistryId_
+  pRegistryArn_
+  pRegistryUri_
+  pVerified_ =
+    Registry'
+      { registryId = pRegistryId_,
+        registryArn = pRegistryArn_,
+        registryUri = pRegistryUri_,
+        verified = pVerified_,
+        aliases = Prelude.mempty
+      }
+
+-- | The AWS account ID associated with the registry. If you do not specify a
+-- registry, the default public registry is assumed.
+registry_registryId :: Lens.Lens' Registry Prelude.Text
+registry_registryId = Lens.lens (\Registry' {registryId} -> registryId) (\s@Registry' {} a -> s {registryId = a} :: Registry)
+
+-- | The Amazon Resource Name (ARN) of the public registry.
+registry_registryArn :: Lens.Lens' Registry Prelude.Text
+registry_registryArn = Lens.lens (\Registry' {registryArn} -> registryArn) (\s@Registry' {} a -> s {registryArn = a} :: Registry)
+
+-- | The URI of a public registry. The URI contains a universal prefix and
+-- the registry alias.
+registry_registryUri :: Lens.Lens' Registry Prelude.Text
+registry_registryUri = Lens.lens (\Registry' {registryUri} -> registryUri) (\s@Registry' {} a -> s {registryUri = a} :: Registry)
+
+-- | Whether the account is verified. This indicates whether the account is
+-- an AWS Marketplace vendor. If an account is verified, each public
+-- repository will received a verified account badge on the Amazon ECR
+-- Public Gallery.
+registry_verified :: Lens.Lens' Registry Prelude.Bool
+registry_verified = Lens.lens (\Registry' {verified} -> verified) (\s@Registry' {} a -> s {verified = a} :: Registry)
+
+-- | An array of objects representing the aliases for a public registry.
+registry_aliases :: Lens.Lens' Registry [RegistryAlias]
+registry_aliases = Lens.lens (\Registry' {aliases} -> aliases) (\s@Registry' {} a -> s {aliases = a} :: Registry) Prelude.. Lens.coerced
+
+instance Data.FromJSON Registry where
+  parseJSON =
+    Data.withObject
+      "Registry"
+      ( \x ->
+          Registry'
+            Prelude.<$> (x Data..: "registryId")
+            Prelude.<*> (x Data..: "registryArn")
+            Prelude.<*> (x Data..: "registryUri")
+            Prelude.<*> (x Data..: "verified")
+            Prelude.<*> (x Data..:? "aliases" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Registry where
+  hashWithSalt _salt Registry' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` registryArn
+      `Prelude.hashWithSalt` registryUri
+      `Prelude.hashWithSalt` verified
+      `Prelude.hashWithSalt` aliases
+
+instance Prelude.NFData Registry where
+  rnf Registry' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf registryArn
+      `Prelude.seq` Prelude.rnf registryUri
+      `Prelude.seq` Prelude.rnf verified
+      `Prelude.seq` Prelude.rnf aliases
diff --git a/gen/Amazonka/ECRPublic/Types/RegistryAlias.hs b/gen/Amazonka/ECRPublic/Types/RegistryAlias.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/RegistryAlias.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.RegistryAlias
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.RegistryAlias where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types.RegistryAliasStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the aliases for a public registry. A public
+-- registry is given an alias upon creation but a custom alias can be set
+-- using the Amazon ECR console. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html Registries>
+-- in the /Amazon Elastic Container Registry User Guide/.
+--
+-- /See:/ 'newRegistryAlias' smart constructor.
+data RegistryAlias = RegistryAlias'
+  { -- | The name of the registry alias.
+    name :: Prelude.Text,
+    -- | The status of the registry alias.
+    status :: RegistryAliasStatus,
+    -- | Whether or not the registry alias is the primary alias for the registry.
+    -- If true, the alias is the primary registry alias and is displayed in
+    -- both the repository URL and the image URI used in the @docker pull@
+    -- commands on the Amazon ECR Public Gallery.
+    --
+    -- A registry alias that is not the primary registry alias can be used in
+    -- the repository URI in a @docker pull@ command.
+    primaryRegistryAlias :: Prelude.Bool,
+    -- | Whether or not the registry alias is the default alias for the registry.
+    -- When the first public repository is created, your public registry is
+    -- assigned a default registry alias.
+    defaultRegistryAlias :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegistryAlias' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'registryAlias_name' - The name of the registry alias.
+--
+-- 'status', 'registryAlias_status' - The status of the registry alias.
+--
+-- 'primaryRegistryAlias', 'registryAlias_primaryRegistryAlias' - Whether or not the registry alias is the primary alias for the registry.
+-- If true, the alias is the primary registry alias and is displayed in
+-- both the repository URL and the image URI used in the @docker pull@
+-- commands on the Amazon ECR Public Gallery.
+--
+-- A registry alias that is not the primary registry alias can be used in
+-- the repository URI in a @docker pull@ command.
+--
+-- 'defaultRegistryAlias', 'registryAlias_defaultRegistryAlias' - Whether or not the registry alias is the default alias for the registry.
+-- When the first public repository is created, your public registry is
+-- assigned a default registry alias.
+newRegistryAlias ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'status'
+  RegistryAliasStatus ->
+  -- | 'primaryRegistryAlias'
+  Prelude.Bool ->
+  -- | 'defaultRegistryAlias'
+  Prelude.Bool ->
+  RegistryAlias
+newRegistryAlias
+  pName_
+  pStatus_
+  pPrimaryRegistryAlias_
+  pDefaultRegistryAlias_ =
+    RegistryAlias'
+      { name = pName_,
+        status = pStatus_,
+        primaryRegistryAlias = pPrimaryRegistryAlias_,
+        defaultRegistryAlias = pDefaultRegistryAlias_
+      }
+
+-- | The name of the registry alias.
+registryAlias_name :: Lens.Lens' RegistryAlias Prelude.Text
+registryAlias_name = Lens.lens (\RegistryAlias' {name} -> name) (\s@RegistryAlias' {} a -> s {name = a} :: RegistryAlias)
+
+-- | The status of the registry alias.
+registryAlias_status :: Lens.Lens' RegistryAlias RegistryAliasStatus
+registryAlias_status = Lens.lens (\RegistryAlias' {status} -> status) (\s@RegistryAlias' {} a -> s {status = a} :: RegistryAlias)
+
+-- | Whether or not the registry alias is the primary alias for the registry.
+-- If true, the alias is the primary registry alias and is displayed in
+-- both the repository URL and the image URI used in the @docker pull@
+-- commands on the Amazon ECR Public Gallery.
+--
+-- A registry alias that is not the primary registry alias can be used in
+-- the repository URI in a @docker pull@ command.
+registryAlias_primaryRegistryAlias :: Lens.Lens' RegistryAlias Prelude.Bool
+registryAlias_primaryRegistryAlias = Lens.lens (\RegistryAlias' {primaryRegistryAlias} -> primaryRegistryAlias) (\s@RegistryAlias' {} a -> s {primaryRegistryAlias = a} :: RegistryAlias)
+
+-- | Whether or not the registry alias is the default alias for the registry.
+-- When the first public repository is created, your public registry is
+-- assigned a default registry alias.
+registryAlias_defaultRegistryAlias :: Lens.Lens' RegistryAlias Prelude.Bool
+registryAlias_defaultRegistryAlias = Lens.lens (\RegistryAlias' {defaultRegistryAlias} -> defaultRegistryAlias) (\s@RegistryAlias' {} a -> s {defaultRegistryAlias = a} :: RegistryAlias)
+
+instance Data.FromJSON RegistryAlias where
+  parseJSON =
+    Data.withObject
+      "RegistryAlias"
+      ( \x ->
+          RegistryAlias'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "primaryRegistryAlias")
+            Prelude.<*> (x Data..: "defaultRegistryAlias")
+      )
+
+instance Prelude.Hashable RegistryAlias where
+  hashWithSalt _salt RegistryAlias' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` primaryRegistryAlias
+      `Prelude.hashWithSalt` defaultRegistryAlias
+
+instance Prelude.NFData RegistryAlias where
+  rnf RegistryAlias' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf primaryRegistryAlias
+      `Prelude.seq` Prelude.rnf defaultRegistryAlias
diff --git a/gen/Amazonka/ECRPublic/Types/RegistryAliasStatus.hs b/gen/Amazonka/ECRPublic/Types/RegistryAliasStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/RegistryAliasStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.RegistryAliasStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.RegistryAliasStatus
+  ( RegistryAliasStatus
+      ( ..,
+        RegistryAliasStatus_ACTIVE,
+        RegistryAliasStatus_PENDING,
+        RegistryAliasStatus_REJECTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RegistryAliasStatus = RegistryAliasStatus'
+  { fromRegistryAliasStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RegistryAliasStatus_ACTIVE :: RegistryAliasStatus
+pattern RegistryAliasStatus_ACTIVE = RegistryAliasStatus' "ACTIVE"
+
+pattern RegistryAliasStatus_PENDING :: RegistryAliasStatus
+pattern RegistryAliasStatus_PENDING = RegistryAliasStatus' "PENDING"
+
+pattern RegistryAliasStatus_REJECTED :: RegistryAliasStatus
+pattern RegistryAliasStatus_REJECTED = RegistryAliasStatus' "REJECTED"
+
+{-# COMPLETE
+  RegistryAliasStatus_ACTIVE,
+  RegistryAliasStatus_PENDING,
+  RegistryAliasStatus_REJECTED,
+  RegistryAliasStatus'
+  #-}
diff --git a/gen/Amazonka/ECRPublic/Types/RegistryCatalogData.hs b/gen/Amazonka/ECRPublic/Types/RegistryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/RegistryCatalogData.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.RegistryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.RegistryCatalogData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata for a public registry.
+--
+-- /See:/ 'newRegistryCatalogData' smart constructor.
+data RegistryCatalogData = RegistryCatalogData'
+  { -- | The display name for a public registry. This appears on the Amazon ECR
+    -- Public Gallery.
+    --
+    -- Only accounts that have the verified account badge can have a registry
+    -- display name.
+    displayName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegistryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'displayName', 'registryCatalogData_displayName' - The display name for a public registry. This appears on the Amazon ECR
+-- Public Gallery.
+--
+-- Only accounts that have the verified account badge can have a registry
+-- display name.
+newRegistryCatalogData ::
+  RegistryCatalogData
+newRegistryCatalogData =
+  RegistryCatalogData' {displayName = Prelude.Nothing}
+
+-- | The display name for a public registry. This appears on the Amazon ECR
+-- Public Gallery.
+--
+-- Only accounts that have the verified account badge can have a registry
+-- display name.
+registryCatalogData_displayName :: Lens.Lens' RegistryCatalogData (Prelude.Maybe Prelude.Text)
+registryCatalogData_displayName = Lens.lens (\RegistryCatalogData' {displayName} -> displayName) (\s@RegistryCatalogData' {} a -> s {displayName = a} :: RegistryCatalogData)
+
+instance Data.FromJSON RegistryCatalogData where
+  parseJSON =
+    Data.withObject
+      "RegistryCatalogData"
+      ( \x ->
+          RegistryCatalogData'
+            Prelude.<$> (x Data..:? "displayName")
+      )
+
+instance Prelude.Hashable RegistryCatalogData where
+  hashWithSalt _salt RegistryCatalogData' {..} =
+    _salt `Prelude.hashWithSalt` displayName
+
+instance Prelude.NFData RegistryCatalogData where
+  rnf RegistryCatalogData' {..} =
+    Prelude.rnf displayName
diff --git a/gen/Amazonka/ECRPublic/Types/Repository.hs b/gen/Amazonka/ECRPublic/Types/Repository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/Repository.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.Repository
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.Repository where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a repository.
+--
+-- /See:/ 'newRepository' smart constructor.
+data Repository = Repository'
+  { -- | The date and time, in JavaScript date format, when the repository was
+    -- created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The AWS account ID associated with the public registry that contains the
+    -- repository.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that identifies the repository. The ARN
+    -- contains the @arn:aws:ecr@ namespace, followed by the region of the
+    -- repository, AWS account ID of the repository owner, repository
+    -- namespace, and repository name. For example,
+    -- @arn:aws:ecr:region:012345678910:repository\/test@.
+    repositoryArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The URI for the repository. You can use this URI for container image
+    -- @push@ and @pull@ operations.
+    repositoryUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Repository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'repository_createdAt' - The date and time, in JavaScript date format, when the repository was
+-- created.
+--
+-- 'registryId', 'repository_registryId' - The AWS account ID associated with the public registry that contains the
+-- repository.
+--
+-- 'repositoryArn', 'repository_repositoryArn' - The Amazon Resource Name (ARN) that identifies the repository. The ARN
+-- contains the @arn:aws:ecr@ namespace, followed by the region of the
+-- repository, AWS account ID of the repository owner, repository
+-- namespace, and repository name. For example,
+-- @arn:aws:ecr:region:012345678910:repository\/test@.
+--
+-- 'repositoryName', 'repository_repositoryName' - The name of the repository.
+--
+-- 'repositoryUri', 'repository_repositoryUri' - The URI for the repository. You can use this URI for container image
+-- @push@ and @pull@ operations.
+newRepository ::
+  Repository
+newRepository =
+  Repository'
+    { createdAt = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryArn = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      repositoryUri = Prelude.Nothing
+    }
+
+-- | The date and time, in JavaScript date format, when the repository was
+-- created.
+repository_createdAt :: Lens.Lens' Repository (Prelude.Maybe Prelude.UTCTime)
+repository_createdAt = Lens.lens (\Repository' {createdAt} -> createdAt) (\s@Repository' {} a -> s {createdAt = a} :: Repository) Prelude.. Lens.mapping Data._Time
+
+-- | The AWS account ID associated with the public registry that contains the
+-- repository.
+repository_registryId :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_registryId = Lens.lens (\Repository' {registryId} -> registryId) (\s@Repository' {} a -> s {registryId = a} :: Repository)
+
+-- | The Amazon Resource Name (ARN) that identifies the repository. The ARN
+-- contains the @arn:aws:ecr@ namespace, followed by the region of the
+-- repository, AWS account ID of the repository owner, repository
+-- namespace, and repository name. For example,
+-- @arn:aws:ecr:region:012345678910:repository\/test@.
+repository_repositoryArn :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryArn = Lens.lens (\Repository' {repositoryArn} -> repositoryArn) (\s@Repository' {} a -> s {repositoryArn = a} :: Repository)
+
+-- | The name of the repository.
+repository_repositoryName :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryName = Lens.lens (\Repository' {repositoryName} -> repositoryName) (\s@Repository' {} a -> s {repositoryName = a} :: Repository)
+
+-- | The URI for the repository. You can use this URI for container image
+-- @push@ and @pull@ operations.
+repository_repositoryUri :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryUri = Lens.lens (\Repository' {repositoryUri} -> repositoryUri) (\s@Repository' {} a -> s {repositoryUri = a} :: Repository)
+
+instance Data.FromJSON Repository where
+  parseJSON =
+    Data.withObject
+      "Repository"
+      ( \x ->
+          Repository'
+            Prelude.<$> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryArn")
+            Prelude.<*> (x Data..:? "repositoryName")
+            Prelude.<*> (x Data..:? "repositoryUri")
+      )
+
+instance Prelude.Hashable Repository where
+  hashWithSalt _salt Repository' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryArn
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` repositoryUri
+
+instance Prelude.NFData Repository where
+  rnf Repository' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryArn
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf repositoryUri
diff --git a/gen/Amazonka/ECRPublic/Types/RepositoryCatalogData.hs b/gen/Amazonka/ECRPublic/Types/RepositoryCatalogData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/RepositoryCatalogData.hs
@@ -0,0 +1,172 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.RepositoryCatalogData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.RepositoryCatalogData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The catalog data for a repository. This data is publicly visible in the
+-- Amazon ECR Public Gallery.
+--
+-- /See:/ 'newRepositoryCatalogData' smart constructor.
+data RepositoryCatalogData = RepositoryCatalogData'
+  { -- | The longform description of the contents of the repository. This text
+    -- appears in the repository details on the Amazon ECR Public Gallery.
+    aboutText :: Prelude.Maybe Prelude.Text,
+    -- | The architecture tags that are associated with the repository.
+    --
+    -- Only supported operating system tags appear publicly in the Amazon ECR
+    -- Public Gallery. For more information, see RepositoryCatalogDataInput.
+    architectures :: Prelude.Maybe [Prelude.Text],
+    -- | The short description of the repository.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The URL containing the logo associated with the repository.
+    logoUrl :: Prelude.Maybe Prelude.Text,
+    -- | Whether or not the repository is certified by AWS Marketplace.
+    marketplaceCertified :: Prelude.Maybe Prelude.Bool,
+    -- | The operating system tags that are associated with the repository.
+    --
+    -- Only supported operating system tags appear publicly in the Amazon ECR
+    -- Public Gallery. For more information, see RepositoryCatalogDataInput.
+    operatingSystems :: Prelude.Maybe [Prelude.Text],
+    -- | The longform usage details of the contents of the repository. The usage
+    -- text provides context for users of the repository.
+    usageText :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RepositoryCatalogData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aboutText', 'repositoryCatalogData_aboutText' - The longform description of the contents of the repository. This text
+-- appears in the repository details on the Amazon ECR Public Gallery.
+--
+-- 'architectures', 'repositoryCatalogData_architectures' - The architecture tags that are associated with the repository.
+--
+-- Only supported operating system tags appear publicly in the Amazon ECR
+-- Public Gallery. For more information, see RepositoryCatalogDataInput.
+--
+-- 'description', 'repositoryCatalogData_description' - The short description of the repository.
+--
+-- 'logoUrl', 'repositoryCatalogData_logoUrl' - The URL containing the logo associated with the repository.
+--
+-- 'marketplaceCertified', 'repositoryCatalogData_marketplaceCertified' - Whether or not the repository is certified by AWS Marketplace.
+--
+-- 'operatingSystems', 'repositoryCatalogData_operatingSystems' - The operating system tags that are associated with the repository.
+--
+-- Only supported operating system tags appear publicly in the Amazon ECR
+-- Public Gallery. For more information, see RepositoryCatalogDataInput.
+--
+-- 'usageText', 'repositoryCatalogData_usageText' - The longform usage details of the contents of the repository. The usage
+-- text provides context for users of the repository.
+newRepositoryCatalogData ::
+  RepositoryCatalogData
+newRepositoryCatalogData =
+  RepositoryCatalogData'
+    { aboutText = Prelude.Nothing,
+      architectures = Prelude.Nothing,
+      description = Prelude.Nothing,
+      logoUrl = Prelude.Nothing,
+      marketplaceCertified = Prelude.Nothing,
+      operatingSystems = Prelude.Nothing,
+      usageText = Prelude.Nothing
+    }
+
+-- | The longform description of the contents of the repository. This text
+-- appears in the repository details on the Amazon ECR Public Gallery.
+repositoryCatalogData_aboutText :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe Prelude.Text)
+repositoryCatalogData_aboutText = Lens.lens (\RepositoryCatalogData' {aboutText} -> aboutText) (\s@RepositoryCatalogData' {} a -> s {aboutText = a} :: RepositoryCatalogData)
+
+-- | The architecture tags that are associated with the repository.
+--
+-- Only supported operating system tags appear publicly in the Amazon ECR
+-- Public Gallery. For more information, see RepositoryCatalogDataInput.
+repositoryCatalogData_architectures :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe [Prelude.Text])
+repositoryCatalogData_architectures = Lens.lens (\RepositoryCatalogData' {architectures} -> architectures) (\s@RepositoryCatalogData' {} a -> s {architectures = a} :: RepositoryCatalogData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The short description of the repository.
+repositoryCatalogData_description :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe Prelude.Text)
+repositoryCatalogData_description = Lens.lens (\RepositoryCatalogData' {description} -> description) (\s@RepositoryCatalogData' {} a -> s {description = a} :: RepositoryCatalogData)
+
+-- | The URL containing the logo associated with the repository.
+repositoryCatalogData_logoUrl :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe Prelude.Text)
+repositoryCatalogData_logoUrl = Lens.lens (\RepositoryCatalogData' {logoUrl} -> logoUrl) (\s@RepositoryCatalogData' {} a -> s {logoUrl = a} :: RepositoryCatalogData)
+
+-- | Whether or not the repository is certified by AWS Marketplace.
+repositoryCatalogData_marketplaceCertified :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe Prelude.Bool)
+repositoryCatalogData_marketplaceCertified = Lens.lens (\RepositoryCatalogData' {marketplaceCertified} -> marketplaceCertified) (\s@RepositoryCatalogData' {} a -> s {marketplaceCertified = a} :: RepositoryCatalogData)
+
+-- | The operating system tags that are associated with the repository.
+--
+-- Only supported operating system tags appear publicly in the Amazon ECR
+-- Public Gallery. For more information, see RepositoryCatalogDataInput.
+repositoryCatalogData_operatingSystems :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe [Prelude.Text])
+repositoryCatalogData_operatingSystems = Lens.lens (\RepositoryCatalogData' {operatingSystems} -> operatingSystems) (\s@RepositoryCatalogData' {} a -> s {operatingSystems = a} :: RepositoryCatalogData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The longform usage details of the contents of the repository. The usage
+-- text provides context for users of the repository.
+repositoryCatalogData_usageText :: Lens.Lens' RepositoryCatalogData (Prelude.Maybe Prelude.Text)
+repositoryCatalogData_usageText = Lens.lens (\RepositoryCatalogData' {usageText} -> usageText) (\s@RepositoryCatalogData' {} a -> s {usageText = a} :: RepositoryCatalogData)
+
+instance Data.FromJSON RepositoryCatalogData where
+  parseJSON =
+    Data.withObject
+      "RepositoryCatalogData"
+      ( \x ->
+          RepositoryCatalogData'
+            Prelude.<$> (x Data..:? "aboutText")
+            Prelude.<*> (x Data..:? "architectures" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "logoUrl")
+            Prelude.<*> (x Data..:? "marketplaceCertified")
+            Prelude.<*> ( x
+                            Data..:? "operatingSystems"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "usageText")
+      )
+
+instance Prelude.Hashable RepositoryCatalogData where
+  hashWithSalt _salt RepositoryCatalogData' {..} =
+    _salt
+      `Prelude.hashWithSalt` aboutText
+      `Prelude.hashWithSalt` architectures
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` logoUrl
+      `Prelude.hashWithSalt` marketplaceCertified
+      `Prelude.hashWithSalt` operatingSystems
+      `Prelude.hashWithSalt` usageText
+
+instance Prelude.NFData RepositoryCatalogData where
+  rnf RepositoryCatalogData' {..} =
+    Prelude.rnf aboutText
+      `Prelude.seq` Prelude.rnf architectures
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf logoUrl
+      `Prelude.seq` Prelude.rnf marketplaceCertified
+      `Prelude.seq` Prelude.rnf operatingSystems
+      `Prelude.seq` Prelude.rnf usageText
diff --git a/gen/Amazonka/ECRPublic/Types/RepositoryCatalogDataInput.hs b/gen/Amazonka/ECRPublic/Types/RepositoryCatalogDataInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/RepositoryCatalogDataInput.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.RepositoryCatalogDataInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.RepositoryCatalogDataInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object containing the catalog data for a repository. This data is
+-- publicly visible in the Amazon ECR Public Gallery.
+--
+-- /See:/ 'newRepositoryCatalogDataInput' smart constructor.
+data RepositoryCatalogDataInput = RepositoryCatalogDataInput'
+  { -- | A detailed description of the contents of the repository. It is publicly
+    -- visible in the Amazon ECR Public Gallery. The text must be in markdown
+    -- format.
+    aboutText :: Prelude.Maybe Prelude.Text,
+    -- | The system architecture that the images in the repository are compatible
+    -- with. On the Amazon ECR Public Gallery, the following supported
+    -- architectures will appear as badges on the repository and are used as
+    -- search filters.
+    --
+    -- -   @Linux@
+    --
+    -- -   @Windows@
+    --
+    -- If an unsupported tag is added to your repository catalog data, it will
+    -- be associated with the repository and can be retrieved using the API but
+    -- will not be discoverable in the Amazon ECR Public Gallery.
+    architectures :: Prelude.Maybe [Prelude.Text],
+    -- | A short description of the contents of the repository. This text appears
+    -- in both the image details and also when searching for repositories on
+    -- the Amazon ECR Public Gallery.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The base64-encoded repository logo payload.
+    --
+    -- The repository logo is only publicly visible in the Amazon ECR Public
+    -- Gallery for verified accounts.
+    logoImageBlob :: Prelude.Maybe Data.Base64,
+    -- | The operating systems that the images in the repository are compatible
+    -- with. On the Amazon ECR Public Gallery, the following supported
+    -- operating systems will appear as badges on the repository and are used
+    -- as search filters.
+    --
+    -- -   @ARM@
+    --
+    -- -   @ARM 64@
+    --
+    -- -   @x86@
+    --
+    -- -   @x86-64@
+    --
+    -- If an unsupported tag is added to your repository catalog data, it will
+    -- be associated with the repository and can be retrieved using the API but
+    -- will not be discoverable in the Amazon ECR Public Gallery.
+    operatingSystems :: Prelude.Maybe [Prelude.Text],
+    -- | Detailed information on how to use the contents of the repository. It is
+    -- publicly visible in the Amazon ECR Public Gallery. The usage text
+    -- provides context, support information, and additional usage details for
+    -- users of the repository. The text must be in markdown format.
+    usageText :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RepositoryCatalogDataInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aboutText', 'repositoryCatalogDataInput_aboutText' - A detailed description of the contents of the repository. It is publicly
+-- visible in the Amazon ECR Public Gallery. The text must be in markdown
+-- format.
+--
+-- 'architectures', 'repositoryCatalogDataInput_architectures' - The system architecture that the images in the repository are compatible
+-- with. On the Amazon ECR Public Gallery, the following supported
+-- architectures will appear as badges on the repository and are used as
+-- search filters.
+--
+-- -   @Linux@
+--
+-- -   @Windows@
+--
+-- If an unsupported tag is added to your repository catalog data, it will
+-- be associated with the repository and can be retrieved using the API but
+-- will not be discoverable in the Amazon ECR Public Gallery.
+--
+-- 'description', 'repositoryCatalogDataInput_description' - A short description of the contents of the repository. This text appears
+-- in both the image details and also when searching for repositories on
+-- the Amazon ECR Public Gallery.
+--
+-- 'logoImageBlob', 'repositoryCatalogDataInput_logoImageBlob' - The base64-encoded repository logo payload.
+--
+-- The repository logo is only publicly visible in the Amazon ECR Public
+-- Gallery for verified accounts.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'operatingSystems', 'repositoryCatalogDataInput_operatingSystems' - The operating systems that the images in the repository are compatible
+-- with. On the Amazon ECR Public Gallery, the following supported
+-- operating systems will appear as badges on the repository and are used
+-- as search filters.
+--
+-- -   @ARM@
+--
+-- -   @ARM 64@
+--
+-- -   @x86@
+--
+-- -   @x86-64@
+--
+-- If an unsupported tag is added to your repository catalog data, it will
+-- be associated with the repository and can be retrieved using the API but
+-- will not be discoverable in the Amazon ECR Public Gallery.
+--
+-- 'usageText', 'repositoryCatalogDataInput_usageText' - Detailed information on how to use the contents of the repository. It is
+-- publicly visible in the Amazon ECR Public Gallery. The usage text
+-- provides context, support information, and additional usage details for
+-- users of the repository. The text must be in markdown format.
+newRepositoryCatalogDataInput ::
+  RepositoryCatalogDataInput
+newRepositoryCatalogDataInput =
+  RepositoryCatalogDataInput'
+    { aboutText =
+        Prelude.Nothing,
+      architectures = Prelude.Nothing,
+      description = Prelude.Nothing,
+      logoImageBlob = Prelude.Nothing,
+      operatingSystems = Prelude.Nothing,
+      usageText = Prelude.Nothing
+    }
+
+-- | A detailed description of the contents of the repository. It is publicly
+-- visible in the Amazon ECR Public Gallery. The text must be in markdown
+-- format.
+repositoryCatalogDataInput_aboutText :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe Prelude.Text)
+repositoryCatalogDataInput_aboutText = Lens.lens (\RepositoryCatalogDataInput' {aboutText} -> aboutText) (\s@RepositoryCatalogDataInput' {} a -> s {aboutText = a} :: RepositoryCatalogDataInput)
+
+-- | The system architecture that the images in the repository are compatible
+-- with. On the Amazon ECR Public Gallery, the following supported
+-- architectures will appear as badges on the repository and are used as
+-- search filters.
+--
+-- -   @Linux@
+--
+-- -   @Windows@
+--
+-- If an unsupported tag is added to your repository catalog data, it will
+-- be associated with the repository and can be retrieved using the API but
+-- will not be discoverable in the Amazon ECR Public Gallery.
+repositoryCatalogDataInput_architectures :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe [Prelude.Text])
+repositoryCatalogDataInput_architectures = Lens.lens (\RepositoryCatalogDataInput' {architectures} -> architectures) (\s@RepositoryCatalogDataInput' {} a -> s {architectures = a} :: RepositoryCatalogDataInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | A short description of the contents of the repository. This text appears
+-- in both the image details and also when searching for repositories on
+-- the Amazon ECR Public Gallery.
+repositoryCatalogDataInput_description :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe Prelude.Text)
+repositoryCatalogDataInput_description = Lens.lens (\RepositoryCatalogDataInput' {description} -> description) (\s@RepositoryCatalogDataInput' {} a -> s {description = a} :: RepositoryCatalogDataInput)
+
+-- | The base64-encoded repository logo payload.
+--
+-- The repository logo is only publicly visible in the Amazon ECR Public
+-- Gallery for verified accounts.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+repositoryCatalogDataInput_logoImageBlob :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe Prelude.ByteString)
+repositoryCatalogDataInput_logoImageBlob = Lens.lens (\RepositoryCatalogDataInput' {logoImageBlob} -> logoImageBlob) (\s@RepositoryCatalogDataInput' {} a -> s {logoImageBlob = a} :: RepositoryCatalogDataInput) Prelude.. Lens.mapping Data._Base64
+
+-- | The operating systems that the images in the repository are compatible
+-- with. On the Amazon ECR Public Gallery, the following supported
+-- operating systems will appear as badges on the repository and are used
+-- as search filters.
+--
+-- -   @ARM@
+--
+-- -   @ARM 64@
+--
+-- -   @x86@
+--
+-- -   @x86-64@
+--
+-- If an unsupported tag is added to your repository catalog data, it will
+-- be associated with the repository and can be retrieved using the API but
+-- will not be discoverable in the Amazon ECR Public Gallery.
+repositoryCatalogDataInput_operatingSystems :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe [Prelude.Text])
+repositoryCatalogDataInput_operatingSystems = Lens.lens (\RepositoryCatalogDataInput' {operatingSystems} -> operatingSystems) (\s@RepositoryCatalogDataInput' {} a -> s {operatingSystems = a} :: RepositoryCatalogDataInput) Prelude.. Lens.mapping Lens.coerced
+
+-- | Detailed information on how to use the contents of the repository. It is
+-- publicly visible in the Amazon ECR Public Gallery. The usage text
+-- provides context, support information, and additional usage details for
+-- users of the repository. The text must be in markdown format.
+repositoryCatalogDataInput_usageText :: Lens.Lens' RepositoryCatalogDataInput (Prelude.Maybe Prelude.Text)
+repositoryCatalogDataInput_usageText = Lens.lens (\RepositoryCatalogDataInput' {usageText} -> usageText) (\s@RepositoryCatalogDataInput' {} a -> s {usageText = a} :: RepositoryCatalogDataInput)
+
+instance Prelude.Hashable RepositoryCatalogDataInput where
+  hashWithSalt _salt RepositoryCatalogDataInput' {..} =
+    _salt
+      `Prelude.hashWithSalt` aboutText
+      `Prelude.hashWithSalt` architectures
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` logoImageBlob
+      `Prelude.hashWithSalt` operatingSystems
+      `Prelude.hashWithSalt` usageText
+
+instance Prelude.NFData RepositoryCatalogDataInput where
+  rnf RepositoryCatalogDataInput' {..} =
+    Prelude.rnf aboutText
+      `Prelude.seq` Prelude.rnf architectures
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf logoImageBlob
+      `Prelude.seq` Prelude.rnf operatingSystems
+      `Prelude.seq` Prelude.rnf usageText
+
+instance Data.ToJSON RepositoryCatalogDataInput where
+  toJSON RepositoryCatalogDataInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("aboutText" Data..=) Prelude.<$> aboutText,
+            ("architectures" Data..=) Prelude.<$> architectures,
+            ("description" Data..=) Prelude.<$> description,
+            ("logoImageBlob" Data..=) Prelude.<$> logoImageBlob,
+            ("operatingSystems" Data..=)
+              Prelude.<$> operatingSystems,
+            ("usageText" Data..=) Prelude.<$> usageText
+          ]
+      )
diff --git a/gen/Amazonka/ECRPublic/Types/Tag.hs b/gen/Amazonka/ECRPublic/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Types/Tag.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata that you apply to a resource to help you categorize and
+-- organize them. Each tag consists of a key and an optional value, both of
+-- which you define. Tag keys can have a maximum character length of 128
+-- characters, and tag values can have a maximum length of 256 characters.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | One part of a key-value pair that make up a tag. A @key@ is a general
+    -- label that acts like a category for more specific tag values.
+    key :: Prelude.Maybe Prelude.Text,
+    -- | The optional part of a key-value pair that make up a tag. A @value@ acts
+    -- as a descriptor within a tag category (key).
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+--
+-- 'value', 'tag_value' - The optional part of a key-value pair that make up a tag. A @value@ acts
+-- as a descriptor within a tag category (key).
+newTag ::
+  Tag
+newTag =
+  Tag'
+    { key = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+tag_key :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The optional part of a key-value pair that make up a tag. A @value@ acts
+-- as a descriptor within a tag category (key).
+tag_value :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..:? "Key")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Key" Data..=) Prelude.<$> key,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/ECRPublic/UntagResource.hs b/gen/Amazonka/ECRPublic/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/UntagResource.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes specified tags from a resource.
+module Amazonka.ECRPublic.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource from which to delete
+    -- tags. Currently, the supported resource is an Amazon ECR Public
+    -- repository.
+    resourceArn :: Prelude.Text,
+    -- | The keys of the tags to be removed.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource from which to delete
+-- tags. Currently, the supported resource is an Amazon ECR Public
+-- repository.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The keys of the tags to be removed.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource from which to delete
+-- tags. Currently, the supported resource is an Amazon ECR Public
+-- repository.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The keys of the tags to be removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/UploadLayerPart.hs b/gen/Amazonka/ECRPublic/UploadLayerPart.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/UploadLayerPart.hs
@@ -0,0 +1,321 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.UploadLayerPart
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Uploads an image layer part to Amazon ECR.
+--
+-- When an image is pushed, each new image layer is uploaded in parts. The
+-- maximum size of each image layer part can be 20971520 bytes (or about
+-- 20MB). The UploadLayerPart API is called once per each new image layer
+-- part.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECRPublic.UploadLayerPart
+  ( -- * Creating a Request
+    UploadLayerPart (..),
+    newUploadLayerPart,
+
+    -- * Request Lenses
+    uploadLayerPart_registryId,
+    uploadLayerPart_repositoryName,
+    uploadLayerPart_uploadId,
+    uploadLayerPart_partFirstByte,
+    uploadLayerPart_partLastByte,
+    uploadLayerPart_layerPartBlob,
+
+    -- * Destructuring the Response
+    UploadLayerPartResponse (..),
+    newUploadLayerPartResponse,
+
+    -- * Response Lenses
+    uploadLayerPartResponse_lastByteReceived,
+    uploadLayerPartResponse_registryId,
+    uploadLayerPartResponse_repositoryName,
+    uploadLayerPartResponse_uploadId,
+    uploadLayerPartResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUploadLayerPart' smart constructor.
+data UploadLayerPart = UploadLayerPart'
+  { -- | The AWS account ID associated with the registry to which you are
+    -- uploading layer parts. If you do not specify a registry, the default
+    -- public registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which you are uploading layer parts.
+    repositoryName :: Prelude.Text,
+    -- | The upload ID from a previous InitiateLayerUpload operation to associate
+    -- with the layer part upload.
+    uploadId :: Prelude.Text,
+    -- | The position of the first byte of the layer part witin the overall image
+    -- layer.
+    partFirstByte :: Prelude.Natural,
+    -- | The position of the last byte of the layer part within the overall image
+    -- layer.
+    partLastByte :: Prelude.Natural,
+    -- | The base64-encoded layer part payload.
+    layerPartBlob :: Data.Base64
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UploadLayerPart' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'uploadLayerPart_registryId' - The AWS account ID associated with the registry to which you are
+-- uploading layer parts. If you do not specify a registry, the default
+-- public registry is assumed.
+--
+-- 'repositoryName', 'uploadLayerPart_repositoryName' - The name of the repository to which you are uploading layer parts.
+--
+-- 'uploadId', 'uploadLayerPart_uploadId' - The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the layer part upload.
+--
+-- 'partFirstByte', 'uploadLayerPart_partFirstByte' - The position of the first byte of the layer part witin the overall image
+-- layer.
+--
+-- 'partLastByte', 'uploadLayerPart_partLastByte' - The position of the last byte of the layer part within the overall image
+-- layer.
+--
+-- 'layerPartBlob', 'uploadLayerPart_layerPartBlob' - The base64-encoded layer part payload.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+newUploadLayerPart ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'uploadId'
+  Prelude.Text ->
+  -- | 'partFirstByte'
+  Prelude.Natural ->
+  -- | 'partLastByte'
+  Prelude.Natural ->
+  -- | 'layerPartBlob'
+  Prelude.ByteString ->
+  UploadLayerPart
+newUploadLayerPart
+  pRepositoryName_
+  pUploadId_
+  pPartFirstByte_
+  pPartLastByte_
+  pLayerPartBlob_ =
+    UploadLayerPart'
+      { registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        uploadId = pUploadId_,
+        partFirstByte = pPartFirstByte_,
+        partLastByte = pPartLastByte_,
+        layerPartBlob = Data._Base64 Lens.# pLayerPartBlob_
+      }
+
+-- | The AWS account ID associated with the registry to which you are
+-- uploading layer parts. If you do not specify a registry, the default
+-- public registry is assumed.
+uploadLayerPart_registryId :: Lens.Lens' UploadLayerPart (Prelude.Maybe Prelude.Text)
+uploadLayerPart_registryId = Lens.lens (\UploadLayerPart' {registryId} -> registryId) (\s@UploadLayerPart' {} a -> s {registryId = a} :: UploadLayerPart)
+
+-- | The name of the repository to which you are uploading layer parts.
+uploadLayerPart_repositoryName :: Lens.Lens' UploadLayerPart Prelude.Text
+uploadLayerPart_repositoryName = Lens.lens (\UploadLayerPart' {repositoryName} -> repositoryName) (\s@UploadLayerPart' {} a -> s {repositoryName = a} :: UploadLayerPart)
+
+-- | The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the layer part upload.
+uploadLayerPart_uploadId :: Lens.Lens' UploadLayerPart Prelude.Text
+uploadLayerPart_uploadId = Lens.lens (\UploadLayerPart' {uploadId} -> uploadId) (\s@UploadLayerPart' {} a -> s {uploadId = a} :: UploadLayerPart)
+
+-- | The position of the first byte of the layer part witin the overall image
+-- layer.
+uploadLayerPart_partFirstByte :: Lens.Lens' UploadLayerPart Prelude.Natural
+uploadLayerPart_partFirstByte = Lens.lens (\UploadLayerPart' {partFirstByte} -> partFirstByte) (\s@UploadLayerPart' {} a -> s {partFirstByte = a} :: UploadLayerPart)
+
+-- | The position of the last byte of the layer part within the overall image
+-- layer.
+uploadLayerPart_partLastByte :: Lens.Lens' UploadLayerPart Prelude.Natural
+uploadLayerPart_partLastByte = Lens.lens (\UploadLayerPart' {partLastByte} -> partLastByte) (\s@UploadLayerPart' {} a -> s {partLastByte = a} :: UploadLayerPart)
+
+-- | The base64-encoded layer part payload.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+uploadLayerPart_layerPartBlob :: Lens.Lens' UploadLayerPart Prelude.ByteString
+uploadLayerPart_layerPartBlob = Lens.lens (\UploadLayerPart' {layerPartBlob} -> layerPartBlob) (\s@UploadLayerPart' {} a -> s {layerPartBlob = a} :: UploadLayerPart) Prelude.. Data._Base64
+
+instance Core.AWSRequest UploadLayerPart where
+  type
+    AWSResponse UploadLayerPart =
+      UploadLayerPartResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UploadLayerPartResponse'
+            Prelude.<$> (x Data..?> "lastByteReceived")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UploadLayerPart where
+  hashWithSalt _salt UploadLayerPart' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` uploadId
+      `Prelude.hashWithSalt` partFirstByte
+      `Prelude.hashWithSalt` partLastByte
+      `Prelude.hashWithSalt` layerPartBlob
+
+instance Prelude.NFData UploadLayerPart where
+  rnf UploadLayerPart' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf partFirstByte
+      `Prelude.seq` Prelude.rnf partLastByte
+      `Prelude.seq` Prelude.rnf layerPartBlob
+
+instance Data.ToHeaders UploadLayerPart where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "SpencerFrontendService.UploadLayerPart" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UploadLayerPart where
+  toJSON UploadLayerPart' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("uploadId" Data..= uploadId),
+            Prelude.Just ("partFirstByte" Data..= partFirstByte),
+            Prelude.Just ("partLastByte" Data..= partLastByte),
+            Prelude.Just
+              ("layerPartBlob" Data..= layerPartBlob)
+          ]
+      )
+
+instance Data.ToPath UploadLayerPart where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UploadLayerPart where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUploadLayerPartResponse' smart constructor.
+data UploadLayerPartResponse = UploadLayerPartResponse'
+  { -- | The integer value of the last byte received in the request.
+    lastByteReceived :: Prelude.Maybe Prelude.Natural,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The upload ID associated with the request.
+    uploadId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UploadLayerPartResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastByteReceived', 'uploadLayerPartResponse_lastByteReceived' - The integer value of the last byte received in the request.
+--
+-- 'registryId', 'uploadLayerPartResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'uploadLayerPartResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'uploadId', 'uploadLayerPartResponse_uploadId' - The upload ID associated with the request.
+--
+-- 'httpStatus', 'uploadLayerPartResponse_httpStatus' - The response's http status code.
+newUploadLayerPartResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UploadLayerPartResponse
+newUploadLayerPartResponse pHttpStatus_ =
+  UploadLayerPartResponse'
+    { lastByteReceived =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The integer value of the last byte received in the request.
+uploadLayerPartResponse_lastByteReceived :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Natural)
+uploadLayerPartResponse_lastByteReceived = Lens.lens (\UploadLayerPartResponse' {lastByteReceived} -> lastByteReceived) (\s@UploadLayerPartResponse' {} a -> s {lastByteReceived = a} :: UploadLayerPartResponse)
+
+-- | The registry ID associated with the request.
+uploadLayerPartResponse_registryId :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_registryId = Lens.lens (\UploadLayerPartResponse' {registryId} -> registryId) (\s@UploadLayerPartResponse' {} a -> s {registryId = a} :: UploadLayerPartResponse)
+
+-- | The repository name associated with the request.
+uploadLayerPartResponse_repositoryName :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_repositoryName = Lens.lens (\UploadLayerPartResponse' {repositoryName} -> repositoryName) (\s@UploadLayerPartResponse' {} a -> s {repositoryName = a} :: UploadLayerPartResponse)
+
+-- | The upload ID associated with the request.
+uploadLayerPartResponse_uploadId :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_uploadId = Lens.lens (\UploadLayerPartResponse' {uploadId} -> uploadId) (\s@UploadLayerPartResponse' {} a -> s {uploadId = a} :: UploadLayerPartResponse)
+
+-- | The response's http status code.
+uploadLayerPartResponse_httpStatus :: Lens.Lens' UploadLayerPartResponse Prelude.Int
+uploadLayerPartResponse_httpStatus = Lens.lens (\UploadLayerPartResponse' {httpStatus} -> httpStatus) (\s@UploadLayerPartResponse' {} a -> s {httpStatus = a} :: UploadLayerPartResponse)
+
+instance Prelude.NFData UploadLayerPartResponse where
+  rnf UploadLayerPartResponse' {..} =
+    Prelude.rnf lastByteReceived
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECRPublic/Waiters.hs b/gen/Amazonka/ECRPublic/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECRPublic/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECRPublic.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.ECRPublic.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECRPublic.Lens
+import Amazonka.ECRPublic.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.ECRPublic
+import Test.Amazonka.ECRPublic.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "ECRPublic"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/ECRPublic.hs b/test/Test/Amazonka/ECRPublic.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/ECRPublic.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.ECRPublic
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.ECRPublic
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/ECRPublic/Internal.hs b/test/Test/Amazonka/ECRPublic/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/ECRPublic/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.ECRPublic.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.ECRPublic.Internal where
diff --git a/test/Test/Amazonka/Gen/ECRPublic.hs b/test/Test/Amazonka/Gen/ECRPublic.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/ECRPublic.hs
@@ -0,0 +1,498 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.ECRPublic
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.ECRPublic where
+
+import Amazonka.ECRPublic
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.ECRPublic.Internal
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestBatchCheckLayerAvailability $
+--             newBatchCheckLayerAvailability
+--
+--         , requestBatchDeleteImage $
+--             newBatchDeleteImage
+--
+--         , requestCompleteLayerUpload $
+--             newCompleteLayerUpload
+--
+--         , requestCreateRepository $
+--             newCreateRepository
+--
+--         , requestDeleteRepository $
+--             newDeleteRepository
+--
+--         , requestDeleteRepositoryPolicy $
+--             newDeleteRepositoryPolicy
+--
+--         , requestDescribeImageTags $
+--             newDescribeImageTags
+--
+--         , requestDescribeImages $
+--             newDescribeImages
+--
+--         , requestDescribeRegistries $
+--             newDescribeRegistries
+--
+--         , requestDescribeRepositories $
+--             newDescribeRepositories
+--
+--         , requestGetAuthorizationToken $
+--             newGetAuthorizationToken
+--
+--         , requestGetRegistryCatalogData $
+--             newGetRegistryCatalogData
+--
+--         , requestGetRepositoryCatalogData $
+--             newGetRepositoryCatalogData
+--
+--         , requestGetRepositoryPolicy $
+--             newGetRepositoryPolicy
+--
+--         , requestInitiateLayerUpload $
+--             newInitiateLayerUpload
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutImage $
+--             newPutImage
+--
+--         , requestPutRegistryCatalogData $
+--             newPutRegistryCatalogData
+--
+--         , requestPutRepositoryCatalogData $
+--             newPutRepositoryCatalogData
+--
+--         , requestSetRepositoryPolicy $
+--             newSetRepositoryPolicy
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUploadLayerPart $
+--             newUploadLayerPart
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchCheckLayerAvailability $
+--             newBatchCheckLayerAvailabilityResponse
+--
+--         , responseBatchDeleteImage $
+--             newBatchDeleteImageResponse
+--
+--         , responseCompleteLayerUpload $
+--             newCompleteLayerUploadResponse
+--
+--         , responseCreateRepository $
+--             newCreateRepositoryResponse
+--
+--         , responseDeleteRepository $
+--             newDeleteRepositoryResponse
+--
+--         , responseDeleteRepositoryPolicy $
+--             newDeleteRepositoryPolicyResponse
+--
+--         , responseDescribeImageTags $
+--             newDescribeImageTagsResponse
+--
+--         , responseDescribeImages $
+--             newDescribeImagesResponse
+--
+--         , responseDescribeRegistries $
+--             newDescribeRegistriesResponse
+--
+--         , responseDescribeRepositories $
+--             newDescribeRepositoriesResponse
+--
+--         , responseGetAuthorizationToken $
+--             newGetAuthorizationTokenResponse
+--
+--         , responseGetRegistryCatalogData $
+--             newGetRegistryCatalogDataResponse
+--
+--         , responseGetRepositoryCatalogData $
+--             newGetRepositoryCatalogDataResponse
+--
+--         , responseGetRepositoryPolicy $
+--             newGetRepositoryPolicyResponse
+--
+--         , responseInitiateLayerUpload $
+--             newInitiateLayerUploadResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutImage $
+--             newPutImageResponse
+--
+--         , responsePutRegistryCatalogData $
+--             newPutRegistryCatalogDataResponse
+--
+--         , responsePutRepositoryCatalogData $
+--             newPutRepositoryCatalogDataResponse
+--
+--         , responseSetRepositoryPolicy $
+--             newSetRepositoryPolicyResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUploadLayerPart $
+--             newUploadLayerPartResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchCheckLayerAvailability :: BatchCheckLayerAvailability -> TestTree
+requestBatchCheckLayerAvailability =
+  req
+    "BatchCheckLayerAvailability"
+    "fixture/BatchCheckLayerAvailability.yaml"
+
+requestBatchDeleteImage :: BatchDeleteImage -> TestTree
+requestBatchDeleteImage =
+  req
+    "BatchDeleteImage"
+    "fixture/BatchDeleteImage.yaml"
+
+requestCompleteLayerUpload :: CompleteLayerUpload -> TestTree
+requestCompleteLayerUpload =
+  req
+    "CompleteLayerUpload"
+    "fixture/CompleteLayerUpload.yaml"
+
+requestCreateRepository :: CreateRepository -> TestTree
+requestCreateRepository =
+  req
+    "CreateRepository"
+    "fixture/CreateRepository.yaml"
+
+requestDeleteRepository :: DeleteRepository -> TestTree
+requestDeleteRepository =
+  req
+    "DeleteRepository"
+    "fixture/DeleteRepository.yaml"
+
+requestDeleteRepositoryPolicy :: DeleteRepositoryPolicy -> TestTree
+requestDeleteRepositoryPolicy =
+  req
+    "DeleteRepositoryPolicy"
+    "fixture/DeleteRepositoryPolicy.yaml"
+
+requestDescribeImageTags :: DescribeImageTags -> TestTree
+requestDescribeImageTags =
+  req
+    "DescribeImageTags"
+    "fixture/DescribeImageTags.yaml"
+
+requestDescribeImages :: DescribeImages -> TestTree
+requestDescribeImages =
+  req
+    "DescribeImages"
+    "fixture/DescribeImages.yaml"
+
+requestDescribeRegistries :: DescribeRegistries -> TestTree
+requestDescribeRegistries =
+  req
+    "DescribeRegistries"
+    "fixture/DescribeRegistries.yaml"
+
+requestDescribeRepositories :: DescribeRepositories -> TestTree
+requestDescribeRepositories =
+  req
+    "DescribeRepositories"
+    "fixture/DescribeRepositories.yaml"
+
+requestGetAuthorizationToken :: GetAuthorizationToken -> TestTree
+requestGetAuthorizationToken =
+  req
+    "GetAuthorizationToken"
+    "fixture/GetAuthorizationToken.yaml"
+
+requestGetRegistryCatalogData :: GetRegistryCatalogData -> TestTree
+requestGetRegistryCatalogData =
+  req
+    "GetRegistryCatalogData"
+    "fixture/GetRegistryCatalogData.yaml"
+
+requestGetRepositoryCatalogData :: GetRepositoryCatalogData -> TestTree
+requestGetRepositoryCatalogData =
+  req
+    "GetRepositoryCatalogData"
+    "fixture/GetRepositoryCatalogData.yaml"
+
+requestGetRepositoryPolicy :: GetRepositoryPolicy -> TestTree
+requestGetRepositoryPolicy =
+  req
+    "GetRepositoryPolicy"
+    "fixture/GetRepositoryPolicy.yaml"
+
+requestInitiateLayerUpload :: InitiateLayerUpload -> TestTree
+requestInitiateLayerUpload =
+  req
+    "InitiateLayerUpload"
+    "fixture/InitiateLayerUpload.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutImage :: PutImage -> TestTree
+requestPutImage =
+  req
+    "PutImage"
+    "fixture/PutImage.yaml"
+
+requestPutRegistryCatalogData :: PutRegistryCatalogData -> TestTree
+requestPutRegistryCatalogData =
+  req
+    "PutRegistryCatalogData"
+    "fixture/PutRegistryCatalogData.yaml"
+
+requestPutRepositoryCatalogData :: PutRepositoryCatalogData -> TestTree
+requestPutRepositoryCatalogData =
+  req
+    "PutRepositoryCatalogData"
+    "fixture/PutRepositoryCatalogData.yaml"
+
+requestSetRepositoryPolicy :: SetRepositoryPolicy -> TestTree
+requestSetRepositoryPolicy =
+  req
+    "SetRepositoryPolicy"
+    "fixture/SetRepositoryPolicy.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUploadLayerPart :: UploadLayerPart -> TestTree
+requestUploadLayerPart =
+  req
+    "UploadLayerPart"
+    "fixture/UploadLayerPart.yaml"
+
+-- Responses
+
+responseBatchCheckLayerAvailability :: BatchCheckLayerAvailabilityResponse -> TestTree
+responseBatchCheckLayerAvailability =
+  res
+    "BatchCheckLayerAvailabilityResponse"
+    "fixture/BatchCheckLayerAvailabilityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchCheckLayerAvailability)
+
+responseBatchDeleteImage :: BatchDeleteImageResponse -> TestTree
+responseBatchDeleteImage =
+  res
+    "BatchDeleteImageResponse"
+    "fixture/BatchDeleteImageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDeleteImage)
+
+responseCompleteLayerUpload :: CompleteLayerUploadResponse -> TestTree
+responseCompleteLayerUpload =
+  res
+    "CompleteLayerUploadResponse"
+    "fixture/CompleteLayerUploadResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CompleteLayerUpload)
+
+responseCreateRepository :: CreateRepositoryResponse -> TestTree
+responseCreateRepository =
+  res
+    "CreateRepositoryResponse"
+    "fixture/CreateRepositoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRepository)
+
+responseDeleteRepository :: DeleteRepositoryResponse -> TestTree
+responseDeleteRepository =
+  res
+    "DeleteRepositoryResponse"
+    "fixture/DeleteRepositoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRepository)
+
+responseDeleteRepositoryPolicy :: DeleteRepositoryPolicyResponse -> TestTree
+responseDeleteRepositoryPolicy =
+  res
+    "DeleteRepositoryPolicyResponse"
+    "fixture/DeleteRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRepositoryPolicy)
+
+responseDescribeImageTags :: DescribeImageTagsResponse -> TestTree
+responseDescribeImageTags =
+  res
+    "DescribeImageTagsResponse"
+    "fixture/DescribeImageTagsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeImageTags)
+
+responseDescribeImages :: DescribeImagesResponse -> TestTree
+responseDescribeImages =
+  res
+    "DescribeImagesResponse"
+    "fixture/DescribeImagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeImages)
+
+responseDescribeRegistries :: DescribeRegistriesResponse -> TestTree
+responseDescribeRegistries =
+  res
+    "DescribeRegistriesResponse"
+    "fixture/DescribeRegistriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRegistries)
+
+responseDescribeRepositories :: DescribeRepositoriesResponse -> TestTree
+responseDescribeRepositories =
+  res
+    "DescribeRepositoriesResponse"
+    "fixture/DescribeRepositoriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRepositories)
+
+responseGetAuthorizationToken :: GetAuthorizationTokenResponse -> TestTree
+responseGetAuthorizationToken =
+  res
+    "GetAuthorizationTokenResponse"
+    "fixture/GetAuthorizationTokenResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAuthorizationToken)
+
+responseGetRegistryCatalogData :: GetRegistryCatalogDataResponse -> TestTree
+responseGetRegistryCatalogData =
+  res
+    "GetRegistryCatalogDataResponse"
+    "fixture/GetRegistryCatalogDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRegistryCatalogData)
+
+responseGetRepositoryCatalogData :: GetRepositoryCatalogDataResponse -> TestTree
+responseGetRepositoryCatalogData =
+  res
+    "GetRepositoryCatalogDataResponse"
+    "fixture/GetRepositoryCatalogDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRepositoryCatalogData)
+
+responseGetRepositoryPolicy :: GetRepositoryPolicyResponse -> TestTree
+responseGetRepositoryPolicy =
+  res
+    "GetRepositoryPolicyResponse"
+    "fixture/GetRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRepositoryPolicy)
+
+responseInitiateLayerUpload :: InitiateLayerUploadResponse -> TestTree
+responseInitiateLayerUpload =
+  res
+    "InitiateLayerUploadResponse"
+    "fixture/InitiateLayerUploadResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy InitiateLayerUpload)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutImage :: PutImageResponse -> TestTree
+responsePutImage =
+  res
+    "PutImageResponse"
+    "fixture/PutImageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutImage)
+
+responsePutRegistryCatalogData :: PutRegistryCatalogDataResponse -> TestTree
+responsePutRegistryCatalogData =
+  res
+    "PutRegistryCatalogDataResponse"
+    "fixture/PutRegistryCatalogDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRegistryCatalogData)
+
+responsePutRepositoryCatalogData :: PutRepositoryCatalogDataResponse -> TestTree
+responsePutRepositoryCatalogData =
+  res
+    "PutRepositoryCatalogDataResponse"
+    "fixture/PutRepositoryCatalogDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRepositoryCatalogData)
+
+responseSetRepositoryPolicy :: SetRepositoryPolicyResponse -> TestTree
+responseSetRepositoryPolicy =
+  res
+    "SetRepositoryPolicyResponse"
+    "fixture/SetRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetRepositoryPolicy)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUploadLayerPart :: UploadLayerPartResponse -> TestTree
+responseUploadLayerPart =
+  res
+    "UploadLayerPartResponse"
+    "fixture/UploadLayerPartResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UploadLayerPart)
