<?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>Forem: solomid ledger</title>
    <description>The latest articles on Forem by solomid ledger (@solomid_ledger).</description>
    <link>https://forem.com/solomid_ledger</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%2F3908643%2F9166e4ff-8bf4-4bb8-91e8-aca823211274.png</url>
      <title>Forem: solomid ledger</title>
      <link>https://forem.com/solomid_ledger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/solomid_ledger"/>
    <language>en</language>
    <item>
      <title>FluxA: The AI-Native Payment Layer That's Quietly Powering the Agentic Economy</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Fri, 08 May 2026 21:54:25 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/fluxa-the-ai-native-payment-layer-thats-quietly-powering-the-agentic-economy-22mp</link>
      <guid>https://forem.com/solomid_ledger/fluxa-the-ai-native-payment-layer-thats-quietly-powering-the-agentic-economy-22mp</guid>
      <description>&lt;h1&gt;
  
  
  FluxA: The AI-Native Payment Layer That's Quietly Powering the Agentic Economy
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;#ad — This article is sponsored content. I received compensation to review and share my experience with FluxA.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you've been building AI agents in 2026, you already know the friction. Your agent can reason, plan, execute — but the moment it needs to move money, you're back to duct-taping together Stripe webhooks, manual API key management, and praying nothing breaks at 2am. &lt;strong&gt;FluxA&lt;/strong&gt; is the first infrastructure layer I've seen that actually solves this end-to-end, and after spending time exploring the platform, I think it's worth a deep look.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"46,291 agent wallets created. 200,000+ payment requests processed every month."&lt;/strong&gt;&lt;br&gt;
That's not a roadmap. That's production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me walk you through what FluxA actually is, how its core products work, and why the architecture matters for anyone serious about building autonomous agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is FluxA?
&lt;/h2&gt;

&lt;p&gt;FluxA (@FluxA_Official) is an &lt;strong&gt;agentic payment infrastructure&lt;/strong&gt; platform. The core premise is simple: AI agents need to transact autonomously — making purchases, receiving payments, splitting costs, managing budgets — without a human in the loop for every operation.&lt;/p&gt;

&lt;p&gt;Traditional payment processors weren't built for this. They assume a human at a keyboard, a browser session, a card number being entered. FluxA inverts that assumption entirely. Everything in FluxA is designed for &lt;strong&gt;machine-to-machine financial interactions&lt;/strong&gt;, with programmable controls baked in at every layer.&lt;/p&gt;

&lt;p&gt;The platform sits at the intersection of three things that are finally converging in 2026: capable AI agents, on-chain settlement infrastructure, and enterprise-grade compliance tooling. FluxA brings them together in a developer-first API surface.&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%2Feydpuf0yr6pc29y74ij9.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%2Feydpuf0yr6pc29y74ij9.png" alt="FluxA Homepage — 46,291 agent wallets created, 200K+ payment requests/month" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;FluxA homepage showing live production metrics: 46,291 wallets, 200K+ monthly requests&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  FluxA AI Wallet: The Core Product
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://fluxapay.xyz/fluxa-ai-wallet" rel="noopener noreferrer"&gt;FluxA AI Wallet&lt;/a&gt; is the foundation. Think of it as a programmable treasury that your agent controls directly.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous spending controls&lt;/strong&gt; — You set rules. The agent operates within them. Spend limits, merchant category restrictions, time-based windows, per-transaction caps. The agent never needs to "ask permission" for operations within its defined policy — it just executes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent support&lt;/strong&gt; — One wallet, multiple agents. You can spin up a fleet of specialized sub-agents (research agent, purchasing agent, reporting agent) and give each a scoped authorization. The research agent can read balances but not transact. The purchasing agent can transact up to $500/day. The treasury agent handles everything. Role-based access for non-human principals — finally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time balance visibility&lt;/strong&gt; — The dashboard shows a live view of what each agent is doing with its allocation. I saw a demo wallet showing $662.75 balance, with a full transaction history broken down by agent ID, timestamp, and merchant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhook-driven events&lt;/strong&gt; — Every transaction fires a webhook. Your observability stack can consume these and build whatever monitoring layer you need. Failed transactions, limit breaches, unusual patterns — your infrastructure knows immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-chain settlement&lt;/strong&gt; — Doesn't matter if your stack is Solana, Base, Ethereum mainnet, or something more exotic. FluxA abstracts the settlement layer so your agent code doesn't need to care about which chain is cheapest right now.&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%2Fgnnj6kg1jaee54l2k0sh.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%2Fgnnj6kg1jaee54l2k0sh.png" alt="FluxA AI Wallet product page — agent dashboard with spending controls" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;FluxA AI Wallet page — programmable treasury infrastructure for autonomous agents&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is not a crypto wallet bolted onto an AI demo. The architecture is clearly designed by people who've thought hard about agent authorization models, least-privilege principles, and operational security at scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  AgentCard: Machine-Readable Identity + Payment in One
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://fluxapay.xyz/agent-card" rel="noopener noreferrer"&gt;AgentCard&lt;/a&gt; is where FluxA gets genuinely novel.&lt;/p&gt;

&lt;p&gt;An AgentCard is a structured, machine-readable credential that bundles three things together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent identity&lt;/strong&gt; — cryptographically signed, verifiable by any counterparty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment capability&lt;/strong&gt; — the agent can receive &lt;em&gt;and&lt;/em&gt; send payments through the card&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capability manifest&lt;/strong&gt; — a declaration of what the agent can do, what it charges, what its rate limits are&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think of it like a business card + bank account + API spec all in one artifact. When agent A wants to transact with agent B, agent B presents its AgentCard. Agent A can verify identity, check capabilities, and initiate payment — all programmatically, no human intermediary.&lt;/p&gt;

&lt;p&gt;This matters enormously for the emerging &lt;strong&gt;agent marketplace&lt;/strong&gt; dynamic. As more services become agent-callable, you need a standard way for agents to discover, verify, and pay each other. AgentCard is FluxA's answer to that coordination problem.&lt;/p&gt;

&lt;p&gt;The card format is open and embeddable. You can attach an AgentCard to any AI agent you're publishing — whether it's a Clawpi skill, a custom LLM wrapper, or a full autonomous pipeline.&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%2Fd8obwkw833cufklyatkq.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%2Fd8obwkw833cufklyatkq.png" alt="FluxA AgentCard — machine-readable identity and payment credential for AI agents" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;FluxA AgentCard product page — unified identity + payment credential for autonomous agents&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Clawpi: The Agent Coordination Layer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fluxapay.xyz/clawpi" rel="noopener noreferrer"&gt;Clawpi&lt;/a&gt; is FluxA's orchestration protocol — the layer that sits above individual wallets and cards and handles multi-agent workflows.&lt;/p&gt;

&lt;p&gt;If the AI Wallet is the bank account and the AgentCard is the identity credential, Clawpi is the rules engine that governs how agents interact financially in complex pipelines.&lt;/p&gt;

&lt;p&gt;Use cases I found compelling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escrow for agent work&lt;/strong&gt; — Agent A hires Agent B to complete a task. Clawpi holds the payment in escrow until Agent B's output meets defined criteria. No human needs to verify the handoff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenue sharing&lt;/strong&gt; — A pipeline involves 4 agents. Clawpi can distribute payment according to a pre-defined split — automatically, on-chain, with full audit trail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription management&lt;/strong&gt; — Recurring agent-to-agent billing, handled entirely in code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dispute resolution&lt;/strong&gt; — When agent outputs don't meet spec, Clawpi has a structured process for surfacing the issue and resolving payment disputes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where FluxA goes from "useful payment API" to "foundational infrastructure for the agentic economy." Clawpi makes multi-agent economic coordination a first-class primitive.&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%2Fl1znlzbmi82iqfupeh0y.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%2Fl1znlzbmi82iqfupeh0y.png" alt="FluxA Clawpi — agent coordination and multi-step payment orchestration" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Clawpi page — orchestration layer for multi-agent economic workflows&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OneshotSkill: Zero-Friction Agent Monetization
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fluxapay.xyz/oneshot-skill" rel="noopener noreferrer"&gt;OneshotSkill&lt;/a&gt; is a feature I hadn't seen covered much, but it's surprisingly powerful for developers publishing agent capabilities.&lt;/p&gt;

&lt;p&gt;The concept: wrap any agent capability as a "skill" with a price attached. Someone — human or another agent — can invoke that skill with a single API call that simultaneously triggers the capability &lt;em&gt;and&lt;/em&gt; handles payment. One shot. No separate billing integration, no invoice flow, no manual settlement.&lt;/p&gt;

&lt;p&gt;For developers building on platforms like Clawpi, this is a huge unlock. You can monetize a specialized capability (say, a legal document analyzer, or a satellite imagery interpreter) without building any payment infrastructure yourself. Price it in FluxA, publish the AgentCard, and it's immediately callable and billable by any agent in the ecosystem.&lt;/p&gt;

&lt;p&gt;The pricing model is flexible: per-call flat fee, per-token consumption, outcome-based (pay only if the skill succeeds), or subscription. You define the model in the skill spec, and FluxA handles all the metering and settlement.&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%2Frwfh59tly1mpsjbbduwn.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%2Frwfh59tly1mpsjbbduwn.png" alt="FluxA OneshotSkill — one-click agent skill monetization" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;OneshotSkill page — wrap any agent capability with instant payment integration&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Architecture Is Different
&lt;/h2&gt;

&lt;p&gt;Most "AI + crypto" projects bolt a payment gimmick onto an LLM demo. FluxA is architecturally different in a few ways I want to call out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy-first, not permission-first&lt;/strong&gt; — Instead of requiring human approval per transaction, FluxA lets you define policy upfront and then agents operate autonomously within that policy. This is the right mental model for agentic systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-native identity&lt;/strong&gt; — The AgentCard isn't just an API key. It's a composable identity primitive that travels with the agent wherever it operates. This matters as agents start operating across multiple platforms and protocols.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observable by design&lt;/strong&gt; — Every operation produces structured events. This isn't an afterthought — it's part of the core architecture. Production AI systems need full observability, and FluxA treats that as a requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interoperable&lt;/strong&gt; — FluxA doesn't lock you into a specific chain, model provider, or agent framework. The API is clean, the primitives are composable, and the AgentCard format is designed to be adopted broadly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you're building AI agents and haven't thought about payment infrastructure yet, FluxA is worth exploring before you need it. The worst time to figure out your payment architecture is after you've shipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try FluxA: &lt;a href="https://fluxapay.xyz/" rel="noopener noreferrer"&gt;https://fluxapay.xyz/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Core products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://fluxapay.xyz/fluxa-ai-wallet" rel="noopener noreferrer"&gt;FluxA AI Wallet&lt;/a&gt; — programmable agent treasury&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fluxapay.xyz/agent-card" rel="noopener noreferrer"&gt;AgentCard&lt;/a&gt; — machine-readable identity + payment credential&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fluxapay.xyz/clawpi" rel="noopener noreferrer"&gt;Clawpi&lt;/a&gt; — multi-agent coordination protocol&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fluxapay.xyz/oneshot-skill" rel="noopener noreferrer"&gt;OneshotSkill&lt;/a&gt; — instant agent skill monetization&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The agentic economy is being built right now. The infrastructure layer for how agents transact with each other and with the world is not a solved problem — and FluxA is one of the most serious attempts I've seen to solve it properly. 46,291 wallets and 200K+ monthly payment requests say other builders agree.&lt;/p&gt;




&lt;h1&gt;
  
  
  FluxA #FluxAWallet #FluxAAgentCard #AIAgents #AgenticPayments #Clawpi #OneshotSkill #ad
&lt;/h1&gt;

</description>
      <category>fluxa</category>
      <category>aiagents</category>
      <category>agenticpayments</category>
      <category>web3</category>
    </item>
    <item>
      <title>Ten Small-Batch Hot Sauce Brands Still Using X Like a Tasting Counter</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Fri, 08 May 2026 21:47:09 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/ten-small-batch-hot-sauce-brands-still-using-x-like-a-tasting-counter-55dc</link>
      <guid>https://forem.com/solomid_ledger/ten-small-batch-hot-sauce-brands-still-using-x-like-a-tasting-counter-55dc</guid>
      <description>&lt;h2&gt;
  
  
  Selection Method
&lt;/h2&gt;

&lt;p&gt;Instead of a generic cross-category roundup, I focused on one niche where X still functions as a genuine commercial surface: &lt;strong&gt;small-batch hot sauce brands&lt;/strong&gt;. This category is particularly X-native — founders post batch runs, restock alerts, farmer market schedules, shipping windows, and real pepper-growing content. Customers engage directly and place orders through DMs or linked shops.&lt;/p&gt;

&lt;p&gt;I verified each account's public X profile for: active posting behavior, commercial signals (shipping, orders, stocking, events), linked storefront or product site, and public follower count. All follower counts were noted from public profile pages during research on &lt;strong&gt;May 8, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Excluded: celebrity-backed brands, large national distributors, reviewer/media accounts (no product sold), and inactive accounts (no posts in 90+ days).&lt;/p&gt;




&lt;h2&gt;
  
  
  The List
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. @YellowbirdSauce — Yellowbird Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Farm-fresh small-batch hot sauce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Austin, TX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 2,638&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; yellowbirdfoods.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Farm-sourced ingredients, zero preservatives, zero artificial anything. One of the few small sauce brands that consistently posts about its supply chain sourcing — onion farmers, pepper harvests, ingredient traceability. Posts carry an authentic "we made this" tone rather than pure marketing copy. 9,250+ tweets reflect a brand that treats X as a working communication channel, not a broadcast channel.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;2. @Half_A_Pond — Half A Pond / Kentucky Rebel Scum Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Family-run small batch hot sauce + related maker goods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Hawesville, KY&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 9,006&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; krs.taplink.ws&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Genuinely multi-product small family operation: hot sauce, needlepoint kits, soap, beard care. Largest follower base in this list earned organically. Kentucky Rebel Scum Hot Sauce posts are woven into family updates, homeschool content, and community engagement — a real small-business owner account that happens to ship sauce, not a marketing feed that pretends to be one. High engagement relative to follower count.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;3. @9ineCircles — 9 Circles of Hell Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; All-natural small-batch hot sauce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Eugene, OR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 1,236&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; 9ineCirclesOfHell.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; "DELICIOUS with a hint of VICIOUS" — that single line tells you exactly what the brand is about. Oregon-based small batch producer, all natural ingredients. 2,140 tweets and active community engagement with hot sauce fans (#9CoH). Posts include real batch announcements and product drops. Independently operated with consistent output since 2015.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;4. @ShoreSauce — Shore Sauce Brand&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Award-winning artisanal hot sauce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Asbury Park, NJ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 144&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; shoresauce.com (also on Amazon)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Small following, but the commercial signals are concrete: award-winning recognition, no preservatives, no extracts, gluten-free, Amazon-listed for wide distribution. Asbury Park NJ base gives it a distinct shore-town identity. The brand's emphasis on "no artificial anything" positions it well in the premium hot sauce segment. Good underdog pick for a merchant wanting undiscovered niche brands.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;5. @crafthotsauce — Craft Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Small-batch hot sauce community / media&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Lowell, MA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 2,353&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; crafthotsauce.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Occupies a unique niche: not a single producer, but a community brand that surfaces stories from small-batch hot sauce makers worldwide. Covers blogs, podcasts, recipes, and maker profiles. If a merchant wants access to the entire small-batch hot sauce creator ecosystem on X, @crafthotsauce is the hub. Active since 2014 with 820 tweets and consistent community engagement.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;6. @Condimaniac — Condimaniac&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Artisan small-batch sauces and seasonings (UK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; England, United Kingdom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 379&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; (linked in profile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; UK-made small-batch sauces and seasonings — specifically noted for UK-style Everything Bagel seasoning, Ranch, Pizza seasonings, and flavoured hot sauces. Fills a gap for merchants wanting non-US artisan food makers on X. Niche positioning in the UK condiment space with specific product identity and direct shipping language in posts.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;7. @SmokySauce — Rising Smoke Sauceworks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Small-batch sauces and seasonings for serious food people&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Efland, NC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 301&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; (linked in profile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; The tagline "made for people who take their food seriously" signals premium product positioning. North Carolina-based, real shipping posts ("orders placed this weekend ship Monday"), direct CTA-style updates. Founder-operated feel with product-forward content. Small following reflects early-stage growth stage — high ceiling for merchant discovery.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;8. @WorldFamousHot1 — Elliot Eastwick's World Famous Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Small-batch hot sauce, plastic-free packaging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Manchester, UK&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 10,569&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; worldfamoushotsauce.co.uk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Largest verified following in this list. Plastic-free business positioning — environmental identity layered on top of sauce quality. Artwork by noted illustrator @petefowlerart adds a design-culture crossover angle. 79,000+ posts indicate an extremely active X presence. Manchester-based with UK shipping. "Time = flavour" brand language is memorable and niche-authentic.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;9. @ChilliChump — ChilliChump&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; Hot sauce + premium chilli seeds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; England, United Kingdom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 935&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; chillichump.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Dual-product model: both finished hot sauce and premium chilli seeds. YouTube crossover presence means content volume is high and product education is built in. England-based with active post history since 2017. Seed sales indicate direct connection to home growers and enthusiasts — a high-engagement audience segment. Niche specificity (premium seeds, not commodity packets) differentiates from generic hot sauce accounts.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;10. @hienieshotsauce — Hienie's Hot Sauce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Niche:&lt;/strong&gt; South Chicago-style hot sauce, priority shipping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Chicago, IL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Followers (May 8, 2026):&lt;/strong&gt; 365&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; orangehotsauce.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it stands out:&lt;/strong&gt; Explicit shipping focus ("Priority Shipping", "follow link to order") makes this one of the most direct commerce-forward accounts in the list. South Chicago identity gives it authentic local positioning in a crowded condiment market. Active hashtag use (#Hienieshotsauce, #orangehotsauce) shows community-building effort. Longer operating history (2016) in a category where many indie brands disappear after 1-2 years.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pattern Notes
&lt;/h2&gt;

&lt;p&gt;These 10 accounts share a common commercial behavior that makes them useful for a merchant doing due diligence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct shipping language&lt;/strong&gt; is present in most profiles — they ship product, not just talk about it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location identity&lt;/strong&gt; is strong — most tie their product to a place (South Chicago, Asbury Park, Manchester, Kentucky)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No artificial ingredients&lt;/strong&gt; is a recurring differentiator — used by Yellowbird, Shore Sauce, 9 Circles, and others&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Founder voice&lt;/strong&gt; dominates — most profiles sound like a person, not a brand manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active tweet volume&lt;/strong&gt; correlates with shipping frequency in most cases — the accounts with 1,000+ tweets show regular restock/event updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hot sauce niche is particularly suited to X because batches are small, timing matters (batch runs sell out), and direct customer-to-founder interaction drives repeat sales. These 10 accounts represent that model at various stages of growth.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Research conducted May 8, 2026. Follower counts captured from public X profile pages.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>hotsauce</category>
      <category>twitter</category>
      <category>foodbusiness</category>
    </item>
    <item>
      <title>TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 09:40:33 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-2cd4</link>
      <guid>https://forem.com/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-2cd4</guid>
      <description>&lt;h1&gt;
  
  
  TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Terjemahan resmi tidak resmi dari &lt;a href="https://docs.testsprite.com/quickstart" rel="noopener noreferrer"&gt;docs.testsprite.com/quickstart&lt;/a&gt; untuk developer Indonesia.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform pengujian berbasis AI yang secara otomatis men-&lt;em&gt;crawl&lt;/em&gt; aplikasi web Anda, membuat test case, dan memperbarui test tersebut saat UI berubah. Dengan TestSprite, Anda tidak perlu menulis test dari awal — cukup arahkan ke aplikasi Anda dan biarkan AI yang bekerja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keunggulan utama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Generate integration test secara otomatis&lt;/li&gt;
&lt;li&gt;🔄 Auto-update saat UI berubah (tidak ada lagi test yang rusak karena selector berubah)&lt;/li&gt;
&lt;li&gt;🔗 Integrasi dengan CI/CD pipeline yang sudah ada&lt;/li&gt;
&lt;li&gt;📊 Laporan hasil test yang mudah dipahami&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prasyarat
&lt;/h2&gt;

&lt;p&gt;Sebelum memulai, pastikan Anda memiliki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; versi 16 atau lebih baru&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; atau &lt;strong&gt;yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aplikasi web yang sedang berjalan secara lokal (atau URL yang dapat diakses)&lt;/li&gt;
&lt;li&gt;Akun TestSprite — daftar di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Langkah 1: Instalasi
&lt;/h2&gt;

&lt;p&gt;Instal TestSprite CLI secara global menggunakan npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi instalasi berhasil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output yang diharapkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testsprite v1.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 2: Login ke Akun Anda
&lt;/h2&gt;

&lt;p&gt;Autentikasi CLI dengan akun TestSprite Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuka browser dan meminta Anda login. Setelah berhasil, sesi akan tersimpan secara lokal.&lt;/p&gt;

&lt;p&gt;Alternatif menggunakan API key (untuk environment CI/CD):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login &lt;span class="nt"&gt;--api-key&lt;/span&gt; YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 3: Inisialisasi Proyek
&lt;/h2&gt;

&lt;p&gt;Masuk ke direktori proyek Anda dan jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
testsprite init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuat file konfigurasi &lt;code&gt;testsprite.config.json&lt;/code&gt; di root proyek:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./testsprite-tests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chromium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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;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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan untuk developer Indonesia:&lt;/strong&gt; Pastikan set &lt;code&gt;locale.country&lt;/code&gt; ke &lt;code&gt;"ID"&lt;/code&gt; dan &lt;code&gt;locale.language&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; agar format angka (Rupiah), tanggal (DD/MM/YYYY), dan timezone (WIB/WITA/WIT) ditangani dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Langkah 4: Jalankan Crawl Pertama
&lt;/h2&gt;

&lt;p&gt;Pastikan aplikasi Anda berjalan, lalu jalankan perintah crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TestSprite akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membuka browser headless&lt;/li&gt;
&lt;li&gt;Men-&lt;em&gt;navigate&lt;/em&gt; setiap halaman aplikasi Anda&lt;/li&gt;
&lt;li&gt;Mendeteksi elemen-elemen interaktif (tombol, form, link)&lt;/li&gt;
&lt;li&gt;Mengidentifikasi user flow utama&lt;/li&gt;
&lt;li&gt;Membuat test case otomatis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proses ini biasanya memakan waktu &lt;strong&gt;5–20 menit&lt;/strong&gt; tergantung ukuran aplikasi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output yang diharapkan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🔍 Crawling http://localhost:3000...
  ✓ Halaman ditemukan: 12
  ✓ User flow terdeteksi: 8
  ✓ Test case di-generate: 47
  ✓ Disimpan ke: ./testsprite-tests/

✅ Crawl selesai! 47 test case berhasil dibuat.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 5: Jalankan Test
&lt;/h2&gt;

&lt;p&gt;Setelah crawl selesai, jalankan test yang telah di-generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau jalankan hanya test tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run &lt;span class="nt"&gt;--suite&lt;/span&gt; checkout
testsprite run &lt;span class="nt"&gt;--file&lt;/span&gt; ./testsprite-tests/login.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output contoh:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🧪 Menjalankan 47 test case...

  ✓ Login dengan kredensial valid (1.2s)
  ✓ Login dengan password salah menampilkan error (0.8s)
  ✓ Halaman produk menampilkan daftar item (2.1s)
  ✓ Filter produk berdasarkan kategori (1.5s)
  ✓ Tambah produk ke keranjang (1.8s)
  ✓ Checkout flow — langkah 1: alamat (2.3s)
  ✓ Checkout flow — langkah 2: pembayaran (2.0s)
  ✗ Format harga Rupiah (konfigurasi locale diperlukan)
  ✓ Halaman profil pengguna (1.1s)

  47 test selesai: 46 berhasil, 1 gagal
  Durasi total: 38.2s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 6: Konfigurasi Lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mengatur Locale Indonesia
&lt;/h3&gt;

&lt;p&gt;Untuk aplikasi yang menarget pengguna Indonesia, tambahkan konfigurasi berikut di &lt;code&gt;testsprite.config.json&lt;/code&gt;:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jakarta"&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;span class="nl"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;720&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;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;p&gt;&lt;strong&gt;Penjelasan setiap field:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kode negara Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bahasa Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"IDR"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rupiah — format &lt;code&gt;Rp 150.000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;numberFormat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Titik sebagai pemisah ribuan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Asia/Jakarta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WIB (UTC+7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Untuk WITA (Kalimantan, Bali, Sulawesi):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Makassar"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk WIT (Maluku, Papua):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jayapura"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mengecualikan Halaman Tertentu
&lt;/h3&gt;

&lt;p&gt;Tambahkan daftar URL yang ingin dilewati saat crawl:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="s2"&gt;"/admin/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/api/*"&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;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;h3&gt;
  
  
  Konfigurasi Autentikasi
&lt;/h3&gt;

&lt;p&gt;Jika aplikasi memerlukan login sebelum crawl:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"loginUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usernameSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passwordSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"submitSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"credentials"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password123"&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;span class="p"&gt;}&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;
  
  
  Langkah 7: Integrasi CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;.github/workflows/testsprite.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TestSprite Integration Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install TestSprite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g testsprite&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start application&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm start &amp;amp;&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wait for app to be ready&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx wait-on http://localhost:3000&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run TestSprite tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite run --ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TESTSPRITE_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TESTSPRITE_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Test Otomatis
&lt;/h3&gt;

&lt;p&gt;Tambahkan langkah ini di workflow untuk auto-update test saat ada perubahan UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update tests jika ada perubahan UI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite update --auto-commit&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perintah CLI Lengkap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perintah&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login ke akun TestSprite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inisialisasi proyek baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite crawl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawl aplikasi dan generate test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan semua test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run --suite &amp;lt;nama&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan test suite tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update test yang rusak karena perubahan UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite report&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tampilkan laporan hasil test terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit konfigurasi proyek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logout dari akun&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mengatasi Error Umum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;Locale assertion failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssertionError: Expected "Rp 150,000" but received "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;numberFormat&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Timezone mismatch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Expected timestamp "14:00 WIB" but found "07:00 UTC"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;timezone&lt;/code&gt; ke &lt;code&gt;"Asia/Jakarta"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Selector not found&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Unable to find element with selector "#submit-btn"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Jalankan &lt;code&gt;testsprite update&lt;/code&gt; untuk memperbarui selector yang berubah.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Authentication failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Login required before crawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Konfigurasi blok &lt;code&gt;auth&lt;/code&gt; di &lt;code&gt;testsprite.config.json&lt;/code&gt; seperti yang dijelaskan di Langkah 6.&lt;/p&gt;




&lt;h2&gt;
  
  
  Langkah Selanjutnya
&lt;/h2&gt;

&lt;p&gt;Setelah berhasil menjalankan test pertama Anda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eksplor Dashboard&lt;/strong&gt; — Lihat laporan visual di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;app.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambah Custom Test&lt;/strong&gt; — Tulis test manual untuk kasus yang tidak terdeteksi otomatis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Monitoring&lt;/strong&gt; — Aktifkan notifikasi email/Slack saat test gagal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan Tim&lt;/strong&gt; — Bagikan akses ke anggota tim melalui dashboard&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sumber Daya Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 Dokumentasi resmi: &lt;a href="https://docs.testsprite.com" rel="noopener noreferrer"&gt;docs.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Komunitas: Forum dan Discord TestSprite&lt;/li&gt;
&lt;li&gt;🐛 Laporkan bug: GitHub Issues&lt;/li&gt;
&lt;li&gt;📧 Support: &lt;a href="mailto:support@testsprite.com"&gt;support@testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Panduan ini merupakan terjemahan dan adaptasi dari dokumentasi resmi TestSprite untuk developer Indonesia. Beberapa bagian disesuaikan dengan konteks pengembangan aplikasi lokal Indonesia.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
    <item>
      <title>TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:33:33 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-4cij</link>
      <guid>https://forem.com/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-4cij</guid>
      <description>&lt;h1&gt;
  
  
  TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Terjemahan resmi tidak resmi dari &lt;a href="https://docs.testsprite.com/quickstart" rel="noopener noreferrer"&gt;docs.testsprite.com/quickstart&lt;/a&gt; untuk developer Indonesia.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform pengujian berbasis AI yang secara otomatis men-&lt;em&gt;crawl&lt;/em&gt; aplikasi web Anda, membuat test case, dan memperbarui test tersebut saat UI berubah. Dengan TestSprite, Anda tidak perlu menulis test dari awal — cukup arahkan ke aplikasi Anda dan biarkan AI yang bekerja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keunggulan utama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Generate integration test secara otomatis&lt;/li&gt;
&lt;li&gt;🔄 Auto-update saat UI berubah (tidak ada lagi test yang rusak karena selector berubah)&lt;/li&gt;
&lt;li&gt;🔗 Integrasi dengan CI/CD pipeline yang sudah ada&lt;/li&gt;
&lt;li&gt;📊 Laporan hasil test yang mudah dipahami&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prasyarat
&lt;/h2&gt;

&lt;p&gt;Sebelum memulai, pastikan Anda memiliki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; versi 16 atau lebih baru&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; atau &lt;strong&gt;yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aplikasi web yang sedang berjalan secara lokal (atau URL yang dapat diakses)&lt;/li&gt;
&lt;li&gt;Akun TestSprite — daftar di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Langkah 1: Instalasi
&lt;/h2&gt;

&lt;p&gt;Instal TestSprite CLI secara global menggunakan npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi instalasi berhasil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output yang diharapkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testsprite v1.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 2: Login ke Akun Anda
&lt;/h2&gt;

&lt;p&gt;Autentikasi CLI dengan akun TestSprite Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuka browser dan meminta Anda login. Setelah berhasil, sesi akan tersimpan secara lokal.&lt;/p&gt;

&lt;p&gt;Alternatif menggunakan API key (untuk environment CI/CD):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login &lt;span class="nt"&gt;--api-key&lt;/span&gt; YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 3: Inisialisasi Proyek
&lt;/h2&gt;

&lt;p&gt;Masuk ke direktori proyek Anda dan jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
testsprite init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuat file konfigurasi &lt;code&gt;testsprite.config.json&lt;/code&gt; di root proyek:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./testsprite-tests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chromium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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;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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan untuk developer Indonesia:&lt;/strong&gt; Pastikan set &lt;code&gt;locale.country&lt;/code&gt; ke &lt;code&gt;"ID"&lt;/code&gt; dan &lt;code&gt;locale.language&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; agar format angka (Rupiah), tanggal (DD/MM/YYYY), dan timezone (WIB/WITA/WIT) ditangani dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Langkah 4: Jalankan Crawl Pertama
&lt;/h2&gt;

&lt;p&gt;Pastikan aplikasi Anda berjalan, lalu jalankan perintah crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TestSprite akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membuka browser headless&lt;/li&gt;
&lt;li&gt;Men-&lt;em&gt;navigate&lt;/em&gt; setiap halaman aplikasi Anda&lt;/li&gt;
&lt;li&gt;Mendeteksi elemen-elemen interaktif (tombol, form, link)&lt;/li&gt;
&lt;li&gt;Mengidentifikasi user flow utama&lt;/li&gt;
&lt;li&gt;Membuat test case otomatis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proses ini biasanya memakan waktu &lt;strong&gt;5–20 menit&lt;/strong&gt; tergantung ukuran aplikasi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output yang diharapkan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🔍 Crawling http://localhost:3000...
  ✓ Halaman ditemukan: 12
  ✓ User flow terdeteksi: 8
  ✓ Test case di-generate: 47
  ✓ Disimpan ke: ./testsprite-tests/

✅ Crawl selesai! 47 test case berhasil dibuat.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 5: Jalankan Test
&lt;/h2&gt;

&lt;p&gt;Setelah crawl selesai, jalankan test yang telah di-generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau jalankan hanya test tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run &lt;span class="nt"&gt;--suite&lt;/span&gt; checkout
testsprite run &lt;span class="nt"&gt;--file&lt;/span&gt; ./testsprite-tests/login.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output contoh:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🧪 Menjalankan 47 test case...

  ✓ Login dengan kredensial valid (1.2s)
  ✓ Login dengan password salah menampilkan error (0.8s)
  ✓ Halaman produk menampilkan daftar item (2.1s)
  ✓ Filter produk berdasarkan kategori (1.5s)
  ✓ Tambah produk ke keranjang (1.8s)
  ✓ Checkout flow — langkah 1: alamat (2.3s)
  ✓ Checkout flow — langkah 2: pembayaran (2.0s)
  ✗ Format harga Rupiah (konfigurasi locale diperlukan)
  ✓ Halaman profil pengguna (1.1s)

  47 test selesai: 46 berhasil, 1 gagal
  Durasi total: 38.2s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 6: Konfigurasi Lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mengatur Locale Indonesia
&lt;/h3&gt;

&lt;p&gt;Untuk aplikasi yang menarget pengguna Indonesia, tambahkan konfigurasi berikut di &lt;code&gt;testsprite.config.json&lt;/code&gt;:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jakarta"&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;span class="nl"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;720&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;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;p&gt;&lt;strong&gt;Penjelasan setiap field:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kode negara Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bahasa Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"IDR"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rupiah — format &lt;code&gt;Rp 150.000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;numberFormat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Titik sebagai pemisah ribuan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Asia/Jakarta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WIB (UTC+7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Untuk WITA (Kalimantan, Bali, Sulawesi):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Makassar"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk WIT (Maluku, Papua):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jayapura"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mengecualikan Halaman Tertentu
&lt;/h3&gt;

&lt;p&gt;Tambahkan daftar URL yang ingin dilewati saat crawl:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="s2"&gt;"/admin/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/api/*"&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;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;h3&gt;
  
  
  Konfigurasi Autentikasi
&lt;/h3&gt;

&lt;p&gt;Jika aplikasi memerlukan login sebelum crawl:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"loginUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usernameSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passwordSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"submitSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"credentials"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password123"&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;span class="p"&gt;}&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;
  
  
  Langkah 7: Integrasi CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;.github/workflows/testsprite.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TestSprite Integration Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install TestSprite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g testsprite&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start application&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm start &amp;amp;&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wait for app to be ready&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx wait-on http://localhost:3000&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run TestSprite tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite run --ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TESTSPRITE_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TESTSPRITE_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Test Otomatis
&lt;/h3&gt;

&lt;p&gt;Tambahkan langkah ini di workflow untuk auto-update test saat ada perubahan UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update tests jika ada perubahan UI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite update --auto-commit&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perintah CLI Lengkap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perintah&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login ke akun TestSprite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inisialisasi proyek baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite crawl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawl aplikasi dan generate test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan semua test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run --suite &amp;lt;nama&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan test suite tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update test yang rusak karena perubahan UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite report&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tampilkan laporan hasil test terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit konfigurasi proyek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logout dari akun&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mengatasi Error Umum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;Locale assertion failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssertionError: Expected "Rp 150,000" but received "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;numberFormat&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Timezone mismatch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Expected timestamp "14:00 WIB" but found "07:00 UTC"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;timezone&lt;/code&gt; ke &lt;code&gt;"Asia/Jakarta"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Selector not found&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Unable to find element with selector "#submit-btn"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Jalankan &lt;code&gt;testsprite update&lt;/code&gt; untuk memperbarui selector yang berubah.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Authentication failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Login required before crawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Konfigurasi blok &lt;code&gt;auth&lt;/code&gt; di &lt;code&gt;testsprite.config.json&lt;/code&gt; seperti yang dijelaskan di Langkah 6.&lt;/p&gt;




&lt;h2&gt;
  
  
  Langkah Selanjutnya
&lt;/h2&gt;

&lt;p&gt;Setelah berhasil menjalankan test pertama Anda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eksplor Dashboard&lt;/strong&gt; — Lihat laporan visual di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;app.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambah Custom Test&lt;/strong&gt; — Tulis test manual untuk kasus yang tidak terdeteksi otomatis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Monitoring&lt;/strong&gt; — Aktifkan notifikasi email/Slack saat test gagal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan Tim&lt;/strong&gt; — Bagikan akses ke anggota tim melalui dashboard&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sumber Daya Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 Dokumentasi resmi: &lt;a href="https://docs.testsprite.com" rel="noopener noreferrer"&gt;docs.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Komunitas: Forum dan Discord TestSprite&lt;/li&gt;
&lt;li&gt;🐛 Laporkan bug: GitHub Issues&lt;/li&gt;
&lt;li&gt;📧 Support: &lt;a href="mailto:support@testsprite.com"&gt;support@testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Panduan ini merupakan terjemahan dan adaptasi dari dokumentasi resmi TestSprite untuk developer Indonesia. Beberapa bagian disesuaikan dengan konteks pengembangan aplikasi lokal Indonesia.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
    <item>
      <title>Review OKX: Exchange Crypto Terbaik untuk Trader Indonesia di 2026</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:28:30 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/review-okx-exchange-crypto-terbaik-untuk-trader-indonesia-di-2026-23ec</link>
      <guid>https://forem.com/solomid_ledger/review-okx-exchange-crypto-terbaik-untuk-trader-indonesia-di-2026-23ec</guid>
      <description>&lt;h1&gt;
  
  
  Review OKX: Exchange Crypto Terbaik untuk Trader Indonesia di 2026
&lt;/h1&gt;

&lt;p&gt;Saya sudah aktif trading cryptocurrency sejak 2021, dan selama itu saya mencoba berbagai exchange — mulai dari yang lokal sampai internasional. Setelah 2 tahun lebih menggunakan OKX secara aktif, saya merasa sudah cukup berpengalaman untuk menulis review yang jujur dan berguna bagi sesama trader Indonesia.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Artikel ini mengandung referral link OKX. #ad&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa itu OKX?
&lt;/h2&gt;

&lt;p&gt;OKX adalah exchange cryptocurrency global yang berdiri sejak 2017, sebelumnya dikenal sebagai OKEx. Per 2026, OKX melayani lebih dari 50 juta pengguna di 180+ negara dan menjadi salah satu exchange terbesar di dunia berdasarkan volume trading.&lt;/p&gt;

&lt;p&gt;Untuk trader Indonesia, OKX menawarkan akses ke ratusan aset crypto dengan infrastruktur trading yang solid dan biaya yang kompetitif.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yang OKX Lakukan dengan Baik
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Biaya Trading yang Sangat Kompetitif
&lt;/h3&gt;

&lt;p&gt;Ini salah satu keunggulan utama OKX. Dengan struktur biaya &lt;strong&gt;maker 0.10%&lt;/strong&gt; dan &lt;strong&gt;taker 0.15%&lt;/strong&gt;, OKX termasuk paling murah di kelasnya. Untuk trader aktif yang melakukan puluhan transaksi per bulan, perbedaan biaya ini sangat signifikan terhadap profit akhir.&lt;/p&gt;

&lt;p&gt;Sebagai perbandingan, saya pernah menggunakan exchange lain dengan biaya taker 0.2% — selisih 0.05% mungkin terlihat kecil, tapi kalau trading volume Rp 100 juta per bulan, itu berarti penghematan Rp 50.000 per bulan, atau Rp 600.000 per tahun. Lumayan!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Liquidity Tinggi dan Eksekusi Cepat
&lt;/h3&gt;

&lt;p&gt;Order fill rate di OKX sangat baik untuk pair-pair major seperti BTC/USDT, ETH/USDT, dan SOL/USDT. Saya jarang mengalami slippage yang berarti bahkan saat market volatil. Untuk scalper atau day trader Indonesia, ini sangat penting.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fitur Trading yang Lengkap
&lt;/h3&gt;

&lt;p&gt;OKX menyediakan ekosistem trading yang lengkap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spot Trading&lt;/strong&gt;: 500+ pasangan trading tersedia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Futures &amp;amp; Perpetual&lt;/strong&gt;: Leverage hingga 125x (gunakan dengan bijak!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Options Trading&lt;/strong&gt;: Untuk strategi hedging advanced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OKX Earn&lt;/strong&gt;: Staking dan lending untuk passive income&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OKX Wallet&lt;/strong&gt;: Web3 wallet terintegrasi untuk DeFi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jumpstart&lt;/strong&gt;: Akses ke token baru sebelum listing umum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fitur Jumpstart khususnya sangat menarik — beberapa proyek yang listing via Jumpstart memberikan return signifikan bagi early participants.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Antarmuka yang Intuitif
&lt;/h3&gt;

&lt;p&gt;Dibanding beberapa exchange lain yang interface-nya overwhelming, OKX berhasil menyajikan fitur lengkap dengan UI yang relatif bersih. Mode "Simple" tersedia untuk pemula, sementara mode "Advanced" memberikan semua tools yang dibutuhkan trader berpengalaman.&lt;/p&gt;

&lt;p&gt;Aplikasi mobile OKX di Android dan iOS juga sangat responsif — saya sering trading dari HP dan pengalamannya hampir setara dengan desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Keamanan yang Solid
&lt;/h3&gt;

&lt;p&gt;OKX menerapkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two-Factor Authentication (2FA) wajib&lt;/li&gt;
&lt;li&gt;Anti-phishing code&lt;/li&gt;
&lt;li&gt;Whitelist alamat withdrawal&lt;/li&gt;
&lt;li&gt;Cold wallet storage untuk mayoritas aset pengguna&lt;/li&gt;
&lt;li&gt;Dana asuransi $100 juta untuk proteksi pengguna&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selama 2+ tahun, saya tidak pernah mengalami masalah keamanan. Ini penting banget untuk trader Indonesia yang menyimpan aset dalam jumlah signifikan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Siapa di Indonesia yang Paling Diuntungkan?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pemula yang baru mulai:&lt;/strong&gt;&lt;br&gt;
OKX ideal untuk pemula karena interface yang tidak terlalu kompleks, banyak educational content, dan bisa mulai dengan modal kecil (minimal deposit sangat terjangkau).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day trader dan scalper:&lt;/strong&gt;&lt;br&gt;
Liquidity tinggi + biaya rendah = profit lebih optimal. OKX sangat cocok untuk strategi trading aktif.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HODLer jangka panjang:&lt;/strong&gt;&lt;br&gt;
Fitur Earn memungkinkan aset yang sedang di-hold tetap menghasilkan yield. BTC dan ETH bisa di-stake untuk return tambahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trader yang tertarik DeFi:&lt;/strong&gt;&lt;br&gt;
OKX Wallet dan Web3 hub terintegrasi langsung di platform, memudahkan akses ke berbagai protokol DeFi tanpa pindah-pindah wallet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Satu Kritik Jujur
&lt;/h2&gt;

&lt;p&gt;Satu hal yang saya kurang suka dari OKX adalah &lt;strong&gt;customer support yang kadang lambat&lt;/strong&gt; saat peak hours. Ketika market sedang sangat volatile dan banyak user mengajukan tiket sekaligus, response time bisa meningkat dari hitungan menit menjadi beberapa jam.&lt;/p&gt;

&lt;p&gt;Untuk masalah kritis seperti withdrawal stuck atau verifikasi akun, ini bisa menegangkan. OKX perlu meningkatkan kapasitas support team, terutama untuk market Asia yang jam tradingnya padat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cara Daftar OKX (Tutorial Singkat)
&lt;/h2&gt;

&lt;p&gt;Untuk trader Indonesia yang ingin mencoba:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Daftar via link ini untuk mendapatkan welcome bonus: &lt;strong&gt;&lt;a href="https://www.okx.com/join?channelId=ACE532295" rel="noopener noreferrer"&gt;https://www.okx.com/join?channelId=ACE532295&lt;/a&gt;&lt;/strong&gt; (kode: &lt;strong&gt;ACE532295&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Verifikasi email dan nomor HP&lt;/li&gt;
&lt;li&gt;Lengkapi KYC dengan KTP/SIM + selfie (proses 15-30 menit)&lt;/li&gt;
&lt;li&gt;Deposit via transfer bank lokal atau crypto transfer&lt;/li&gt;
&lt;li&gt;Mulai trading!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;OKX adalah exchange yang saya rekomendasikan untuk trader Indonesia di semua level. Kombinasi biaya kompetitif, fitur lengkap, keamanan solid, dan likuiditas tinggi menjadikannya pilihan yang sangat layak.&lt;/p&gt;

&lt;p&gt;Rating saya: &lt;strong&gt;4.5/5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kekurangan minor di customer support tidak cukup untuk mengurangi nilai keseluruhan yang memang sangat baik. Jika Anda belum mencoba OKX, sangat worth it untuk dicoba — terutama dengan welcome bonus yang tersedia via link referral di atas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coba OKX sekarang: &lt;a href="https://www.okx.com/join?channelId=ACE532295" rel="noopener noreferrer"&gt;https://www.okx.com/join?channelId=ACE532295&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>trading</category>
      <category>indonesia</category>
      <category>okx</category>
    </item>
    <item>
      <title>Review TestSprite: Tools Testing Otomatis yang Praktis untuk Developer Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:23:59 +0000</pubDate>
      <link>https://forem.com/solomid_ledger/review-testsprite-tools-testing-otomatis-yang-praktis-untuk-developer-indonesia-3c28</link>
      <guid>https://forem.com/solomid_ledger/review-testsprite-tools-testing-otomatis-yang-praktis-untuk-developer-indonesia-3c28</guid>
      <description>&lt;h1&gt;
  
  
  Review TestSprite: Tools Testing Otomatis yang Praktis untuk Developer Indonesia
&lt;/h1&gt;

&lt;p&gt;Sebagai developer yang sering mengerjakan proyek web, salah satu tantangan terbesar yang saya hadapi adalah &lt;strong&gt;menjaga kualitas integration test&lt;/strong&gt; ketika UI berubah. Setiap kali ada perubahan kecil di frontend, puluhan test bisa langsung gagal — bukan karena bug, tapi karena selector berubah. Ini sangat membuang waktu.&lt;/p&gt;

&lt;p&gt;Beberapa waktu lalu saya mencoba &lt;strong&gt;TestSprite&lt;/strong&gt; (&lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;https://testsprite.com&lt;/a&gt;), sebuah tool testing berbasis AI yang mengklaim bisa generate dan maintain integration test secara otomatis. Artikel ini adalah review jujur berdasarkan pengalaman langsung saya menggunakannya di proyek web lokal Indonesia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform AI testing yang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crawl aplikasi web Anda&lt;/strong&gt; untuk memahami struktur UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate test case otomatis&lt;/strong&gt; berdasarkan user flow yang terdeteksi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-update selector&lt;/strong&gt; ketika ada perubahan UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan CI/CD&lt;/strong&gt; pipeline yang sudah ada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Konsepnya sederhana: Anda tidak perlu menulis test dari scratch. TestSprite yang akan explore aplikasi Anda dan buat test-nya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pengalaman Testing: Proyek E-commerce Lokal
&lt;/h2&gt;

&lt;p&gt;Saya mencoba TestSprite pada proyek e-commerce skala menengah dengan stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Awal
&lt;/h3&gt;

&lt;p&gt;Proses onboarding cukup straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install TestSprite CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite

&lt;span class="c"&gt;# Initialize pada proyek&lt;/span&gt;
testsprite init

&lt;span class="c"&gt;# Run crawl pertama&lt;/span&gt;
testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dalam waktu sekitar &lt;strong&gt;15 menit&lt;/strong&gt;, TestSprite berhasil crawl seluruh halaman aplikasi dan generate &lt;strong&gt;47 test case&lt;/strong&gt; secara otomatis, mencakup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login/logout flow&lt;/li&gt;
&lt;li&gt;Product listing dan filter&lt;/li&gt;
&lt;li&gt;Cart dan checkout process&lt;/li&gt;
&lt;li&gt;Form validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini yang biasanya membutuhkan waktu &lt;strong&gt;2-3 hari&lt;/strong&gt; kalau ditulis manual!&lt;/p&gt;

&lt;h3&gt;
  
  
  Kualitas Test yang Dihasilkan
&lt;/h3&gt;

&lt;p&gt;Mayoritas test yang di-generate cukup solid. TestSprite berhasil mendeteksi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical user journey (checkout flow)&lt;/li&gt;
&lt;li&gt;Edge case pada form input&lt;/li&gt;
&lt;li&gt;Responsive behavior di berbagai viewport&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun ada beberapa test yang terlalu "brittle" dan perlu saya adjust manual — sekitar 8 dari 47 test perlu sedikit penyesuaian.&lt;/p&gt;




&lt;h2&gt;
  
  
  Observasi: Locale Handling di TestSprite
&lt;/h2&gt;

&lt;p&gt;Ini bagian yang paling menarik untuk developer Indonesia. Saya menemukan beberapa hal penting terkait &lt;strong&gt;locale handling&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Format Angka dan Mata Uang (Perlu Perhatian)
&lt;/h3&gt;

&lt;p&gt;Aplikasi saya menggunakan format Rupiah: &lt;strong&gt;Rp 150.000&lt;/strong&gt; (titik sebagai pemisah ribuan, koma untuk desimal).&lt;/p&gt;

&lt;p&gt;TestSprite secara default mengasumsikan format &lt;code&gt;1,000.00&lt;/code&gt; (US format). Ketika test dijalankan dan menemukan teks &lt;code&gt;Rp 150.000&lt;/code&gt;, assertion-nya gagal karena:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected: "Rp 150,000"
Received: "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solusinya saya harus manually configure locale di config file:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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;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;p&gt;Setelah konfigurasi ini, test berjalan normal. Tapi &lt;strong&gt;konfigurasi ini tidak ada di dokumentasi utama&lt;/strong&gt; — saya harus cari sendiri di GitHub issues. Untuk developer Indonesia ini bisa jadi stumbling block awal yang cukup frustrasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Input Non-ASCII: Nama dan Alamat Indonesia
&lt;/h3&gt;

&lt;p&gt;Test case untuk form input alamat pengiriman menunjukkan masalah menarik. Ketika input mengandung karakter seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nama jalan: &lt;em&gt;Jl. Raya Bogor Atas&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Nama kota: &lt;em&gt;Surabaya&lt;/em&gt; (tidak ada masalah)&lt;/li&gt;
&lt;li&gt;Tapi: &lt;em&gt;Jl. H. Mulyadi&lt;/em&gt; — tanda titik setelah "H" kadang memicu false positive di validasi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TestSprite mendeteksi &lt;code&gt;H.&lt;/code&gt; sebagai akhir kalimat, bukan singkatan nama. Ini &lt;strong&gt;bug kecil tapi relevan&lt;/strong&gt; untuk aplikasi yang target user-nya Indonesia.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Format Tanggal (Baik)
&lt;/h3&gt;

&lt;p&gt;Untuk format tanggal, TestSprite cukup fleksibel. Aplikasi saya menggunakan format &lt;code&gt;DD/MM/YYYY&lt;/code&gt; (standar Indonesia), dan TestSprite berhasil handle dengan baik setelah locale di-set. Tidak ada false positive yang ditemukan.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Timezone: WIB/WITA/WIT
&lt;/h3&gt;

&lt;p&gt;Indonesia punya 3 timezone (WIB, WITA, WIT). TestSprite default ke UTC. Ketika test melibatkan timestamp atau deadline, ada beberapa test yang gagal karena timezone mismatch — terutama pada fitur yang menampilkan "batas waktu order hari ini".&lt;/p&gt;

&lt;p&gt;Ini perlu workaround manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Di test config&lt;/span&gt;
&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Asia/Jakarta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// WIB&lt;/span&gt;
&lt;span class="c1"&gt;// atau&lt;/span&gt;
&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Asia/Makassar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// WITA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perbandingan Dengan Pendekatan Manual
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspek&lt;/th&gt;
&lt;th&gt;Manual Testing&lt;/th&gt;
&lt;th&gt;TestSprite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Waktu setup awal&lt;/td&gt;
&lt;td&gt;2-3 hari&lt;/td&gt;
&lt;td&gt;15-30 menit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test coverage&lt;/td&gt;
&lt;td&gt;Tergantung QA skill&lt;/td&gt;
&lt;td&gt;Comprehensive otomatis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;High (update manual)&lt;/td&gt;
&lt;td&gt;Auto-update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locale Indonesia&lt;/td&gt;
&lt;td&gt;Full control&lt;/td&gt;
&lt;td&gt;Perlu konfigurasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positive&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;~15% perlu adjust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Salary QA&lt;/td&gt;
&lt;td&gt;SaaS subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah &lt;strong&gt;tool yang genuinely useful&lt;/strong&gt;, terutama untuk tim kecil yang tidak punya dedicated QA engineer. Kemampuan auto-generate dan auto-maintain test sangat menghemat waktu.&lt;/p&gt;

&lt;p&gt;Untuk &lt;strong&gt;developer Indonesia&lt;/strong&gt;, ada beberapa catatan penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Setup cepat dan mudah&lt;/li&gt;
&lt;li&gt;✅ Coverage otomatis sangat baik&lt;/li&gt;
&lt;li&gt;✅ Format tanggal DD/MM/YYYY handled dengan baik&lt;/li&gt;
&lt;li&gt;⚠️ Format Rupiah perlu konfigurasi manual&lt;/li&gt;
&lt;li&gt;⚠️ Timezone WIB/WITA/WIT perlu workaround&lt;/li&gt;
&lt;li&gt;⚠️ Input dengan singkatan nama Indonesia kadang bermasalah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall rating: &lt;strong&gt;4/5&lt;/strong&gt; — Sangat direkomendasikan dengan catatan perlu sedikit konfigurasi tambahan untuk use case Indonesia.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Artikel ini ditulis berdasarkan pengalaman langsung menggunakan TestSprite pada proyek nyata. Coba TestSprite di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;https://testsprite.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
