{"id":30622454,"url":"https://github.com/useraar/mechack-team-website","last_synced_at":"2025-09-18T13:18:27.450Z","repository":{"id":312158642,"uuid":"1046552849","full_name":"UserAAR/MecHack-Team-Website","owner":"UserAAR","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-17T12:27:25.000Z","size":23011,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-17T12:33:45.743Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://qarabag-mechack.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UserAAR.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-28T21:22:07.000Z","updated_at":"2025-09-17T12:27:28.000Z","dependencies_parsed_at":"2025-09-17T12:25:36.454Z","dependency_job_id":null,"html_url":"https://github.com/UserAAR/MecHack-Team-Website","commit_stats":null,"previous_names":["useraar/mechack-team-website"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/UserAAR/MecHack-Team-Website","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UserAAR%2FMecHack-Team-Website","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UserAAR%2FMecHack-Team-Website/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UserAAR%2FMecHack-Team-Website/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UserAAR%2FMecHack-Team-Website/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UserAAR","download_url":"https://codeload.github.com/UserAAR/MecHack-Team-Website/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UserAAR%2FMecHack-Team-Website/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275772840,"owners_count":25525905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-18T02:00:09.552Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-30T15:40:16.084Z","updated_at":"2025-09-18T13:18:27.444Z","avatar_url":"https://github.com/UserAAR.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Qarabag MecHack Website\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/public/logo/logo.jpg\" alt=\"Qarabag MecHack Logo\" width=\"160\" height=\"160\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://nextjs.org/\" target=\"_blank\"\u003e\u003cimg alt=\"Next.js\" src=\"https://img.shields.io/badge/Next.js-15-black?logo=next.js\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org/\" target=\"_blank\"\u003e\u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://tailwindcss.com/\" target=\"_blank\"\u003e\u003cimg alt=\"Tailwind CSS\" src=\"https://img.shields.io/badge/Tailwind%20CSS-4-38BDF8?logo=tailwindcss\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.framer.com/motion/\" target=\"_blank\"\u003e\u003cimg alt=\"Framer Motion\" src=\"https://img.shields.io/badge/Framer%20Motion-11-0055FF?logo=framer\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://supabase.com/\" target=\"_blank\"\u003e\u003cimg alt=\"Supabase\" src=\"https://img.shields.io/badge/Supabase-Edge%20/%20SSR-3ECF8E?logo=supabase\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://next-intl-docs.vercel.app/\" target=\"_blank\"\u003e\u003cimg alt=\"next-intl\" src=\"https://img.shields.io/badge/next--intl-4-000000\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e A modern, multilingual website for Qarabag MecHack robotics team. It blends performance, accessibility, and delightful motion design with a robust content workflow backed by Supabase.\n\n\n## Table of Contents\n- [Overview](#overview)\n- [Features](#features)\n- [Architecture](#architecture)\n- [Tech Stack](#tech-stack)\n- [Getting Started](#getting-started)\n- [Environment Variables](#environment-variables)\n- [Project Structure](#project-structure)\n- [Internationalization (i18n)](#internationalization-i18n)\n- [Data \u0026 Supabase](#data--supabase)\n- [Styling \u0026 Design System](#styling--design-system)\n- [Animations](#animations)\n- [Quality \u0026 Tooling](#quality--tooling)\n- [Deployment](#deployment)\n- [Troubleshooting](#troubleshooting)\n- [License](#license)\n\n\n## Overview\nQarabag MecHack Website is built with Next.js App Router and TypeScript. It supports English, Azerbaijani and Russian, uses Supabase for content and media, and delivers a premium user experience with subtle motion and polished UI components.\n\n- Multilingual content routing (`/[locale]/*`)\n- Server-first data (static/SSR) with Supabase\n- Admin experiences under `/[locale]/admin/*`\n- Optimized images, responsive layout, and accessible UI\n\n\n## Features\n- UX \u0026 Content\n  - Multilingual pages (EN, AZ, RU) and locale-aware routing\n  - News, events, projects and media library integrations\n  - Responsive, mobile-first layout with shadcn/ui components\n  - SEO-friendly structure, clean URLs and metadata\n- Engineering\n  - Type-safe codebase with TS\n  - App Router (streaming, layouts, server actions ready)\n  - Next middleware for locale and Supabase session refresh\n  - Static generation with per-locale params\n\n\n## Architecture\n- App Router: `website/app` with `/[locale]` segment for localized routes\n- i18n via `next-intl` (middleware + request-time message loading)\n- Supabase clients:\n  - Static server client: `lib/supabase/static.ts`\n  - Browser client for client-side interactions: `lib/supabase/client.ts`\n- Middleware integrates `next-intl` and refreshes Supabase auth cookies per request\n\n\n## Tech Stack\n- Framework: Next.js 15, React 19, TypeScript 5\n- UI: Tailwind CSS 4, shadcn/ui, Radix Primitives\n- Motion: Framer Motion\n- Data: Supabase (Postgres + Storage)\n- i18n: next-intl 4\n\n\n## Getting Started\n1) Requirements\n- Node.js 20 LTS (recommended) or \u003e=18.17\n- npm 9+ (or pnpm/yarn/bun)\n\n2) Install\n```bash\ncd website\nnpm install\n```\n\n3) Configure environment\nCreate `website/.env.local`:\n```env\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\n# Optional\nNEXT_PUBLIC_SITE_URL=http://localhost:3000\n```\n\n4) Run\n```bash\nnpm run dev\n# open http://localhost:3000\n```\n\n5) Build \u0026 start\n```bash\nnpm run build\nnpm start\n```\n\n\n## Environment Variables\nThe website uses only public Supabase keys on the client side. Put the following into `website/.env.local`:\n```env\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\n```\nOptional:\n```env\nNEXT_PUBLIC_SITE_URL=https://your-domain.com\n```\n\u003e Do not expose service role keys in the frontend.\n\n\n## Project Structure\n```\nwebsite/\n├─ app/\n│  ├─ [locale]/\n│  │  ├─ admin/              # Admin interfaces\n│  │  ├─ news/               # News listing \u0026 details\n│  │  ├─ events/             # Events\n│  │  ├─ projects-events/    # Projects/Events hub\n│  │  ├─ layout.tsx          # Locale layout\n│  │  ├─ page.tsx            # Home (per-locale)\n│  │  └─ HomeClient.tsx      # Home client UI\n│  ├─ api/                   # Route handlers\n│  ├─ favicon.ico\n│  ├─ globals.css\n│  └─ layout.tsx             # Root layout\n├─ components/\n│  ├─ admin/                 # Admin UI pieces\n│  ├─ shared/                # Shared feature components\n│  └─ ui/                    # shadcn/ui\n├─ i18n/\n│  └─ request.ts             # i18n loader\n├─ lib/\n│  └─ supabase/              # Supabase clients\n├─ messages/                 # i18n translation files (en/az/ru)\n├─ public/                   # Static assets (logo, news, sponsors, video)\n├─ middleware.ts             # next-intl + Supabase cookies refresh\n├─ next.config.ts\n├─ package.json\n├─ postcss.config.mjs\n├─ tsconfig.json\n└─ README.md\n```\n\n\n## Internationalization (i18n)\n- Locales: `en`, `az`, `ru`\n- Middleware enforces locale prefix (`/en`, `/az`, `/ru`)\n- Messages are loaded in `i18n/request.ts` from `messages/\u003clng\u003e.json`\n\nAdd a new language:\n1. Create `messages/\u003clng\u003e.json`\n2. Add the locale to `middleware.ts` locales array\n3. Provide translations for required namespaces/keys\n\n\n## Data \u0026 Supabase\n- Server/static fetches use `getSupabaseStaticClient()` from `lib/supabase/static.ts`\n- Client interactions use `getSupabaseBrowserClient()` in `lib/supabase/client.ts`\n- Auth cookies are refreshed in `middleware.ts`\n\nSchema\n- See `website/supabase.sql` for SQL helpers/tables (import via Supabase SQL Editor)\n- Common tables: `news`, `events`, `projects` (+ localized variants like `news_az`)\n\nContent rules\n- Visibility is controlled by `published_at` (filtering/sorting)\n- Displayed date for news is `created_at`\n\n\n## Styling \u0026 Design System\n- Tailwind CSS 4 with CSS variables for brand colors (see `app/globals.css`)\n- shadcn/ui + Radix primitives for accessible UI\n- Consistent spacing, rounded corners, and elevation tokens\n\nTheming\n- Brand palette is defined via CSS variables\n- Image domains are configured in `next.config.ts`\n\n\n## Animations\n- Framer Motion is used for subtle page and component transitions\n- Keep animations performant: avoid heavy layouts, prefer transform/opacity\n- Respect users with reduced motion preferences where applicable\n\n\n## Quality \u0026 Tooling\nScripts\n```bash\nnpm run dev       # Start dev server\nnpm run build     # Production build\nnpm run start     # Start production server\nnpm run lint      # ESLint\n```\n\nConventions\n- TypeScript-first; avoid `any` unless necessary\n- Small, focused components; prefer composition\n- Early returns, clear naming, minimal nesting\n- Accessibility: label interactive elements and ensure keyboard support\n\n\n## Deployment\nVercel (recommended)\n1. Push to your repository\n2. Import project on Vercel\n3. Add environment variables\n4. Deploy\n\nManual\n```bash\nnpm run build\nnpm start\n```\n\n\n## Troubleshooting\n- Blank images: ensure the image host is whitelisted in `next.config.ts`\n- i18n 404: verify locale prefixes and `middleware.ts` configuration\n- Supabase auth state not persisting: check cookies; middleware must run on page routes\n- Env vars not loading: confirm `.env.local` exists under `website/` and values are set\n\n\n## License\nMIT © Qarabag MecHack\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuseraar%2Fmechack-team-website","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuseraar%2Fmechack-team-website","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuseraar%2Fmechack-team-website/lists"}