This is the code for my personal blog where I write about my thoughts, experiences, and learnings. I use this blog as a way to document my journey and share my knowledge with others.
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
pnpm install |
Installs dependencies |
pnpm dev |
Starts local dev server at localhost:4321 |
pnpm run generate:og |
Generates per-post Open Graph card images |
pnpm run build |
Generates Open Graph cards and builds to dist/ |
pnpm preview |
Preview your build locally, before deploying |
pnpm post:publish <slug> |
Preview promoting a draft to a published post |
pnpm post:verify <slug> |
Build and confirm a post is published by it |
pnpm post:await-deploy |
Wait for a commit to deploy, then check posts |
pnpm post:verify-live |
Check posts are live and listed in production |
pnpm run typecheck |
Typecheck the project with astro check |
pnpm run test:a11y |
Run Playwright axe accessibility tests |
pnpm run a11y:viewer |
Open the generated axe aggregate report viewer |
pnpm standard-site:validate |
Build and validate Standard.site discovery links |
pnpm astro ... |
Run CLI commands like astro add, astro check |
pnpm astro -- --help |
Get help using the Astro CLI |
Blog post social cards are generated at build time with
@schalkneethling/opengraph-cards-maker.
- Generator script:
scripts/generate-og-cards.mjs - Card background artwork:
src/assets/open-graph/post-card-template.png - Generated source output:
public/og/posts/ - Built output:
dist/og/posts/ - Metadata wiring:
public/og/ is ignored because the cards are reproducible build output. Run
pnpm run generate:og after changing post frontmatter, the generator script, or
the card template. The full pnpm run build command runs this automatically.
If the card design needs tuning, the current blog-specific layout is the
image-panel layout in
@schalkneethling/opengraph-cards-maker.
The generator uses background.src for the template image and
contentAlign: "align-end" so the post text sits on the right while the
background graphic remains on the left.
The blog is adopting Standard.site as an AT Protocol metadata, discovery, and verification layer. The website remains the canonical reading experience.
See the Standard.site adoption policy for content eligibility, rollout, record storage, safeguards, and the scope of the initial integration phases. The publishing and authentication workflow records how the site will generate and safely synchronize AT Protocol records.
Publishing to the website is unchanged unless a post opts into Standard.site. Write the post as a draft and publish it with the procedure in Publishing a post, then allow the canonical page to deploy as before.
To publish the post to Standard.site as well:
-
Add the explicit selection to the post frontmatter:
standardSite: publish: true
-
Include that selection in the post pull request, merge it, and allow the canonical page to deploy.
-
From an updated
main, inspect the offline plan:pnpm standard-site:generate
-
Run the authenticated, read-only preflight:
pnpm standard-site:sync
-
Create the document record explicitly:
pnpm standard-site:sync --write
Write mode persists the returned
documentAtUriin the post frontmatter. Commit that one-line identifier change in a small follow-up pull request. -
After the identifier pull request deploys, validate the production post with the Standard.site Validator.
The current workflow creates new document records but does not update an existing record after post content changes. Until document updates are implemented, edit the website normally and treat its canonical page as the authoritative version.
Run the complete local pre-deploy validation with:
pnpm standard-site:validateThis command builds the site and checks:
- every rendered HTML page, excluding redirects, includes the configured publication discovery link;
/.well-known/site.standard.publicationcontains the configured publication AT-URI;- every post with
standardSite.documentAtUriemits exactly one matchingsite.standard.documentlink on its rendered page; and - no built document link exists without matching post metadata.
The command is local, read-only, and does not load AT Protocol credentials.
Use pnpm standard-site:generate for an offline create/update/skip plan. Use
pnpm standard-site:sync when an authenticated, read-only check of the remote
records and their content identifiers is required. Only the explicit
--write mode performs remote writes.
After deployment:
- Confirm
/.well-known/site.standard.publicationreturns the configured publication AT-URI. - Paste a published post URL into the Standard.site Validator.
- Run
pnpm standard-site:syncand confirm the publication and configured documents reportstatus: "found"with content identifiers.
Feel free to check our documentation or jump into our Discord server.