A modern Next.js portfolio website built with 💙 and ☕ by Sal Anvarov. Deployed with HotJar, GTM, and Formspree tools for analytics and form tracking.
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
Table of Contents:
🔎 This repo was created with Nx.
Preview: https://www.sal-anvarov.com/
This 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.
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.
- Please make sure to have Node.js (16+) locally by downloading the Javascript runtime via
brew
,choco
, orapt-get
.
- Please make sure to have Docker Desktop operational to quickly compose the required dependencies. Then follow the docker procedure outlined below.
-
Clone the repo via
git clone https://github.com/msanvarov/personal-portfolio
. -
Navigate to the root directory of repo via
cd personal-portfolio
. -
Download dependencies via
npm i
oryarn
. -
Create a .env file via the
cp apps/personal-portfolio/.env.example .env
command and replace the example environment variables with valid ones. -
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).
Remark: In the docker deployment, the UI is automatically started and served by the API.
Open in Docker Dev Environments
- Execute the following command in-app directory:
# creates and loads the docker container in detached mode with the required configuration
$ docker-compose up -d
- The following command will download dependencies and execute the web application on http://localhost:80 (deployed behind a Nginx reverse proxy).
By default, the application comes with a config module that can read in every environment variable from the .env
file.
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
.
ENABLE_TRACKING - enables tracking tools. Options: true
or false
.
HOTJAR_WEBSITE_UID - hotjar website uid, requires a HotJar account (free)
HOTJAR_VERSION - hotjar version
GOOGLE_TAG_MANAGER_UID - google tag manager uid, requires google analytics to be onboarded.
MICROSOFT_CLARITY_UID - microsoft clarity uid, manages heatmaps and events. requires a Microsoft account (free)
Remark: DebugBear can be easy onboarded via Vercel
DEBUGBEAR_RUM_UID - debugbear real user monitoring (RUM) uid, requires DebugBear to be onboarded (free).
.
├── Dockerfile
├── README.md
├── apps
│ ├── personal-portfolio
│ │ ├── case-studies
│ │ ├── index.d.ts
│ │ ├── jest.config.ts
│ │ ├── next-env.d.ts
│ │ ├── next.config.js
│ │ ├── pages
│ │ ├── posts
│ │ ├── project.json
│ │ ├── public
│ │ ├── tests
│ │ ├── tsconfig.json
│ │ ├── tsconfig.spec.json
│ │ └── utils
│ └── personal-portfolio-e2e
│ ├── cypress.config.ts
│ ├── project.json
│ ├── src
│ └── tsconfig.json
├── assets
│ └── open-link.svg
├── compose.yaml
├── dist
│ └── apps
│ └── personal-portfolio
├── jest.config.ts
├── jest.preset.js
├── libs
│ ├── core-components
│ │ ├── README.md
│ │ ├── project.json
│ │ ├── src
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ └── store
│ ├── README.md
│ ├── project.json
│ ├── src
│ ├── tsconfig.json
│ └── tsconfig.lib.json
├── nx.json
├── package-lock.json
├── package.json
├── tools
│ └── tsconfig.tools.json
└── tsconfig.base.json
# Start the docker container if it's not running
$ docker start frontend
# unit tests
$ docker exec -it frontend npm run test
# execute test
$ npm run test
Branches | Status |
---|---|
main | ✅ |
feat/* | 🚧 |
PRs are appreciated, I fully rely on the passion ❤️ of the OS developers.
This personal portfolio website is MIT licensed.