wishan / README.md

WISHAN

A mobile app for buying asset shares

Last updated: 4/16/2026GitHubWishan

WISHAN

Wishan Platform is a digital draw and asset participation system designed to offer users the opportunity to acquire high-value assets such as real estate, luxury vehicles, and watches through a transparent, Sharia-compliant mechanism. Recognizing the need for a secure, scalable, and engaging digital presence, the platform’s founders have decided to develop a comprehensive website and mobile application by outsourcing to a vendor with the required technical expertise.

Problem Statement

This platform will serve as a hub for platform users, providing:

  1. Full access to available and upcoming draws.
  2. Secure wallet management and payment processing.
  3. A robust loyalty and rewards program.
  4. Clear compliance oversight from both legal and Sharia advisors.

The project aims to enhance user engagement through interactive features such as countdown timers, asset reminders, referral programs, and loyalty-based free entries, while ensuring operational transparency through automated, tamper-proof draw mechanisms and clearly defined reporting processes.

Supporting documents

This section includes all documents in the repo, which can be more or less than what is in the template. For example:

  1. Contribution guide
  2. Product brief
  3. Features list
  4. System design
  5. Admin document
  6. API document
  7. Frontend document
  8. Postman collection — import into Postman to exercise the API (see Accessing postman)

Getting started

Pre-requisites

Project setup

Clone the repository

git clone https://github.com/rihal-om/wishan
cd wishan

Running the app locally (Docker Compose)

  1. Run docker-compose to start the application
docker-compose up
# or
make run
  1. Once the application is running, open your browser and navigate to:
# Frontend
http://localhost:3000

Running the app locally (Kubernetes)

Pre-requisites
  • kubectl
  • A local Kubernetes cluster — either:
    • Docker Desktop with Kubernetes enabled (Settings > Kubernetes > Enable)
    • or kind: brew install kind && kind create cluster
Start the app
  1. Build local images and apply manifests
make k8s-dev-up
  1. In a separate terminal, start port-forwarding
make k8s-dev-ports
  1. Access the services:
Stop the app
make k8s-dev-down
Available targets
TargetDescription
make k8s-dev-buildBuild local Docker images (wishan-api:dev, wishan-admin:dev)
make k8s-dev-upBuild images + apply k8s manifests
make k8s-dev-downDelete all k8s dev resources
make k8s-dev-portsPort-forward API, Admin, and MinIO to localhost

Seeding & Cleanup

Seed the database with test data for the admin dashboard (categories, assets, media, draws, tickets, ads, sponsors, invoices, receipts, and a test admin user):

make populate-admin

Remove all seeded data (truncates all related tables):

make cleanup-admin

Other seed commands:

TargetDescription
make populate-usersSeed test users
make populate-adminSeed admin dashboard test data (assets, draws, tickets, ads, sponsors, payments, etc.)
make cleanup-adminTruncate all tables seeded by populate-admin
make populate-notificationsSeed 20 test notifications
make participate DRAW_ID=<id> NUM_PARTICIPANTS=<n>Add participants to a specific draw

Accessing postman

Import docs/api.postman_collection.json into Postman.

Then, before running the requests:

  1. Click on the collection
  2. Click on the Variables tab
  3. Set firebase_api_key to AIzaSyB6MjLCZCN0nSh5Zb4fEI9ENiveafV0ZSU (mentioned here)

The Buy ticket request automatically stores invoice_id and ticket_id as collection variables on a successful response, so the BNPL flow (/bnpl/plans, /bnpl/confirm) and invoice endpoints can reference them via {{invoice_id}} without manual copy-paste.

If you face any issues, reach out to the backend team.

Tech Stack

CategoryToolDescription
FrontendReact Native and ReactUI library/framework
BackendGoServer-side language/framework
AuthenticationFirebaseIAM system
DatabasePostgresRelational/NoSQL DB
Object StorageMinIOS3-compatible object storage for media files
ContainerizationDockerContainer platform

Media Storage with MinIO

The application uses MinIO for storing media files (images, videos, etc.). MinIO is an S3-compatible object storage service that runs in Docker.

MinIO Configuration

MinIO is automatically started with docker-compose up and is configured in api/config.yaml:

minio:
  endpoint: "minio:9000"
  access_key: "minioadmin"
  secret_key: "minioadmin"
  bucket: "wishan-media"
  use_ssl: false
  public_url: "http://localhost:9000"

Accessing MinIO Console

Once the application is running, you can access the MinIO web console at:

Media Upload API

The admin panel provides endpoints for managing media:

  • POST /admin/media - Upload a file (multipart/form-data with file field)
  • GET /admin/media - List all media with pagination
  • PUT /admin/media/:id - Update media metadata (alt text)
  • DELETE /admin/media/:id - Delete media from storage and database

Files are automatically stored in MinIO with public read access, and metadata is saved to PostgreSQL.

Project Team

NameRoleGitHub
Adnan BarakatProject Manager@Adnan3182
Omar Al ShabibiBusiness Analyst@omarshabibi
Mohamed Al-RasbiTech Lead@mohdrasbi
Jishnu KidileUX/UI Designer@jkidile
Maymoona Al BaloshiLead Frontend Dev@MaymoonaAlBoloshi
Sharifa TaimurFrontend Dev@SharifaTaimur
Reem Al QarniFrontend Dev@ireemalqarni
Omar Al SuleimaniBackend Dev@omar-alsuleimani
Ghassan Al KulaibiBackend Dev@Gha5san