sedekah-je: The Community Speedrun Digitizing Devotion
How a high-velocity TypeScript stack and an automated verification pipeline turned fragmented QR codes into Malaysia's digital directory for Islamic giving.
- Sedekah-je solves the "last mile" of digital giving by acting as a crowdsourced discovery directory rather than a payment processor.
- The project utilizes a high-velocity stack featuring Bun, Drizzle ORM, and Next.js to prioritize developer speed and type safety.
- A human-in-the-loop verification pipeline ensures the accuracy of crowdsourced QR codes before they are published to the public directory.
- Client-side QR extraction and Zod-validated geographic bounding boxes prevent malicious or low-quality data from entering the system.
The Friction of Digital Giving
Malaysia boasts one of the highest e-wallet adoption rates in Southeast Asia. Yet, religious charitable giving often hits a physical wall. Donors have the funds and the apps, but they lack the specific QR code for a mosque unless they are standing right in front of it. This is a discovery problem, not a payment problem. Massive fintech applications ignore this highly localized "last mile" of digital infrastructure.
Enter sedekah-je. Built as a community "speedrun," the project sidesteps the regulatory nightmare of becoming a payment processor. Instead, it acts purely as a crowdsourced, verified directory of existing DuitNow QR codes. By focusing strictly on discovery, the maintainers built a solution that digitizes a traditional ecosystem faster than any formal institution could.
Architecture of an Approval
The application is built on a Feature-Based Next.js App Router architecture. The codebase strictly partitions the app/ directory into (admin) and (user) route groups. This separation guarantees that public-facing contribution forms never tangle with the sensitive logic required for reviewing submissions.
When a user submits a QR code, the payload enters a "Pending" state in a Drizzle-managed PostgreSQL database. The core feature of the admin panel is the human-in-the-loop verification pipeline. Admins utilize custom coordinate parsing utilities to handle copy-pasted Google Maps data and perform duplicate checks before final approval.
The Speedrun Stack
The repository description explicitly calls it a "speedrun project." The technical choices reflect a ruthless prioritization of developer velocity. Bun serves as the runtime and package manager, drastically cutting down installation and script execution times. Drizzle ORM provides type-safe SQL queries that bridge the gap between form inputs and the database schema without the overhead of heavier ORMs like Prisma.
sedekah.je is a directory of qr codes of mosques, suraus, or other institutions in malaysia.
To keep the public directory lightning-fast while admins work behind the scenes, the project relies heavily on Next.js's unstable_cache. Complex aggregation queries, like leaderboard rankings and approval rates, are cached and explicitly tagged. When an admin approves a new institution, the system manually invalidates the specific tag, ensuring the public sees fresh data without unnecessary database load.
Crowdsourcing with Guardrails
Crowdsourcing financial routing information is inherently risky. To mitigate spam and ensure accuracy, the project employs several clever guardrails. A custom React hook, useQrExtractionLazy, dynamically imports the heavy ZXing browser library only when an image is selected. It decodes the QR content on the client side, providing immediate feedback and reducing server processing overhead.
On the server, robust Server Actions handle the rest. Submissions are throttled by a cooldown timer, restricting users to a maximum number of daily uploads. Zod schemas strictly validate geographic coordinates to ensure they fall within Malaysia's bounding box, preventing malicious or accidental junk data from polluting the directory.
| Feature | sedekah-je | Fintech Apps | Web3 Charity |
|---|---|---|---|
| Primary Focus | Discovery (Directory) | Payment Processing | Trustless Escrow |
| Onboarding Friction | Zero (Crowdsourced) | High (Business KYC) | Very High (Wallets) |
| Transaction Fees | None (Direct P2P) | Variable platform cuts | Gas fees |
| Verification Model | Human-in-the-loop Admin | Corporate Compliance | Smart Contract Logic |