A portfolio built like the work it documents: carefully, honestly, and in public.
This repository holds two things at once.
The content lives in docs/ as Markdown with YAML front matter, version-controlled alongside the code. Articles, architecture notes, LinkedIn posts, portfolio cards, profile sections, design assets, image prompts. Everything here is production, not placeholder.
The site reads those files at build time, parses them, and generates static pages. Editing the site is editing Markdown in a pull request.
| 11 | long-form articles | with diagrams and references |
| 8 | architecture notes | focused design decisions |
| 21 | LinkedIn posts | ready to publish |
| 11 | portfolio cards | featured work |
| 9 | profile sections | complete engineering profile |
palmshed/
│
├── app/ the site
│ ├── articles/ index and detail
│ ├── architecture/ notes
│ ├── posts/ LinkedIn
│ ├── featured/ cards
│ ├── open-source/ projects
│ ├── about/ profile
│ ├── now/ current focus
│ ├── changelog/ record of changes
│ ├── search/ client-side index
│ └── colophon/ how this was made
│
├── docs/ the content
│ ├── articles/
│ ├── architecture/
│ ├── linkedin/
│ ├── featured/
│ └── profile/
│
├── assets/ diagrams, logos, cards
├── design-system/ colors, type, spacing
├── prompts/ image generation
├── templates/ new content starters
└── scripts/ build, validate, stats
Quiet. Monochrome. One green accent, the single living thing in an otherwise still frame.
Canvas is #111110. Text is #e6e6e3. Secondary is #8a8a87. Borders are #262623. Light mode is an override, not the default.
Type is Inter for body, IBM Plex Sans for display, IBM Plex Mono for code. All self-hosted. No third-party requests. No layout shift.
Spacing follows a 4px scale. Elements breathe. Whitespace does the separating.
Motion is almost invisible. The palm mark draws itself on load. Content reveals on scroll. Interactions are fast, predictable, and quiet.
npm install
npm run dev localhost:3000
npm run build static export
npm run typecheck typescript
npm run validate content checks
npm run stats word counts
- Copy
templates/article.mdintodocs/articles/. - Fill the front matter: title, slug, date, tags, intro, references.
- Write the body in Markdown.
- Diagrams go in
assets/diagrams/. Reference as. npm run build. The site regenerates.
GitHub Pages. GitHub Actions. Every push to main.
| variable | purpose |
|---|---|
NEXT_PUBLIC_BASE_PATH |
link prefix for project-path hosting |
NEXT_PUBLIC_SITE_URL |
origin for canonical URLs, sitemap, RSS, Open Graph |
For a custom domain: add a CNAME file, point DNS, clear the two env vars.
Short sentences. Concrete. No filler. First person, but humble. Claims are demonstrated, not asserted. Engineering honesty over marketing polish.
The site is live. The content is real. The references point at actual repositories. Everything here is production.
See CHANGELOG.md for the full record.
Built by hand. Open source. Maintained in public.