Skip to content

SOMUCHDOG.github.io Replatform ​

Executive Summary ​

I replaced a legacy static/Jekyll-style personal website with a VitePress-based portfolio and blog, then set up automated GitHub Pages deployment via GitHub Actions.

The replatform had three goals:

  1. Move to a content-first workflow where writing and project updates are fast.
  2. Improve site maintainability by consolidating build tooling.
  3. Ensure deployments are deterministic and repeatable from main.

Context and Constraints ​

Starting Point ​

The repository contained an older, template-based site with many static HTML pages, legacy assets, and front-end build remnants. It also had GitHub Pages behavior that could fall back to Jekyll rendering.

Constraints ​

  • Domain and hosting remained on SOMUCHDOG.github.io (GitHub Pages).
  • Migration needed to avoid long downtime.
  • The new site had to support both portfolio case studies and blog posts.
  • Existing repository state included legacy files that could conflict with Pages behavior.

Architecture Decisions ​

Why VitePress ​

  • Markdown-native authoring for fast content updates.
  • Built-in documentation-style navigation and sidebar primitives.
  • Simple, low-maintenance static output suitable for Pages.
  • Theme customization without introducing a full custom app framework.

Content Structure ​

I standardized on:

  • index.md: home
  • about.md: personal background
  • portfolio/: project case studies
  • blog/: posts
  • .vitepress/: config, theme, and custom components
  • public/: static assets (logo)

This gives a predictable model where every new case study is one markdown file and optional assets.

Deployment Model ​

I chose GitHub Actions Pages deployment over branch-based static publishing:

  • Build is defined in code (.github/workflows/deploy.yml).
  • Artifact is generated from npm ci + npm run docs:build.
  • Deployment target is controlled by workflow permissions and Pages environment.
  • This avoids ambiguity around Jekyll/branch auto-processing.

Implementation Walkthrough ​

1. Scaffolding and Theming ​

I created a VitePress site with:

  • Custom nav and sidebars in .vitepress/config.mts
  • Home hero + feature blocks
  • Portfolio and blog sections
  • Theme overrides in .vitepress/theme/custom.css

A key improvement was making theme colors mode-aware (light/dark) with CSS variables instead of hardcoded light-only backgrounds.

2. Portfolio Enhancement: GitHub Repo Feed ​

I added a Vue component (.vitepress/theme/components/GitHubRepos.vue) that:

  • Reads themeConfig.githubUsername
  • Fetches public repos from GitHub API on mount
  • Filters forks
  • Sorts by updated_at
  • Renders recent repos as cards

This keeps portfolio content partially self-updating while preserving curated case studies above it.

3. Repository Transition to Primary Site ​

To make VitePress the primary website, I migrated from docs/ to repository root and updated build paths:

  • Scripts changed to vitepress dev ., vitepress build ., vitepress preview .
  • Deploy artifact changed to .vitepress/dist
  • Ignore rules updated for root cache/dist directories

Legacy static files were removed from tracking so main clearly represents a single source of truth.

4. GitHub Pages Workflow ​

I implemented .github/workflows/deploy.yml with two jobs:

  • build: checkout, setup Node 20, install with npm ci, build VitePress, upload Pages artifact
  • deploy: deploy artifact to Pages environment

This made deployments reproducible and tied to repository history.

Debugging and Production Issues ​

Issue 1: Wrong Repository Context ​

Initially, local git commands were affected by a parent repository context. To avoid accidental pushes, I initialized and targeted a dedicated repo in the project directory and explicitly pushed to:

  • https://github.com/SOMUCHDOG/SOMUCHDOG.github.io

Issue 2: Non-fast-forward Push ​

Remote main already had commits, so I rebased local work onto origin/main, resolved conflicts, then pushed.

Issue 3: Live Site Did Not Match Local VitePress ​

The deployed site looked like markdown rendered by Jekyll (not VitePress).

Root cause:

  • GitHub Pages source was still effectively branch/Jekyll based, not workflow artifact based.

Resolution:

  • Confirmed/required Pages source to be GitHub Actions.
  • Re-ran deployment workflow.
  • Verified generated output now reflects VitePress layout.

Issue 4: URL Compatibility ​

cleanUrls: true can create route edge cases on Pages. I set:

  • cleanUrls: false

This improved direct-load behavior for generated pages.

Quality and Verification ​

Validation performed during migration:

  • Built site locally after structural moves (npm run docs:build).
  • Confirmed artifact generation under .vitepress/dist.
  • Verified workflow triggers on main push.
  • Confirmed deployed output source by inspecting live HTML.

Results ​

Technical Outcomes ​

  • Single modern static-site pipeline using VitePress.
  • Automated CI/CD deployment to Pages.
  • Reduced maintenance burden from legacy assets and templates.
  • Improved clarity of repository purpose and structure.

Content Outcomes ​

  • Faster publishing loop for blog posts and case studies.
  • Stronger project storytelling through dedicated markdown pages.
  • Dynamic repository visibility via GitHub API integration.

Tradeoffs and Future Improvements ​

Current Tradeoffs ​

  • GitHub API rate limits can affect anonymous repo-feed requests.
  • Dynamic client-side fetch means repo cards load after initial page render.

Next Iterations ​

  1. Add selective pinning or weighting for flagship repos.
  2. Add tags and taxonomy for portfolio case studies.
  3. Add structured metadata for posts/projects (date, role, impact, stack).
  4. Add visual regression checks for theme changes.
  5. Add custom domain and SEO/social preview metadata.

Key Lessons ​

  • Replatforming is as much about deployment source-of-truth as framework choice.
  • For GitHub Pages, explicit workflow-based deploys are more reliable than implicit branch/Jekyll behavior when using modern static generators.
  • Cleaning repository history and structure pays off immediately in maintainability.

Built with VitePress.