{"id":40329590,"url":"https://github.com/missionmike/interactive-resume","last_synced_at":"2026-01-20T08:03:44.192Z","repository":{"id":258706408,"uuid":"863225974","full_name":"missionmike/interactive-resume","owner":"missionmike","description":"Interactive resume template to showcase projects and work.","archived":false,"fork":false,"pushed_at":"2024-11-22T00:11:16.000Z","size":452,"stargazers_count":5,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-29T23:52:44.691Z","etag":null,"topics":["jobsearch","jobseeker","material-ui","mui","nextjs","resume-app","resume-builder","resume-creator","resume-site-builder","sanity","sanity-io","sanity-studio","sanitycms","sanityio","vercel","vercel-deployment","vercel-hosting"],"latest_commit_sha":null,"homepage":"https://resume.missionmike.dev/","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/missionmike.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":"2024-09-25T23:56:47.000Z","updated_at":"2025-11-24T07:55:12.000Z","dependencies_parsed_at":"2024-10-26T02:46:35.537Z","dependency_job_id":"d5ea616d-b670-47a2-a8e8-bd582acba015","html_url":"https://github.com/missionmike/interactive-resume","commit_stats":null,"previous_names":["missionmike/interactive-resume"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/missionmike/interactive-resume","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/missionmike%2Finteractive-resume","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/missionmike%2Finteractive-resume/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/missionmike%2Finteractive-resume/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/missionmike%2Finteractive-resume/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/missionmike","download_url":"https://codeload.github.com/missionmike/interactive-resume/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/missionmike%2Finteractive-resume/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28598875,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T02:08:49.799Z","status":"ssl_error","status_checked_at":"2026-01-20T02:08:44.148Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["jobsearch","jobseeker","material-ui","mui","nextjs","resume-app","resume-builder","resume-creator","resume-site-builder","sanity","sanity-io","sanity-studio","sanitycms","sanityio","vercel","vercel-deployment","vercel-hosting"],"created_at":"2026-01-20T08:03:44.127Z","updated_at":"2026-01-20T08:03:44.176Z","avatar_url":"https://github.com/missionmike.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Interactive Resume with Next.js and Sanity.io\n\nThe Interactive Resume can organize work history, positions, and projects within. Skills can be\norganized by duration of experience, and can be applied to projects.\n\n## Getting Started\n\n### Pulling to Local\n\nTo set up your own Interactive Resume, you can either fork your own copy of this repository, or\ncheck out this code locally and spin it up. The primary differences between the two options is how\nthey're deployed (if you're deploying to Vercel).\n\n- **Forking** - if you fork the repo, you can set up your own deployment through Vercel to trigger\n  when you make changes to your own `main` branch. See:\n  https://vercel.com/docs/deployments/git/vercel-for-github\n- **Cloning** - if you clone the repo locally, you can manually configure your deployment through\n  the Vercel CLI. See: https://vercel.com/docs/cli/project-linking\n\nEither way, you can always run the local utility `npm run deploy:vercel` to trigger a deployment to\n`prod`.\n\n### Installing Dependencies\n\n1. Ensure you have `nvm` installed: https://github.com/nvm-sh/nvm\n2. In the project root folder, run `nvm use` to run on the Node version defined in the `.nvmrc`\n   file. If you don't already have that version installed, follow the steps to install with `nvm`.\n3. Run `npm i` to install dependencies.\n\n### Setting up Sanity to Host Content\n\n1. If you don't already have a free account, head over to https://www.sanity.io/ and sign up. Then,\n   create a new project.\n2. Copy the `.env.example` file to `.env.local` and update the values. `NEXT_PUBLIC_SANITY_DATASET`\n   can stay as `\"production\"` unless you plan on using different environment name.\n3. Run `npm run deploy:graphql` to ensure your Sanity project's GraphQL endpoint is set up. After\n   this command is run successfully, you should find a GraphQL endpoint in your terminal in a format\n   like: `https://[SANITY_PROJECT_ID].api.sanity.io/v2023-08-01/graphql/[SANITY_DATASET]/default`.\n   Copy this value to `SANITY_GRAPHQL_ENDPOINT` in `.env.local`.\n4. If the date value in the URL differs from the value in `NEXT_PUBLIC_SANITY_API_VERSION` in\n   `.env.local`, update the value in `.env.local` to match the date value from the URL (exclude the\n   `\"v\"` prefix).\n5. Ensure you have `localhost:3000` and your production/other domains listed in the CORS section of\n   the Sanity API settings. If you're not allowing your domain to access, the GraphQL requests will\n   be blocked.\n\n### Populate Data in Sanity\n\nYou can spin up locally with `npm run dev`, then visit http://localhost:3000/studio and sign in with\nyour preferred credentials.\n\nFrom there, visit the following pages to populate data:\n\n-**Theme Options**: http://localhost:3000/studio/structure/themeOptions this is where you can set\nyour name, title, location, and other global meta.\n\n- **Skills**: http://localhost:3000/studio/structure/skill this is where you can add skills and\n  years' experience. Each skill includes optional description which would appear to users when they\n  click the skill icon. The Skill Icon can be set as a string based on any icon found here:\n  https://icon-sets.iconify.design/ e.g. `devicon:react`\n- **Companies**: http://localhost:3000/studio/structure/company add companies where you've worked.\n  Values are flexible.\n- **Positions**: http://localhost:3000/studio/structure/position add positions. Each position can be\n  linked to a company. Within each position, you can add Projects. The project's title appears as\n  the bullet point in the resume. The description and skills appear within this section. Note, you\n  can add project-specific skill descriptions here.\n- **Education**: http://localhost:3000/studio/structure/education add education experience.\n\n#### TODO (work in progress)\n\nThis project is a work in progress. To find planned features, visit the\n[Issues](https://github.com/missionmike/interactive-resume/issues) page in GitHub.\n\n### Fetch Content from Sanity\n\nAfter setting up Sanity and ensuring GraphQL is published, you an test out your GraphQL endpoint\nwith Postman. I've set up an example collection that you can fork to test, or view the saved example\nresponses.\n\n[\u003cimg src=\"https://run.pstmn.io/button.svg\" alt=\"Run In Postman\" style=\"width: 128px; height: 32px;\"\u003e](https://app.getpostman.com/run-collection/2595954-32a4a40a-8daa-45b4-b570-4e533469a20c?action=collection%2Ffork\u0026source=rip_markdown\u0026collection-url=entityId%3D2595954-32a4a40a-8daa-45b4-b570-4e533469a20c%26entityType%3Dcollection%26workspaceId%3D034c1af6-8d72-472b-8943-f6291da07e69#?env%5BInteractive%20Resume%5D=W3sia2V5IjoiR1JBUEhRTF9FTkRQT0lOVCIsInZhbHVlIjoiaHR0cDovL3lvdXItZ3JhcGhxbC1lbmRwb2ludC9ncmFwaHFsIiwiZW5hYmxlZCI6dHJ1ZSwidHlwZSI6ImRlZmF1bHQiLCJzZXNzaW9uVmFsdWUiOiJodHRwOi8veW91ci1ncmFwaHFsLWVuZHBvaW50L2dyYXBocWwiLCJjb21wbGV0ZVNlc3Npb25WYWx1ZSI6Imh0dHA6Ly95b3VyLWdyYXBocWwtZW5kcG9pbnQvZ3JhcGhxbCIsInNlc3Npb25JbmRleCI6MH1d)\n\n\u003e You need to ensure that the Environment value for `{{GRAPHQL_ENDPOINT}}` is set in Postman to\n\u003e test!\n\n### Running on Local\n\nAfter dependencies are installed, GraphQL is deployed and environment variables are set, spin up the\nlocal server with `npm run dev`.\n\n- Access the Sanity studio at: http://localhost:3000/studio\n- Access your local front-end view at: http://localhost:3000\n\nFrom here, populate your data in the Sanity Studio, then perform a full refresh in the local browser\nto view the changes.\n\n## Adding Analytics\n\nThis installation supports Google Tag Manager out of the box. Everything else can be configured\nwithin Google from there. If other platforms need to be supported, feel free to open a PR!\n\nTo support GTM, ensure that the `GTM_ID` value is populated in your environment.\n\n## Deploying to Vercel\n\nTo deploy your Interactive Resume to Vercel, first ensure you have an account and project set up in\nVercel. If you forked the Interactive Resume repository, you can authenticate with GitHub and have\nit automatically deploy when you make changes to your `main` branch.\n\nIf you'd prefer to manually deploy and link projects, you can run the `npm run deploy:vercel`\ncommand.\n\nThe following environment variables will need to be set in Vercel to match what we're using in\n`.env.local`:\n\n- `NEXT_PUBLIC_SANITY_PROJECT_ID`\n- `NEXT_PUBLIC_SANITY_DATASET`\n- `NEXT_PUBLIC_SANITY_API_VERSION`\n- `SANITY_GRAPHQL_ENDPOINT`\n\nOptional values:\n\n- `GTM_ID` for Google Tag Manager.\n\nHere is a live example: https://resume.missionmike.dev/\n\n## Design Choices\n\nYou might wonder, \"Why can't I edit data in the Sanity Studio and immediately see my changes in the\nfront-end after refresh?\"\n\nWell, this installation is using Next.js to fetch and render the data on the initial page load only.\nAfter the page is rendered with SSR, the data is cached and saved. Refreshing the page will not\nre-fetch the data from the GraphQL endpoint. The reason I set it up this way is because the Sanity\nFree plan has a limit on API requests and data fetching. In an effort to stay well under the paid\nthresholds and keep usage in the free tier, the data is only fetched on the first render.\n\nIf you make changes in Sanity Studio and you want to ensure you can see the latest updates on\n`production`, you'll need to manually redeploy with `npm run deploy:vercel`, which will trigger a\nfull rebuild and deployment.\n\n## Troubleshooting\n\nIf you run into issues setting this up or running it on local, please feel free to open an Issue in\nGitHub, or open a Pull Request if you have an idea or solution to share.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmissionmike%2Finteractive-resume","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmissionmike%2Finteractive-resume","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmissionmike%2Finteractive-resume/lists"}