- Astro 54.4%
- TypeScript 33.5%
- CSS 11.7%
- JavaScript 0.4%
|
All checks were successful
Deploy to Netlify / deploy (push) Successful in 2m44s
sm:justify-center only kicked in at 640px+, leaving pills left-aligned on mobile. Replaced with [justify-content:safe_center] — centers on all viewports when content fits, falls back to start when it overflows (e.g. all 5 pills on a narrow phone). |
||
|---|---|---|
| .forgejo/workflows | ||
| .hermes/bridge | ||
| public | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| .npmrc | ||
| astro.config.mjs | ||
| env.d.ts | ||
| netlify.toml | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.json | ||
Homegrown Infra
Tech is political. Software you run is power you keep.
A newsletter website about self-hosting, digital sovereignty, and the politics of the software you choose to run. Built with Astro and Buttondown.
Stack
- Astro 6 — Server-rendered (SSR) site via
@astrojs/node - Tailwind CSS 4 — Utility-first CSS (via
@tailwindcss/vite) - Buttondown — Newsletter platform (API-driven subscription + archive)
- Hosted at homegrowninfra.com
Getting Started
# Install dependencies
pnpm install
# Start dev server
pnpm dev
# Build for production
pnpm build
# Preview production build
pnpm preview
Environment Variables
Copy .env.example to .env and fill in:
| Variable | Description |
|---|---|
BUTTONDOWN_API_KEY |
Buttondown API key (get yours at https://buttondown.com/settings) |
BUTTONDOWN_USERNAME |
Buttondown newsletter username (e.g. homegrowninfra) |
Both are required at runtime. The homepage, category pages, and issue
pages all read from Buttondown at request time. If the API is
unreachable the homepage and category pages fall back to the
ARTICLES fixture in src/lib/articles.ts and show an inline
"showing the cached archive" notice; the issue page surfaces the
error inline so the layout still renders.
Subscribe form posts to the SSR endpoint /api/subscribe, which
forwards to Buttondown — no third-party form action. Search is a
dedicated SSR page at /search?q=…. RSS is self-hosted at
/rss.xml, sitemap at /sitemap.xml, and all pages carry
canonical + Open Graph/Twitter meta.
Project Structure
src/
├── components/ # Astro components (Cover, ArticleCard, etc.)
│ ├── ArticleCard.astro
│ ├── ArticleGrid.astro
│ ├── Container.astro
│ ├── Cover.astro
│ ├── Footer.astro
│ ├── Logo.astro
│ ├── NavPills.astro
│ ├── SearchButton.astro
│ ├── SectionHeader.astro
│ ├── SubscribeBlock.astro
│ ├── SubscribeForm.astro
│ ├── Topbar.astro
│ └── TypeBadge.astro
├── layouts/
│ └── Layout.astro # Base HTML layout, head meta, OG/canonical
├── lib/
│ ├── articles.ts # Article shape + Buttondown adapter + fixture fallback
│ ├── buttondown.ts # Buttondown API client
│ └── format.ts # Date / markdown / read-time helpers
├── pages/
│ ├── index.astro # Homepage — cover + per-type sections + subscribe
│ ├── [category].astro # Thesis / Blueprint / Field Notes
│ ├── [...path].astro # Catch-all → rewrites to 404
│ ├── 404.astro # Custom 404 page
│ ├── about.astro
│ ├── search.astro # Search page (?q=…)
│ ├── rss.xml.ts # RSS 2.0 feed
│ ├── sitemap.xml.ts # XML sitemap
│ ├── api/
│ │ └── subscribe.ts # POST endpoint → Buttondown subscribe
│ └── issues/
│ └── [slug].astro # Issue reader
└── styles/
└── global.css # Global styles (Tailwind entry point)
public/
├── favicon.svg # Brand mark favicon
└── robots.txt # Robots + sitemap reference
License
Source code is available under the terms you see in the repository. The newsletter content itself is © Yuris Cakranegara.