Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Fa3liat — Event Management & E-Ticketing Platform

Fa3liat is a production-grade Event Management & E-Ticketing system designed for seamless event organization and secure ticket purchasing. The platform offers a robust backend API, a responsive web dashboard for organizers and attendees, and a specialized mobile application for real-time QR-based ticket validation.

📌 Note for Developers & Reviewers: This repository is a unified workspace designed solely to run the entire project (Backend, Frontend, and Mobile) together smoothly.

If you want to inspect the core codebase, active development, or detailed commits, please visit the official repositories:


📂 Repository Structure

fa3liat/
├── src/
│ ├── backend/ # Express.js API, Prisma ORM, BullMQ Workers
│ ├── frontend/ # React.js Web Application (Vite)
│ └── mobile/ # React Native (Expo) Scanner Application
├── exe/
│ └── app-release.apk # Pre-built Android Scanner App
├── docker-compose.yml # Root orchestration for the entire stack
└── README.md # Project documentation

📥 Project Setup / Clone Repository

This project uses Git Submodules to manage the frontend, backend, and mobile components as separate repositories. This architecture allows each part of the platform to be developed and versioned independently while remaining part of a unified stack.

1. Cloning for the First Time

To clone the main repository and automatically pull all submodule source code in one step:

git clone --recurse-submodules <repo-url>

2. If You Already Cloned (Empty Folders)

If you have already cloned the repository normally and find the src/ subdirectories empty, run the following to initialize and fetch the code:

git submodule update --init --recursive

3. Keeping Submodules Updated

When pulling new changes from the main repository, ensure your submodules are also updated to their latest pinned commits:

git pull origin main
git submodule update --recursive

⚠️ Troubleshooting

  • Empty Folders: If src/backend, src/frontend, or src/mobile are empty after cloning, run the initialization command in Step 2.
  • Submodule Not Updated: If the project fails to build after a pull, your submodules might be out of sync. Run git submodule update --recursive.
  • Detached HEAD Warning: Submodules are pinned to specific commits. It is normal for them to be in a "detached HEAD" state. If you need to make changes within a submodule, remember to git checkout main (or your target branch) inside that specific directory first.

🚀 Quick Start (Docker)

The platform is optimized for Docker. Follow these steps to get started:

Prerequisites

  • Docker and Docker Compose installed.
  • .env files configured in src/backend and src/frontend (use the provided .env.example templates).

1. Configure Environment Files

# (Optional) Docker Compose overrides (ports, profiles)
cp .env.example .env
# Required for Docker + local dev
cp src/backend/.env.example src/backend/.env
cp src/frontend/.env.example src/frontend/.env
# Optional (mobile app)
cp src/mobile/.env.example src/mobile/.env

2. Start the Application

This command builds the images and starts all services (DB, Redis, backend, workers, frontend).

docker compose up -d --build

The application will be available at http://localhost:5173.

Note: the backend container runs prisma migrate reset + seeds the database on startup (development convenience). This wipes existing data in the Docker database volume.

3. Stopping the Application

To stop all running services:

docker compose down

🛠️ Manual Development Setup

Backend Setup

cd src/backend
# 1. Configure .env (ensure PORT=3000)# 2. Install dependencies
npm install
# 3. Setup DB & Generate Client
npm run setup
# 4. Start Server
npm run dev

Frontend Setup

cd src/frontend
npm install
npm run dev

Mobile App Setup (Scanner)

To run the mobile application for ticket scanning:

  1. Download Expo Go: Install the Expo Go app from the Google Play Store or Apple App Store to open our mobile app.
  2. Start the App:
    cd src/mobile
    npm install
    npx expo start
  3. Open the App: Scan the QR code displayed in your terminal using the Expo Go app to start scanning tickets.

🔐 Environment Variables

Backend (src/backend/.env)

VariableDescriptionStandard Value
PORTAPI Server Port3000
DATABASE_URLPostgreSQL URLpostgresql://fa3liat:fa3liat@localhost:5434/fa3liat
REDIS_URLRedis URLredis://localhost:6381
MAIL_HOSTMail SMTP Hostlocalhost
STRIPE_SECRET_KEYStripe Test Keysk_test_...
OLLAMA_BASE_URLAI Engine URLhttp://localhost:11436

Fa3liat — Built with ❤️ for Graduation Project 2026.