
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

CAPS (Centralized Art of Living Payment System) is an effort to have a common independent service to integrate multiple payment systems out-of-the-box.
It has two essential parts
This is the Frontend Component Library.
*The access to admin pages can be requested by contacting the respective team members.
🧢 caps-ui is a functional component library made to simplify integration of multiple payment systems out-of-the-box.
🦢 can be used anywhere in the entire Art of Living ecosystem
🌙 minimal code for your frontend applications
🏵️ no more custom CSS handling for different payment-gateways*
(to-be-shipped with standard theme options applied uniformly)
* under development - not yet released
Language Support
Using npm:
npm install caps-ui
Using specific tarball:
# download the latest stable release from
# https://aolrepo.artofliving.org/projects/MVP/repos/caps-fe
npm install /path/to/caps-ui-x.x.x.tgz
Download the source code from -
https://aolrepo.artofliving.org/projects/MVP/repos/caps-fe
It is essential to add these environment files
(where BASE_URL is the api url and API_KEY is the key used for preliminary authentication)
.env.localdev
- CAPS_LOCALDEV_BASE_URL
- CAPS_LOCALDEV_API_KEY
.env.development
- CAPS_DEVELOPMENT_BASE_URL
- CAPS_DEVELOPMENT_API_KEY
.env.production
- CAPS_PRODUCTION_BASE_URL
- CAPS_PRODUCTION_API_KEY
.env.qa
- CAPS_QA_BASE_URL
- CAPS_QA_API_KEY
.env.test
- CAPS_TEST_BASE_URL
- CAPS_TEST_API_KEY
.env.uat
- CAPS_UAT_BASE_URL
- CAPS_UAT_API_KEY
Using custom builds:
# after making custom changes, build the bundle
npm run bundle
# and then install like previous step
npm install ./caps-ui-x.x.x.tgz
There are essentially two pages where an application needs to include components/functions provided by caps-ui to handle payments smoothly:
This is the page where your customer chooses amongst various payment gateways configured by you, and enters credentials (or is redirect to a hosted page where they enter the credentials) and confirms to initiate a payment.
On this page, include the component <PaymentGateways /> along
with some config :
*Please note the amount needs to be lowest denomination of currency
** under development - not yet released
import {
GatewayAddress,
GatewayCustomer,
GatewayMetadata,
GatewayStyle,
PaymentGatewaysConfig,
PaymentGateways,
} from "caps-ui";
const capsEnvironment: CapsEnvironment = "development";
const customerAddress: GatewayAddress = {
line1: "Unit 530",
line2: "910 7 Ave. SW",
city: "Calgary",
state: "Alberta (AB)",
country: "CA",
pincode: "T2P 3N8",
};
const customerDetails: GatewayCustomer = {
name: "Raghuvir",
surname: "Jhaveri",
phone: "+1-6046576534",
email: "raghuvir.jhaveri@artofliving.ca",
address: customerAddress,
};
const context: GatewayMetadata = {
donorId: "9092dc16-b783-44d9-aab4-89b9f616cdac",
campaign: "World Culture Festival",
};
const style: GatewayStyle = {
button: "border",
};
const pconfig: PaymentGatewaysConfig = {
country: "CA",
org: 3,
module: "DX",
test: false,
amount: 150000,
currency: "cad",
customerInfo: customerDetails,
metadata: context,
appearance: style,
returnUrl: "https://dx.artofliving.org/thankyou",
environment: capsEnvironment,
};
export const PayPage = () => {
return <PaymentGateways config={pconfig} />;
};
This is the page the user will be redirected to when their payment is resolved (successful or perhaps canceled on the bank-authorization page).
paymentStatus() asynchronous function call on this page (as an effect hook, perhaps)paymentStatus() will collect the query string params and send the same back to backend.paymentStatus() function will return a promise that resolves to an object of type GatewayReturnStatusPlease note, that this page can be refreshed as many times as possible and CAPS-FE will fetch the transaction status everytime for your customer's convenience.
import { GatewayReturnStatus, paymentStatus } from "caps-ui";
const capsEnvironment: CapsEnvironment = "development";
const [pStatus, setPStatus] = useState<
GatewayReturnStatus | { error: string }
>();
useEffect(() => {
paymentStatus(capsEnvironment).then((value) => setPStatus(value));
}, []);
// handle your own frontend-logic using the pStatus state variable
export const ThankyouPage = () => {
return (
<div>
<p>Thank you page</p>
<p>Details of the payment</p>
<hr />
<p>Transaction ID: {pStatus?.id}</p>
<p>Status: {pStatus?.status}</p>
<p>Currency: {pStatus?.currency}</p>
<p>Amount: {pStatus?.amount}</p>
<p>Payment Method: {pStatus?.method}</p>
<p>Payment Vendor: {pStatus?.vendor}</p>
<p>Payment Type: {pStatus?.type}</p>
<p>Meta data: {JSON.stringify(pStatus?.metadata)}</p>
<p>Failure Message:{pStatus?.failure_message}</p>
</div>
);
};
The list of supported payment gateways is an ongoing task.
| Payment Gateway | Availability Status |
|---|---|
| Stripe | ✅ |
| Swish | 🧾 |
| Paypal | ✅ |
| Corvuspay | ✅ |
| Altpaynet | 🛠️ |
| Taptopay | 🛠️ |
| invoiceforu | 🛠️ |
| tupaggo | 🛠️ |
| Goldenpay | 🛠️ |
*Please note, this diagram is not up-to-date since the system is still under initial development phase
FAQs
Frontend Component Library for CAPS
We found that caps-ui demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 9 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.