This repository is two things at once. Open it in Obsidian and it is a vault. Point Astro at it and it is a website. There is no export step between them — the markdown file I am typing into right now is the one that gets built.

Publishing
Set draft: false, push, done. Drafts stay in the repository, visible in the
vault and in astro dev, and are excluded from anything the build emits.
The LinkedIn part
If a post has a linkedinText field, a workflow opens an issue containing the
text to paste and the link for the first comment. That’s the whole integration.
The first design used the LinkedIn API and could publish on its own. It also needed an OAuth bootstrap, a refresh token with a 365-day life, a scheduled job to warn me before it expired, and a ledger written back into the post’s own frontmatter to guarantee it never published twice — which an adversarial review found it would, the first time a git push failed.
Trading thirty seconds of copy-paste for all of that was not a hard call.