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
5 changes: 5 additions & 0 deletions .agent-state/decisions.ndjson
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,8 @@
{"ts":"2026-06-09T23:54:29.544Z","sha":"583aec472f6ec4490e7817385fdccc22ad2f28ed","subject":"chore(main): release 1.5.0 (#153)","decision":null,"why":null,"resolves":[],"overrides":[],"source":"gh-pr-merge"}
{"ts":"2026-06-10T00:02:18.730Z","sha":"b33bdb5356f65b71675237c26e54db9bdb6aa10d","subject":"feat: portfolio-first site — drop Work and Skills sections, résumé carries career history","decision":"site shows only what the résumé cannot; career history starts at Symbiont","why":"user directive (redundancy + pre-2017 one-year roles read better as prose); research-validated","resolves":["'do we NEED a work section' / 'Symbiont should be the start of actual roles'"],"overrides":[]}
{"ts":"2026-06-10T00:14:49.235Z","sha":"295747d07646309af137485c39541eb0bee0d1a7","subject":"fix: OOXML postprocess for turbodocx layout defects + dual-engine DOCX QC","decision":"fix converter defects by post-processing OOXML in our build, not by switching converters","why":"turbodocx hardcodes the values (no options); it remains the only converter validated in both Word-proxy and Pages engines","resolves":["'docx showing weird spacing gaps and alignment issues' + 'need a way to capture the docx as it actually shows up'"],"overrides":[]}
{"ts":"2026-06-10T00:19:35.220Z","sha":"4ff909738e0341872f0c05a07a0fa2bc34eb2723","subject":"feat: portfolio-first site — drop Work and Skills sections, résumé carries career history (#156)","decision":"site shows only what the résumé cannot; career history starts at Symbiont","why":"user directive (redundancy + pre-2017 one-year roles read better as prose); research-validated","resolves":["'do we NEED a work section' / 'Symbiont should be the start of actual roles'","'docx showing weird spacing gaps and alignment issues' + 'need a way to capture the docx as it actually shows up'"],"overrides":[],"source":"gh-pr-merge"}
{"ts":"2026-06-10T00:19:35.220Z","sha":"4ff909738e0341872f0c05a07a0fa2bc34eb2723","subject":"feat: portfolio-first site — drop Work and Skills sections, résumé carries career history (#156)","decision":"fix converter defects by post-processing OOXML in our build, not by switching converters","why":"turbodocx hardcodes the values (no options); it remains the only converter validated in both Word-proxy and Pages engines","resolves":[],"overrides":[]}
{"ts":"2026-06-10T00:20:26.239Z","sha":"2bb588e27f07854b9adec5327e38099a75f5ada0","subject":"chore(main): release 1.6.0 (#157)","decision":null,"why":null,"resolves":[],"overrides":[],"source":"gh-pr-merge"}
{"ts":"2026-06-10T00:33:24.983Z","sha":"9d642c586e8b73fba40c671cc88f5674257f2da3","subject":"feat: zero-JavaScript site — replace the React island with pure Astro components","decision":"keep Astro, drop React — not the reverse","why":"Astro earns its place (static rendering from typed data, JSON-LD, sitemap); React carried 15 lines of scroll-spy","resolves":[],"overrides":[]}
{"ts":"2026-06-10T00:54:21.372Z","sha":"610679c2771132963d458f70f9d4f657d5177aea","subject":"feat: writing infrastructure — content collection, index, post pages, RSS","decision":"port astrofy's blog architecture, reject the template wholesale","why":"its value is the collections scaffolding; its visual identity is the template look the site just escaped","resolves":["'writing presence' gap (research) + astrofy review directive"],"overrides":[]}
21 changes: 14 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,27 @@

## Architecture

Astro 6 static site with React islands, shadcn/ui, and Tailwind CSS v4.
Astro 6 static site, Tailwind CSS v4, **zero JavaScript shipped** — the only
client script is a dozen inline lines of nav scroll-spy. No React, no
component framework.

```
src/
├── content/resume.ts # CANONICAL resume data — single source of truth
├── content/writing/ # Markdown posts (see content.config.ts for frontmatter)
├── pages/
│ ├── index.astro # Portfolio SPA shell (React island)
│ └── resume.astro # Print-optimized HTML resume view
├── components/ # React components (hero, tabs, sections)
│ ├── index.astro # The lobby: hero → Open Source → contact
│ ├── resume.astro # Print-optimized HTML resume view
│ ├── writing/ # Post index + pages — nav link appears with the first post
│ └── rss.xml.ts # RSS feed for writing
├── components/ # Astro components (SiteNav, Hero, OpenSourceSection, Footer)
└── layouts/Layout.astro # Meta, JSON-LD, OG tags

scripts/resume/
├── template.ts # resume.ts → Word-semantics HTML
├── build-docx.ts # HTML → Jon_Bogaty_Resume.docx (turbodocx)
└── qc.ts # DOCX → LibreOffice → PNG pages for visual review
├── build-docx.ts # HTML → DOCX (turbodocx) → OOXML postprocess
├── postprocess.ts # fixes turbodocx's hardcoded layout defects
└── qc.ts # renders the DOCX via LibreOffice AND Apple Pages → PNGs
```

### Resume pipeline (DOCX-first, no PDF)
Expand All @@ -34,7 +40,8 @@ The DOCX is the resume. There is deliberately no PDF target.
```bash
pnpm resume:build # compile public/Jon_Bogaty_Resume.docx from resume.ts
pnpm resume:qc # render the actual DOCX to PNGs (artifacts/resume-qc/)
# — read them before shipping; requires LibreOffice + poppler
# via BOTH engines — read them at full size before shipping;
# requires LibreOffice + poppler (Pages used when available)
```

`src/content/resume.ts` is typed and commented; positioning decisions are
Expand Down
4 changes: 2 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import react from '@astrojs/react'
import mdx from '@astrojs/mdx'
import sitemap from '@astrojs/sitemap'
import tailwindcss from '@tailwindcss/vite'
import { defineConfig } from 'astro/config'
Expand All @@ -11,7 +11,7 @@ const buildDate = new Date().toISOString().slice(0, 10)
export default defineConfig({
site: 'https://www.jonbogaty.com',
output: 'static',
integrations: [react(), sitemap()],
integrations: [mdx(), sitemap()],
vite: {
plugins: [tailwindcss()],
define: {
Expand Down
23 changes: 0 additions & 23 deletions components.json

This file was deleted.

21 changes: 5 additions & 16 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,21 @@
"test:watch": "vitest",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"check": "astro check && tsc --noEmit -p tsconfig.json",
"check": "astro sync && astro check && tsc --noEmit -p tsconfig.json",
"lint": "biome check .",
"lint:fix": "biome check --write .",
"format": "biome format --write ."
},
"dependencies": {
"@astrojs/react": "^4.4.2",
"@astrojs/mdx": "^6.0.3",
"@astrojs/rss": "^4.0.18",
"@astrojs/sitemap": "^3.7.3",
"@fontsource/instrument-serif": "^5.2.8",
"@fontsource/inter": "^5.2.8",
"@fontsource/jetbrains-mono": "^5.2.8",
"@tailwindcss/typography": "^0.5.20",
"astro": "^6.4.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.575.0",
"motion": "^12.40.0",
"radix-ui": "^1.5.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"tailwind-merge": "^3.6.0"
"daisyui": "^5.5.23"
},
"devDependencies": {
"@astrojs/check": "^0.9.9",
Expand All @@ -44,14 +39,10 @@
"@tailwindcss/vite": "^4.3.0",
"@turbodocx/html-to-docx": "^1.21.0",
"@types/node": "^25.9.2",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"jszip": "^3.10.1",
"playwright": "^1.60.0",
"shadcn": "^3.8.5",
"tailwindcss": "^4.3.0",
"tsx": "^4.22.4",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vitest": "^4.1.8"
},
Expand All @@ -66,8 +57,6 @@
"portfolio",
"jbcom",
"astro",
"react",
"shadcn",
"github-pages",
"resume"
]
Expand Down
Loading
Loading