<?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: Fattain Naime</title>
    <description>The latest articles on DEV Community by Fattain Naime (@fattain_naime).</description>
    <link>https://dev.to/fattain_naime</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4031296%2Ffe54bfc2-7c9a-4189-b9c3-7d07f156bd8d.jpg</url>
      <title>DEV Community: Fattain Naime</title>
      <link>https://dev.to/fattain_naime</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fattain_naime"/>
    <language>en</language>
    <item>
      <title>I Was Tired of Writing the Same Design Docs From Scratch, So I Built a Skill Library for It</title>
      <dc:creator>Fattain Naime</dc:creator>
      <pubDate>Thu, 16 Jul 2026 10:20:22 +0000</pubDate>
      <link>https://dev.to/fattain_naime/i-was-tired-of-writing-the-same-design-docs-from-scratch-so-i-built-a-skill-library-for-it-2plg</link>
      <guid>https://dev.to/fattain_naime/i-was-tired-of-writing-the-same-design-docs-from-scratch-so-i-built-a-skill-library-for-it-2plg</guid>
      <description>&lt;p&gt;Every time I started a new feature, I went through the same routine. Open a blank doc. Try to remember what sections a proper technical spec needs. Copy an old ADR template from a previous project and strip out the parts that don't apply. Realize halfway through that I forgot to think about rollback steps, or access control, or what happens when the thing fails at 3 AM.&lt;/p&gt;

&lt;p&gt;None of this is hard work. It is just repetitive, and repetitive work is exactly the kind of thing that gets skipped when you are in a hurry. And skipping it is how you end up shipping a feature with no threat model, no rollback plan, and no one on the team quite sure why a decision was made six months later.&lt;/p&gt;

&lt;p&gt;So I built engineering-docs. It is a set of 21 skills for coding agents that cover the full lifecycle of writing software, from the first fuzzy idea to the postmortem after something breaks in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual problem I was solving
&lt;/h2&gt;

&lt;p&gt;I work across a few different projects at once, things like OwnPay, a self-hosted payment gateway, and a couple of security tools. Every one of them needs the same kind of documentation. A spec before you build. An architecture doc once the shape of the system is clear. A threat model before anything touches money or user data. A deployment plan before you push to production. A postmortem when something goes wrong, because something always eventually goes wrong.&lt;/p&gt;

&lt;p&gt;I know how to write all of these. That was never the issue. The issue was doing it consistently, every single time, without cutting corners because I was tired or the deadline was close. And when I started leaning on AI coding agents for more of my daily work, I noticed they had the exact same problem I did. Ask an agent to "design the database for this feature" and you will usually get a handful of CREATE TABLE statements with no thought given to indexing strategy, migration rollback, or why a particular normalization choice was made. Ask it to draft an API and you get endpoints with no error contract, no versioning strategy, nothing about rate limiting.&lt;/p&gt;

&lt;p&gt;The agent is not being lazy. It just does not know that a real system architecture document has a specific shape, or that a good threat model follows STRIDE, or that a proper API design references the Richardson Maturity Model. That knowledge lives in the head of whoever taught it, and most of the time nobody taught it anything at all. It is just pattern matching on whatever half-finished specs happen to be common in its training data.&lt;/p&gt;

&lt;p&gt;So the fix was not "write better prompts every time." The fix was to encode the actual structure of good engineering documentation into something the agent could load and follow automatically, the same way a junior engineer eventually internalizes the format after seeing enough good examples from a senior engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually inside
&lt;/h2&gt;

&lt;p&gt;The repo has 21 skills, and they are grouped into five phases that roughly match how a real project moves from idea to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discovery and planning.&lt;/strong&gt; This is where you start when you only have a rough idea. There is a skill for building out user personas with actual jobs-to-be-done and success metrics, not the generic "Sarah, 32, busy professional" placeholder personas that show up in every template. There is also a project plan skill for milestones, a RACI matrix, and a work breakdown structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification and feasibility.&lt;/strong&gt; Before anyone writes code, there is a skill that produces a proper Software Requirements Specification following ISO/IEC/IEEE 29148, using EARS syntax for the actual requirements. There is also a feasibility study skill, so you can sanity check whether an idea is realistic before committing resources to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture and product design.&lt;/strong&gt; This is the biggest group, and it is where most of the day-to-day value shows up for me. System architecture using the C4 model. Database design with real ERDs and a proper data dictionary down to indexes and cascade rules. API design aligned to OpenAPI 3.1, with RFC 7807 error handling instead of made-up error shapes. Architecture Decision Records, written the way ADRs are supposed to be written: immutable once accepted, with alternatives and trade-offs actually spelled out instead of just the final decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk and quality.&lt;/strong&gt; A threat model skill using STRIDE and OWASP, which is the part that catches the security gaps I would otherwise only notice during a security audit. A test strategy document. An implementation plan that orders the work by dependency instead of just listing tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment and operations.&lt;/strong&gt; Deployment plans with explicit go and no-go gates, not just "deploy on Friday and hope." SLO and error budget documents. Runbooks in the format Google's SRE teams use, connecting alerts to diagnosis to escalation. A disaster recovery plan with actual RTO and RPO targets. And a blameless postmortem skill using the Five Whys method, because the point of a postmortem is to fix the system, not to find someone to blame.&lt;/p&gt;

&lt;p&gt;There is also an orchestrator skill called using-engineering-docs that sits on top of all of this. You describe a raw idea to it, and it interviews you with a handful of targeted questions, figures out which of the 21 skills actually apply, and sequences them in the right order. You do not have to remember which skill to reach for. It figures that out from the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it interviews you before writing anything
&lt;/h2&gt;

&lt;p&gt;This part matters more than it sounds like it should. The skills do not just generate a document the moment you ask for one. They ask three to five clarifying questions first, the same way a good senior engineer would push back on a vague ticket before writing any code.&lt;/p&gt;

&lt;p&gt;If you ask for a database design and you have not said anything about expected read and write volume, it asks. If you ask for an API design and have not mentioned whether this needs to support mobile clients with unreliable connections, it asks. When there genuinely is a gap that cannot be resolved through a question, the doc gets an explicit marker for it instead of a made-up answer. Assumptions get flagged with 🔶 and open questions get flagged with 🔵, right in the document, so anyone reading it later knows exactly which parts were confirmed and which parts still need a decision.&lt;/p&gt;

&lt;p&gt;I added that after noticing how often AI-generated docs read as confident and complete while actually being full of quiet, unstated assumptions. A document that pretends to have all the answers is more dangerous than one that honestly marks what it does not know yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting it running
&lt;/h2&gt;

&lt;p&gt;If you want to try it, the fastest way is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx engineering-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It detects your environment and asks which agent harness you are using. Right now that covers Claude Code, Cursor and Windsurf, Kimi Code, Codex and GitHub Copilot, and Gemini through Antigravity. Each one gets its own manifest format, since Cursor expects &lt;code&gt;.mdc&lt;/code&gt; rule files and Claude Code expects a plugin structure, but you do not need to know any of that going in.&lt;/p&gt;

&lt;p&gt;For Claude Code specifically, you can also register it as a plugin marketplace directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add fattain-naime/engineering-docs
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;engineering-docs@engineering-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are also plain shell and PowerShell scripts in the repo if you would rather skip npx entirely and see exactly what gets copied where.&lt;/p&gt;

&lt;p&gt;One small thing I was careful about: the install process never overwrites &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;GEMINI.md&lt;/code&gt;, or &lt;code&gt;CLAUDE.md&lt;/code&gt; if you already have one. If those files exist at the destination, the installer just skips them and logs that it did. I did not want a global install command quietly wiping out someone's existing agent configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why skills instead of one giant prompt
&lt;/h2&gt;

&lt;p&gt;I could have written this as one long system prompt that tries to cover every kind of document. I tried that first, actually, and it did not work well. A single prompt trying to hold the format for an ADR, a database design doc, and an incident postmortem all at once either gets too vague to be useful or so long that the agent starts ignoring parts of it.&lt;/p&gt;

&lt;p&gt;Splitting it into 21 separate, focused skills that auto-trigger based on what you are actually asking for keeps each one sharp. The database design skill only has to be good at database design. It does not need to also know the format for a disaster recovery plan. And because they are composable, the orchestrator skill can pull in exactly the ones a given project needs instead of forcing every project through the same fixed checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would still like to add
&lt;/h2&gt;

&lt;p&gt;The skills library is not finished, and I do not think it ever really will be in the sense of being "done." Software engineering practice keeps evolving, and a couple of areas I want to build out next are more depth on data pipeline and ETL design, and a skill specifically for migration planning when you are moving off legacy infrastructure, which is a problem I run into constantly with clients still running on old shared hosting setups.&lt;/p&gt;

&lt;p&gt;If you try it and hit a gap, or you think a skill is missing something a real senior engineer would ask about, open an issue or a PR. The contributing guide covers how the YAML frontmatter and coaching blocks are structured, so adding a new skill is mostly a matter of following the existing pattern rather than reverse engineering it from scratch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/fattain-naime/engineering-docs" rel="noopener noreferrer"&gt;github.com/fattain-naime/engineering-docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;License: MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have ever shipped a feature and realized three weeks later that nobody actually wrote down why a decision was made, this might save you from doing that again.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Got Tired of Renting My Payment Infrastructure, So I Built OwnPay</title>
      <dc:creator>Fattain Naime</dc:creator>
      <pubDate>Thu, 16 Jul 2026 04:34:27 +0000</pubDate>
      <link>https://dev.to/fattain_naime/i-got-tired-of-renting-my-payment-infrastructure-so-i-built-ownpay-38il</link>
      <guid>https://dev.to/fattain_naime/i-got-tired-of-renting-my-payment-infrastructure-so-i-built-ownpay-38il</guid>
      <description>&lt;p&gt;If you have ever run a small business online, you know the drill. You sign up for a payment processor, hand over your customer data, watch two to three percent of every sale disappear into fees, and hope the platform does not change its terms next year.&lt;/p&gt;

&lt;p&gt;I got tired of that setup. So over the past several months I built OwnPay, a self-hosted, open-source payment gateway platform written in PHP. This post is not a sales pitch. It is a technical walkthrough of why I built it, how it is architected, and what I learned building a system that touches money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with renting your payment stack
&lt;/h2&gt;

&lt;p&gt;Most payment platforms today are SaaS. You do not own the server, you do not own the database, and you definitely do not own the customer data that flows through checkout. That is fine for a lot of businesses, but it creates three recurring pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees compound over time.&lt;/strong&gt; A percentage cut sounds small until your transaction volume grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor lock-in is real.&lt;/strong&gt; Migrating away from a processor after two years of integration work is painful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local payment rails are often an afterthought.&lt;/strong&gt; If you are building for markets in South or Southeast Asia, mobile financial services like bKash, Nagad, or GCash are not always first-class citizens in Western-built platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I work out of Dhaka, Bangladesh, so that last point hit close to home. Local MFS integrations are usually bolted on as an afterthought or missing entirely. I wanted something that treated them as equally important as Stripe or PayPal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OwnPay actually is
&lt;/h2&gt;

&lt;p&gt;OwnPay is a self-hosted payment orchestrator. It is not a payment processor itself. It sits on your own server, between your storefront and whichever gateway your customer chooses, and it handles the parts that are painful to build correctly: checkout rendering, gateway routing, signature and callback verification, ledger bookkeeping, and notifications back to your store.&lt;/p&gt;

&lt;p&gt;The flow looks like this:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fykjthi6d4zw5w72skl1d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fykjthi6d4zw5w72skl1d.png" alt="OwnPay payment flow" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things that make it different from a typical payment library:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-brand, single install.&lt;/strong&gt; One OwnPay installation can run multiple isolated brands (stores), each with its own custom domain, gateways, and checkout theme. Isolation happens at the database query layer through a &lt;code&gt;TenantScope&lt;/code&gt; trait, so a single super-admin can manage several storefronts without any data bleeding between them. A &lt;code&gt;DomainMiddleware&lt;/code&gt; resolves the incoming custom domain and routes the checkout to the right brand, while admin routes stay locked to the master domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;White-label by default.&lt;/strong&gt; The checkout page shows your logo, your colors, your domain. OwnPay never appears in the customer-facing experience. That was a deliberate design decision, not an add-on feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gateways as plugins.&lt;/strong&gt; Every payment gateway is a plugin living under &lt;code&gt;modules/gateways/&amp;lt;slug&amp;gt;/&lt;/code&gt; with a &lt;code&gt;manifest.json&lt;/code&gt; and an adapter implementing &lt;code&gt;GatewayAdapterInterface&lt;/code&gt;. Out of the box there are 123 built-in gateway integrations, covering global processors like Stripe, PayPal, and Braintree alongside regional ones like bKash, Nagad, SSLCommerz, GCash, Maya, and PromptPay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Double-entry ledger, not a transactions table.&lt;/strong&gt; Every payment produces balanced ledger entries, not just a row in a &lt;code&gt;payments&lt;/code&gt; table. There is an &lt;code&gt;op_ledger_accounts&lt;/code&gt;, &lt;code&gt;op_ledger_transactions&lt;/code&gt;, and &lt;code&gt;op_ledger_entries&lt;/code&gt; schema that enforces balance constraints at the database level. Refunds and multi-currency conversions post atomically, guarded by mutexes, so you do not end up with a ledger that does not add up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Balanced ledger entries for every payment&lt;/span&gt;
&lt;span class="nv"&gt;$ledger&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'debit'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'customer_receivable'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'credit'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'merchant_revenue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$amount&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;&lt;strong&gt;Offline and manual payments are first-class.&lt;/strong&gt; A lot of self-hosted gateway projects treat bank transfers and manual MFS payments as an edge case. OwnPay has a full manual gateway system for showing bank details or QR codes, plus something I am fairly proud of: an SMS-to-payment confirmation pipeline. A companion Android app parses incoming bank or MFS SMS notifications, matches transaction IDs or amount and timeframe against a pending invoice, and confirms the checkout automatically. It authenticates over JWT with automatic key rotation and instant device revocation, so you are not stuck manually reconciling bank statements against orders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built a custom core instead of using a framework
&lt;/h2&gt;

&lt;p&gt;This is the question I get most from other developers, so let me address it directly. Why not just build this on top of Laravel or Symfony?&lt;/p&gt;

&lt;p&gt;The honest answer is that OwnPay needed a few things that off-the-shelf frameworks do not solve cleanly out of the box: strict multi-brand domain isolation at the query layer, a sandboxed plugin execution model for third-party gateway code, and a domain-specific hook engine similar to WordPress actions and filters. Bending a full framework to do all three well would have meant fighting its conventions more than leveraging them.&lt;/p&gt;

&lt;p&gt;Going custom cost more time upfront, but it means I control the entire boot pipeline, there is no dead code from unused framework features, and the security surface is something I own end to end rather than inheriting from a dependency tree I do not fully control. When the product is literally moving money, that tradeoff felt worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation is deliberately boring
&lt;/h2&gt;

&lt;p&gt;I did not want OwnPay to require Docker, Kubernetes, or a DevOps background to run. A huge percentage of small businesses and freelancers run on cheap shared hosting or a small VPS, and that had to be a supported first-class path, not an afterthought.&lt;/p&gt;

&lt;p&gt;Requirements are simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 8.3 or later, with bcmath, json, mbstring, openssl, pdo_mysql, and curl&lt;/li&gt;
&lt;li&gt;MySQL 8.0+ or MariaDB 10.6+&lt;/li&gt;
&lt;li&gt;Apache with mod_rewrite, or Nginx, pointed at the &lt;code&gt;public/&lt;/code&gt; directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The release archive is self-contained. No Composer or SSH access is required if you are on shared hosting. You upload the zip, point your domain at &lt;code&gt;public/&lt;/code&gt;, and the installer handles the rest.&lt;/p&gt;

&lt;p&gt;If you prefer working from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/own-pay/OwnPay.git
&lt;span class="nb"&gt;cd &lt;/span&gt;OwnPay
composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-dev&lt;/span&gt; &lt;span class="nt"&gt;--optimize-autoloader&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# edit .env with your DB credentials and SMTP settings&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root ownpay &amp;lt; database/schema.sql
php database/seeds/admin.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point your web root to &lt;code&gt;public/&lt;/code&gt;, and you are running your own payment gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security is not an afterthought
&lt;/h2&gt;

&lt;p&gt;Anything that touches money needs to be held to a higher bar, and I have tried to treat security as an ongoing process rather than a one-time checklist. Recent work in this area included closing a gap in the webhook pipeline where a gateway's identity was not fully verified, which had opened up a potential server-side request forgery vector. Invoice PDF downloads now sanitize the output filename to prevent path traversal. Permission checks on the brand appearance and theme page were tightened so they correctly require plugin view or manage permissions instead of being reachable by anyone with general admin access.&lt;/p&gt;

&lt;p&gt;None of that is glamorous work, but it is the work that matters most in a payment system. If you are evaluating self-hosted financial software, I would encourage you to actually read the changelog and commit history of any project you are considering, not just the marketing page. That transparency is exactly why OwnPay is open source under AGPL-3.0 in the first place. The code, the commits, and the security fixes are all public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extending it: gateways, hooks, and the plugin system
&lt;/h2&gt;

&lt;p&gt;If you want to add a payment gateway that is not in the default 123, the plugin architecture is intentionally similar to WordPress, since that is a mental model a huge number of developers already carry around.&lt;/p&gt;

&lt;p&gt;A gateway plugin needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A directory under &lt;code&gt;modules/gateways/&amp;lt;your-gateway&amp;gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;manifest.json&lt;/code&gt; describing the plugin&lt;/li&gt;
&lt;li&gt;An adapter class implementing &lt;code&gt;GatewayAdapterInterface&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Addons and checkout themes follow the same hook-based extension pattern, using action and filter hooks rather than requiring changes to core files. That separation matters for anyone running a fork in production, since it means upstream updates do not stomp on your customizations.&lt;/p&gt;

&lt;p&gt;There is also a REST API for programmatic access and HMAC-signed webhooks for real-time event notifications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/payments/op_7Xk9mN2q
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment.completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where the project is headed
&lt;/h2&gt;

&lt;p&gt;OwnPay follows what I think of as a "ship when it is ready" approach rather than a fixed release calendar. Docker support is planned for an upcoming release to make local testing and containerized deployment easier. Beyond that, the roadmap is shaped heavily by what self-hosters and contributors actually ask for, since this is a community project first.&lt;/p&gt;

&lt;p&gt;If you are building for markets where local payment rails matter as much as global ones, or if you simply do not want a percentage of every sale routed through a third party, I would genuinely like your feedback. Star the repo, open an issue, or better yet, try installing it on a spare VPS this weekend and tell me where it breaks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://ownpay.org" rel="noopener noreferrer"&gt;ownpay.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/own-pay/OwnPay" rel="noopener noreferrer"&gt;github.com/own-pay/OwnPay&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://ownpay.org/docs" rel="noopener noreferrer"&gt;ownpay.org/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Payment infrastructure should be something you own, not something you rent. That is the whole thesis behind this project, and I would love to hear what you think.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>fintech</category>
      <category>webdev</category>
      <category>php</category>
    </item>
  </channel>
</rss>
