{"id":14991042,"url":"https://github.com/msanvarov/personal-portfolio","last_synced_at":"2025-04-07T17:08:59.697Z","repository":{"id":37024560,"uuid":"182603171","full_name":"msanvarov/personal-portfolio","owner":"msanvarov","description":"🌐 react next.js app for personal portfolio","archived":false,"fork":false,"pushed_at":"2025-03-28T16:23:47.000Z","size":68649,"stargazers_count":55,"open_issues_count":3,"forks_count":28,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-31T14:14:36.230Z","etag":null,"topics":["contentful","cv","nextjs","portfolio","portfolio-website","react","starter-template"],"latest_commit_sha":null,"homepage":"https://sal-anvarov.com","language":"SCSS","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/msanvarov.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}},"created_at":"2019-04-22T01:37:38.000Z","updated_at":"2025-03-23T05:32:28.000Z","dependencies_parsed_at":"2023-02-06T11:15:54.212Z","dependency_job_id":"f54921c1-6bdc-4ffa-afbe-4a9aaa059503","html_url":"https://github.com/msanvarov/personal-portfolio","commit_stats":{"total_commits":366,"total_committers":5,"mean_commits":73.2,"dds":"0.28415300546448086","last_synced_commit":"f60d2ffd516ac720b14b24fbdf37156b9091762a"},"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msanvarov%2Fpersonal-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msanvarov%2Fpersonal-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msanvarov%2Fpersonal-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msanvarov%2Fpersonal-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/msanvarov","download_url":"https://codeload.github.com/msanvarov/personal-portfolio/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247694876,"owners_count":20980733,"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","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":["contentful","cv","nextjs","portfolio","portfolio-website","react","starter-template"],"created_at":"2024-09-24T14:21:21.997Z","updated_at":"2025-04-07T17:08:59.671Z","avatar_url":"https://github.com/msanvarov.png","language":"SCSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eSal's Personal Portfolio Website\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://sal-anvarov.com/\" target=\"blank\"\u003e\u003cimg src=\"./apps/personal-portfolio/public/assets/thumbnails/website.png\" width=\"320\" alt=\"portfolio website\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eA modern \u003ca href=\"https://www.nextjs.org\" target=\"blank\" rel=\"noreferrer noopener\"\u003eNext.js\u003c/a\u003e portfolio website built with 💙 and ☕ by Sal Anvarov. \u003ca href=\"https://www.sal-anvarov.com\" target=\"blank\" rel=\"noreferrer noopener\"\u003eDeployed\u003c/a\u003e with \u003ca href=\"https://www.hotjar.com/\" target=\"blank\" rel=\"noreferrer noopener\"\u003eHotJar\u003c/a\u003e, \u003ca href=\"https://tagmanager.google.com/#/home\" target=\"blank\" rel=\"noreferrer noopener\"\u003eGTM\u003c/a\u003e, and \u003ca href=\"https://formspree.io/\" target=\"blank\" rel=\"noreferrer noopener\"\u003eFormspree\u003c/a\u003e tools for analytics and form tracking.\n\u003c/p\u003e\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fmsanvarov%2Fpersonal-portfolio\u0026env=ENABLE_TRACKING,HOTJAR_WEBSITE_UID,HOTJAR_VERSION,GOOGLE_TAG_MANAGER_UID,MICROSOFT_CLARITY_UID,DEBUGBEAR_RUM_UID\u0026envDescription=Environment%20Configs%20for%20Website\u0026envLink=https%3A%2F%2Fgithub.com%2Fmsanvarov%2Fpersonal-portfolio%23-environment-configuration\u0026project-name=personal-portfolio\u0026repository-name=personal-portfolio\u0026redirect-url=https%3A%2F%2Fgithub.com%2Fmsanvarov%2Fpersonal-portfolio\u0026demo-title=Sal's%20Personal%20Website\u0026demo-url=https%3A%2F%2Fwww.sal-anvarov.com\u0026demo-image=https%3A%2F%2Fwww.sal-anvarov.com%2Fassets%2Fthumbnails%2Fwebsite.png)\n\n\u003e Remark: Deploying on Vercel will **FAIL** as **Nx** has the output directory as **dist** on builds by default. To fix this - navigate to the **Build and Development Settings** and change the **Output Directory** to `dist/apps/personal-portfolio/.next`. Documentation: https://vercel.com/docs/deployments/configure-a-build#build-and-development-settings\n\nTable of Contents:\n\n1. [Description](#-description)\n2. [Prerequisites](#%EF%B8%8F-prerequisites)\n3. [Deployment](#-deployment)\n4. [Environment Configuration](#-environment-configuration)\n5. [Repository Files and Folders](#-repository-files-and-folders)\n6. [Testing](#-testing)\n\n🔎 This repo was created with [Nx](https://nx.dev/).\n\n### 📚 Description\n\nPreview: https://www.sal-anvarov.com/\n\nThis portfolio website was built with ease of extensibility in mind. This app comes with **MDX** for case-studies and blog management and **Bootstrap** for styling. The app has redux state management via **Redux Toolkit** and **React Hooks**.\n\n\u003e Remark: Given **App Router** is not fully stable, I opted to stay with **Pages Router** until further notice. The plan is to eventually migrate to **App Router**.\n\n---\n\n### 🛠️ Prerequisites\n\n#### Tracking Tools\n\n- [HotJar](https://www.hotjar.com/)\n- [Google Analytics](https://www.marketingplatform.google.com)\n- [Microsoft Clarity](https://clarity.microsoft.com)\n- [DebugBear RUM](https://www.debugbear.com/docs/rum/real-user-monitoring)\n- [Vercel Analytics](https://vercel.com/docs/analytics/quickstart)\n\n#### Non Docker\n\n- Please make sure to have [Node.js](https://nodejs.org/en/download/) (16+) locally by downloading the Javascript runtime via `brew`, `choco`, or `apt-get`.\n\n#### Docker 🐳\n\n- Please make sure to have [Docker Desktop](https://www.docker.com/products/docker-desktop/) operational to quickly compose the required dependencies. Then follow the docker procedure outlined below.\n\n---\n\n### 🚀 Deployment\n\n#### Manual Deployment without Docker\n\n- Clone the repo via `git clone https://github.com/msanvarov/personal-portfolio`.\n\n- Navigate to the root directory of repo via `cd personal-portfolio`.\n\n- Download dependencies via `npm i` or `yarn`.\n\n- Create a **.env file** via the `cp apps/personal-portfolio/.env.example .env` command and replace the example environment variables with valid ones.\n\n- Start the app in development mode via `npm run start` (the app will be exposed on http://localhost:4200; not to conflict with the default React, Angular, or Vue ports).\n\n\u003e Remark: In the docker deployment, the UI is automatically started and served by the API.\n\n#### Deploying with Docker 🐳\n\n[Open in Docker Dev Environments \u003cimg src=\"assets/open-link.svg\" alt=\"Open in Docker Dev Environments\" align=\"top\"/\u003e](https://open.docker.com/dashboard/dev-envs?url=https://github.com/msanvarov/personal-portfolio/tree/master)\n\n- Execute the following command in-app directory:\n\n```bash\n# creates and loads the docker container in detached mode with the required configuration\n$ docker-compose up -d\n```\n\n- The following command will download dependencies and execute the web application on http://localhost:80 (deployed behind a Nginx reverse proxy).\n\n---\n\n### 🔒 Environment Configuration\n\nBy default, the application comes with a config module that can read in every environment variable from the `.env` file.\n\n**APP_ENV** - the application environment to execute as, either in development or production. Determines the type of logging options to utilize. Options: `development` or `production`.\n\n**ENABLE_TRACKING** - enables tracking tools. Options: `true` or `false`.\n\n**HOTJAR_WEBSITE_UID** - hotjar website uid, requires a HotJar account (**free**)\n\n**HOTJAR_VERSION** - hotjar version\n\n**GOOGLE_TAG_MANAGER_UID** - google tag manager uid, requires google analytics to be onboarded.\n\n**MICROSOFT_CLARITY_UID** - microsoft clarity uid, manages heatmaps and events. requires a Microsoft account (**free**)\n\n\u003e Remark: DebugBear can be easy onboarded via [Vercel](https://vercel.com/integrations/debugbear)\n\n**DEBUGBEAR_RUM_UID** - debugbear real user monitoring (RUM) uid, requires DebugBear to be onboarded (**free**).\n\n---\n\n### 📁 Repository Files and Folders\n\n```text\n.\n├── Dockerfile\n├── README.md\n├── apps\n│   ├── personal-portfolio\n│   │   ├── case-studies\n│   │   ├── index.d.ts\n│   │   ├── jest.config.ts\n│   │   ├── next-env.d.ts\n│   │   ├── next.config.js\n│   │   ├── pages\n│   │   ├── posts\n│   │   ├── project.json\n│   │   ├── public\n│   │   ├── tests\n│   │   ├── tsconfig.json\n│   │   ├── tsconfig.spec.json\n│   │   └── utils\n│   └── personal-portfolio-e2e\n│       ├── cypress.config.ts\n│       ├── project.json\n│       ├── src\n│       └── tsconfig.json\n├── assets\n│   └── open-link.svg\n├── compose.yaml\n├── dist\n│   └── apps\n│       └── personal-portfolio\n├── jest.config.ts\n├── jest.preset.js\n├── libs\n│   ├── core-components\n│   │   ├── README.md\n│   │   ├── project.json\n│   │   ├── src\n│   │   ├── tsconfig.json\n│   │   └── tsconfig.lib.json\n│   └── store\n│       ├── README.md\n│       ├── project.json\n│       ├── src\n│       ├── tsconfig.json\n│       └── tsconfig.lib.json\n├── nx.json\n├── package-lock.json\n├── package.json\n├── tools\n│   └── tsconfig.tools.json\n└── tsconfig.base.json\n```\n\n---\n\n### ✅ Testing\n\n#### Docker 🐳\n\n```bash\n# Start the docker container if it's not running\n$ docker start frontend\n\n# unit tests\n$ docker exec -it frontend npm run test\n\n```\n\n#### Non-Docker\n\n```bash\n# execute test\n$ npm run test\n```\n\n---\n\n### 🏗️ Progress\n\n|                                                            Branches | Status |\n| ------------------------------------------------------------------: | :----- |\n|             [main](https://github.com/msanvarov/personal-portfolio) | ✅     |\n| [feat/\\*](https://github.com/msanvarov/personal-portfolio/branches) | 🚧     |\n\n\u003c!-- \u003e Remark: This template was employed to create a [Real World example app](https://github.com/gothinkster/realworld) on [Github](). --\u003e\n\n---\n\n### 👥 Help\n\nPRs are appreciated, I fully rely on the passion ❤️ of the OS developers.\n\n---\n\n## License\n\nThis personal portfolio website is [MIT licensed](LICENSE).\n\n[Author](https://linkedin.com/in/sal-anvarov)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsanvarov%2Fpersonal-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmsanvarov%2Fpersonal-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsanvarov%2Fpersonal-portfolio/lists"}