{"id":50499394,"url":"https://github.com/maxcaplan/portfolio","last_synced_at":"2026-06-02T10:02:54.508Z","repository":{"id":114309913,"uuid":"517872232","full_name":"maxcaplan/portfolio","owner":"maxcaplan","description":"░▒▓ Max Caplan ▓▒░","archived":false,"fork":false,"pushed_at":"2026-02-27T15:33:02.000Z","size":41701,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-27T19:09:30.429Z","etag":null,"topics":["portfolio","react","typescript","vite"],"latest_commit_sha":null,"homepage":"https://www.maxcaplan.com","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/maxcaplan.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":"2022-07-26T01:24:02.000Z","updated_at":"2026-02-27T15:33:05.000Z","dependencies_parsed_at":"2025-09-15T20:23:29.075Z","dependency_job_id":null,"html_url":"https://github.com/maxcaplan/portfolio","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maxcaplan/portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxcaplan%2Fportfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxcaplan%2Fportfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxcaplan%2Fportfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxcaplan%2Fportfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxcaplan","download_url":"https://codeload.github.com/maxcaplan/portfolio/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxcaplan%2Fportfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33816488,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"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":["portfolio","react","typescript","vite"],"created_at":"2026-06-02T10:02:53.510Z","updated_at":"2026-06-02T10:02:54.499Z","avatar_url":"https://github.com/maxcaplan.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![maxcaplan.com cover image](https://raw.githubusercontent.com/maxcaplan/portfolio/refs/heads/master/public/assets/images/projects/max_caplan/cover/cover_lg.png)\n\n[![Netlify Status](https://api.netlify.com/api/v1/badges/49f2ed15-a9df-4ec3-8085-6131915c8a86/deploy-status)](https://app.netlify.com/sites/maxcaplan/deploys)\n\n## \u003e\\_ Commands\n\nAll commands are run from the root of the project, from a terminal:\n\n| Command                | Action                                                        |\n| :--------------------- | :------------------------------------------------------------ |\n| `npm run dev`          | Starts local dev server at `localhost:5173`                   |\n| `npm run build`        | Builds the client and server as an SSR application to `dist/` |\n| `npm run build:client` | Builds the client side files for SSR to `dist/client/`        |\n| `npm run build:server` | Builds the server side files for SSR to `dist/server`         |\n| `npm run generate`     | Generates a static version of the site to `dist/static`       |\n| `npm run serve`        | Serves the production built SSR application                   |\n| `npm run serve-static` | Serves the production built static site                       |\n| `npm run preview`      | Preview your build locally, before deploying                  |\n\n## Setup\n\nTo setup the site for local development, clone the repo and install the dependencies with the following commands:\n\n```\ngit clone https://github.com/maxcaplan/portfolio.git\ncd portfolio\nnpm install\n```\n\nStart the local development server with the following command:\n\n```\nnpm run dev\n```\n\nYou can then view the local site at `localhost:5173`\nOptionally, you can run the following command instead to have the site available to any device on your network:\n\n```\nnpm run dev -- --host\n```\n\nThe local site will now be available at `\u003cyour-local-ip\u003e:5173`\n\n## File Structure\n\nThe file structure of the project is as follows:\n\n```\n.\n├── public \u003c-- Static files\n│   └── assets\n│       ├── favicons\n│       ├── fonts\n│       └── images\n└── src\n    ├── assets \u003c-- Asset files\n    ├── components \u003c-- React components\n    │   ├── common \u003c-- Generic components\n    │   ├── Home \u003c-- Home page components\n    ├── content \u003c-- Content to be displayed\n    │   └── Work \u003c-- Work page content\n    ├── css\n    ├── pages \u003c-- Site pages\n    │   └── Work\n    │       └── [title] \u003c-- Dynamic page param\n    └── utils \u003c-- Utility functions\n        └── hooks \u003c-- Custom react hooks\n```\n\nSub directories of either `src/components` or `src/pages` with names in PascalCase have an `index.tsx` file that is a component or page respectivly.\n\n`.tsx` files with PascalCase names in `src/components` denote a component file\n\nContent in `src/content` to be displayed on dynamic pages must have a parent directory name equal to the parent directory of the dynamic page. Example `src/pages/Work` gets it's content from `src/content/Work`\n\n## Deploying\n\nTo deploy a static version of the site first create a `.env` file at the root of the repository. Make sure the following fields are defined with the appropriate information in this file:\n\n```\n# .env\nVITE_EMAILJS_SERVICE_ID=your_service_id\nVITE_EMAILJS_TEMPLATE_ID=your_template_id\nVITE_EMAILJS_PUBLIC_KEY=your_public_key\n```\n\nNext run the following command:\n\n```\nnpm run generate\n```\n\nThis will generate a static version of the production site to `dist/static/`\nUpload the contents of this directory to the static site host of your choosing.\n\n## Project Details\n\nThis site is proudly open source and made using `Typescript` with the following technologies:\n\n- [Vite](https://vitejs.dev/) for SSR and SSG\n- [Express](https://expressjs.com/) for HTTP server\n- [sirv](https://github.com/lukeed/sirv) for static file serving\n- [React](https://react.dev/) for UI\n- [TailwindCSS](https://tailwindcss.com/) for styling\n- And several other libraries\n\n---\n\n    ==================================================================\n         __    __  ______  __  __\n        /\\ \"-./  \\/\\  __ \\/\\_\\_\\_\\\n        \\ \\ \\-./\\ \\ \\  __ \\/_/\\_\\/_\n         \\ \\_\\ \\ \\_\\ \\_\\ \\_\\/\\_\\/\\_\\\n          \\/_/  \\/_/\\/_/\\/_/\\/_/\\/_/__  __      ______  __   __\n               /\\  ___\\/\\  __ \\/\\  == \\/\\ \\    /\\  __ \\/\\ \"-.\\ \\\n               \\ \\ \\___\\ \\  __ \\ \\  _-/\\ \\ \\___\\ \\  __ \\ \\ \\-.  \\\n                \\ \\_____\\ \\_\\ \\_\\ \\_\\   \\ \\_____\\ \\_\\ \\_\\ \\_\\\\\"\\_\\\n                 \\/_____/\\/_/\\/_/\\/_/    \\/_____/\\/_/\\/_/\\/_/ \\/_/\n\n    ======================= Developer/Designer =======================\n    \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxcaplan%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxcaplan%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxcaplan%2Fportfolio/lists"}