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.

khrnchn/sedekah-je

A wide shot of a traditional mosque archway with a glowing QR code floating in the center, connected by thin digital lines to smartphones held by people below. It illustrates the bridging of traditional physical giving with digital accessibility.
Bridging the physical gap: sedekah-je solves discovery, not payments.

Key Takeaways

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 lifecycle of a QR code submission from user device to the public directory.

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.

khrnchn, Project Creator and Maintainer · khrnchn/sedekah-je: speedrun project

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.

Featuresedekah-jeFintech AppsWeb3 Charity
Primary FocusDiscovery (Directory)Payment ProcessingTrustless Escrow
Onboarding FrictionZero (Crowdsourced)High (Business KYC)Very High (Wallets)
Transaction FeesNone (Direct P2P)Variable platform cutsGas fees
Verification ModelHuman-in-the-loop AdminCorporate ComplianceSmart Contract Logic