<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hyperswitch</title>
    <description>The latest articles on DEV Community by Hyperswitch (@hyperswitchio).</description>
    <link>https://dev.to/hyperswitchio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F8076%2Fb8d7fbd1-3f30-421f-9912-b633536a9d55.jpg</url>
      <title>DEV Community: Hyperswitch</title>
      <link>https://dev.to/hyperswitchio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hyperswitchio"/>
    <language>en</language>
    <item>
      <title>Prism: A stateless payment integration library extracted from 4 years of production</title>
      <dc:creator>Neeraj Kumar</dc:creator>
      <pubDate>Thu, 16 Apr 2026 15:40:55 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/prism-a-stateless-payment-integration-library-extracted-from-4-years-of-production-555o</link>
      <guid>https://dev.to/hyperswitchio/prism-a-stateless-payment-integration-library-extracted-from-4-years-of-production-555o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ve1j1cym6pjl1qzahrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ve1j1cym6pjl1qzahrp.png" alt="Hyperswitch Prism" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you have ever integrated a payment processor, you know the drill. You read through a PDF that was last updated in 2019, figure out what combination of API keys goes in which header, discover that "decline code 51" means something subtly different on this processor than the last one you dealt with, and then do it all over again when your business decides to add a second processor.&lt;/p&gt;

&lt;p&gt;We have been living in this world for years building &lt;a href="https://github.com/juspay/hyperswitch" rel="noopener noreferrer"&gt;Juspay Hyperswitch&lt;/a&gt;, an open-source and composable payments platform. At some point we had integrations for 100+ connectors. The integrations worked well — but they were locked inside our orchestrator, not usable by anyone who just needed to talk to Stripe or Adyen without adopting an entire platform.&lt;/p&gt;

&lt;p&gt;And we always felt the payment APIs are not more complicated than database drivers. It is just that the industry has not arrived at a standard (and likely never will) for payments.&lt;/p&gt;

&lt;p&gt;Hence, we decided to extract the integrations into a lightweight open interface for developers and AI agents to use, rather than recreate it every time.&lt;/p&gt;

&lt;p&gt;This post is about how we did that: unbundling those integrations into a standalone library called &lt;strong&gt;&lt;a href="https://github.com/juspay/hyperswitch-prism" rel="noopener noreferrer"&gt;Prism&lt;/a&gt;&lt;/strong&gt;, and the engineering decisions we made along the way. Some of them are genuinely interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why unbundle at all?
&lt;/h2&gt;

&lt;p&gt;The connector integrations inside Hyperswitch were not designed to be embedded in an orchestrator forever. They were always a self-contained layer: translate a unified request into a connector-specific HTTP call, make the call, translate the response back. The orchestrator was just the first thing to use them.&lt;/p&gt;

&lt;p&gt;The more we looked at it, the more it seemed wrong to keep that capability locked behind a full platform deployment. If you just need to accept payments through Stripe, you should not have to adopt an orchestrator to get a well-tested, maintained integration. And if you want to switch to Adyen later, that should be a config change, not a rewrite.&lt;/p&gt;

&lt;p&gt;So we separated the integration layer out. The result is a library with a well-defined specification — a protobuf schema covering the full payment lifecycle — that can be embedded directly in any application or deployed as a standalone service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why protobuf for the specification?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: JSON schemas exist. OpenAPI exists. Why protobuf?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core requirement was multi-language client generation. We needed Python developers, Java developers, TypeScript developers, and Rust developers to all be able to consume this library with first-class, type-safe APIs — without anyone hand-writing SDK code in each language. Protobuf has the most mature ecosystem for this: &lt;code&gt;prost&lt;/code&gt; for Rust, &lt;code&gt;protoc-gen-java&lt;/code&gt; for Java, &lt;code&gt;grpc_tools.protoc&lt;/code&gt; for Python, and so on. It also doubles as our gRPC interface description when the library is deployed as a server, which turned out to be a natural fit for the two deployment modes we wanted to support.&lt;/p&gt;

&lt;p&gt;The specification covers the full payment lifecycle across nine services:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PaymentService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Authorize, capture, void, refund, sync — the core lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RecurringPaymentService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Charge and revoke mandates for subscriptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RefundService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve and sync refund statuses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DisputeService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit evidence, defend, and accept chargebacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EventService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Process inbound webhook events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PaymentMethodService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tokenize and retrieve payment methods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CustomerService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create and manage customer profiles at connectors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MerchantAuthenticationService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access tokens, session tokens, Apple Pay / Google Pay session init&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PaymentMethodAuthenticationService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3DS pre/authenticate/post flows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything is strongly typed. &lt;code&gt;PaymentService.Authorize&lt;/code&gt; takes a &lt;code&gt;PaymentServiceAuthorizeRequest&lt;/code&gt; — amount, currency, payment method details, customer, metadata, capture method — and returns a &lt;code&gt;PaymentServiceAuthorizeResponse&lt;/code&gt; with a unified status enum, connector reference IDs, and structured error details. No freeform JSON blobs. No stringly-typed status fields. The spec is the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  The implementation: Rust at the core
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: Why Rust? Wouldn't Go or Java be simpler?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few reasons. First, we already had 50+ connector implementations in Rust from Hyperswitch, so starting there was practical. But more importantly: the library needs to be embeddable in Python, JavaScript, and Java applications without a separate process or a runtime dependency like the JVM or a Python interpreter. The only realistic way to distribute a native library that loads cleanly into all of those runtimes is as a compiled shared library — &lt;code&gt;.so&lt;/code&gt; on Linux, &lt;code&gt;.dylib&lt;/code&gt; on macOS. Rust produces exactly that, with no garbage collector pauses, no runtime to ship, and memory safety that does not require a GC.&lt;/p&gt;

&lt;p&gt;The Rust codebase is organized into a handful of internal crates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;connector-integration&lt;/code&gt;&lt;/strong&gt; — The actual connector logic: 50+ implementations translating unified domain types into connector-specific HTTP requests and parsing responses back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;domain_types&lt;/code&gt;&lt;/strong&gt; — Shared models: &lt;code&gt;RouterDataV2&lt;/code&gt;, flow markers (&lt;code&gt;Authorize&lt;/code&gt;, &lt;code&gt;Capture&lt;/code&gt;, &lt;code&gt;Refund&lt;/code&gt;, ...), request/response data types&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;grpc-api-types&lt;/code&gt;&lt;/strong&gt; — Rust types generated from the protobuf spec via &lt;code&gt;prost&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;interfaces&lt;/code&gt;&lt;/strong&gt; — The trait definitions that connector implementations must satisfy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The two-phase transformer pattern
&lt;/h3&gt;

&lt;p&gt;The single most important design decision in the Rust core is that &lt;strong&gt;the library never makes HTTP calls itself&lt;/strong&gt;. Every payment operation is split into two pure functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐    req_transformer      ┌──────────────────┐
│  Unified    │ ──────────────────────▶ │ Connector HTTP   │
│  Request    │                         │ Request          │
│  (proto)    │                         │ (URL, headers,   │
└─────────────┘                         │  body)           │
                                        └────────┬─────────┘
                                                 │  you make this call
                                                 ▼
┌─────────────┐    res_transformer      ┌──────────────────┐
│  Unified    │ ◀────────────────────── │ Connector HTTP   │
│  Response   │                         │ Response         │
│  (proto)    │                         │ (raw bytes)      │
└─────────────┘                         └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;req_transformer&lt;/code&gt; takes your unified protobuf request and returns the connector-specific HTTP request — the URL, the headers, the serialized body. You make the HTTP call however you like. &lt;code&gt;res_transformer&lt;/code&gt; takes the raw response bytes plus the original request and returns a unified protobuf response.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: Why not just have the library make the HTTP call for you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mostly because it makes the library genuinely stateless and transport-agnostic. It does not own any connection pools. It does not have opinions about TLS configuration, proxy settings, or retry logic. When this code runs inside a Python application, the Python application's &lt;code&gt;httpx&lt;/code&gt; client handles the HTTP. When it runs inside the gRPC server, the server's client handles it. This also turns out to be quite testable — you can unit test transformers by feeding them request bytes and asserting on the resulting HTTP request structure, without standing up any network infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each flow is registered using a pair of Rust macros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Register the request transformer for the Authorize flow&lt;/span&gt;
&lt;span class="nd"&gt;req_transformer!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fn_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;authorize_req_transformer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentServiceAuthorizeRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;flow_marker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resource_common_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentFlowData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentsAuthorizeData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentsResponseData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Register the response transformer for the Authorize flow&lt;/span&gt;
&lt;span class="nd"&gt;res_transformer!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fn_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;authorize_res_transformer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentServiceAuthorizeRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentServiceAuthorizeResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;flow_marker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resource_common_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentFlowData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentsAuthorizeData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response_data_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentsResponseData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The macros generate the boilerplate: connector lookup, trait object dispatch, &lt;code&gt;RouterDataV2&lt;/code&gt; construction, serialization. A new flow means adding the connector trait implementation and one pair of macro invocations. The code generator handles everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to use it
&lt;/h2&gt;

&lt;p&gt;We wanted the library to work both as an &lt;strong&gt;embedded SDK&lt;/strong&gt; (loaded directly into your application process) and as a &lt;strong&gt;standalone gRPC service&lt;/strong&gt; (deployed separately, called over the network). Same Rust core, same proto types, same API — two completely different deployment topologies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────┐
│                    Your Application                      │
└─────────────────────┬────────────────────────────────────┘
                      │
         ┌────────────┴────────────┐
         ▼                         ▼
 ┌──────────────┐         ┌─────────────────┐
 │   SDK Mode   │         │   gRPC Mode     │
 │  (FFI/UniFFI)│         │ (Client/Server) │
 └──────┬───────┘         └────────┬────────┘
        │                          │
        │  in-process call         │  network call
        ▼                          ▼
 ┌──────────────────────────────────────────────┐
 │              Rust Core (Prism)               │
 │  req_transformer → [HTTP] → res_transformer  │
 └──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mode 1: The embedded SDK
&lt;/h3&gt;

&lt;p&gt;In SDK mode, the Rust core compiles into a native shared library (&lt;code&gt;.so&lt;/code&gt; / &lt;code&gt;.dylib&lt;/code&gt;) and is exposed to host languages via &lt;strong&gt;UniFFI&lt;/strong&gt; — Mozilla's framework for generating language bindings from Rust automatically. When your Python code calls &lt;code&gt;authorize_req_transformer(request_bytes, options_bytes)&lt;/code&gt;, that call crosses the FFI boundary directly into the Rust binary running in the same process.&lt;/p&gt;

&lt;p&gt;Data crosses the language boundary as serialized protobuf bytes. This is intentional — every language already has a protobuf runtime, so there is no custom serialization protocol to maintain, and the byte interface is completely language-neutral.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: Does this mean I need to compile Rust to use the Python SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For development, yes — you run &lt;code&gt;make pack&lt;/code&gt;, which builds the Rust library, runs &lt;code&gt;uniffi-bindgen&lt;/code&gt; to generate the Python bindings, and packages everything into a wheel. For production use, we ship pre-built binaries for Linux x86_64, Linux aarch64, macOS x86_64, and macOS aarch64 inside the wheel. The loader picks the right one at runtime. You install the wheel and never think about Rust again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Mode 2: The gRPC server
&lt;/h3&gt;

&lt;p&gt;In gRPC mode, the &lt;code&gt;grpc-server&lt;/code&gt; crate runs as a standalone async service built on &lt;strong&gt;Tonic&lt;/strong&gt; (Rust's async gRPC framework). It implements all nine proto services, accepts gRPC connections from any language's generated stubs, makes the connector HTTP calls internally, and returns unified proto responses over the wire.&lt;/p&gt;

&lt;p&gt;The gRPC server calls the same Rust core transformers as the FFI layer — just from a different entry point. The transformation logic is literally the same code path.&lt;/p&gt;

&lt;p&gt;Each language SDK ships both deployment modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sdk/python/
├── src/payments/           ← FFI-based embedded SDK
│   ├── connector_client.py
│   └── _generated_service_clients.py
└── grpc-client/            ← gRPC stubs for server mode

sdk/java/
├── src/                    ← FFI-based embedded SDK (JNA + UniFFI)
└── grpc-client/            ← gRPC stubs for server mode

sdk/javascript/
├── src/payments/           ← FFI-based embedded SDK (node-ffi)
└── grpc-client/            ← gRPC stubs for server mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: When would you actually choose gRPC over the embedded SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The embedded SDK is great when you have a single-language service and want zero network overhead — serverless functions, edge deployments, or situations where adding a sidecar is painful. The gRPC server shines in polyglot environments: if your checkout service is in Java, your fraud service is in Python, and your reconciliation job is in Go, deploying one gRPC server gives all of them a shared, consistent integration layer without each one shipping a native binary.&lt;/p&gt;

&lt;p&gt;The important point is that the choice is not a migration — your &lt;code&gt;PaymentServiceAuthorizeRequest&lt;/code&gt; looks identical in both modes. You change a config flag, not your application code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SDK (embedded)&lt;/th&gt;
&lt;th&gt;gRPC (network)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microseconds (in-process)&lt;/td&gt;
&lt;td&gt;Milliseconds (network)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Library inside your app&lt;/td&gt;
&lt;td&gt;Separate service to run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python, JS, Java/Kotlin, Rust&lt;/td&gt;
&lt;td&gt;Any language with gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Connector HTTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your app makes the calls&lt;/td&gt;
&lt;td&gt;Server makes the calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless, edge, single-language&lt;/td&gt;
&lt;td&gt;Polyglot stacks, shared infra&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Code generation: the glue that holds it together
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/juspay/hyperswitch-prism" rel="noopener noreferrer"&gt;Prism&lt;/a&gt; supports many payment flows and many SDK languages. Hand-maintaining typed client methods for each flow in each language is exactly the kind of work that introduces drift and bugs. So we don't do it.&lt;/p&gt;

&lt;p&gt;The code generator at &lt;code&gt;sdk/codegen/generate.py&lt;/code&gt; reads two sources of truth and emits all the SDK client boilerplate automatically.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: What are the two sources of truth?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;services.proto&lt;/code&gt; compiled to a binary descriptor — this tells the generator every RPC name, its request type, its response type, and its doc comment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;crates/ffi/ffi/src/services/payments.rs&lt;/code&gt; — this tells the generator which flows are actually implemented, by scanning for &lt;code&gt;req_transformer!&lt;/code&gt; invocations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The generator takes their intersection. A flow in proto but not implemented in Rust? Warning, skipped — we don't ship unimplemented APIs. A transformer in Rust with no matching proto RPC? Also a warning — the spec is the authority, not the implementation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Running &lt;code&gt;make generate&lt;/code&gt; produces typed client classes across all languages. For example, in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_ConnectorClientBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentServiceAuthorizeRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PaymentServiceAuthorizeResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;PaymentService.Authorize — Authorizes a payment amount on a payment method...&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_execute_flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authorize&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_pb2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentServiceAuthorizeResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in Kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ConnectorConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ConnectorClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;PaymentServiceAuthorizeRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RequestConfig&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;PaymentServiceAuthorizeResponse&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="nf"&gt;executeFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"authorize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toByteArray&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;PaymentServiceAuthorizeResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the full pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.proto
    │
    ├── prost (Rust build.rs)      → grpc-api-types crate (Rust types)
    ├── grpc_tools.protoc          → payment_pb2.py (Python proto stubs)
    ├── protoc-gen-java            → Payment.java (Java/Kotlin proto stubs)
    ├── protoc (JS plugin)         → proto.js / proto.d.ts (JS proto stubs)
    └── protoc (binary descriptor) → services.desc
                                            │
payments.rs (transformer registrations) ───┤
                                            ▼
                                      generate.py
                                            │
        ┌───────────────────────────────────┼──────────────────────┐
        ▼                                   ▼                      ▼
_generated_ffi_flows.rs    _generated_service_clients.py    GeneratedFlows.kt
                           connector_client.pyi             _generated_connector_client_flows.ts


cargo build --features uniffi
    └── uniffi-bindgen
              ├── connector_service_ffi.py   (Python native bindings)
              ├── ConnectorServiceFfi.kt     (Kotlin/JVM native bindings)
              └── ffi.js                     (Node.js native bindings)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The practical result: add a new flow to &lt;code&gt;services.proto&lt;/code&gt;, implement the transformer pair in Rust, run &lt;code&gt;make generate&lt;/code&gt; — and every language SDK gets a typed, documented method for that flow. No one writes boilerplate by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Walking through a real authorize call
&lt;/h2&gt;

&lt;p&gt;Let's trace what actually happens when a Python application calls &lt;code&gt;client.authorize(...)&lt;/code&gt; in SDK mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;① App builds PaymentServiceAuthorizeRequest (protobuf message)

② PaymentClient.authorize() → _execute_flow("authorize", request, ...)

③ _ConnectorClientBase._execute_flow():

   a. request.SerializeToString() → request_bytes

   b. authorize_req_transformer(request_bytes, options_bytes)
      ──── FFI boundary: Python → Rust shared library ────
      Rust: build_router_data! macro
        ├── ConnectorEnum::from("stripe")   ← look up connector
        ├── connector.get_connector_integration_v2()
        ├── proto bytes → PaymentFlowData + PaymentsAuthorizeData
        ├── construct RouterDataV2 { flow, request, auth, ... }
        └── connector.build_request(router_data) → Request { url, headers, body }
      serialize Request → FfiConnectorHttpRequest bytes
      ──── returns bytes across FFI boundary ────

   c. deserialize FfiConnectorHttpRequest → url, method, headers, body

   d. httpx AsyncClient.post(url, headers=headers, content=body)
      ← this is the actual outbound HTTP call to Stripe

   e. raw response bytes received

   f. authorize_res_transformer(response_bytes, request_bytes, options_bytes)
      ──── FFI boundary: Python → Rust shared library ────
      Rust: connector.handle_response(raw_bytes)
        ├── parse Stripe's JSON response format
        └── map → PaymentServiceAuthorizeResponse (unified proto)
      serialize → proto bytes
      ──── returns bytes across FFI boundary ────

   g. PaymentServiceAuthorizeResponse.FromString(bytes)

④ App receives unified PaymentServiceAuthorizeResponse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In gRPC mode, steps ③b through ③f happen inside the &lt;code&gt;grpc-server&lt;/code&gt; process. The app sends the protobuf request over the network and gets the protobuf response back. The connector lookup, HTTP call, and response transformation are identical — just running in a different process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we go from here — together
&lt;/h2&gt;

&lt;p&gt;We want to be upfront about what this is and what it is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; a working implementation with 60+ connectors, a protobuf specification that covers the full payment lifecycle, and SDKs in four languages. It is ready to use today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is not:&lt;/strong&gt; a finished standard. The spec reflects our understanding of what payment integrations need to look like. That understanding is incomplete, and we know it. Payment APIs have a very long tail of edge cases — 3DS flows that differ between processors, webhook schemas that change without notice, authorization responses that technically succeeded but should be treated as soft declines. There is no team small enough to have seen all of it.&lt;/p&gt;

&lt;p&gt;That is why community ownership matters here, not as a marketing posture, but as a practical necessity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to use it:&lt;/strong&gt; install the SDK, run &lt;code&gt;make generate&lt;/code&gt; to see what flows are available, and point it at your test credentials. When something breaks — and something will — open an issue. The more connectors and flows get exercised in real environments, the faster the rough edges get found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to contribute a connector:&lt;/strong&gt; implement a Rust trait in &lt;code&gt;connector-integration/&lt;/code&gt;. The FFI layer, gRPC server, and all language SDKs pick it up automatically. You do not need to write Python or JavaScript or maintain anything outside that one crate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to contribute a flow:&lt;/strong&gt; start with a discussion on the &lt;code&gt;services.proto&lt;/code&gt; shape — that is the community contract, so it deserves a conversation before code gets written. Once there is agreement, implement the transformer pair in Rust, run &lt;code&gt;make generate&lt;/code&gt;, and every SDK gets the new method in every language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you disagree with a spec decision:&lt;/strong&gt; open a discussion. The whole point of making this community-owned is that no single team's assumptions should be baked in permanently. If you have seen payment edge cases that the current schema cannot express, that is exactly the kind of feedback that shapes a standard.&lt;/p&gt;

&lt;p&gt;The longer arc here is for &lt;code&gt;services.proto&lt;/code&gt; to evolve into something the payments community — developers, processors, orchestrators, and everyone else in the stack — maintains collectively. The same way OpenTelemetry's semantic conventions emerged from broad input, not from one company's opinions. The same way JDBC worked because it was simple enough to implement and strict enough to actually abstract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/juspay/hyperswitch-prism" rel="noopener noreferrer"&gt;GitHub: juspay/hyperswitch-prism&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>rust</category>
    </item>
    <item>
      <title>Open-Source Payments: Modular, Flexible, and Built for You</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Tue, 11 Mar 2025 06:57:19 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/open-source-payments-modular-flexible-and-built-for-you-12g7</link>
      <guid>https://dev.to/hyperswitchio/open-source-payments-modular-flexible-and-built-for-you-12g7</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SWAaMmRFshU"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;strong&gt;Imagine a Linux-like foundation for payments.&lt;/strong&gt; A unified and open-source intelligence that transforms payment agility into a competitive advantage.  &lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;Hyperswitch&lt;/strong&gt;, a modular, open-source, and interoperable full-stack payments platform engineered to put control back in your hands.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Why Hyperswitch?
&lt;/h3&gt;

&lt;p&gt;Enterprises can &lt;strong&gt;build, augment, or customize&lt;/strong&gt; their payment stack with modular solutions. Whether it's &lt;strong&gt;enabling alternate payment methods, streamlining operations across multiple providers and acquirers, or optimizing payment routing&lt;/strong&gt;—Hyperswitch provides the flexibility businesses need.  &lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;advanced analytics on processing costs, seamless authentication, token storage, and reconciliation&lt;/strong&gt;, it simplifies and secures global payments.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Backed by a Global Engineering Force
&lt;/h3&gt;

&lt;p&gt;Hyperswitch is powered by &lt;strong&gt;1,000+ payment engineers&lt;/strong&gt; globally, enabling infrastructure that processes &lt;strong&gt;up to 175 million transactions a day&lt;/strong&gt; with &lt;strong&gt;99.999% availability&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Engineered with robust &lt;strong&gt;system design principles&lt;/strong&gt;, its &lt;strong&gt;open-source architecture&lt;/strong&gt; ensures &lt;strong&gt;transparency, security, and enterprise-grade reliability&lt;/strong&gt; with &lt;strong&gt;PCI compliance, tokenization, and security certifications&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Freedom from Closed-Loop Systems
&lt;/h3&gt;

&lt;p&gt;With Hyperswitch, merchants gain &lt;strong&gt;rapid integration capabilities&lt;/strong&gt; and &lt;strong&gt;freedom from vendor lock-ins&lt;/strong&gt;. The &lt;strong&gt;open-source model&lt;/strong&gt; allows for &lt;strong&gt;risk-free due diligence&lt;/strong&gt;, eliminating the need for lengthy and costly &lt;strong&gt;RFP cycles&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Merchants can &lt;strong&gt;deploy Hyperswitch in local or cloud environments&lt;/strong&gt; or leverage &lt;strong&gt;Juspay’s hosted sandboxes&lt;/strong&gt; for seamless experimentation.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Take Control of your Payments
&lt;/h3&gt;

&lt;p&gt;Whether you aim to &lt;strong&gt;optimize costs, expand into new markets, or reduce vendor reliance&lt;/strong&gt;, Hyperswitch empowers you to &lt;strong&gt;build what you want, how you want&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/juspay/hyperswitch" rel="noopener noreferrer"&gt;Learn more about open-source payments and Juspay Hyperswitch.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>rust</category>
      <category>community</category>
    </item>
    <item>
      <title>Transitioning from Kubernetes to EC2 for Enhanced Kafka Performance</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Thu, 06 Feb 2025 14:07:56 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/transitioning-from-kubernetes-to-ec2-for-enhanced-kafka-performance-2nmi</link>
      <guid>https://dev.to/hyperswitchio/transitioning-from-kubernetes-to-ec2-for-enhanced-kafka-performance-2nmi</guid>
      <description>&lt;p&gt;Scaling distributed systems is never just about performance, it's also about cost and operational efficiency. While Kubernetes provided us with a solid foundation for container orchestration, we hit unexpected roadblocks when running Kafka clusters at scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Costs were rising due to inefficiencies in resource allocation.&lt;/li&gt;
&lt;li&gt;Auto-scaling wasn’t handling our stateful workload well.&lt;/li&gt;
&lt;li&gt;Kafka node management with Strimzi led to operational complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After months of firefighting, we decided to move from Kubernetes to EC2, a transition that improved performance, simplified operations, and cut costs by 28%.&lt;/p&gt;

&lt;p&gt;Here’s the story of that journey, what worked, and the lessons we learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Kubernetes wasn’t working for us?
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Resource Allocation Inefficiencies
&lt;/h4&gt;

&lt;p&gt;Kubernetes dynamically manages resources, but in our case, it led to hidden inefficiencies.&lt;/p&gt;

&lt;p&gt;For example, when allocating 2 CPU cores and 8GB RAM, we observed that the actual provisioned resources were often slightly lower (1.8 CPU cores, 7.5GB RAM). This discrepancy may seem trivial, but at scale, it resulted in significant wasted resources and unexpected cost overruns.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Imagine paying for a full tank of fuel, but your car only gets 90% of it. Over time, those missing liters add up.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0n9o469nx7pesiknmh4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0n9o469nx7pesiknmh4.png" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Auto-Scaling Challenges for Stateless Applications
&lt;/h4&gt;

&lt;p&gt;Kubernetes’ auto-scaling mechanism works well for stateless applications, but Kafka isn’t stateless. When resources ran out, Kubernetes would restart our Kafka application instead of efficiently scaling it.&lt;/p&gt;

&lt;p&gt;This resulted in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15-second delays in message processing.&lt;/li&gt;
&lt;li&gt;Increased latency during scaling events.&lt;/li&gt;
&lt;li&gt;Operational headaches managing stateful workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Kafka Node Management with Strimzi
&lt;/h4&gt;

&lt;p&gt;Initially, we relied on Strimzi for managing Kafka clusters. However, it had major drawbacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Kafka nodes often failed to integrate properly.&lt;/li&gt;
&lt;li&gt;Manual intervention was required for every scaling event.&lt;/li&gt;
&lt;li&gt;Overall Kafka performance was unpredictable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Managing our Kafka clusters felt like playing whack-a-mole every time we solved one issue, another would pop up.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Decided to move to EC2
&lt;/h2&gt;

&lt;p&gt;After evaluating various alternatives, we decided to move Kafka from Kubernetes to EC2. This gave us more control over resource allocation, auto-scaling, and cluster management.&lt;/p&gt;

&lt;p&gt;Here’s what changed:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Replacing Strimzi with a Custom Kafka Controller
&lt;/h4&gt;

&lt;p&gt;Instead of relying on third-party tools, we built an in-house Kafka Controller tailored to our needs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seamless integration of new Kafka nodes&lt;/li&gt;
&lt;li&gt;Automated scaling based on real-time workload analysis&lt;/li&gt;
&lt;li&gt;Better cluster management with minimal manual intervention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;? Kafka nodes were now automatically recognized and integrated instantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Precise Resource Allocation
&lt;/h4&gt;

&lt;p&gt;Unlike Kubernetes, where we had limited control over resource provisioning, EC2 allowed us to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allocate exactly the CPU and memory we needed.&lt;/li&gt;
&lt;li&gt;Avoid wasted resources and over-provisioning costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Previously, we paid $180/month per instance on Kubernetes. After transitioning to EC2, this dropped to $130/month, saving 28% on infrastructure costs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frh0mn7w28vbzs2gtnr1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frh0mn7w28vbzs2gtnr1r.png" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Streamlined Kafka Node Support
&lt;/h4&gt;

&lt;p&gt;With EC2, we could now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scale up Kafka nodes seamlessly without restarts.&lt;/li&gt;
&lt;li&gt;Perform vertical scaling (switching to more powerful machines) with zero downtime.&lt;/li&gt;
&lt;li&gt;Ensure predictable
performance under peak loads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last month, we moved from a &lt;strong&gt;T-class instance&lt;/strong&gt; to a &lt;strong&gt;C-class instance&lt;/strong&gt; in &lt;strong&gt;EC2 without downtime&lt;/strong&gt;. If we had been on Kubernetes, this would have required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a new node group.&lt;/li&gt;
&lt;li&gt;Rebalancing partitions manually.&lt;/li&gt;
&lt;li&gt;Managing potential downtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, on EC2, it was a simple instance upgrade with zero complexity, zero downtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Impact: Cost Savings &amp;amp; efficiency gains
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi81sqgpxexjzrpkdbfo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi81sqgpxexjzrpkdbfo2.png" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key lessons &amp;amp; Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not all workloads are ideal for Kubernetes – It’s great for general-purpose container orchestration but not always the best for stateful applications like Kafka.&lt;/li&gt;
&lt;li&gt;Custom solutions can be worth it – Building an in-house Kafka Controller gave us better control and reliability.&lt;/li&gt;
&lt;li&gt;Cost inefficiencies add up – Even small inefficiencies in resource allocation can result in thousands of dollars lost at scale.&lt;/li&gt;
&lt;li&gt;EC2 provides better flexibility – We gained granular control over scaling and performance with EC2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you’re running Kafka on Kubernetes and experiencing similar issues, EC2 might be a better fit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who should consider moving? Teams struggling with stateful workloads on Kubernetes.&lt;/li&gt;
&lt;li&gt;Who should stick with Kubernetes? Those managing stateless, highly dynamic applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every infrastructure decision should be guided by workload needs, not just industry trends. Kubernetes is powerful, but for Kafka, EC2 provided the right balance of cost, performance, and operational efficiency for us.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Hyperswitch Plugin Development Hackathon: Build, Compete, and Win Big! 🚀</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Wed, 09 Oct 2024 10:48:02 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/hyperswitch-plugin-development-hackathon-build-compete-and-win-big-nnb</link>
      <guid>https://dev.to/hyperswitchio/hyperswitch-plugin-development-hackathon-build-compete-and-win-big-nnb</guid>
      <description>&lt;p&gt;Hey developers! 🔥&lt;/p&gt;

&lt;p&gt;We’re excited to announce the &lt;a href="https://github.com/juspay/hyperswitch/wiki/Plugin-Development-Hackathon" rel="noopener noreferrer"&gt;Hyperswitch's Plugin Development Hackathon&lt;/a&gt;, running from October 9th to October 31st, 2024. It’s your chance to develop plugins for Hyperswitch, collaborate with fellow developers, and win big rewards!&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the Hackathon About?
&lt;/h2&gt;

&lt;p&gt;You'll be building plugins for platforms like MedusaJS, CommerceTools, or Prestashop, helping to extend Hyperswitch’s payment orchestration platform. &lt;strong&gt;Participate individually or as a team&lt;/strong&gt; (up to 4 members) and tackle real-world payment challenges while competing for awesome prizes!&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Dates:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registration Deadline&lt;/strong&gt;: October 14th, 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approach Submission&lt;/strong&gt;: October 14th, 2024 (EOD IST)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Submission&lt;/strong&gt;: October 31st, 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo Day&lt;/strong&gt;: First week of November 2024 (TBA)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Participate:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sign Up&lt;/strong&gt;: Register before October 14th to get started.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit Your Approach&lt;/strong&gt;: Outline the core features, integration with Hyperswitch’s API, and edge case handling by October 14th.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Shortlisted&lt;/strong&gt;: The Hyperswitch team will review your submission and notify shortlisted teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop Your Plugin&lt;/strong&gt;: If selected, you’ll have two weeks to complete your plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo Day&lt;/strong&gt;: Showcase your plugin in early November, dates to be announced!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prizes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MedusaJS Plugin&lt;/strong&gt;: $2000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CommerceTools Plugin&lt;/strong&gt;: $2000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prestashop Plugin&lt;/strong&gt;: $2000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to showcase your skills? &lt;a href="https://github.com/juspay/hyperswitch/wiki/Plugin-Development-Hackathon" rel="noopener noreferrer"&gt;Register today&lt;/a&gt; and start building your plugin! Let’s code, collaborate, and win together. 💻&lt;/p&gt;

&lt;p&gt;Good luck to all participants! 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hyperswitch" rel="noopener noreferrer"&gt;Star Us on GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://x.com/HyperSwitchIO" rel="noopener noreferrer"&gt;Follow us on twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>hackathon</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Hacktoberfest 2024 with Hyperswitch</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Fri, 27 Sep 2024 09:07:40 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/hacktoberfest-2024-with-hyperswitch-47dk</link>
      <guid>https://dev.to/hyperswitchio/hacktoberfest-2024-with-hyperswitch-47dk</guid>
      <description>&lt;h2&gt;
  
  
  Join the Celebration of Open Source!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hyperswitch.io/hacktoberfest" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt; is excited to participate in &lt;strong&gt;Hacktoberfest 2024!&lt;/strong&gt; Join us in building a robust payment infrastructure that serves billions of people worldwide. Contribute to our open-source projects and earn exciting rewards.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Involved
&lt;/h2&gt;

&lt;p&gt;1. Explore Hyperswitch Repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Visit our &lt;a href="https://github.com/juspay/hyperswitch" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Star and watch the repositories to stay updated with new issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2. Find Issues to Work On:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Look for issues tagged with &lt;a href="https://github.com/juspay/hyperswitch/issues?q=is%3Aopen+is%3Aissue+label%3Ahacktoberfest" rel="noopener noreferrer"&gt;"hacktoberfest"&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have ideas for improvements, feel free to create new issues,  and inform us using community channels.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3. Make Your Contribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Comment on the issue you want to work on: "I would like to work on this. Can you assign it to me?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure you follow up within 3-4 days to show you are actively working on it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submit your pull request (PR) and link it to the issue. Tag a maintainer for review.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4. Get Support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our maintainers are here to guide you. Join our Community for support and to connect with fellow contributors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5. Earn Swag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Get one PR merged to earn exclusive Hyperswitch swag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get 3 or more PRs merged to receive a special swag kit from Hyperswitch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4rxr0ue5eio3un70bmj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4rxr0ue5eio3un70bmj.png" alt="Hyperswitch goodies" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Learning Opportunities: Enhance your skills by working on real-world projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Networking: Connect with a global community of developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rewards: Earn cool swag for your contributions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Join the Hyperswitch Community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://discord.gg/wJZ7DVW8mm" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://join.slack.com/t/hyperswitch-io/shared_invite/zt-2jqxmpsbm-WXUENx022HjNEy~Ark7Orw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/hyperswitch" rel="noopener noreferrer"&gt;Star Us on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Contributing!🎉&lt;/p&gt;

</description>
      <category>digitalpayments</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Securing Digital Transactions: How Hyperswitch makes Payment Protection a Priority</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Thu, 01 Aug 2024 09:26:44 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/securing-digital-transactions-how-hyperswitch-makes-payment-protection-a-priority-3dnb</link>
      <guid>https://dev.to/hyperswitchio/securing-digital-transactions-how-hyperswitch-makes-payment-protection-a-priority-3dnb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Security is not a product, but a process  - &lt;a href="https://en.wikipedia.org/wiki/Bruce_Schneier" rel="noopener noreferrer"&gt;Bruce Schneier&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/UOTJ3-spfBM"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In today's digital landscape, data security is paramount, especially when it comes to online payments. At &lt;a href="https://hyperswitch.io/" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;, we've built our platform with security as a fundamental principle. Let's explore the robust measures we've implemented to ensure a safe and secure payments infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Top Priority: Customer Security
&lt;/h2&gt;

&lt;p&gt;When a customer makes a payment through &lt;a href="https://hyperswitch.io/" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;, their card information is immediately encrypted at the source. We use the SSL/TLS 1.2 protocol for transmission, adhering to PCI standards for handling card data.&lt;br&gt;
For customers who opt to store their card details, we've developed a secure Card Vault. This system employs multiple layers of protection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.gigamon.com/2021/07/14/what-is-tls-1-2-and-why-should-you-still-care/" rel="noopener noreferrer"&gt;SSL/TLS&lt;/a&gt; 1.2 encryption&lt;/li&gt;
&lt;li&gt;JWE + JWS for secure data transmission&lt;/li&gt;
&lt;li&gt;Double encryption for stored data&lt;/li&gt;
&lt;li&gt;A two-key custodian system for enhanced security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, all customer Personally Identifiable Information (PII) is TLS encrypted in transit and &lt;a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard" rel="noopener noreferrer"&gt;AES&lt;/a&gt; encrypted at rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping Your Business Secure
&lt;/h2&gt;

&lt;p&gt;For our merchant, we know that not everyone needs to be in on all the secrets. That's why we've built up an access control system that's more discerning. API credentials? We treat those with more care than a rare vintage car, wrapping them in layers of AES encryption. Also, we mask the sensitive merchant details in the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyperswitch's Approach to Security
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://hyperswitch.io/" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;, we're not just building a payment system; we're crafting a digital fortress. Our multi-tenant system comes with unique data encryption keys for each business, creating a security layer that's both impressive and effective.&lt;br&gt;
We've also enlisted Rust as our companion, using its robust type system to keep sensitive information under wraps. It's like having a very diligent, slightly obsessive assistant who never lets a secret slip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serious Security with a Smile
&lt;/h2&gt;

&lt;p&gt;In the end, we're not just developing an application; we're creating a secure future for digital transactions. Our goal is to allow businesses to focus on their core competencies while we ensure the protection of their customers' financial information.&lt;br&gt;
With &lt;a href="https://hyperswitch.io/" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;, security isn't just a feature—it's a cornerstone of our service. We're dedicated to maintaining the highest standards of data protection, giving both merchants and customers peace of mind in their digital transactions.&lt;/p&gt;




&lt;p&gt;Want to contribute? Check out some of our &lt;a href="https://github.com/juspay/hyperswitch/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22" rel="noopener noreferrer"&gt;good first issues here.&lt;/a&gt;&lt;br&gt;
Try Hyperswitch. &lt;a href="https://app.hyperswitch.io/" rel="noopener noreferrer"&gt;Get your API keys here.&lt;/a&gt; Happy reading!&lt;/p&gt;

</description>
      <category>hyperswitch</category>
      <category>security</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Scaling to 125 Million Transactions per Day: Juspay's Engineering Principles</title>
      <dc:creator>Gorakhnath Yadav</dc:creator>
      <pubDate>Wed, 19 Jun 2024 14:32:56 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/scaling-to-125-million-transactions-per-day-juspays-engineering-principles-2bj1</link>
      <guid>https://dev.to/hyperswitchio/scaling-to-125-million-transactions-per-day-juspays-engineering-principles-2bj1</guid>
      <description>&lt;p&gt;At Juspay, we process 125 million transactions per day, with peak traffic reaching 5,000 transactions per second, all while maintaining 99.99% uptime. Handling such enormous volumes demands a robust, reliable, and scalable system. In this post, we'll walk you through our core engineering principles and how they've shaped our engineering decisions and systems.&lt;br&gt;
When designing systems at this scale, several challenges naturally arise:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reliability vs Scale:&lt;/strong&gt; Generally, as you scale, you tend to exhaust resources, which can affect system availability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability vs Agility:&lt;/strong&gt; Frequent releases and system changes can impact system reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale vs Cost-Effectiveness:&lt;/strong&gt; Scaling requires more resources, 
leading to higher costs.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Core Engineering Pillars
&lt;/h3&gt;

&lt;p&gt;We've been able to strike the right balance between these challenges by anchoring our tech stack on four pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build zero downtime stacks:&lt;/strong&gt; Solve reliability by building redundancy at each layer to achieve almost 100% uptime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Horizontally scalable systems:&lt;/strong&gt; Solve scalability by building systems that can scale horizontally by removing bottlenecks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build agile systems for frequent bug-free releases.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build performant systems for low latency, high throughput transaction processing.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Adopting Haskell Programming Language
&lt;/h3&gt;

&lt;p&gt;To achieve our goals, we've made a critical investment: adopting the Haskell programming language. Haskell, a functional programming language, offers performance akin to C, which is closer to the machine and processes transactions much faster. With Haskell, we've reduced our transaction &lt;strong&gt;processing time to less than 100 milliseconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's an example of a Haskell function that adds two numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Define the add function
add :: Int -&amp;gt; Int -&amp;gt; Int
add x y = x + y

-- Main function to test the add function
main :: IO ()
main = do
    let sum = add 3 5
    putStrLn ("The sum of 3 and 5 is " ++ show sum)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function showcases Haskell's concise and readable syntax.&lt;/p&gt;

&lt;p&gt;Additionally, Haskell's readability, like English, enables non-technical folks to read the code easily, verify business logic, and sign off on features during development itself. As a strong-typed language, Haskell enforces a set of rules to ensure consistency of results, helping us preempt failures and achieve zero technical declines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache-based Shock Absorber
&lt;/h3&gt;

&lt;p&gt;To handle scale and remove database bottlenecks, we introduced a horizontally scalable caching layer where real-time transactions are served from this cache layer and later drained to the database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foujubo2bjosui4hnxk7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foujubo2bjosui4hnxk7g.png" alt="Implementation of Redis Shock Absorber" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scaling up and down the cache layer is relatively easy and cost-effective compared to scaling databases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rapid Deployment and Release Frameworks
&lt;/h3&gt;

&lt;p&gt;With rapid development comes the challenge of frequent production releases. To achieve agility through frequent releases without compromising reliability, we've built internal tools for automated releases with minimal manual effort. These tools monitor the performance of the release by benchmarking error codes against the previous stable version of the codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ART (Automated Regression Tester):&lt;/strong&gt; A system that records production payloads and runs them in the UAT system against a new deployment to identify bugs early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autopilot:&lt;/strong&gt; A tool that creates a new deployment and performs traffic staggering from 1% onwards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B testing 
framework:&lt;/strong&gt; A system that monitors and benchmarks the new deployment's performance against the previous stable version. Based on this benchmark, the system automatically decides to scale up the traffic or abort the deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hyperswitch: An Open-Source Payments Switch
&lt;/h3&gt;

&lt;p&gt;We're carrying these learnings forward to our latest product, &lt;a href="https://github.com/juspay/hyperswitch" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;, an open-source payments switch. Every line of code powering our stack is available for you to see. With Hyperswitch, our vision is to ensure every business has access to world-class payment infrastructure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Through these investments, we've built reliable, agile, and scalable systems, enabling our engineers to solve exciting new problems and fostering a culture of systems thinking within the company. We encourage developers to engage with the open-source Hyperswitch project and explore the principles and technologies we've adopted to handle massive scale and high-volume transaction processing.&lt;/p&gt;

</description>
      <category>digitalpayments</category>
      <category>rust</category>
      <category>opensource</category>
      <category>haskell</category>
    </item>
    <item>
      <title>RFC 003: Quantum Entangled Payment Methods</title>
      <dc:creator>Vedant Khairnar</dc:creator>
      <pubDate>Mon, 01 Apr 2024 13:45:08 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/rfc-003-quantum-entangled-payment-methods-597e</link>
      <guid>https://dev.to/hyperswitchio/rfc-003-quantum-entangled-payment-methods-597e</guid>
      <description>&lt;h2&gt;
  
  
  I. Objective
&lt;/h2&gt;

&lt;p&gt;This RFC presents an approach for reducing application latency using quantum entanglement. Currently Hyperswitch is optimized for sub 30ms application overhead. By integrating advanced quantum mechanics with traditional networking principles, Hyperswitch aims to revolutionize payment processing speeds, security, and inter-dimensional commerce.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjuspay%2Fhyperswitch%2Fassets%2F115226524%2F63e33aae-4244-42b0-9a90-e5d75e4b0a9a" class="article-body-image-wrapper"&gt;&lt;img alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjuspay%2Fhyperswitch%2Fassets%2F115226524%2F63e33aae-4244-42b0-9a90-e5d75e4b0a9a" width="596" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Proposal
&lt;/h2&gt;

&lt;p&gt;Modern networking technologies have reached their limits in terms of speed and efficiency, often constrained by the limitations of spacetime. Hyperswitch proposes the use of quantum entangled wormholes to bypass these limitations entirely. This approach allows for instantaneous data transfer and transaction processing across the multiverse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Transmission
&lt;/h3&gt;

&lt;p&gt;In this approach, payment method data is transformed into qubits and transmitted through PCI compliant quantum entangled wormholes. These wormholes act as portals between different points in spacetime, allowing for instantaneous data transfer without the constraints of traditional networking protocols.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payment Processing
&lt;/h3&gt;

&lt;p&gt;Similarly, Hyperswitch leverages these wormholes for payment processing, enabling instant and secure transactions across multiple dimensions. Users can simply select the Hyperswitch payment option during checkout, and the transaction will be processed through a quantum entangled wormhole to the merchant's account in their respective dimension. This is made possible through Hyperswitch’s direct connection to major wormholes across dimensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and Reliability
&lt;/h3&gt;

&lt;p&gt;Quantum entangled wormholes offer unparalleled security and reliability. Any attempt to intercept or tamper with the data or transaction would collapse the quantum state, rendering the information unreadable and invalidating the transaction. Additionally, the self-healing nature of the entangled wormholes ensures persistent delivery retry and automatic audit trails.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Open Questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are the ethical implications of interdimensional commerce?&lt;/li&gt;
&lt;li&gt;How can we ensure backward compatibility with existing payment systems across different dimensions?&lt;/li&gt;
&lt;li&gt;How will payments be routed through wormholes?&lt;/li&gt;
&lt;li&gt;How many direct connections will be necessary?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frame Format
&lt;/h2&gt;

&lt;p&gt;Data and transactions are encoded into qubits and transmitted through quantum entangled wormholes. The bandwidth and MTU (Maximum Transmission Unit) of the wormholes are theoretically unlimited, allowing for high-speed data transfer and large-scale transaction processing across multiple dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;While security is inherently robust due to the principles of quantum mechanics, additional measures such as quantum encryption and multi-dimensional authentication protocols may be required to protect against advanced threats from alternate realities or parallel dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Conclusion
&lt;/h2&gt;

&lt;p&gt;Hyperswitch's proposal to use quantum entangled wormholes for data transmission and payment processing represents a significant leap forward in the field of networking and commerce. By overcoming the limitations of traditional spacetime-based technologies, Hyperswitch aims to create a truly interconnected and secure global marketplace across the multiverse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Possible Implementation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Read and understand the &lt;a href="https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md" rel="noopener noreferrer"&gt;general guidelines&lt;/a&gt; on contributing to Hyperswitch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import postman collection of hyperswitch from &lt;a href="https://www.postman.com/hyperswitch/workspace/hyperswitch-development/collection/25176162-630b5353-7002-44d1-8ba1-ead6c230f2e3" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand the implementation of all different payment flows and &lt;a href="https://github.com/juspay/hyperswitch/blob/main/add_connector.md" rel="noopener noreferrer"&gt;how to add a connector&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test the following flows - Payment, Capture, Void and Refund using postman for your local implementation and generate relevant screenshots of the test cases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Embark on an enlightening journey through the intricate world of payments. These blogs are your compass to navigate the complexities of the payment galaxy. &lt;/p&gt;

&lt;p&gt;As developers, we create a lot of value through the applications we build. Payments are the means to capture some of that value for ourselves. Surprisingly, the effort to set up a payments stack is often exaggerated. This is what we aim to solve at Hyperswitch by building a free and open payments switch. If you resonate with this vision, you can join the movement to help build an open payments ecosystem!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" alt="contributors" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about how you can set up your own payments stack in minutes with &lt;a href="https://docs.hyperswitch.io/about-hyperswitch/readme" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  On a serious note, Hyperswitch is Hiring:
&lt;/h3&gt;

&lt;p&gt;Go to GitHub Discussions and bookmark our &lt;a href="https://github.com/juspay/hyperswitch/discussions?discussions_q=is:open+label:hiring-challenge" rel="noopener noreferrer"&gt;Hiring Challenge&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>rust</category>
      <category>payments</category>
      <category>hiring</category>
    </item>
    <item>
      <title>Why we're changing our hiring process 🚀🎸</title>
      <dc:creator>NarsGNA</dc:creator>
      <pubDate>Tue, 19 Mar 2024 15:12:15 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/why-we-changed-our-hiring-process-at-hyperswitch-157</link>
      <guid>https://dev.to/hyperswitchio/why-we-changed-our-hiring-process-at-hyperswitch-157</guid>
      <description>&lt;h2&gt;
  
  
  Identifying high potential talent
&lt;/h2&gt;

&lt;p&gt;The Beatles are probably one of the greatest bands to have ever existed and they have produced timeless albums for almost a decade. A lot has been said about each of the band members John, Paul, Ringo, and George but there’s very little coverage on their manager Brian Epstein and producer George Martin. These guys were instrumental in channeling the raw talent and energy that the Beatles radiated. Perhaps there's a lot to learn from how these guys decided to work with the Beatles even while they were just a very small band in Liverpool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOGlraWxieHAyZDZkMXhkd2d5djcwcGdhdGYxZ214dTc0YmF2ZDlhYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QpWDP1YMziaQw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOGlraWxieHAyZDZkMXhkd2d5djcwcGdhdGYxZ214dTc0YmF2ZDlhYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QpWDP1YMziaQw/giphy.gif" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Brian was running his family’s music store when we heard of the Beatles for the very first time from a customer requesting their music. He followed them for a while at their local performances and really seemed to like what he describes as their “presence”. This is how he describes his first meeting with the band:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“….like they were fresh and they were honest and they had what I thought was a sort of presence and this is a terrible word, a vague star quality…” ⭐🎶&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Initially, even the band's producer wasn't particularly captivated by their sound since it diverged significantly from what he was accustomed to. However, he notes that what ultimately persuaded him to produce their music was their charisma and attitude, rather than solely their skill level at the time. 🌟🎵💫&lt;/p&gt;

&lt;p&gt;While knowledge and skills can be taught, it can be really hard to change traits like curiosity or passion for building stuff. It might seem fuzzy but I’ve come to realize that it’s ultimately these characteristics that differentiate good developers from the great ones. This became even more apparent for our team during Hacktoberfest. We asked ourselves some fundamental questions: What actually gets measured in an interview? Do resumes really matter? It set off a series of events that made us completely redesign our hiring process. 🎉💡💼&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGxyOGI0OHkwMmEyMGN1aHFld3poYmcyYzF4Z2E5MXZ4bHh5OWJtMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT0GqtcVR0jOXzmmPK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGxyOGI0OHkwMmEyMGN1aHFld3poYmcyYzF4Z2E5MXZ4bHh5OWJtMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT0GqtcVR0jOXzmmPK/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learnt from Hacktoberfest
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest was a wild experience. We got the opportunity to work with 70+ new contributors from across 7 countries 🇫🇷🇩🇪🇮🇳🇺🇸🇺🇦🇲🇾🇳🇱. We had created a pool of 110+ issues, closed 110+ PRs and gained 3k+ stars over the course of the month. The energy and enthusiasm were nothing like we had ever seen before. Given that our project requires significant payments domain knowledge, we were pleasantly surprised to see participation at this scale. In fact, this momentum continued even after Hacktoberfest was over. It’s super satisfying to interact with a developer from the other side of the globe, especially when they're asking the right questions, speaking your language and really understanding the essence of what you are building. 🌍🌟👨‍💻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1swxz16n7kf0bnke3l8v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1swxz16n7kf0bnke3l8v.jpg" alt="Contributions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when it clicked. Why don’t we redesign our entire hiring process to fully leverage the open-source nature of our project? While we might come from diverse cultural backgrounds, open source presents a unique opportunity to communicate through code. And our code is open for you to see! We wanted to make sure that the process gives each applicant a clear picture of what it is like to work at Hyperswitch, what problems we are solving and what exactly it feels like to collaborate with our team! 💻👥🔍&lt;/p&gt;

&lt;h2&gt;
  
  
  What we look for in a developer
&lt;/h2&gt;

&lt;p&gt;That is why we want to spend more time understanding what you can do rather than who you are. Are you a fresher or have very few years of experience? Are you completely new to Rust? Are you overwhelmed by all the payment domain buzzwords? You do not have to worry because we have designed the process to be fair for everyone across levels. ✨🤝💡&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Even a billion dollars of capital cannot compete with a project having a soul.” - Vitalik Buterin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ultimately, we believe that payments should be a basic utility like water or air. This is important because the payment ecosystem is full of closed systems and walled gardens. It is also extremely diverse (as it should be). In order to enable this diversity, payments need a trusted unifier like Linux. The road to commoditize payments will not be easy and we are looking for engineers that can make it happen. If this vision resonates with you, consider &lt;a href="https://github.com/juspay/hyperswitch/wiki/Hyperswitch-Hiring-Challenge" rel="noopener noreferrer"&gt;applying for Hyperswitch&lt;/a&gt; and we’d love to work with you! 🌟🔧🌈&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe944ex51hvv7gmofdphx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe944ex51hvv7gmofdphx.png" alt="Image description" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>hiring</category>
      <category>rust</category>
      <category>react</category>
    </item>
    <item>
      <title>What is Hyperswitch</title>
      <dc:creator>Vedant Khairnar</dc:creator>
      <pubDate>Fri, 15 Mar 2024 13:23:07 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/what-is-hyperswitch-57o9</link>
      <guid>https://dev.to/hyperswitchio/what-is-hyperswitch-57o9</guid>
      <description>&lt;p&gt;As your business expands, it's essential to have a payment infrastructure that can handle larger transaction volumes and support local and alternate payment methods required by newer geographies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/tBgd9sfrf1w" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq4jks1r79heqgx9paa8.jpg" alt="What is Hyperswitch youtube video" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A single payment processor might not fulfil your requirements, so you must integrate additional payment processors. But here's the catch: integrating additional payment processors involves a lot of dev effort, which makes it costly and time-consuming.&lt;/p&gt;

&lt;p&gt;This is where a payment orchestrator like Hyperswitch comes in. A payment orchestrator pre-integrates multiple payment processors so that businesses don't have to go through the tedious integration process.&lt;/p&gt;

&lt;p&gt;A payment orchestrator allows businesses to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce dev efforts&lt;/li&gt;
&lt;li&gt;Increase conversion rates&lt;/li&gt;
&lt;li&gt;Optimize processing fees&lt;/li&gt;
&lt;li&gt;Reduce dependency on a single processor&lt;/li&gt;
&lt;li&gt;Customize checkout experience&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Embark on an enlightening journey through the intricate world of payments. These blogs are your compass to navigate the complexities of the payment galaxy. &lt;/p&gt;

&lt;p&gt;As developers, we create a lot of value through the applications we build. Payments are the means to capture some of that value for ourselves. Surprisingly, the effort to set up a payments stack is often exaggerated. This is what we aim to solve at Hyperswitch by building a free and open payments switch. If you resonate with this vision, you can join the movement to help build an open payments ecosystem!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" alt="contributors" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about how you can set up your own payments stack in minutes with &lt;a href="https://docs.hyperswitch.io/about-hyperswitch/readme" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Want to contribute? Check out some of our &lt;a href="https://github.com/juspay/hyperswitch/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22" rel="noopener noreferrer"&gt;good first issues here.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Try Hyperswitch. &lt;a href="https://app.hyperswitch.io/" rel="noopener noreferrer"&gt;Get your API keys here.&lt;/a&gt;
Happy reading!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>payments</category>
      <category>programming</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What happens when you click pay now?</title>
      <dc:creator>Vedant Khairnar</dc:creator>
      <pubDate>Thu, 14 Mar 2024 11:57:11 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/how-payment-flows-from-customers-to-businesses-51b0</link>
      <guid>https://dev.to/hyperswitchio/how-payment-flows-from-customers-to-businesses-51b0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This chapter will cover the payment flows available with Hyperswitch. Please reach out to us to learn more about the payment flows supported!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://youtu.be/DrcuNcAO4zA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4179nf4aqugzfrgy0pax.jpg" alt="What is Hyperswitch youtube video" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Payments flow
&lt;/h2&gt;

&lt;p&gt;There are multiple stages in a Payment flow depending on the payment methods that are involved. Considering an one-time payment method where there was no redirection involved, the following stages form the Payment flow:&lt;/p&gt;

&lt;p&gt;a. &lt;strong&gt;Creating a Payment:&lt;/strong&gt; When your customer wants to checkout, create a payment by hitting the payments/create endpoint. Fetch and store the payment_id and client_secret&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;Loading the SDK:&lt;/strong&gt; After your customer checks out, load the Hyperswitch SDK by initiating it with the client_secret and publishable_key&lt;/p&gt;

&lt;p&gt;c. &lt;strong&gt;SDK being rendered:&lt;/strong&gt; After you initiate the SDK, the SDK makes several API calls involving the /sessions and /payment_methods endpoints to load relevant payment methods and any saved cards associated with the customer&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;Customer enters the payment method data:&lt;/strong&gt; After the SDK is fully rendered, your customer would choose a payment method and enter the relevant information and click pay&lt;/p&gt;

&lt;p&gt;e. &lt;strong&gt;Confirming the payment:&lt;/strong&gt; After the customer clicks pay, the SDK calls the payments/confirm endpoint with the customer's payment method details and post response, it displays the payment status&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybpytz5gtb7v33a9qt6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybpytz5gtb7v33a9qt6x.png" alt="payment process overview" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a more detailed version of the payment flow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7m3gr3n0fejgdg3trlm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7m3gr3n0fejgdg3trlm.png" alt="payment flow" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Payment flow vary across Payment methods?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customer Action&lt;/th&gt;
&lt;th&gt;Direct/Redirect flows&lt;/th&gt;
&lt;th&gt;Payment - finalized immediately&lt;/th&gt;
&lt;th&gt;Payment - finalized later&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer action required before payments/ confirm&lt;/td&gt;
&lt;td&gt;Within Hyperswitch SDK&lt;/td&gt;
&lt;td&gt;Non 3DS Cards&lt;/td&gt;
&lt;td&gt;Bank Debits like ACH Debit, BACS Debit, SEPA Debit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer action required before payments/ confirm&lt;/td&gt;
&lt;td&gt;3rd party Redirect/SDK&lt;/td&gt;
&lt;td&gt;- Wallets like Apple Pay, Google pay, Paypal, AliPay - BNPL like Klarna, Afterpay, Affirm&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer action required after payments/ confirm&lt;/td&gt;
&lt;td&gt;3rd party Redirect&lt;/td&gt;
&lt;td&gt;- 3DS cards - Bank Redirects like iDeal, Giropay, eps&lt;/td&gt;
&lt;td&gt;- Bank Transfers like ACH Transfer, SEPA Transfer, BACS Transfer, Multibanco - Crypto wallets like Cryptopay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Use-cases supported by Hyperswitch
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Accept online payments&lt;/strong&gt; Get started with accepting one time payments globally on your online store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store mandates &amp;amp; recurring payments&lt;/strong&gt; Setup payments for a future date or charge your customers on a recurring basis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage payouts&lt;/strong&gt; Facilitate payouts for global network of partners and service providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save a card during payment&lt;/strong&gt; Learn how you can save your customers' cards in a secure PCI compliant manner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage payments on your platform/marketplace&lt;/strong&gt; Accept payments from your customers and process payouts to the sellers on your marketplace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept payments on your e-commerce platform&lt;/strong&gt; Give your Wordpress store a lightweight an embedded payment experience with the Hyperswitch WooCommerce plugin&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create payment links&lt;/strong&gt; Accept payments for your products through reusable links without writing any code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are &lt;code&gt;PaymentIntent&lt;/code&gt; and &lt;code&gt;PaymentAttempt&lt;/code&gt; objects and how do they work in Hyperswitch?
&lt;/h2&gt;

&lt;p&gt;Hyperswitch uses the &lt;code&gt;PaymentIntent&lt;/code&gt; object to track the status of a payment initiated by you. Since, Hyperswitch enables retrying a single payment multiple times across different processors until a successful transaction, we track each of these payment attempts through separate &lt;code&gt;PaymentAttempt&lt;/code&gt; objects.&lt;/p&gt;

&lt;p&gt;While &lt;code&gt;PaymentIntent&lt;/code&gt; and &lt;code&gt;PaymentAttempt&lt;/code&gt; have their own state machines, the various states in &lt;code&gt;PaymentAttempt&lt;/code&gt; are also constrained by their respective mapping to the &lt;code&gt;PaymentIntent&lt;/code&gt; statuses.&lt;/p&gt;

&lt;h3&gt;
  
  
  PaymentIntent state machine
&lt;/h3&gt;

&lt;p&gt;The following is an abridged version of the &lt;code&gt;PaymentIntent&lt;/code&gt; state machine flow that covers majority of the above payment use-cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  PaymentAttempt state machine
&lt;/h3&gt;

&lt;p&gt;The following is an abridged version of the &lt;code&gt;PaymentAttempt&lt;/code&gt; state machine flow that covers majority of the above payment use-cases.&lt;/p&gt;




&lt;p&gt;Embark on an enlightening journey through the intricate world of payments. These blogs are your compass to navigate the complexities of the payment galaxy. &lt;/p&gt;

&lt;p&gt;As developers, we create a lot of value through the applications we build. Payments are the means to capture some of that value for ourselves. Surprisingly, the effort to set up a payments stack is often exaggerated. This is what we aim to solve at Hyperswitch by building a free and open payments switch. If you resonate with this vision, you can join the movement to help build an open payments ecosystem!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" alt="contributors" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about how you can set up your own payments stack in minutes with &lt;a href="https://docs.hyperswitch.io/about-hyperswitch/readme" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Want to contribute? Check out some of our &lt;a href="https://github.com/juspay/hyperswitch/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22" rel="noopener noreferrer"&gt;good first issues here.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Try Hyperswitch. &lt;a href="https://app.hyperswitch.io/" rel="noopener noreferrer"&gt;Get your API keys here.&lt;/a&gt;
Happy reading!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hyperswitch</category>
      <category>opensource</category>
      <category>rust</category>
      <category>payments</category>
    </item>
    <item>
      <title>Hyperswitch by Juspay</title>
      <dc:creator>Vedant Khairnar</dc:creator>
      <pubDate>Wed, 13 Mar 2024 11:39:38 +0000</pubDate>
      <link>https://dev.to/hyperswitchio/hyperswitch-by-juspay-3244</link>
      <guid>https://dev.to/hyperswitchio/hyperswitch-by-juspay-3244</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"With Hyperswitch, our vision is to enable every digital business to get access to the best payments infrastructure, which they need to run their business efficiently - focusing on their core, not on the complexity of payments," &lt;em&gt;&lt;strong&gt;says Sheetal Lalwani, Chief Operating Officer, Juspay.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We, at Juspay have transformed the payment landscape by providing comprehensive solutions to leading global enterprises and major banks in India. &lt;/p&gt;

&lt;p&gt;During this time, we have cleared several engineering challenges, and we are applying our expertise and learnings to make Hyperswitch a fast, reliable, and affordable payment switch.&lt;/p&gt;

&lt;p&gt;We are also utilizing 🦀 Rust to ensure type safety and leverage its robust features in our development process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/p6vqGHsoc0s" rel="noopener noreferrer"&gt;&lt;strong&gt;Join our co-founder&lt;/strong&gt;&lt;/a&gt; as he talks about how our team leveraged insights gained from building Juspay to develop HyperSwitch, an end-to-end global payment solution that addresses the complex challenges in the payment ecosystem, allowing businesses to prioritize their core capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwbphgvpyilq2h1546h9.png" alt="contributors" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more about how you can set up your own payments stack in minutes with &lt;a href="https://docs.hyperswitch.io/about-hyperswitch/readme" rel="noopener noreferrer"&gt;Hyperswitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Want to contribute? Check out some of our &lt;a href="https://github.com/juspay/hyperswitch/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22" rel="noopener noreferrer"&gt;good first issues here.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Try Hyperswitch. &lt;a href="https://app.hyperswitch.io/" rel="noopener noreferrer"&gt;Get your API keys here.&lt;/a&gt;
Happy reading!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hyperswitch</category>
      <category>rust</category>
      <category>payments</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
