Next.js (App Router) + Firebase (Auth, Firestore, Storage) + Tailwind CSS. Mongolian UI for the XIV National Computer Network Olympiad registration flow.
- Email/password authentication; user role (
user|admin) stored in Firestoreusers/{uid}. /dashboard: registration form, multiple PDF uploads to Storage, one submission per user (submissions/{uid}), statuspendingby default./admin: admin-only list of submissions, approve/reject, PDF links.- Home page with countdown to 30 April 2026 (registration deadline context) and official copy.
- Firestore and Storage security rules under
firebase/.
- Node.js 20+
- A Firebase project with Authentication (Email/Password), Firestore, and Storage enabled.
-
Clone / open the project
cd network-olympiad npm install -
Environment variables
Copy
.env.exampleto.env.localand fill in values from Firebase Console → Project settings → Your apps → Web app.cp .env.example .env.local
-
Deploy security rules
Install Firebase CLI if needed:
npm i -g firebase-toolsthenfirebase login.Either paste
firebase/firestore.rulesandfirebase/storage.rulesinto the Firebase Console (Firestore → Rules, Storage → Rules), or use afirebase.jsonthat points at these files and runfirebase deploy --only firestore:rules,storage. -
Create an admin user
- Register a normal account via
/register. - In Firebase Console → Firestore →
users→ open that user’s document and setroletostringvalueadmin.
- Register a normal account via
-
Firestore index (if prompted)
The admin page queries
submissionswithorderBy('submittedAt', 'desc'). If the console asks for a composite index, click the link it provides to create it (single-fieldsubmittedAtis usually auto-indexed).
npm run devOpen http://localhost:3000.
npm run build
npm start- Push the repo to GitHub/GitLab.
- Import the project in Vercel.
- Add the same
NEXT_PUBLIC_FIREBASE_*variables in the project’s Environment Variables. - Deploy.
Ensure Firebase Authorized domains includes your production domain (Authentication → Settings → Authorized domains).
app/— routes (/,/login,/register,/dashboard,/admin)context/AuthContext.tsx— auth state + Firestore profilelib/firebase.ts— Firebase initializationfirebase/firestore.rules,firebase/storage.rules— example rules
PDFs are stored as submissions/{uid}/{timestamp}_{index}_{filename}.
Private / event use — adjust as needed.