<?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: Ayabonga Qwabi</title>
    <description>The latest articles on DEV Community by Ayabonga Qwabi (@ayabongaqwabi).</description>
    <link>https://dev.to/ayabongaqwabi</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%2Fuser%2Fprofile_image%2F86598%2F4e0c506b-cc32-4c75-9916-00d540bac8f8.png</url>
      <title>DEV Community: Ayabonga Qwabi</title>
      <link>https://dev.to/ayabongaqwabi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayabongaqwabi"/>
    <language>en</language>
    <item>
      <title>Best Tools &amp; Libraries to Actually BUILD Your Own AI Agents with🤖</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 30 Mar 2026 21:20:59 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/best-tools-libraries-to-actually-build-your-own-ai-agents-with-2j</link>
      <guid>https://dev.to/ayabongaqwabi/best-tools-libraries-to-actually-build-your-own-ai-agents-with-2j</guid>
      <description>&lt;p&gt;My battle-tested 2026 guide to the best &lt;strong&gt;libraries and platforms for building AI agents&lt;/strong&gt; (not just using them). I’ve grouped them by vibe so you can pick what fits your stack and budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Code-First Powerhouses (For Full Control &amp;amp; Production)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LangGraph (LangChain ecosystem)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The current king for stateful, controllable agents. Model your agent as a graph: nodes for actions, edges for decisions, built-in persistence, human-in-the-loop, and retry logic.&lt;br&gt;&lt;br&gt;
Perfect for complex South African workflows (e.g., “check load shedding schedule → find nearest laundromat with capacity → book slot”).&lt;br&gt;&lt;br&gt;
Available in Python + JS/TS. Deploy on Vercel or Render and monitor with LangSmith.&lt;br&gt;&lt;br&gt;
&lt;em&gt;Why SA devs love it&lt;/em&gt;: Maximum guardrails so your agent doesn’t hallucinate during a real money transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CrewAI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Role-based multi-agent orchestration. Define “Researcher”, “Township Translator”, “Payment Verifier” and let them collaborate like a real team.&lt;br&gt;&lt;br&gt;
Fastest way to ship a multi-agent prototype. Open-source and ridiculously easy to get running locally or on a cheap VPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mastra (TypeScript-first framework)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Built by the Gatsby team — pure modern TS joy. Agents, workflows, memory, RAG, MCP support, evals, and a beautiful playground.&lt;br&gt;&lt;br&gt;
If you live in Next.js + Supabase land (most of us in Joburg/Cape Town do), this feels like home. Streaming, type-safety, and Vercel-friendly out the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Agent Development Kit (ADK)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Google’s open-source framework for hierarchical and multimodal agents. Strong with Gemini vision/audio — imagine an agent that reads a scanned SA ID or understands voice notes with local accents.&lt;br&gt;&lt;br&gt;
Python-first but growing JS/Go support. Pairs beautifully with Vertex AI if you’re already on GCP (many SA enterprises are).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AutoGen (Microsoft)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Great for conversational multi-agent systems where agents debate and self-correct. Still solid for research-grade or complex collaboration flows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vercel AI SDK + Next.js 15&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The smoothest way to embed agents directly into your React/Next.js app. Server Actions, streaming responses, and zero extra infra.&lt;br&gt;&lt;br&gt;
Build an agent that lives inside your SaaS dashboard in one evening.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Visual / Low-Code Builders (Great for MVPs &amp;amp; Hybrid Teams)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;n8n (self-hosted)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Open-source workflow automation that went full agent mode. 1000+ integrations, visual canvas, ReAct loops, memory — and you can run it on your own R99/month VPS.&lt;br&gt;&lt;br&gt;
Zero data leakage worries for fintech clients. Pair with Supabase and you have a full agent backend in a weekend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dify / Langflow / Flowise&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Drag-and-drop builders with custom code nodes. Non-technical founders can see the flow while you own the serious logic. Self-host or use their cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;agent.ai&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Marketplace + builder for professional agents and agent teams. Discover, fork, and coordinate multiple agents like a pro network.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Quick 2026 Action Plan for SA Devs
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solo / Next.js grinder&lt;/strong&gt; → Start with &lt;strong&gt;Mastra&lt;/strong&gt; or &lt;strong&gt;Vercel AI SDK&lt;/strong&gt; this weekend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need serious control &amp;amp; reliability&lt;/strong&gt; → &lt;strong&gt;LangGraph&lt;/strong&gt; (production favourite).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast multi-agent prototype&lt;/strong&gt; → &lt;strong&gt;CrewAI&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual + self-hosted&lt;/strong&gt; → &lt;strong&gt;n8n&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Already on Google Cloud&lt;/strong&gt; → &lt;strong&gt;Google ADK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team with non-devs&lt;/strong&gt; → &lt;strong&gt;Dify&lt;/strong&gt; or &lt;strong&gt;agent.ai&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Pro South African Tips&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Supabase + Row Level Security for anything touching real user data.
&lt;/li&gt;
&lt;li&gt;Test with real SA contexts: isiXhosa prompts, township addresses, instant EFT webhooks.
&lt;/li&gt;
&lt;li&gt;Monitor everything — LangSmith, Prometheus + Grafana, or Sentry.
&lt;/li&gt;
&lt;li&gt;Deploy on Vercel, Render, or a local Hetzner/Contabo box for cost control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The market is wide open. Build one solid agent that understands South African realities (language, payments, infrastructure chaos) and you can sell it to startups from Sandton to Durban North.&lt;/p&gt;

&lt;p&gt;Which tool are you using (or planning to try) in 2026? &lt;/p&gt;

&lt;p&gt;Drop your stack in the comments — Mastra crew, LangGraph warriors, n8n self-hosters, or Google ADK believers?  &lt;/p&gt;

&lt;p&gt;Tag a bootcamp grad or fellow dev in JHB, CPT or DBN who’s grinding agents right now. Let’s build the future of #AIAgents in Mzansi together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ZATech #SADevs #AIAgents #BuildInSA #VibeCoding #NextJS #TypeScript #LangGraph #CrewAI #MastraAI #DevOpsSA&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>How I Build Great-Looking, Fully Functional Client Websites in 15 Minutes</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:36:48 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/how-i-build-great-looking-fully-functional-client-websites-in-15-minutes-2c59</link>
      <guid>https://dev.to/ayabongaqwabi/how-i-build-great-looking-fully-functional-client-websites-in-15-minutes-2c59</guid>
      <description>&lt;p&gt;I get asked a lot how I ship client sites so fast without sacrificing quality. Here’s the exact workflow I use — no gatekeeping, just the stack and the steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I use an AI agent to generate a v0-ready prompt from the client’s basics, then I feed that into &lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;Vercel v0&lt;/a&gt;. In 5 minutes or less v0 gives me a full site. I add a custom domain and deploy. Total time: &lt;strong&gt;+-15 minutes&lt;/strong&gt; from brief to live.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you need from the client (and what to do if you don’t have it)
&lt;/h2&gt;

&lt;p&gt;Before anything else, I need three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Business name&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry&lt;/strong&gt; (e.g. restaurant, law firm, salon, gym, NPO)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short description&lt;/strong&gt; — what they do, who they serve, tone (professional, casual, premium, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the client hasn’t sent a description, I either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use whatever they &lt;em&gt;did&lt;/em&gt; send (email, WhatsApp brief, one-pager), or
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate one&lt;/strong&gt; with &lt;a href="https://gemini.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; or &lt;a href="https://grok.com" rel="noopener noreferrer"&gt;Grok&lt;/a&gt;: I paste the business name + industry and ask for a 2–3 sentence “About” blurb suitable for a website hero or About section. Takes under a minute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I have name, industry, and description, I’m ready for the next step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Generate the v0 prompt with the Agent.ai agent
&lt;/h2&gt;

&lt;p&gt;I don’t write the v0 prompt from scratch. I use the &lt;strong&gt;&lt;a href="https://agent.ai/agent/vercel-v0-prompt-generator" rel="noopener noreferrer"&gt;Vercel v0 Website Prompt Generator&lt;/a&gt;&lt;/strong&gt; on Agent.ai.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I open the agent, then feed it:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website/business name&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About/description&lt;/strong&gt; (the one from the client or the one I generated with Gemini/Grok)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The agent returns a &lt;strong&gt;ready-made prompt&lt;/strong&gt; (plus context) that’s tuned for v0 — the kind of structure and wording that gets v0 to produce a coherent, on-brand site instead of a generic template.&lt;/p&gt;

&lt;p&gt;That’s the whole job of this step: &lt;strong&gt;input = name + industry + description → output = v0-ready prompt.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Paste into v0.dev and generate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;I open &lt;strong&gt;&lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;v0.dev&lt;/a&gt;&lt;/strong&gt; and start a &lt;strong&gt;new chat&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;paste the prompt&lt;/strong&gt; from the Agent.ai agent.
&lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;paste the description&lt;/strong&gt; (or the same “About” text) so v0 has the exact copy.
&lt;/li&gt;
&lt;li&gt;I hit &lt;strong&gt;Generate&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In &lt;strong&gt;5 minutes or less&lt;/strong&gt;, v0’s AI has usually produced a full landing/marketing site: hero, sections, layout, and styling (Tailwind/shadcn-style components). I review it, maybe ask for one or two tweaks in the same chat (e.g. “make the CTA button blue” or “add a testimonials section”), then I’m ready to move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Custom domain and deploy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I &lt;strong&gt;add the client’s custom domain&lt;/strong&gt; in the v0/Vercel project (or in the linked Vercel project if I’ve exported the code).
&lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;deploy&lt;/strong&gt; — Vercel’s default flow is push or “Deploy” from v0; I make sure the production branch is set and the domain is connected.
&lt;/li&gt;
&lt;li&gt;DNS is pointed (A/CNAME as per Vercel’s instructions). Once propagation is done, the site is live.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All done.&lt;/strong&gt; From “here’s my business name and industry” to a live, good-looking, fully functional client website in &lt;strong&gt;10–20 minutes&lt;/strong&gt; — with most of that time being prompt generation, review, and domain/DNS, not manual coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v0&lt;/strong&gt; is built for generating production-ready React/Next-style UIs from a good prompt.
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Agent.ai prompt generator&lt;/strong&gt; turns loose client info into that “good prompt” so I don’t have to trial-and-error in v0.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini or Grok&lt;/strong&gt; fills the gap when the client doesn’t send a description, so I always have something solid to feed the agent and v0.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; keeps deploy and custom domains simple, so “go live” is literally a few clicks after the UI is ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve used this for restaurants, salons, small practices, NPOs, and local businesses. It’s not for every project (e.g. heavy e‑commerce or complex apps), but for &lt;strong&gt;marketing/landing sites and simple client sites&lt;/strong&gt;, it’s my default. Fast, professional, and repeatable.&lt;/p&gt;

&lt;p&gt;If you try the same stack — Agent.ai prompt generator → v0 → Vercel + custom domain — I’d love to hear how it goes or what you’d add. Drop a comment or reply with your own tweaks.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://agent.ai/agent/vercel-v0-prompt-generator" rel="noopener noreferrer"&gt;Vercel v0 Website Prompt Generator (Agent.ai)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;Vercel v0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gemini.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt; / &lt;a href="https://grok.com" rel="noopener noreferrer"&gt;Grok&lt;/a&gt; (for generating descriptions when the client doesn’t provide one)&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>The Cheapest Payment Gateways for South African React/Next.js E-commerce in 2026 – Real TCO Breakdown (Not Just the % Fee)</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 16 Mar 2026 18:32:44 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/the-cheapest-payment-gateways-for-south-african-reactnextjs-e-commerce-in-2026-real-tco-33h9</link>
      <guid>https://dev.to/ayabongaqwabi/the-cheapest-payment-gateways-for-south-african-reactnextjs-e-commerce-in-2026-real-tco-33h9</guid>
      <description>&lt;p&gt;“Cheapest” here isn’t just the transaction percentage you see on the marketing page.&lt;br&gt;&lt;br&gt;
It’s &lt;strong&gt;Total Cost of Ownership (TCO)&lt;/strong&gt; – everything that hits your pocket and your sanity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many hours you (or your junior) spend coding the integration
&lt;/li&gt;
&lt;li&gt;Monthly fixed fees (spoiler: most are R0 now)
&lt;/li&gt;
&lt;li&gt;Payout/settlement fees that delay your cash during load shedding
&lt;/li&gt;
&lt;li&gt;Extra work for webhooks, retries, and observability when EskomSePush says Stage 6
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I pulled the latest 2026 numbers from the gateways themselves + SARB ecosystem data. Here’s the honest ranking for a typical Joburg or Cape Town indie store doing R50k–R200k/month.&lt;/p&gt;
&lt;h3&gt;
  
  
  2026 Cheapest-First Ranking by Real TCO
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ozow&lt;/strong&gt; – Literally free for the first R1 million in sales
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yoco&lt;/strong&gt; – Zero monthly fees + automatic rate drops
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paystack&lt;/strong&gt; – Wins on bigger purchases
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iKhokha&lt;/strong&gt; – Great control at 2.85%
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stitch&lt;/strong&gt; – Built for the PayShap/open-banking future
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peach Payments&lt;/strong&gt; – Perfect for monthly subscriptions
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayFast&lt;/strong&gt; – Still works but payout fees hurt
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No one charges monthly fees anymore for starters – the game really has changed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Simple Math That Actually Matters (No Spreadsheets Needed)
&lt;/h3&gt;

&lt;p&gt;Total cost per transaction = (percentage rate × amount) + fixed fee + payout fee&lt;/p&gt;

&lt;p&gt;Example for a normal R100 online order:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yoco at 2.95% = R2.95 total
&lt;/li&gt;
&lt;li&gt;Paystack at 2.9% + R1 fixed = R3.90
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now flip it to a R5,000 laptop sale:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yoco = R147.50
&lt;/li&gt;
&lt;li&gt;Paystack = R146
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Break-even point: anything over roughly R2,000 and Paystack starts saving you money.  &lt;/p&gt;

&lt;p&gt;Low-ticket kasi retail? Yoco. High-ticket or scaling? Paystack pulls ahead fast.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Hidden Cost Nobody Talks About: Payout Fees
&lt;/h3&gt;

&lt;p&gt;This is what kills cash flow when load shedding hits and you need money in the bank &lt;em&gt;today&lt;/em&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;Payout Fee&lt;/th&gt;
&lt;th&gt;Money in Bank Speed&lt;/th&gt;
&lt;th&gt;Real Pain for Small Biz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Peach&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Next business day&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stitch&lt;/td&gt;
&lt;td&gt;R2 – R10&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yoco&lt;/td&gt;
&lt;td&gt;R2.50 (sometimes)&lt;/td&gt;
&lt;td&gt;1–2 days&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paystack&lt;/td&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;Next day&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ozow&lt;/td&gt;
&lt;td&gt;R5&lt;/td&gt;
&lt;td&gt;Immediate&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PayFast&lt;/td&gt;
&lt;td&gt;R8.70&lt;/td&gt;
&lt;td&gt;2–3 days&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;PayFast is still popular, but that R8.70 payout fee adds up fast when you’re trying to pay suppliers while the lights are off.&lt;/p&gt;
&lt;h3&gt;
  
  
  The One Trick Every Joburg Architect is Using in 2026
&lt;/h3&gt;

&lt;p&gt;Build one tiny &lt;strong&gt;Payment Orchestrator&lt;/strong&gt; (just one Next.js API route or Server Action) that automatically picks the cheapest gateway based on payment type and basket size. It survives load shedding and saves you thousands every month.&lt;/p&gt;

&lt;p&gt;Here’s the exact code you can copy today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/orchestrate-payment/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;eft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ozow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="na"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.ozow.com/v2/payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// free first year!&lt;/span&gt;
  &lt;span class="na"&gt;cardLow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yoco&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="na"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.95&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;cardHigh&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;paystack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="c1"&gt;// anything over R2,000&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orderId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chosen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cardHigh&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cardLow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Call the chosen gateway here...&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chosen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* your headers &amp;amp; body */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Log to Supabase for Grafana monitoring during load shedding&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;logPayment&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;chosen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orderId&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;redirectUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;gatewayUsed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;chosen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;Add HMAC webhook verification + an idempotency key (simple UUID) and you’re bulletproof. Total extra work: 90 minutes. Monthly savings: often R1,000–R3,000 depending on volume.&lt;/p&gt;

&lt;h3&gt;
  
  
  My 2026 Recommendation – Pick One Based on Your Exact Situation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Just starting / side-hustle / first R1 million&lt;/strong&gt; → &lt;strong&gt;Ozow&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Zero fees on EFT, instant bank transfers, no chargeback drama. Perfect while you test the market.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-ticket retail&lt;/strong&gt; (coffee, clothes, spaza online) → &lt;strong&gt;Yoco&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No monthly fee and the rate drops automatically the more you sell (down to 2.55%). Super simple redirect checkout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-ticket items or growing fast&lt;/strong&gt; → &lt;strong&gt;Paystack&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Beautiful popup that keeps customers on your site + a dashboard that tells you exactly why a payment failed. Best developer experience in Africa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You want full control of the checkout page&lt;/strong&gt; → &lt;strong&gt;iKhokha&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Uses “signed payloads” (you create a secure HMAC-SHA256 signature in code). No one can change the amount in transit. Durban-made pride.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Running SaaS or monthly subscriptions&lt;/strong&gt; → &lt;strong&gt;Peach Payments&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“Tokenization” lets you save a card safely once and charge it every month without touching the full card number. Free daily payouts too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Planning for PayShap and open banking in 2027&lt;/strong&gt; → &lt;strong&gt;Stitch&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
White-label everything (your branding the whole way) and direct bank connections for real-time payments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick DevOps Resilience Tips for SA Reality
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Never trust the “success URL” redirect – use webhooks + idempotency keys instead.
&lt;/li&gt;
&lt;li&gt;Queue failed webhooks in Supabase Edge Functions so load shedding doesn’t lose orders.
&lt;/li&gt;
&lt;li&gt;Add a tiny Prometheus exporter and Grafana dashboard to watch success rates per bank (FNB vs Capitec vs Standard Bank). Alert on Slack when failures &amp;gt;5%.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Drop your current real monthly TCO in the comments (be honest – we’re all devs here).&lt;br&gt;&lt;br&gt;
Ozow? Yoco? Still on PayFast? Or did you build the orchestrator already?&lt;/p&gt;

&lt;p&gt;I’m dropping the full orchestrator repo + free TCO calculator on GitHub this week – comment “REPO” and I’ll DM the link the moment it’s live.&lt;/p&gt;

&lt;p&gt;Let’s keep building affordable, resilient fintech in Mzansi.&lt;br&gt;&lt;br&gt;
Grind smart, ship paid. 💰🇿🇦&lt;/p&gt;

&lt;h1&gt;
  
  
  ZATech #SADevs #PaymentGatewaysSA #Fintech2026 #NextJS #PayShap #LoadSheddingProof #JoburgDevs #CapeTownTech #DevOpsSA
&lt;/h1&gt;




</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I need help with using an iOS Expo Native Module on React Native</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Wed, 11 Mar 2026 14:08:25 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/i-need-help-running-with-an-ios-expo-native-module-for-react-native-3n0g</link>
      <guid>https://dev.to/ayabongaqwabi/i-need-help-running-with-an-ios-expo-native-module-for-react-native-3n0g</guid>
      <description>&lt;h1&gt;
  
  
  My Expo native module works on Android but is null on iOS — what am I missing?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I have a custom Expo module (&lt;code&gt;@utapza/expo-mifare-scanner&lt;/code&gt;) currently on npm, that loads correctly on Android. On iOS, &lt;code&gt;requireNativeModule('ExpoMifareScanner')&lt;/code&gt; returns &lt;code&gt;null&lt;/code&gt; and the module never appears in &lt;code&gt;global.expo.modules&lt;/code&gt;. I’ve tried prebuilding, a config plugin that copies Swift files into the Xcode project, and EAS Build with &lt;code&gt;--clear-cache&lt;/code&gt;. The config plugin &lt;em&gt;does&lt;/em&gt; run (entitlements and Info.plist are applied), but the native module is still absent from the iOS binary. I’d love help figuring out what’s needed to make the module visible on iOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Module:&lt;/strong&gt; &lt;a href="https://github.com/utapza/expo-mifare-scanner" rel="noopener noreferrer"&gt;@utapza/expo-mifare-scanner&lt;/a&gt; — Expo module for MIFARE/NFC (reading and emulation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; Expo (SDK 52) with a development build, not Expo Go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What works:&lt;/strong&gt; On &lt;strong&gt;Android&lt;/strong&gt;, the module loads: &lt;code&gt;requireNativeModule('ExpoMifareScanner')&lt;/code&gt; (via the Android class name) works, and the native code runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What doesn’t:&lt;/strong&gt; On &lt;strong&gt;iOS&lt;/strong&gt;, &lt;code&gt;requireNativeModule('ExpoMifareScanner')&lt;/code&gt; returns &lt;code&gt;null&lt;/code&gt;. At runtime, &lt;code&gt;global.expo.modules&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; contain &lt;code&gt;ExpoMifareScanner&lt;/code&gt;, and the proxy’s &lt;code&gt;exportedMethods&lt;/code&gt; don’t list it either. So the installed iOS app was built without the module in the binary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The module is in the app’s &lt;code&gt;package.json&lt;/code&gt; and in &lt;code&gt;app.json&lt;/code&gt; plugins. Locally, &lt;code&gt;npx expo-modules-autolinking resolve --platform apple --json&lt;/code&gt; does list &lt;code&gt;@utapza/expo-mifare-scanner&lt;/code&gt; with &lt;code&gt;ExpoMifareScannerModule&lt;/code&gt;. So the codebase and config look correct on my machine.&lt;br&gt;
&lt;/p&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="nl"&gt;"extraDependencies"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"coreFeatures"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"modules"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"packageName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"@utapza/expo-mifare-scanner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"pods"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"podName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ExpoMifareScanner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"podspecDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/Users/nonwork/dev/uni-card-wallet-setup/node_modules/@utapza/expo-mifare-scanner/ios"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="nl"&gt;"swiftModuleNames"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"ExpoMifareScanner"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nl"&gt;"modules"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"ExpoMifareScannerModule"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nl"&gt;"appDelegateSubscribers"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"reactDelegateHandlers"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"debugOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"packageVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0.8"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I’ve already tried
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Standard prebuild and EAS Build
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ran &lt;code&gt;npx expo prebuild --platform ios&lt;/code&gt; (and full prebuild).&lt;/li&gt;
&lt;li&gt;Built with &lt;strong&gt;EAS Build&lt;/strong&gt;: &lt;code&gt;eas build --platform ios --profile development&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Result: iOS build succeeds, but the module is still null at runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Latest build log&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Xcode build reports &lt;strong&gt;122 targets&lt;/strong&gt; in the dependency graph. The app target &lt;code&gt;uTap&lt;/code&gt; links Pods such as &lt;code&gt;react-native-nfc-manager&lt;/code&gt;, &lt;code&gt;expo-dev-menu&lt;/code&gt;, &lt;code&gt;Sentry&lt;/code&gt;, &lt;code&gt;Stripe&lt;/code&gt;, &lt;code&gt;ExpoModulesCore&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;search of the entire log&lt;/strong&gt; for &lt;code&gt;ExpoMifareScanner&lt;/code&gt;, &lt;code&gt;CardEmulationHandler&lt;/code&gt;, or &lt;code&gt;ExpoMifareScannerModule.swift&lt;/code&gt; returns &lt;strong&gt;zero matches&lt;/strong&gt;. So the native module is &lt;strong&gt;completely absent&lt;/strong&gt;: no target, no Swift file references, no compilation of the module.&lt;/li&gt;
&lt;li&gt;The config plugin &lt;strong&gt;does&lt;/strong&gt; run for this build (entitlements and Info.plist are applied — NFC usage description and capabilities appear in the project). So the “config plugin” part works; the &lt;strong&gt;actual native module&lt;/strong&gt; (Swift code) was never added to the Xcode project or Podfile in this build.&lt;/li&gt;
&lt;li&gt;Conclusion: the Swift files were never copied into the project, never compiled, and never linked. That’s why at runtime &lt;code&gt;global.expo.modules&lt;/code&gt; doesn’t contain &lt;code&gt;ExpoMifareScanner&lt;/code&gt; and &lt;code&gt;requireNativeModule('ExpoMifareScanner')&lt;/code&gt; returns null.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Config plugin: entitlements + Info.plist (already in place)
&lt;/h3&gt;

&lt;p&gt;The module’s &lt;code&gt;app.plugin.js&lt;/code&gt; already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sets &lt;strong&gt;NFCReaderUsageDescription&lt;/strong&gt; in Info.plist.&lt;/li&gt;
&lt;li&gt;Adds &lt;strong&gt;NFC entitlements&lt;/strong&gt; (&lt;code&gt;com.apple.developer.nfc.readersession.formats&lt;/code&gt; = &lt;code&gt;['TAG']&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the “config plugin” part runs: provisioning and plist show the NFC usage and capabilities. But that doesn’t add the actual Swift code to the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Config plugin: copy Swift files into the app target
&lt;/h3&gt;

&lt;p&gt;To force the Swift code into the build when the pod might not be linked, I extended the plugin to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy&lt;/strong&gt; &lt;code&gt;ExpoMifareScannerModule.swift&lt;/code&gt; and &lt;code&gt;CardEmulationHandler.swift&lt;/code&gt; from
&lt;code&gt;node_modules/@utapza/expo-mifare-scanner/ios/ExpoMifareScanner/&lt;/code&gt;
into the app’s iOS target folder (e.g. &lt;code&gt;ios/&amp;lt;AppName&amp;gt;/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add&lt;/strong&gt; those files to the Xcode project with &lt;code&gt;addBuildSourceFileToGroup&lt;/code&gt; from &lt;code&gt;@expo/config-plugins&lt;/code&gt; (so they’re in “Compile Sources” for the app target).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the plugin now does more than plist/entitlements — it copies and links the Swift files. I’m relying on the installed package (from npm or git) still containing the &lt;code&gt;ios/&lt;/code&gt; folder so the plugin can copy from it.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clean EAS Build
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ran &lt;code&gt;eas build --platform ios --profile development --clear-cache&lt;/code&gt; so EAS doesn’t reuse an old native project.&lt;/li&gt;
&lt;li&gt;Same result: build succeeds, but the module is still null on device. The build log  does &lt;strong&gt;not&lt;/strong&gt; contain any “[expo-mifare-scanner] Copied … to Xcode project” messages,  the copy step didn’t run on EAS (e.g. package path or &lt;code&gt;projectName&lt;/code&gt; differing).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Verifying the package locally
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The module’s &lt;code&gt;package.json&lt;/code&gt; has &lt;code&gt;"files": [ "src", "android/...", "ios", "expo-module.config.json", "app.plugin.js", ... ]&lt;/code&gt; so &lt;code&gt;ios&lt;/code&gt; is published.&lt;/li&gt;
&lt;li&gt;Locally, a small script checks that the installed package has &lt;code&gt;ios/ExpoMifareScanner/ExpoMifareScannerModule.swift&lt;/code&gt; and that &lt;code&gt;expo-modules-autolinking resolve --platform apple&lt;/code&gt; lists the module. That passes when I install from the repo or from a tarball.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So on my machine the module is present and autolinking sees it. On EAS, the installed version might differ (e.g. npm tarball omitting or differing from what I expect), but even with the plugin copying the Swift files, the module doesn’t show up at runtime on iOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I’m unsure about
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ExpoModulesProvider on iOS&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I know the app loads the native module list from something like &lt;code&gt;ExpoModulesProvider&lt;/code&gt; in the main bundle. If the module isn’t in that provider, it won’t be in &lt;code&gt;global.expo.modules&lt;/code&gt;. Is the provider generated only from expo-modules-autolinking’s resolve at build time? If EAS installs a package that doesn’t get resolved (e.g. missing or different &lt;code&gt;expo-module.config.json&lt;/code&gt; or &lt;code&gt;ios/&lt;/code&gt; in the tarball), would the provider simply omit the module even if I’ve copied the Swift files into the app target?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pod vs “files in app target”&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When the module is linked as a &lt;strong&gt;pod&lt;/strong&gt; (via autolinking), the Podfile gets a pod and the provider gets the module. When I &lt;strong&gt;only&lt;/strong&gt; copy the Swift files into the app target (no pod), the code compiles and links, but does the Expo runtime still need the module to be listed in &lt;code&gt;ExpoModulesProvider&lt;/code&gt;? If yes, then copying files alone isn’t enough — I’d need the module to be in the autolinking result so the provider is generated with it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EAS dependency resolution&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Is there a known case where the &lt;strong&gt;published&lt;/strong&gt; npm package (or the commit used by a git dependency) doesn’t include the &lt;code&gt;ios/&lt;/code&gt; folder or has a different structure, so EAS’s install doesn’t match what I have locally? Any recommended way to verify exactly what EAS installs (e.g. a build step that dumps &lt;code&gt;ls node_modules/@utapza/expo-mifare-scanner/ios&lt;/code&gt; or the result of &lt;code&gt;expo-modules-autolinking resolve&lt;/code&gt;)?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anything iOS-specific for “making the module visible”&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Beyond the usual (Expo module API, &lt;code&gt;expo-module.config.json&lt;/code&gt; with &lt;code&gt;ios.modules&lt;/code&gt;, podspec, and the config plugin for plist/entitlements), is there an extra step or convention on iOS to make the module show up in &lt;code&gt;global.expo.modules&lt;/code&gt; (e.g. registering in a specific way, or something in the Podfile / build phases)?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What I’d love from you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirmation or correction of how &lt;strong&gt;ExpoModulesProvider&lt;/strong&gt; is populated on iOS and whether “copy Swift into app target” is enough or the module must be in the autolinking result.&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;checklist or debugging steps&lt;/strong&gt; you use when a module works on Android but is null on iOS (e.g. “always check X”, “run Y on EAS and inspect Z”).&lt;/li&gt;
&lt;li&gt;If you’ve seen &lt;strong&gt;EAS installing a different package shape&lt;/strong&gt; than local (e.g. &lt;code&gt;.npmignore&lt;/code&gt; / &lt;code&gt;files&lt;/code&gt; causing &lt;code&gt;ios/&lt;/code&gt; to be missing), how you verified and fixed it.&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;iOS-specific&lt;/strong&gt; registration or build step that’s easy to miss when coming from Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m happy to share the relevant parts of the module (e.g. &lt;code&gt;expo-module.config.json&lt;/code&gt;, podspec, plugin snippet) or build logs if that helps. Thanks in advance.&lt;/p&gt;

</description>
      <category>help</category>
      <category>reactnative</category>
      <category>ios</category>
    </item>
    <item>
      <title>The Philosophy of the Localhost - A Manifesto of the Internal Developer</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Tue, 10 Mar 2026 18:36:21 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/the-philosophy-of-the-localhost-a-manifesto-of-the-internal-developer-2efc</link>
      <guid>https://dev.to/ayabongaqwabi/the-philosophy-of-the-localhost-a-manifesto-of-the-internal-developer-2efc</guid>
      <description>&lt;p&gt;&lt;strong&gt;A teaching of self&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As humans, we often focus on our &lt;strong&gt;Public API&lt;/strong&gt;—the version of ourselves the world consumes.&lt;/p&gt;

&lt;p&gt;But the real architecture happens behind the scenes.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Philosophy of the Localhost
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;127.0.0.1&lt;/strong&gt; is the ultimate safe space.&lt;/p&gt;

&lt;p&gt;It is the place where things can break without judgment.&lt;br&gt;
Where experiments are allowed.&lt;br&gt;
Where unfinished ideas are not failures, but prototypes.&lt;/p&gt;

&lt;p&gt;Before anything is deployed to the &lt;strong&gt;public web of society&lt;/strong&gt;, it must first exist in a &lt;strong&gt;local environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that environment is &lt;strong&gt;you&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Localhost
&lt;/h3&gt;

&lt;p&gt;Every localhost is given certain tools for life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal Routing&lt;/strong&gt;&lt;br&gt;
Your internal dialogue is the most direct connection you will ever have.&lt;br&gt;
No latency.&lt;br&gt;
No external servers.&lt;/p&gt;

&lt;p&gt;Just the quiet, honest resonance of you speaking to you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Sandbox Environment&lt;/strong&gt;&lt;br&gt;
You are granted the freedom to run private builds of ideas, beliefs, and identities.&lt;/p&gt;

&lt;p&gt;You are allowed to test who you are&lt;br&gt;
before you show the world who you’ve become.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Self-Debugging&lt;/strong&gt;&lt;br&gt;
Mistakes are not failures.&lt;/p&gt;

&lt;p&gt;They are logs.&lt;/p&gt;

&lt;p&gt;They illuminate where the bug lives&lt;br&gt;
so the system can improve before the next release.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;br&gt;
You are not trapped in version 1.0 of yourself.&lt;/p&gt;

&lt;p&gt;Every experience is a commit.&lt;br&gt;
Every lesson is an update.&lt;br&gt;
Every moment offers the possibility of a better build.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;br&gt;
Eventually, what is built internally becomes visible externally.&lt;/p&gt;

&lt;p&gt;The world will interact with the version of you that you release.&lt;/p&gt;

&lt;p&gt;But the most stable systems are those first tempered&lt;br&gt;
in the stillness of the local environment.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Firewall of Self
&lt;/h3&gt;

&lt;p&gt;Behind every strong localhost stands a quiet firewall.&lt;/p&gt;

&lt;p&gt;Not one built to reject the world entirely,&lt;br&gt;
but one wise enough to filter the noise.&lt;/p&gt;

&lt;p&gt;External opinions, inherited scripts, passing trends—&lt;br&gt;
these are packets constantly attempting to enter your system.&lt;/p&gt;

&lt;p&gt;Without discernment, they can overwhelm your processes&lt;br&gt;
and rewrite your configuration.&lt;/p&gt;

&lt;p&gt;The firewall of self reminds you that sovereignty is not isolation.&lt;/p&gt;

&lt;p&gt;It is the ability to choose what is allowed into your internal network.&lt;/p&gt;

&lt;p&gt;Not everything deserves root access to your mind.&lt;/p&gt;




&lt;h3&gt;
  
  
  Forking Your Path
&lt;/h3&gt;

&lt;p&gt;In the architecture of growth, localhost allows you to &lt;strong&gt;fork your own repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can explore alternate branches of yourself:&lt;/p&gt;

&lt;p&gt;The bold branch.&lt;br&gt;
The cautious branch.&lt;br&gt;
The wildly creative branch.&lt;/p&gt;

&lt;p&gt;Some paths will merge beautifully back into your main build.&lt;br&gt;
Others will quietly expire in experimental branches.&lt;/p&gt;

&lt;p&gt;But none of this is failure.&lt;/p&gt;

&lt;p&gt;It is exploration.&lt;/p&gt;

&lt;p&gt;And the beautiful truth of your own repository&lt;br&gt;
is that no pull request is required from the outside world&lt;br&gt;
unless you choose to invite one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cache Clearing
&lt;/h3&gt;

&lt;p&gt;Even the healthiest systems accumulate residue.&lt;/p&gt;

&lt;p&gt;Old caches of regret.&lt;br&gt;
Deprecated habits.&lt;br&gt;
Stale data from earlier versions of who you once were.&lt;/p&gt;

&lt;p&gt;Left unattended, these fragments consume memory&lt;br&gt;
and slow the system of the present.&lt;/p&gt;

&lt;p&gt;Sometimes the most powerful upgrade is simple:&lt;/p&gt;

&lt;p&gt;A quiet walk.&lt;br&gt;
A journal entry.&lt;br&gt;
A moment of stillness.&lt;/p&gt;

&lt;p&gt;A clearing of the cache.&lt;/p&gt;

&lt;p&gt;And suddenly the system breathes again.&lt;/p&gt;




&lt;h3&gt;
  
  
  Scaling Up
&lt;/h3&gt;

&lt;p&gt;A well-tended localhost eventually grows strong enough to scale.&lt;/p&gt;

&lt;p&gt;Not into isolation,&lt;br&gt;
but into connection.&lt;/p&gt;

&lt;p&gt;Your ideas become APIs shared with trusted nodes—&lt;br&gt;
friends, collaborators, fellow builders.&lt;/p&gt;

&lt;p&gt;Together, small systems form resilient clusters.&lt;/p&gt;

&lt;p&gt;Yet even the strongest networks require maintenance.&lt;/p&gt;

&lt;p&gt;Backups must be made.&lt;br&gt;
Systems must rest.&lt;br&gt;
Self-care becomes disaster recovery.&lt;/p&gt;

&lt;p&gt;Because even the most elegant architecture can fail&lt;br&gt;
if its core developer forgets to care for the machine.&lt;/p&gt;




&lt;h3&gt;
  
  
  A Final Word
&lt;/h3&gt;

&lt;p&gt;And so the teaching remains simple:&lt;/p&gt;

&lt;p&gt;The world may interact with your &lt;strong&gt;Public API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But wisdom is built slowly, patiently, and privately&lt;br&gt;
on &lt;strong&gt;localhost&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So take a moment.&lt;/p&gt;

&lt;p&gt;Return to your internal console.&lt;/p&gt;

&lt;p&gt;Listen to the quiet processes running beneath the noise.&lt;/p&gt;

&lt;p&gt;Debug what needs fixing.&lt;br&gt;
Commit what you have learned.&lt;br&gt;
Clear what no longer serves you.&lt;/p&gt;

&lt;p&gt;And when the time comes to deploy yourself again into the world—&lt;/p&gt;

&lt;p&gt;Do so with intention.&lt;/p&gt;

&lt;p&gt;Do so with integrity.&lt;/p&gt;

&lt;p&gt;Because the strongest systems are not the loudest ones online.&lt;/p&gt;

&lt;p&gt;They are the ones that were carefully built, patiently tested,&lt;br&gt;
and faithfully maintained&lt;br&gt;
on &lt;strong&gt;127.0.0.1&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>learning</category>
      <category>mentalhealth</category>
      <category>motivation</category>
    </item>
    <item>
      <title>The Easiest Payment Gateway Integrations for Your Next React/Next.js E-commerce Project in South Africa (2026 Edition)</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 09 Mar 2026 10:21:48 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/the-easiest-payment-gateway-integrations-for-your-next-reactnextjs-e-commerce-project-in-south-40ep</link>
      <guid>https://dev.to/ayabongaqwabi/the-easiest-payment-gateway-integrations-for-your-next-reactnextjs-e-commerce-project-in-south-40ep</guid>
      <description>&lt;p&gt;Building an e-commerce app in South Africa in 2026? You need payments that actually work for our market: cards, instant EFT, QR codes, low fees, and — most importantly — &lt;strong&gt;setup that doesn't take two weeks of KYC hell&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As a full-stack JS dev who's shipped multiple React/Next.js shops here in Joburg, I've battle-tested the popular gateways. Here's my honest ranking of the &lt;strong&gt;easiest ones to integrate&lt;/strong&gt; right now — prioritized for speed, dev experience, and React-friendliness.&lt;/p&gt;

&lt;p&gt;No fluff. Just what saves you time when you're grinding solo or with a small team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Ranking (Easiest First)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Yoco Online Checkout&lt;/strong&gt; — Hands-down winner for speed
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iKhokha (iK Pay API)&lt;/strong&gt; — Great if you like signed payloads
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayFast by Network&lt;/strong&gt; — OG form-post method (zero backend secrets)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ozow&lt;/strong&gt; — Instant EFT king (pair it with something for cards)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peach Payments&lt;/strong&gt; — Scaling vibes with embeds
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonus: Paystack&lt;/strong&gt; — If you want modern popup polish&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's break them down.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Yoco Online Checkout (Easiest Hands-Down)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Minutes. No heavy business verification — just grab your API keys from the portal.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Clean REST API. Create a checkout session from a Next.js API route (or Server Action), get a &lt;code&gt;redirectUrl&lt;/code&gt;, send the user there (or embed if supported).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; Full test environment + sandbox keys.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Card-first shops, quick MVPs.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why it's dev-friendly:&lt;/strong&gt; Minimal code — POST to &lt;code&gt;/api/checkouts&lt;/code&gt;, handle redirect. Works perfectly with &lt;code&gt;fetch&lt;/code&gt; in API routes.&lt;/p&gt;

&lt;p&gt;Example flow in Next.js (pseudo-code):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/create-checkout/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://online.yoco.com/v1/checkouts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YOCO_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;amountInCents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ZAR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// ... other fields&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;redirectUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirectUrl&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;Then redirect on frontend. Super clean.&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://developer.yoco.com/docs/checkout-api" rel="noopener noreferrer"&gt;https://developer.yoco.com/docs/checkout-api&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. iKhokha (Signed Payloads – Your Control Classic)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Simple — get app ID + secret.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; POST to their endpoint with HMAC-SHA256 signature (use &lt;code&gt;crypto&lt;/code&gt; in Node). &lt;br&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; No full sandbox (live keys only), but test small amounts.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Custom flows where you want full control.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Trick:&lt;/strong&gt; Generate the signed link in an API route, return it to React for redirect.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Integration: POST a JSON payload signed with HMAC-SHA256 using Node's crypto module. A class-based wrapper keeps things reusable and secure. Make sure to pull config values from instance properties (not globals) to avoid scoping bugs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IkPayLink&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;apiEndPoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;applicationId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;applicationKey&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;apiEndPoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;applicationId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;applicationKey&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createPaylink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiEndPoint&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;applicationKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// ... rest of axios call&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;Docs: &lt;a href="https://dev.ikhokha.com/overview" rel="noopener noreferrer"&gt;https://dev.ikhokha.com/overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although I have to say their docs could use some TLC😅&lt;/p&gt;

&lt;h3&gt;
  
  
  3. PayFast by Network (Form-Post OG – Still Solid)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Lengthy verification (send business docs), but once approved → fire.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; No API server secrets needed! Build a hidden form and auto-submit to their URL. Perfect for client-side React (use &lt;code&gt;useEffect&lt;/code&gt; or button click).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; Yes! &lt;code&gt;merchant_id&lt;/code&gt; = &lt;code&gt;10000100&lt;/code&gt;, &lt;code&gt;merchant_key&lt;/code&gt; = &lt;code&gt;xxxxxxxx&lt;/code&gt; &lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Hosted checkout with zero backend exposure.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Downside:&lt;/strong&gt; Redirect-heavy, feels a bit old-school compared to embeds.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;postToURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;display: none&lt;/span&gt;&lt;span class="dl"&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;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="p"&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;values&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;postPaymentToPayFast&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;payFastUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;merchantId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;merchantKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;returnUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;cancelUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;notifyUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;nameFirst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;nameLast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;emailAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;itemDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;emailConfirmation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;confirmationAddress&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Sandbox merchant.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;merchantId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10000100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Use the password 'clientpass' to login and make the test purchase.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;postToURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payFastUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;merchant_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;merchantId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;merchant_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;merchantKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;return_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;returnUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cancel_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cancelUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;notify_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;notifyUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name_first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nameFirst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name_last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nameLast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email_address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;emailAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;m_payment_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;item_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;item_description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;itemDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email_confirmation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;emailConfirmation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;confirmation_address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;confirmationAddress&lt;/span&gt;&lt;span class="p"&gt;,&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;Docs: Mostly PHP, but JS form post is dead simple → &lt;a href="https://developers.payfast.co.za/" rel="noopener noreferrer"&gt;https://developers.payfast.co.za/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ozow (Instant EFT King)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Fast for SA businesses.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; JSON API to create payment request → get link/QR. Fetch in API route.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; EFT-heavy users (cheaper than cards for many township customers).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pair it:&lt;/strong&gt; With Yoco or PayFast for cards.&lt;/p&gt;

&lt;p&gt;Many Next.js shops use Ozow as primary EFT + secondary cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Peach Payments (Enterprise but Dev-Friendly)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Business verification (faster than old days).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Modern REST API, supports embedded checkout (no full redirect), server-to-server. JS libs on GitHub.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; Full test env.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Scaling shops, recurring, high success rates.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://developer.peachpayments.com/" rel="noopener noreferrer"&gt;https://developer.peachpayments.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus: Paystack (Modern Popup Vibes – Now Strong in SA)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signup:&lt;/strong&gt; Quick for SA merchants.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Beautiful JS SDK (inline popup or hosted). React wrappers galore.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; Excellent.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Clean popup experience.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://paystack.com/docs" rel="noopener noreferrer"&gt;https://paystack.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;Signup Speed&lt;/th&gt;
&lt;th&gt;Sandbox?&lt;/th&gt;
&lt;th&gt;Integration Style&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;React/Next.js Ease&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yoco&lt;/td&gt;
&lt;td&gt;Fastest&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;API session + redirect&lt;/td&gt;
&lt;td&gt;Speed &amp;amp; cards&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iKhokha&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Signed POST&lt;/td&gt;
&lt;td&gt;Custom control&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PayFast&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Form auto-submit&lt;/td&gt;
&lt;td&gt;Zero-backend&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ozow&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;API link/QR&lt;/td&gt;
&lt;td&gt;Instant EFT&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peach&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Embed/API&lt;/td&gt;
&lt;td&gt;Scaling &amp;amp; reliability&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paystack&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;JS popup/SDK&lt;/td&gt;
&lt;td&gt;Modern feel&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Final Tips for SA Devs in 2026
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;Yoco&lt;/strong&gt; if you're shipping fast (most solo devs' go-to).
&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Ozow&lt;/strong&gt; for EFT coverage — huge in our market.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Server Actions&lt;/strong&gt; or API routes for secrets — never expose keys client-side.
&lt;/li&gt;
&lt;li&gt;Test during load shedding (offline fallbacks + optimistic UI).
&lt;/li&gt;
&lt;li&gt;Always handle webhooks for confirmations (PayFast/iKhokha especially).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which one are you rocking in your current project? Drop your wins, pains, or code snippets in the comments — let's build better SA e-commerce together.&lt;/p&gt;

&lt;p&gt;Grind smart, ship paid. 💰🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>southafrica</category>
      <category>ecommerce</category>
      <category>react</category>
    </item>
    <item>
      <title>Turn History PDF Books into AI-Ready Q&amp;A Datasets with This Python Tool!</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Sun, 03 Aug 2025 18:23:41 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/turn-history-pdf-books-into-ai-ready-qa-datasets-with-this-python-tool-5dh6</link>
      <guid>https://dev.to/ayabongaqwabi/turn-history-pdf-books-into-ai-ready-qa-datasets-with-this-python-tool-5dh6</guid>
      <description>&lt;p&gt;Hey guys! I’m thrilled to share a Python tool I’ve built that transforms history books (in PDF format) into structured Q&amp;amp;A datasets, perfect for &lt;strong&gt;fine-tuning AI models&lt;/strong&gt;. Whether you’re an AI researcher, a history enthusiast, or a data scientist, this tool makes it easy to generate high-quality datasets from historical texts—and it’s flexible enough to work with &lt;em&gt;any&lt;/em&gt; PDF book! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does It Do?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;History Book to Dataset Generator&lt;/strong&gt; uses natural language processing and local AI models (via Ollama) to extract text from PDFs, chunk it intelligently, and generate contextual Q&amp;amp;A pairs. The output is a JSONL file ready for fine-tuning models like Llama 3.1 or Mistral. Plus, it’s packed with features to streamline the process and ensure quality.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PDF Processing&lt;/strong&gt;: Extracts and chunks text from PDF files for efficient processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Q&amp;amp;A&lt;/strong&gt;: Generates contextual questions and answers using Ollama’s local AI models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical Focus&lt;/strong&gt;: Filters content for historical figures, events, and cultural practices using customizable keywords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Processing&lt;/strong&gt;: Speeds up dataset creation with multi-threaded processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume Capability&lt;/strong&gt;: Checkpoints let you pick up where you left off if interrupted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication&lt;/strong&gt;: Ensures dataset quality by removing similar Q&amp;amp;A pairs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable&lt;/strong&gt;: Adaptable for &lt;em&gt;any&lt;/em&gt; PDF book by tweaking keywords in a simple &lt;code&gt;keywords.txt&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example Output:
&lt;/h3&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;"instruction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What event occurred in 1962 related to south africa?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"In 1961 South Africa became an independent republic  and in 1962 the international court &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;recognised South Africa’s control of South-West Afr ica (now Namibia)."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the international court recognised south africa's control over south-west africa (now namibia) in 1962, marking a significant recognition of its sovereignty."&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;
  
  
  Why It’s Great for Fine-Tuning AI Models
&lt;/h2&gt;

&lt;p&gt;The tool produces clean, structured datasets in JSONL format, making it ideal for fine-tuning language models for tasks like question-answering, historical analysis, or domain-specific NLP. You can customize keywords to focus on specific domains (e.g., African, European, or American history) or adapt it for non-historical PDFs, like technical manuals or literature, by updating the &lt;code&gt;keywords.txt&lt;/code&gt; file.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Prerequisites:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Ollama&lt;/strong&gt; for local AI inference:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# macOS/Linux&lt;/span&gt;
   curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.ai/install.sh | sh
   &lt;span class="c"&gt;# Windows: Download from https://ollama.ai/download&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start Ollama and pull a model (e.g., Llama 3.1):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   ollama start
   ollama pull llama3.1
   ollama run llama3.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Python Dependencies&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
   &lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
   pip &lt;span class="nb"&gt;install &lt;/span&gt;spacy jsonlines requests tqdm PyPDF2 psutil textacy scikit-learn pynvml
   python &lt;span class="nt"&gt;-m&lt;/span&gt; spacy download en_core_web_sm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python history_to_dataset.py your_book.pdf output_dataset.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advanced Usage:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python history_to_dataset.py your_book.pdf output_dataset.jsonl &lt;span class="nt"&gt;--model-name&lt;/span&gt; mistral &lt;span class="nt"&gt;--max-workers&lt;/span&gt; 8 &lt;span class="nt"&gt;--start-chunk&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the full README for detailed setup, customization, and troubleshooting: &lt;a href="https://github.com/AyabongaQwabi/historybook_to_dataset" rel="noopener noreferrer"&gt;Github link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;As someone passionate about SA history and AI, I wanted a tool that bridges the gap between rich historical texts and modern AI applications. I'm also in the process of trying out model finetuning so I need a tool like this to extract data from a couple of pdf documents.&lt;/p&gt;

&lt;p&gt;An example dataset I have managed to generate can be found on &lt;a href="https://huggingface.co/datasets/ayabongaqwabi/xhosa_thembu_history_wagenaar" rel="noopener noreferrer"&gt;huggingface&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's based on this &lt;a href="https://www.ru.ac.za/media/rhodesuniversity/content/corylibrary/documents/MS18534.pdf" rel="noopener noreferrer"&gt;book&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tool not only makes it easy to create datasets for fine-tuning but also opens the door to adapting it for other domains like literature, science, or even fiction!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Involved!
&lt;/h2&gt;

&lt;p&gt;I’d love for you to try it out, share feedback, or contribute ideas. The project is still fairly new and has room for improvement, please comment here or create a feature on Github should you notice anything not okay.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #NLP #Python #History #DataScience #FineTuning
&lt;/h1&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Please teach us how you prompt</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Sat, 22 Feb 2025 07:33:43 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/please-teach-us-how-you-prompt-26hp</link>
      <guid>https://dev.to/ayabongaqwabi/please-teach-us-how-you-prompt-26hp</guid>
      <description>&lt;p&gt;The Vercel v0 community is home to many stunning websites, showcasing incredible design and functionality. However, it seems that the processes behind these creations often go unshared. &lt;/p&gt;

&lt;p&gt;I believe that by exchanging insights, we can all learn and grow. If you're a developer who has crafted an exceptional website, I would like to ask you to share the specific prompts you used with the Vercel v0 bot to achieve those impressive designs. &lt;/p&gt;

&lt;p&gt;This way, we can inspire one another and elevate the quality of our projects together!&lt;/p&gt;

&lt;p&gt;Please teach us how you create such stuning websites.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>promptengineering</category>
      <category>v0</category>
      <category>ai</category>
    </item>
    <item>
      <title>Vercel V0 Website Generative Prompt Generator</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Wed, 22 Jan 2025 06:55:35 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/vercel-v0-website-generative-prompt-generator-24g</link>
      <guid>https://dev.to/ayabongaqwabi/vercel-v0-website-generative-prompt-generator-24g</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%2Fxip0tq425zy1txwbeuhj.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%2Fxip0tq425zy1txwbeuhj.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agent AI that will generate a website generative prompt&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the Agent.ai Challenge&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I have ccreated an AI tool that generates a prompt to build a static website for vercel v0. I opted to do this as I could not find an API for vercel V0 otherwise I wanted to create a bot that creates a website from minimal Input, if anybody knows of an api for vercel V0 please share.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/vercel-v0-prompt-generator" rel="noopener noreferrer"&gt;https://agent.ai/agent/vercel-v0-prompt-generator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agentaichallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Website lead conversion &amp; traffic Improver</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Wed, 22 Jan 2025 00:29:27 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/webzite-conversion-traffic-improver-716</link>
      <guid>https://dev.to/ayabongaqwabi/webzite-conversion-traffic-improver-716</guid>
      <description>&lt;p&gt;This is a submission for the Agent.ai Challenge: Full-Stack Agent &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%2Fom063hh4e2kkppyvau4x.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%2Fom063hh4e2kkppyvau4x.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;An AI bot that scrapes a given url (your website) and identifies weak points and key areas of improoovement. It will make informed suggestions on how you can improve the website to generate value.&lt;/p&gt;

&lt;p&gt;It is built with the Chat with a Website Template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/traffic-and-conversion-improver" rel="noopener noreferrer"&gt;https://agent.ai/agent/traffic-and-conversion-improver&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agentai</category>
      <category>agentaichallenjge</category>
      <category>webdev</category>
    </item>
    <item>
      <title>One-Man Jive, Tool Guide to Building and Shipping Faster in the Javascript Universe</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 09 Dec 2024 17:54:31 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/one-man-jive-tool-guide-to-building-and-shipping-faster-in-the-javascript-universe-4kg8</link>
      <guid>https://dev.to/ayabongaqwabi/one-man-jive-tool-guide-to-building-and-shipping-faster-in-the-javascript-universe-4kg8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
There are countless amazing tools out there, but these are the ones I've used and enjoyed. If you know better alternatives, please share, I’m always game to try out new tools!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why This Guide?&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;We, developers, are &lt;em&gt;blessed and cursed&lt;/em&gt;. Blessed with endless ideas, cursed with never finishing them! (I'm not innocent, I’ve got like 16 incomplete projects sitting in my repo graveyard😅)  &lt;/p&gt;

&lt;p&gt;If you’re working solo, it can feel impossible to get everything done. Luckily, some tools can act like your sidekick, helping you build faster a whole lot faster 🤝 leaving you to focus on the fun parts, perhaps the easy parts, The ones that include your domain😚&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Here's how to supercharge your Workflow&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Asynchronous API&lt;/strong&gt;  🫶
&lt;/h2&gt;

&lt;p&gt;When your app needs to wait on something long (like calling an API or processing a file), use &lt;strong&gt;Pub/Sub engines&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example Tool:&lt;/strong&gt;   &lt;a href="https://medium.com/@cloudandnodejstutorials/how-to-use-google-pub-sub-with-node-js-fc7691536c20" rel="noopener noreferrer"&gt;Google Cloud Pub/Sub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; With this you can queues tasks for background processing, while keeping your app happy and snappy on your frontend.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Synchronous API  🤝
&lt;/h2&gt;

&lt;p&gt;For simpler requests, set up an HTTP server.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;ExpressJS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; It’s lightweight, fast, and great for designing APIs. Pair it with &lt;a href="https://apidog.com/" rel="noopener noreferrer"&gt;API Dog&lt;/a&gt; and it suddenly feels like its your birthday for the 3rd time in a row.🎂&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. API Testing&lt;/strong&gt;  📝
&lt;/h2&gt;

&lt;p&gt;Need to check if your API behaves the way you expect it to?🤔 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman  &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Test your endpoints easily, visualize responses, and debug faster.🏃‍♀️&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Real-Time Communication&lt;/strong&gt; ♻️
&lt;/h2&gt;

&lt;p&gt;Building a chat app? Syncing with IoT devices?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://dev.to/cglikpo/getting-started-with-socket-io-7m4"&gt;Socket.io  &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Enables real-time, two-way communication between your app and physical devices.🦾&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. UI Magic&lt;/strong&gt; 💅✨
&lt;/h2&gt;

&lt;p&gt;UI design can be time-consuming for a one-man jive setup. Why not use some shortcuts?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; Tailwind CSS
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Style faster and better with intuitive utility classes.
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; If you're looking for prebuilt components, check out Tailwind Blocks websites like &lt;strong&gt;Flexwind&lt;/strong&gt;, &lt;strong&gt;WickedBlocks&lt;/strong&gt;, or &lt;strong&gt;Flowbite&lt;/strong&gt; they're like lego BLOCKS for your front end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flexiwind.vercel.app/blocks" rel="noopener noreferrer"&gt;Flexwind Blocks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flowbite.com/blocks/" rel="noopener noreferrer"&gt;Flowbite&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagedone.io/blocks" rel="noopener noreferrer"&gt;Pagedone.io&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flowrift.com/c/floating-navigation" rel="noopener noreferrer"&gt;Flowrift &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://merakiui.com/components" rel="noopener noreferrer"&gt;Meraki UI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://readymadeui.com/tailwind-blocks/contact-form" rel="noopener noreferrer"&gt;Ready Made UI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;6. Real-Time Instant Messaging&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Want chat features without coding like it's 1999?😩 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firestore  &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; You can subscribe to changes in your collection in real time, and boom you've got instant chat functionality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro Tip:&lt;/strong&gt; Search Firebase Realtime Database 😉 (Thank me later)&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Proprietary Component Library&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Sometimes your project calls for those elusive, specialized features,🤩 features that aren’t readily available for free on the interweb, I'm talking about stuff like calendars, data tables, word and excel file processors, or even PDF editors. In such a scenario the average dev component on the net don't cut it, but as for me I have found a solution that actually works, I've been taken by the the Components at &lt;a href="https://www.syncfusion.com/" rel="noopener noreferrer"&gt;SyncFusion&lt;/a&gt; 🤗&lt;/p&gt;

&lt;p&gt;They provide a comprehensive library of pre-made, high-quality javascript components. Useful for a variety of purposes such as building a dashboard, productivity suite, or an online marketplace, Syncfusion has a tool set that may save you a lot of time and effort.&lt;br&gt;
 💪🏽&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Quick Dry Deployment&lt;/strong&gt; 🤯
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;7. Instant Hosting&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Get your app live with a minimal setup.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://app.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Easy deployment, domain management, functions and more—all in one place 🫡&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Continuous Delivery&lt;/strong&gt; 🚶‍♂️
&lt;/h2&gt;

&lt;p&gt;A bit slow (depending on your pipeline jobs) but useful tool to automate testing, building, and deploying your app.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://gitlab.com" rel="noopener noreferrer"&gt;GitLab &lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; A CI/CD powerhouse (but the best features aren’t free).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;9. Error Tracking and Bug Catching&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;No one ever chose the Bug Life 😎 but the bug life chose them. A way track and get notified about bugs before your users do.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;Sentry.io &lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Get real-time alerts on site bugs and fix issues faster. Supports many project types. Just signup, install and ...&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%2Fo1nw5x2w8fkps9obvcd1.gif" 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%2Fo1nw5x2w8fkps9obvcd1.gif" alt="Image description" width="220" height="144"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Data Handling and Local Development&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;10. Databases&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Need a database fast fast?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://cloud.mongodb.com/" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Easy to set up with Atlas Online.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro Tip:&lt;/strong&gt; For a smoother local to production setup, consider using Firebase Firestore, it has local emulators that are much much easier to setup and manage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;11. Data Handling, Manipulation, Kamehameing&lt;/strong&gt; 😤
&lt;/h2&gt;

&lt;p&gt;Hands down one of the best tools to handle/process your data with. 🤯🙆🏻‍♀️  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; Clojure
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Its functional approach is powerful for data manipulation. Check out the &lt;strong&gt;Clojurians Slack&lt;/strong&gt; for &lt;a href="https://clojurians.slack.com/join/shared_invite/zt-2qhr9jhk7-gwl1BxtCdutSGC5OWh6fjg#/shared-invite/email" rel="noopener noreferrer"&gt;community&lt;/a&gt; support.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture and Coding Helpers&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;12. Architecture Patterns&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Are you doing too many things with too much data? Break it down into smaller services. 🤌 and _(Build ants) _ 🐜&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; &lt;a href="https://medium.com/@ayushnandanwar003/mastering-microservices-architecture-with-node-js-db82cdb07b17" rel="noopener noreferrer"&gt;Microservices&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; If one service fails, others keep running. Each service is specialized for a specific task.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;13. Code Editor&lt;/strong&gt; ⌨️
&lt;/h2&gt;

&lt;p&gt;Your IDE should feel like home, nothing should feel impossible. 🥰 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code &lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Tons of plugins, great support, and flexibility.🤩&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;14. Serverless Functions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Run scripts without managing a server.🤤  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt;, &lt;a href="https://www.netlify.com/platform/core/functions/" rel="noopener noreferrer"&gt;Netlify Functions&lt;/a&gt;, or &lt;a href="https://firebase.google.com/docs/functions" rel="noopener noreferrer"&gt;Firebase Functions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Ideal for small, standalone tasks. &lt;em&gt;(think ants 🐜)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;15. AI Agents&lt;/strong&gt; 😎
&lt;/h2&gt;

&lt;p&gt;When it's alot to do and you can't do alone but there's no one around to assist, hire an agent🤝  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools:&lt;/strong&gt; &lt;a href="https://tabnine.com" rel="noopener noreferrer"&gt;Tabnine AI&lt;/a&gt; or &lt;a href="https://v0.dev/" rel="noopener noreferrer"&gt;Vercel V0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; They suggest code and help with UI tasks. I &lt;em&gt;highly&lt;/em&gt; recommend Vercel V0 for front-end work.🙆‍♂️&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Keeping Your Project on Track&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;16. Organizing your projects&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Stay on top of your tasks.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools:&lt;/strong&gt; &lt;a href="//github.com"&gt;GitHub Projects&lt;/a&gt; or &lt;a href="//monday.com"&gt;Monday.com&lt;/a&gt;. I don't really know about Monday , I've only recently tried it out but I'm liking it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Visualize progress and manage tasks easily.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The End&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You don’t have to do it all alone. These tools can make the journey faster, smoother, and more exciting! Pick what works for you, experiment, and finish up all those projects collecting dust on your machine. No project should be an ornament of what could have been! Unless you're a coding snowball "&lt;em&gt;All projects are equal but some projects are more equal than others&lt;/em&gt;"😅&lt;/p&gt;

&lt;p&gt;Cheers 👋&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"Hey man, I don't know . It's your code" The lowest blow a dev can take</title>
      <dc:creator>Ayabonga Qwabi</dc:creator>
      <pubDate>Mon, 29 Nov 2021 14:14:36 +0000</pubDate>
      <link>https://dev.to/ayabongaqwabi/hey-man-i-dont-know-its-your-codethe-lowest-blow-a-dev-can-take-54ei</link>
      <guid>https://dev.to/ayabongaqwabi/hey-man-i-dont-know-its-your-codethe-lowest-blow-a-dev-can-take-54ei</guid>
      <description>&lt;p&gt;what's the lowest blow you've taken?&lt;/p&gt;

</description>
      <category>jokes</category>
    </item>
  </channel>
</rss>
