Content is written in the private vault as Markdown. The sync script copies only published content into this repo, then src/lib/content.ts renders it with standard Markdown plus a small set of custom directives.
Use this guide when writing or reviewing vault content.
- Keep frontmatter factual and public-safe.
- Set
published: trueonly when the page or writeup is ready to ship. - Put writeup images in the writeup's local
images/folder. - Reference local images as
./images/file.png. - Start writeup body sections at
##; the article title is already rendered as the pageh1. - Prefer normal Markdown unless a directive adds real structure.
- Do not rely on raw HTML unless there is a specific reason.
Standard image:
The alt text is used as the visible caption when the image is promoted to a figure.
Width override:
No visible caption:
Opt out of the zoom view:
Every image in the article body opens an enlarged zoom view on click or tap by
default. Add |nozoom to keep a specific image static; it still renders
normally. The |nozoom modifier also works inside ::figure blocks.
The sync pipeline generates responsive variants. Picture.astro renders AVIF, WebP, and fallback sources with stable dimensions.
Use terminal blocks for command/output sequences.
::terminal
$ npm run publish:check
check 0 errors, 0 warnings
build 76 pages built
::Lines beginning with $ are rendered as commands. Other lines are rendered as output.
Single button:
::button [View Resume](/resume/) ::Sticky button:
::button sticky [Download PDF](/assets/resume.pdf) ::Button row:
::buttons
- [View Portfolio](/portfolio/)
- [Contact Me](/contact/)
::Standard CTA:
::cta ::The standard CTA is generated by the renderer and points to the portfolio and contact pages.
Use sparingly for short page-opening text.
::center
Cybersecurity and networking projects.
::Use a split layout for two-column page sections.
::split
Left column content.
:::
Right column content.
::The ::: line separates the two columns.
Wraps the home-page hero in a centered <header>. Use once, at the top of the home page.
::hero
<p class="hero-eyebrow">Cybersecurity • Networking</p>
# Hi, I'm Joe Severino
Role • Credentials
<p class="hero-summary">One-line summary of the work.</p>
<p class="hero-location">City, State</p>
::buttons
- [View My Resume](/resume/)
- [Get in Touch](/contact/)
::
::The hero-eyebrow, hero-summary, and hero-location classes style the kicker, the lead summary, and the location chip.
These are mainly for top-level pages.
Featured projects:
::featured-projects ::Technology cloud:
::technology-cloud ::Both are generated from structured content. Featured projects come from writeup frontmatter. Technology groups come from src/content/technology-groups.md.
Use figure blocks when a caption needs Markdown or multiple lines.
::figure

The host firewall accepts SSH only from Tailscale and the home LAN fallback.
::Use table blocks when a table needs a caption.
::table
| Control | Purpose |
| --- | --- |
| Turnstile | Bot challenge |
| D1 | Contact messages and CSP reports |
Contact form controls.
::Tables are wrapped for horizontal scrolling on small screens.
Before publishing:
- The page or writeup has
published: true. - The title and description are public-safe.
- Images use local relative paths.
- Captions are descriptive.
- No private hostnames, keys, internal notes, or vault metadata appear in body content.
npm run publish:checkpasses after sync (see Pre-flight Validation).