Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html)

### Changed
- `src/hooks/useOgMeta.js` — `/services` route now uses `og-services.png` and services-specific title/description; `applyMeta()` extended to update `og:image:width`, `og:image:height`, `og:image:alt`, `twitter:url`, and `link[rel="canonical"]` (previously only 8 of 13 meta tags were updated on route change)
- `services/index.html` + `vite.config.js` — added as a second Vite build entry so `dist/services/index.html` is emitted with services-specific OG/Twitter meta baked into static HTML; social crawlers (which don't run JS) now receive the correct preview image and copy for `/services`
- `vercel.json` — replaced `/services` SPA fallback rewrites with a `/services/(.*)` catch-all pointing to `dist/services/index.html`

### Changed
- `index.html` — updated page `<title>` and all meta descriptions to "Technical Product Manager | Systems & AI Automation" brand positioning; removed duplicate OG/Twitter tag blocks; consolidated to single canonical set; added `twitter:domain` + `twitter:url` properties
Expand Down
48 changes: 48 additions & 0 deletions services/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preload" as="image" href="/images/profile.jpg" fetchpriority="high" />
<link rel="canonical" href="https://www.mazuryk.dev/services" />

<title>Web, Workflow &amp; AI Systems | mazuryk.dev</title>
<meta
name="description"
content="Productized systems that replace operational chaos with measurable results — lead-generating websites, automation dashboards, and AI workflow audits. Delivered in weeks, not quarters."
/>

<meta property="og:url" content="https://www.mazuryk.dev/services" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Web, Workflow &amp; AI Systems | mazuryk.dev" />
<meta property="og:description" content="Productized systems that replace operational chaos with measurable results — lead-generating websites, automation dashboards, and AI workflow audits. Delivered in weeks, not quarters." />
<meta property="og:image" content="https://www.mazuryk.dev/images/og-services.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta
property="og:image:alt"
content="Mazuryk.dev services page preview — Web, Workflow &amp; AI Systems for founders and product teams."
/>

<meta name="twitter:card" content="summary_large_image" />
<meta property="twitter:domain" content="mazuryk.dev" />
<meta property="twitter:url" content="https://www.mazuryk.dev/services" />
<meta name="twitter:title" content="Web, Workflow &amp; AI Systems | mazuryk.dev" />
<meta name="twitter:description" content="Productized systems that replace operational chaos with measurable results — lead-generating websites, automation dashboards, and AI workflow audits. Delivered in weeks, not quarters." />
<meta name="twitter:image" content="https://www.mazuryk.dev/images/og-services.png" />
<script>
(function(){
var m=localStorage.getItem('theme');
var t=m?m:(window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light');
document.documentElement.setAttribute('data-theme',t);
})();
</script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
3 changes: 1 addition & 2 deletions vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
"outputDirectory": "dist",
"framework": "vite",
"rewrites": [
{ "source": "/services", "destination": "/index.html" },
{ "source": "/services/", "destination": "/index.html" }
{ "source": "/services/(.*)", "destination": "/services/index.html" }
],
"headers": [
{
Expand Down
8 changes: 8 additions & 0 deletions vite.config.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { resolve } from 'path'
import { fileURLToPath } from 'url'

const __dirname = fileURLToPath(new URL('.', import.meta.url))

// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
build: {
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html'),
services: resolve(__dirname, 'services/index.html'),
},
output: {
manualChunks: {
'react-vendor': ['react', 'react-dom'],
Expand Down
Loading