From 50f02eeba9685c111d7a6f7c48a64523dfc2b427 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:36:18 -0500 Subject: [PATCH 01/10] feat: add go sdk blogpost --- ...25-12-19-go-further-with-open-payments.mdx | 257 ++++++++++++++++++ src/content/docs/get-involved.md | 2 +- 2 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 src/content/blog/2025-12-19-go-further-with-open-payments.mdx diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx new file mode 100644 index 00000000..904b888a --- /dev/null +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -0,0 +1,257 @@ +--- +title: "Go Further with Open Payments" +description: "Announcing the Open Payments Go SDK" +date: 2025-12-19 +slug: go-further-with-open-payments +authors: + - Blair Currey +author_urls: + - https://www.linkedin.com/in/blair-currey/ +tags: + - Open Payments + - Releases + - Updates +--- + +## Why Open Payments in Go? + +The [**Open Payments**](https://openpayments.dev/) standard is reshaping how applications initiate, manage, and complete digital transactions — enabling truly interoperable financial systems across different wallets, services, and financial institutions. + +The Interledger Foundation has been steadily expanding SDK support across languages — [Node](https://github.com/interledger/open-payments-node) led the way, followed by [PHP](https://github.com/interledger/open-payments-php) and [Rust](https://github.com/interledger/open-payments-rust). But one language was notably missing: **Go**. + +According to the [2025 Stack Overflow Developer Survey](https://survey.stackoverflow.co/2025/technology#worked-with-vs-want-to-work-with-language-worked-want), Go ranks among the top backend languages, sitting alongside TypeScript and Python in developer adoption. Perhaps more tellingly, the survey notes that "Python developers aspire to use Rust and Go as the path to high-performance systems programming" — reflecting Go's growing role in cloud infrastructure, microservices, and performance-critical backends. + +Today, we're excited to close that gap with [**Open Payments Go**](https://github.com/interledger/open-payments-go) — an open-source SDK that brings first-class Open Payments support to the Go ecosystem. + +## What We Built + +[interledger/open-payments-go](https://github.com/interledger/open-payments-go) is a production-ready Go module that provides complete client support for the Open Payments API. + +It includes: + +- Complete API coverage — wallet addresses, grants, tokens, quotes, incoming payments, and outgoing payments. +- Built for Go 1.21+, leveraging Go's strong typing, interfaces, and standard library conventions. +- **Types generated directly from OpenAPI specifications** using [oapi-codegen](https://github.com/oapi-codegen/oapi-codegen), ensuring the SDK stays in sync with the Open Payments spec. +- Built-in HTTP signature utilities for [GNAP authentication](https://openpayments.dev/identity/http-signatures/), abstracting away the complexity of Ed25519 signing. +- Comprehensive integration tests against both local Rafiki environments and testnet. + +Here's what it looks like to request a grant and create an incoming payment: + +```go +package main + +import ( + "context" + "log" + "time" + + openpayments "github.com/interledger/open-payments-go" + as "github.com/interledger/open-payments-go/generated/authserver" + rs "github.com/interledger/open-payments-go/generated/resourceserver" +) + +func main() { + privateKeyBase64 := os.Getenv("BASE64_PRIVATE_KEY") + keyId := os.Getenv("KEY_ID") + + // Initialize the authenticated client + client, err := openpayments.NewAuthenticatedClient( + "https://wallet.example.com/alice", // Your wallet address + privateKeyBase64, + keyId, + ) + if err != nil { + log.Fatal(err) + } + + // Get wallet address info + wallet, err := client.WalletAddress.Get(context.Background(), openpayments.WalletAddressGetParams{ + URL: "https://wallet.example.com/alice", + }) + if err != nil { + log.Fatal(err) + } + + // Build the access request + incomingAccess := as.AccessIncoming{ + Type: as.IncomingPayment, + Actions: []as.AccessIncomingActions{ + as.AccessIncomingActionsCreate, + as.AccessIncomingActionsRead, + as.AccessIncomingActionsList, + as.AccessIncomingActionsComplete, + }, + } + accessItem := as.AccessItem{} + accessItem.FromAccessIncoming(incomingAccess) + + // Request a grant + grant, err := client.Grant.Request(context.Background(), openpayments.GrantRequestParams{ + URL: *wallet.AuthServer, + RequestBody: as.GrantRequestWithAccessToken{ + AccessToken: struct { + Access as.Access `json:"access"` + }{ + Access: []as.AccessItem{accessItem}, + }, + }, + }) + if err != nil { + log.Fatal(err) + } + + // Create an incoming payment + expiresAt := time.Now().Add(24 * time.Hour) + payment, err := client.IncomingPayment.Create(context.Background(), openpayments.IncomingPaymentCreateParams{ + BaseURL: *wallet.ResourceServer, + AccessToken: grant.AccessToken.Value, + Payload: rs.CreateIncomingPaymentJSONBody{ + WalletAddressSchema: *wallet.Id, + IncomingAmount: &rs.Amount{ + Value: "1000", + AssetCode: wallet.AssetCode, + AssetScale: wallet.AssetScale, + }, + ExpiresAt: &expiresAt, + }, + }) + if err != nil { + log.Fatal(err) + } + + log.Printf("Created incoming payment: %s", *payment.Id) +} +``` + +With Go's strong typing and the SDK's clean API design, developers get compile-time safety and IDE autocompletion for the entire Open Payments workflow. + +## How It Works: Inside the Library + +Open Payments Go is designed around Go idioms and best practices, making it feel natural for Go developers while handling the complexity of the Open Payments protocol. + +### Project Structure + +| Package | Purpose | +| ------------------------------- | --------------------------------------------------------------- | +| `openpayments` (root) | Main client types, service implementations, and public API | +| `generated/authserver` | Types generated from the Auth Server OpenAPI spec | +| `generated/resourceserver` | Types generated from the Resource Server OpenAPI spec | +| `generated/walletaddressserver` | Types generated from the Wallet Address Server OpenAPI spec | +| `httpsignatureutils` | HTTP signature creation and validation utilities | +| `test/integration` | Integration tests against Rafiki local and testnet environments | + +### Service-Oriented Architecture + +Each Open Payments resource has a dedicated service with methods that map directly to API operations: + +- `client.WalletAddress.Get()`, `GetKeys()`, `GetDIDDocument()` +- `client.Grant.Request()`, `Continue()`, `Cancel()` +- `client.IncomingPayment.Create()`, `Get()`, `List()`, `Complete()`, `GetPublic()` +- `client.OutgoingPayment.Create()`, `Get()`, `List()` +- `client.Quote.Create()`, `Get()` +- `client.Token.Rotate()`, `Revoke()` + +### Type-Safe Generated Types with OpenAPI Overlays + +One challenge we faced was that the upstream OpenAPI specifications didn't always produce ideal Go types when run through code generators. For example, request bodies for grants and outgoing payments used `oneOf` unions that resulted in awkward generated type names like `PostRequestJSONBody`. + +To solve this, we leveraged [OpenAPI Overlays](https://learn.openapis.org/overlay/) — a powerful technique for modifying OpenAPI specs without forking them. Our overlay files (`authserver.overlay.yaml`, `resourceserver.overlay.yaml`) add explicit type names and restructure unions for better Go ergonomics: +```yaml +# resourceserver.overlay.yaml +actions: + - target: $.components.schemas + update: + CreateOutgoingPaymentWithQuote: + type: object + required: [walletAddress, quoteId] + properties: + walletAddress: + $ref: "#/components/schemas/walletAddress" + quoteId: + type: string + metadata: + type: object + additionalProperties: true + + CreateOutgoingPaymentWithAmount: + type: object + required: [walletAddress, incomingPayment, debitAmount] + # ... +``` + +Instead of wrestling with anonymous types, you get clear, self-documenting structs: +```go +// Without overlays: confusing generated names +var payload PostRequestJSONBody // What is this? + +// With overlays: intent is obvious +var payload rs.CreateOutgoingPaymentWithQuote +payload.WalletAddressSchema = walletAddress +payload.QuoteId = quoteId +``` + +This approach keeps us in sync with upstream specs while producing clean, well-named Go types. + +### HTTP Signatures Made Simple + +Open Payments requires [HTTP Message Signatures](https://openpayments.dev/introduction/http-signatures/) for authenticated requests. The SDK handles this complexity internally through the `httpsignatureutils` package: + +The SDK automatically signs requests when using `AuthenticatedClient`. Internally, it: + +1. Computes `Content-Digest` for request bodies +2. Builds the signature base string per RFC 9421 +3. Signs with your Ed25519 private key +4. Sets `Signature` and `Signature-Input` headers + +## Why It Matters for the Go Community + +Go powers a significant portion of cloud infrastructure, payment systems, and fintech backends. By bringing native Open Payments support to Go, we enable: + +- **Cloud-native payment integrations**: Deploy Open Payments clients as microservices, serverless functions, or embedded in existing Go applications. + +- **High-performance payment processing**: Go's concurrency model and low overhead make it ideal for high-throughput payment scenarios. + +- **Type safety at compile time**: Catch integration errors before runtime with Go's strong typing and the SDK's generated types. + +- **Battle-tested**: Comprehensive integration tests run against both local Rafiki environments and the Interledger testnet, ensuring real-world reliability. + +## Getting Started + +Install the SDK: + +```bash +go get github.com/interledger/open-payments-go +``` + +The SDK requires Go 1.21 or later. For development, you'll also need to initialize the OpenAPI spec submodule: + +```bash +git submodule update --init +``` + +To regenerate types from the specs (if you're contributing or customizing): + +```bash +go generate ./generated +``` + +## What's Next + +We're actively developing Open Payments Go and have exciting plans ahead: + +- **Official documentation integration** — Open Payments docs will include Go examples alongside JavaScript, TypeScript, and PHP examples. + +- **Community feedback** — We want to hear from you! Open issues, submit PRs, or join discussions on GitHub. + +## Resources + +- GitHub: [interledger/open-payments-go](https://github.com/interledger/open-payments-go) +- [Open Payments Specification](https://openpayments.dev/) +- [Interledger Foundation](https://interledger.org/) +- [Rafiki — Open Payments Reference Implementation](https://github.com/interledger/rafiki) + +--- + +We're excited to bring Open Payments to the Go ecosystem and can't wait to see what the community builds. + +Give it a try, and let us know what you think! 🚀 diff --git a/src/content/docs/get-involved.md b/src/content/docs/get-involved.md index ffbdd06e..81386cff 100644 --- a/src/content/docs/get-involved.md +++ b/src/content/docs/get-involved.md @@ -18,7 +18,7 @@ If you are most comfortable working with **Angular**, you can contribute to [Tes If you are most comfortable working with the **Web Extensions API**, you can contribute to the [Web Monetization Extension](https://github.com/interledger/web-monetization-extension) -If you are most comfortable in either **Python**, **Go**, **Rust**, **PHP**, **Ruby** or **.Net**, you can contribute to porting the [Open Payments SDK](https://github.com/interledger/open-payments) to the any of the aforementioned languages. +If you are most comfortable in either **Python**, **Ruby** or **.Net**, you can contribute to porting the [Open Payments SDK](https://github.com/interledger/open-payments) to the any of the aforementioned languages. If you have experience working on browser engines, you can contribute to the [Chromium](https://issues.chromium.org/issues/40110471) browser implementation of Web Monetization. From 1b08bd204e4a5536d687d921bb73c24820e2eaaa Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:37:45 -0500 Subject: [PATCH 02/10] chore: format --- .../blog/2025-12-19-go-further-with-open-payments.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 904b888a..0d3e6b51 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -1,6 +1,6 @@ --- -title: "Go Further with Open Payments" -description: "Announcing the Open Payments Go SDK" +title: 'Go Further with Open Payments' +description: 'Announcing the Open Payments Go SDK' date: 2025-12-19 slug: go-further-with-open-payments authors: @@ -156,6 +156,7 @@ Each Open Payments resource has a dedicated service with methods that map direct One challenge we faced was that the upstream OpenAPI specifications didn't always produce ideal Go types when run through code generators. For example, request bodies for grants and outgoing payments used `oneOf` unions that resulted in awkward generated type names like `PostRequestJSONBody`. To solve this, we leveraged [OpenAPI Overlays](https://learn.openapis.org/overlay/) — a powerful technique for modifying OpenAPI specs without forking them. Our overlay files (`authserver.overlay.yaml`, `resourceserver.overlay.yaml`) add explicit type names and restructure unions for better Go ergonomics: + ```yaml # resourceserver.overlay.yaml actions: @@ -166,7 +167,7 @@ actions: required: [walletAddress, quoteId] properties: walletAddress: - $ref: "#/components/schemas/walletAddress" + $ref: '#/components/schemas/walletAddress' quoteId: type: string metadata: @@ -180,6 +181,7 @@ actions: ``` Instead of wrestling with anonymous types, you get clear, self-documenting structs: + ```go // Without overlays: confusing generated names var payload PostRequestJSONBody // What is this? From af4189a47cb929eb0d743139dc4e745166203b12 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:25:56 -0500 Subject: [PATCH 03/10] Update src/content/blog/2025-12-19-go-further-with-open-payments.mdx Co-authored-by: Max Kurapov --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 0d3e6b51..2a127ee6 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -33,7 +33,7 @@ It includes: - Built for Go 1.21+, leveraging Go's strong typing, interfaces, and standard library conventions. - **Types generated directly from OpenAPI specifications** using [oapi-codegen](https://github.com/oapi-codegen/oapi-codegen), ensuring the SDK stays in sync with the Open Payments spec. - Built-in HTTP signature utilities for [GNAP authentication](https://openpayments.dev/identity/http-signatures/), abstracting away the complexity of Ed25519 signing. -- Comprehensive integration tests against both local Rafiki environments and testnet. +- Comprehensive integration tests against both local Rafiki environments and the test wallet. Here's what it looks like to request a grant and create an incoming payment: From 6574f755f834fb96dbfef2fd3ae20219eb5bd335 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:27:15 -0500 Subject: [PATCH 04/10] Update src/content/blog/2025-12-19-go-further-with-open-payments.mdx Co-authored-by: Max Kurapov --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 2a127ee6..931b1a2b 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -127,7 +127,7 @@ With Go's strong typing and the SDK's clean API design, developers get compile-t ## How It Works: Inside the Library -Open Payments Go is designed around Go idioms and best practices, making it feel natural for Go developers while handling the complexity of the Open Payments protocol. +Open Payments Go is designed around Go idioms and best practices, making it feel natural for Go developers while handling the complexity of the Open Payments API standard. ### Project Structure From 60e31ebb28a94585c8399fa53e272a096e4b3b36 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:27:26 -0500 Subject: [PATCH 05/10] Update src/content/blog/2025-12-19-go-further-with-open-payments.mdx Co-authored-by: Max Kurapov --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 931b1a2b..18622148 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -248,7 +248,7 @@ We're actively developing Open Payments Go and have exciting plans ahead: ## Resources - GitHub: [interledger/open-payments-go](https://github.com/interledger/open-payments-go) -- [Open Payments Specification](https://openpayments.dev/) +- [Open Payments Documentation](https://openpayments.dev/) - [Interledger Foundation](https://interledger.org/) - [Rafiki — Open Payments Reference Implementation](https://github.com/interledger/rafiki) From e3e847d572a5f7d72650f9b3b31e442150aaf301 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:44:52 -0500 Subject: [PATCH 06/10] chore: pr feedback --- ...25-12-19-go-further-with-open-payments.mdx | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 18622148..9a117895 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -56,7 +56,7 @@ func main() { // Initialize the authenticated client client, err := openpayments.NewAuthenticatedClient( - "https://wallet.example.com/alice", // Your wallet address + "https://wallet.example.com/alice", privateKeyBase64, keyId, ) @@ -125,31 +125,9 @@ func main() { With Go's strong typing and the SDK's clean API design, developers get compile-time safety and IDE autocompletion for the entire Open Payments workflow. -## How It Works: Inside the Library +## Under the Hood -Open Payments Go is designed around Go idioms and best practices, making it feel natural for Go developers while handling the complexity of the Open Payments API standard. - -### Project Structure - -| Package | Purpose | -| ------------------------------- | --------------------------------------------------------------- | -| `openpayments` (root) | Main client types, service implementations, and public API | -| `generated/authserver` | Types generated from the Auth Server OpenAPI spec | -| `generated/resourceserver` | Types generated from the Resource Server OpenAPI spec | -| `generated/walletaddressserver` | Types generated from the Wallet Address Server OpenAPI spec | -| `httpsignatureutils` | HTTP signature creation and validation utilities | -| `test/integration` | Integration tests against Rafiki local and testnet environments | - -### Service-Oriented Architecture - -Each Open Payments resource has a dedicated service with methods that map directly to API operations: - -- `client.WalletAddress.Get()`, `GetKeys()`, `GetDIDDocument()` -- `client.Grant.Request()`, `Continue()`, `Cancel()` -- `client.IncomingPayment.Create()`, `Get()`, `List()`, `Complete()`, `GetPublic()` -- `client.OutgoingPayment.Create()`, `Get()`, `List()` -- `client.Quote.Create()`, `Get()` -- `client.Token.Rotate()`, `Revoke()` +Here are two things we did to help ensure a good developer experience. ### Type-Safe Generated Types with OpenAPI Overlays @@ -215,7 +193,7 @@ Go powers a significant portion of cloud infrastructure, payment systems, and fi - **Type safety at compile time**: Catch integration errors before runtime with Go's strong typing and the SDK's generated types. -- **Battle-tested**: Comprehensive integration tests run against both local Rafiki environments and the Interledger testnet, ensuring real-world reliability. +- **Battle-tested**: Comprehensive integration tests run against both local Rafiki environments and the Interledger test wallet, ensuring real-world reliability. ## Getting Started From cae7013becde27e2d14687bfdf4260617fd2ffcb Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:03:01 -0500 Subject: [PATCH 07/10] docs: link to sdk docs --- ...25-12-19-go-further-with-open-payments.mdx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 9a117895..cae1b99b 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -215,20 +215,19 @@ To regenerate types from the specs (if you're contributing or customizing): go generate ./generated ``` -## What's Next +## Get Involved -We're actively developing Open Payments Go and have exciting plans ahead: +Open Payments Go is under active development and ready to use today. -- **Official documentation integration** — Open Payments docs will include Go examples alongside JavaScript, TypeScript, and PHP examples. +- **Documentation** — The official Open Payments docs include Go examples alongside SDKs in other languages such as JavaScript, TypeScript, PHP, Rust, and Java. Explore the SDK documentation here: https://openpayments.dev/sdk/before-you-begin/ -- **Community feedback** — We want to hear from you! Open issues, submit PRs, or join discussions on GitHub. +- **Community feedback** — We’d love your input. Open issues, submit pull requests, or join the discussion on GitHub to help shape the SDK’s future. -## Resources - -- GitHub: [interledger/open-payments-go](https://github.com/interledger/open-payments-go) -- [Open Payments Documentation](https://openpayments.dev/) -- [Interledger Foundation](https://interledger.org/) -- [Rafiki — Open Payments Reference Implementation](https://github.com/interledger/rafiki) +- **Source & ecosystem** — Open Payments Go is part of the broader Interledger and Open Payments ecosystem: + - GitHub: https://github.com/interledger/open-payments-go + - Open Payments: https://openpayments.dev/ + - Interledger Foundation: https://interledger.org/ + - Rafiki (Open Payments reference implementation): https://github.com/interledger/rafiki --- From 11c0afa73ffc782fd1938f96ad6c9222279af43a Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:49:49 -0500 Subject: [PATCH 08/10] fix: link to rfc --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index cae1b99b..15aa7af0 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -179,7 +179,7 @@ Open Payments requires [HTTP Message Signatures](https://openpayments.dev/introd The SDK automatically signs requests when using `AuthenticatedClient`. Internally, it: 1. Computes `Content-Digest` for request bodies -2. Builds the signature base string per RFC 9421 +2. Builds the signature base string per [RFC 9421](https://datatracker.ietf.org/doc/html/rfc9421) 3. Signs with your Ed25519 private key 4. Sets `Signature` and `Signature-Input` headers From bc441e934c5208fcf42bb73a0e16edd18b9fccaa Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:50:12 -0500 Subject: [PATCH 09/10] chore: update date --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 15aa7af0..2a51b5ba 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -1,7 +1,7 @@ --- title: 'Go Further with Open Payments' description: 'Announcing the Open Payments Go SDK' -date: 2025-12-19 +date: 2025-01-22 slug: go-further-with-open-payments authors: - Blair Currey From c8697dc61416683dbc88207c444cccbd3f48a1d3 Mon Sep 17 00:00:00 2001 From: Blair Currey <12960453+BlairCurrey@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:52:57 -0500 Subject: [PATCH 10/10] fix: date --- src/content/blog/2025-12-19-go-further-with-open-payments.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx index 2a51b5ba..f808eece 100644 --- a/src/content/blog/2025-12-19-go-further-with-open-payments.mdx +++ b/src/content/blog/2025-12-19-go-further-with-open-payments.mdx @@ -1,7 +1,7 @@ --- title: 'Go Further with Open Payments' description: 'Announcing the Open Payments Go SDK' -date: 2025-01-22 +date: 2026-01-22 slug: go-further-with-open-payments authors: - Blair Currey