Modern portfolio for Vikram Sharma, focused on Python backend engineering, AWS serverless systems, REST APIs, production reliability, and selected project work.
Live site: vikramsh2002.github.io/My-Portfolio
Preview site, when deployed manually: vikramsh2002.github.io/My-Portfolio-Preview
The modern version is isolated under portfolio-v2 and built with Vite + React. The original root HTML/CSS/JS portfolio is preserved as a fallback so the site can recover automatically if the V2 build fails.
Detailed architecture notes: portfolio-v2/docs/architecture.md
GitHub Models project sync workflow: portfolio-v2/docs/portfolio-sync.md
flowchart TD
A["Old root portfolio"] --> B["Fallback static site"]
C["Portfolio V2 app"] --> D["Structured content data"]
D --> E["React components"]
E --> F["Vite build output"]
G["GitHub Actions"] --> H{"V2 build succeeds"}
H -->|Yes| F
H -->|No| B
F --> I["GitHub Pages"]
B --> I
I --> J["Public portfolio URL"]
This repository uses three safety layers:
Portfolio V2 CI: buildsportfolio-v2on pull requests without deploying.Sync Portfolio Project with GitHub Models: creates a project PR, dispatches CI, and can deploy the preview in one run.Deploy Portfolio Preview: manually rebuilds a branch preview when needed.Deploy Portfolio V2 to GitHub Pages: deploys the live site only frommain.
Generated portfolio sync PRs are created by github-actions[bot]. Because GitHub does not fire normal pull_request workflows from GITHUB_TOKEN-created events, the sync workflow explicitly dispatches Portfolio V2 CI for the generated branch after it opens the PR.
flowchart TD
S["Run AI project sync"] --> M["Generated project PR"]
M --> N["Sync workflow dispatches CI"]
N --> B
A["Feature branch"] --> B["Portfolio V2 CI"]
B --> C{"Build passes"}
C -->|No| D["Fix before merge"]
C -->|Yes| E["Automatic or manual preview deploy"]
E --> F["Build with preview base path"]
F --> G["Push dist to preview repo"]
G --> H["Preview link on PR"]
H --> I{"Looks good"}
I -->|No| D
I -->|Yes| J["Merge to main"]
J --> K["Live GitHub Pages deploy"]
K --> L["Live portfolio URL"]
Preview deploys use a separate repository as a static hosting target:
Source repo: vikramsh2002/My-Portfolio
Preview repo: vikramsh2002/My-Portfolio-Preview
The source code stays in My-Portfolio. Preview deployment builds the selected branch, then pushes only portfolio-v2/dist into the preview repository's Pages branch.
The AI sync workflow can deploy preview automatically after it opens a PR. The manual preview workflow remains available when you want to rebuild a preview for an existing branch.
This keeps the preview URL separate from the live portfolio:
Live: https://vikramsh2002.github.io/My-Portfolio/
Preview: https://vikramsh2002.github.io/My-Portfolio-Preview/
The preview workflow is configurable through manual inputs:
source_ref
preview_repository
preview_branch
preview_base
preview_url
pr_number
For PR previews, run the workflow from main and set source_ref to the PR branch, for example:
portfolio-sync/26572564684-1
It requires this repository secret:
PORTFOLIO_PREVIEW_TOKEN
PORTFOLIO_PREVIEW_TOKEN must be able to push to the preview repository.
The Vite base path is configurable through VITE_BASE. By default, local and live builds use:
/My-Portfolio/
Preview builds use:
/My-Portfolio-Preview/
cd portfolio-v2
npm install
npm run dev
npm run build
npm run previewTo test a preview base path locally:
$env:VITE_BASE="/My-Portfolio-Preview/"
npm run build
Remove-Item Env:\VITE_BASE