Fields & Floors Collectors
eBay에서 번호가 매겨진 스포츠 카드들을 인쇄본·사인·신인 여부·가격으로 검색하고, 검색을 저장해 새 카드가 등록되면 이메일 알림을 받는다
ناسِك은 하즈·우므라 캠페인을 한 곳에 모은 오만 플랫폼으로, 인증 캠페인·가격·서비스·평가를 확인하고 안심하고 예약할 수 있다
ناسِك — منصة عُمانية تجمع حملات الحج والعمرة في مكان واحد. اكتشف الحملات المعتمدة، واطّلع على الأسعار والخدمات والتقييمات، واحجز رحلتك بثقة.
커머스TypeScript · PLpgSQLGitHub @zhrjabri온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Omani platform connecting Hajj & Umrah campaign operators with pilgrims — customer, owner and admin applications.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An Omani digital platform that brings Hajj and Umrah campaigns together in one place.
NASEK connects licensed campaign operators with pilgrims: operators publish their trips,
manage bookings and answer reviews; pilgrims search, compare and book with confidence.
The platform is bilingual throughout — Arabic (RTL) and English (LTR) — and is built as
three separate applications for three separate audiences.README 전문 보기 ↗An Omani digital platform that brings Hajj and Umrah campaigns together in one place.
NASEK connects licensed campaign operators with pilgrims: operators publish their trips, manage bookings and answer reviews; pilgrims search, compare and book with confidence. The platform is bilingual throughout — Arabic (RTL) and English (LTR) — and is built as three separate applications for three separate audiences.
| Application | Audience | URL |
|---|---|---|
| Customer Platform | Pilgrims | https://nasek.vercel.app/ |
| Campaign Owner Portal | Campaign operators | https://nasek-owner.vercel.app/ |
| Admin Portal | NASEK administration | https://nasek-admin.vercel.app/ |
These are three separate applications on three separate origins, and that is a deliberate architectural decision rather than a deployment convenience. Each has its own build, its own entry point and its own host. A pilgrim's browser downloads no route, component or string belonging to the other two, and the public site carries no link to either — not in the navbar, not in the footer, not on the sign-in page.
That isolation is asserted against the built bundles rather than trusted:
npm run verify:isolation reads the compiled output and fails if owner or administration
code has leaked into the customer build.
The links above are for this repository's readers. They are intentionally not published anywhere on the customer website.
Browse and filter campaigns · Smart Match questionnaire · interactive map of Oman · NASEK Giving · save campaigns · booking flow · customer dashboard (bookings, saved trips, notifications, profile).
Sign-in is email plus an 8-digit one-time code — no password to choose, forget or reuse. Signing in for the first time creates the account, so there is no separate registration.
A separate portal for campaign operators. An owner either registers there (pending until an administrator approves the permit) or is created by an administrator with a temporary password. Sign-in is email plus password; the company phone is contact information only.
Company profile · campaign management (create, edit, publish, withdraw) · bookings · customers · reviews and replies · notifications · analytics. Changes to verified company details are submitted as a proposal for administrative review rather than written directly.
A separate administration application behind its own Admin Access authentication.
Campaign approvals · campaign owner and provider management · profile-change approvals · bookings and reviews oversight · notifications · platform administration. Administrative decisions are recorded with who made them and when.
| Layer | Technology |
|---|---|
| UI | React 19 · React Router 7 |
| Language | TypeScript 5.7 |
| Build | Vite 6 — one shared config, four entry points |
| Styling | Tailwind CSS 4 via @tailwindcss/vite |
| Icons | lucide-react |
| Charts | Recharts |
| Backend | Supabase — Postgres, Auth, Row-Level Security, Edge Functions |
| Hosting | Vercel — three projects, one repository |
| CI | GitHub Actions — typecheck, build, verification suite |
Verification runs under jsdom. There is no test-runner dependency: each check is a script built with Vite in SSR mode and executed with Node.
├── index.html Customer entry
├── owner.html Campaign Owner Portal entry
├── admin.html Admin Portal entry
├── harness.html Visual harness — development only, never deployed
├── vite.config.ts One config per application, sharing vite.shared.ts
├── vite.owner.config.ts
├── vite.admin.config.ts
├── vite.harness.config.ts
│
├── src/
│ ├── pages/ Customer screens
│ ├── owner/ Campaign Owner Portal
│ ├── admin/ Admin Portal
│ ├── components/ Shared UI, including the design system in components/ui
│ ├── services/ Supabase client, auth, data access, AI features
│ ├── store/ Application state
│ ├── hooks/ Shared React hooks
│ ├── i18n/ Arabic and English dictionaries, one per application
│ ├── data/ Static reference data (governorates, services)
│ └── harness/ Visual harness — development only, never deployed
│
├── supabase/
│ ├── migrations/ Schema, policies and functions, in order
│ └── functions/ Edge Functions
│
├── scripts/ Verification and maintenance scripts
└── docs/ DATA-MODEL.md · SUPABASE.md · DEPLOYMENT.md
git clone https://github.com/zhrjabri/Nasek.git
cd Nasek
npm install
cp .env.example .env
.env.example is committed, holds no secrets, and documents every variable the
applications read. Fill in your own Supabase project values — .env is git-ignored and
must never be committed.
Each application has its own port, and the port is fixed rather than incremental because sign-in redirect URLs are registered against it.
npm run dev # Customer Platform http://localhost:5173
npm run dev:owner # Campaign Owner Portal http://localhost:5175
npm run dev:admin # Admin Portal http://localhost:5174
npm run harness # Visual harness http://localhost:5177
npm run typecheck # TypeScript, no emit
npm run build # typecheck + build all three applications
npm run verify # the full verification suite
Individual checks can be run on their own — for example npm run verify:isolation
(no cross-application code leaks), npm run verify:render (every screen draws its first
frame), npm run verify:auth, npm run verify:admin. Run npm run to list them all.
To preview a production build locally: npm run preview, npm run preview:owner,
npm run preview:admin.
No secret belongs in this repository. .env is git-ignored and is never committed;
.env.example documents the variable names and contains no values.
Configure the following as environment variables locally, and as deployment secrets in Vercel, Supabase and GitHub Actions:
VITE_-prefixed variableOnly the Supabase anon/publishable key belongs in a client build, and only because row-level security is what actually protects the data — every policy is evaluated in Postgres before a row is returned.
Anything prefixed VITE_ is inlined into the JavaScript bundle at build time and is
therefore public. Treat it accordingly.
If a secret is ever committed, rotate it first and rewrite history second. Removing the file alone does not revoke the key.
push to main → GitHub Actions: typecheck · build all three · verification suite
→ Vercel builds each application from the same commit
| Application | Vercel deployment |
|---|---|
| Customer Platform | https://nasek.vercel.app |
| Campaign Owner Portal | https://nasek-owner.vercel.app |
| Admin Portal | https://nasek-admin.vercel.app |
Three Vercel projects build from one repository, each with its own entry point, output directory and environment. The GitHub Actions workflow verifies; it does not deploy.
See docs/DEPLOYMENT.md for the full procedure.
All three applications share one design system — the same tokens in src/index.css and
the same components in src/components/ui. What differs between them is density:
44px on the customer site, 40px in the owner portal, 36px in administration.
Six tiers, no two sharing a visual weight:
| Tier | Role | Treatment |
|---|---|---|
| Primary | The next step | Filled deep green with a gold rule inset along the bottom |
| Secondary | A real alternative | A frame, never a fill |
| Tertiary — the Gold Rule | Onward links | Text, an arrow, and a gold rule that grows on hover |
| Icon | No room for a word | A ring that fills when active |
| Destructive | Irreversible | A red hairline that fills only on hover — obvious, never aggressive |
| Approval | The affirming act | Gold, so approve and refuse are separable across a table |
Palette: deep manuscript green, antique gold, and a cool ivory ground. Arabic is set in Kufi and English in Plus Jakarta Sans, with Cormorant Garamond for display.
| Document | Contents |
|---|---|
docs/DATA-MODEL.md | Tables, relationships and row-level security policies |
docs/SUPABASE.md | Project setup, migrations, Edge Functions, auth configuration |
docs/DEPLOYMENT.md | Build and deployment procedure for all three applications |
NASEK is in active development. Identity, sessions, roles and authorisation run on Supabase Auth and Postgres row-level security; the campaign catalogue, bookings and moderation decisions are served from Postgres.
Payments are not implemented. No card details are collected and no money moves; a production launch requires a licensed Omani payment gateway with server-side booking creation. NASEK Giving is described in the interface but cannot accept funds.
NASEK · ناسك · Made in Oman