← Kembali ke Portofolio

Bejagung — Community Management Platform

Kunjungi Proyek →

Everything used to be recorded in handwritten notebooks. bejagung.web.id was born from a real need: designing and building a unified web platform now used to manage RT residents, prayer group finances, haul genealogy data, and local UMKM business profiles — all in one system with a multi-tenant architecture.

Architecture

Built on the Inertia.js SPA pattern — Laravel 12 on the backend paired with React 19 + TypeScript on the frontend, with no separate REST API. On top of this sits a multi-tenant system supporting three data isolation strategies (shared table, separate database, schema) within a single codebase, without changing business logic across models.

The hardest technical challenge: designing a financial system where data cannot be deleted. Every correction generates a void + reversal entry — preserving full data integrity and audit trail, following professional accounting standards.

Highlights

  • 🏗️ Multi-tenant — one codebase, three data isolation strategies (shared table / separate database / schema)
  • 📒 Immutable financial ledger — corrections via void-reversal, never delete, full audit trail
  • Real-time — WebSocket powered by Laravel Reverb, no paid third-party services
  • 🔐 Granular RBAC — per-feature permissions using Spatie Laravel Permission
  • 📱 PWA — browser push notifications, offline mode, installable

Modules

Module Function
RT Resident records, announcements, dues, community programs
Nariyah Prayer attendance, dues, auditable cash ledger, arisan
Haul Family genealogy tree, haul donations, data moderation
UMKM Local business landing pages per tenant

Tech Stack

Layer Technology
Backend Laravel 12, PHP 8.2, Inertia.js
Frontend React 19, TypeScript, Tailwind CSS v4
UI Components Radix UI, Lucide Icons
Real-time Laravel Reverb (WebSocket)
Auth & Access Spatie Laravel Permission (RBAC)
Multi-tenancy Custom (shared table / DB / schema)
Build Tool Vite
Progressive Web App PWA, push notifications, offline mode