Homegrown Infra — self-hosting, digital sovereignty, and the politics of software you run
  • Astro 54.4%
  • TypeScript 33.5%
  • CSS 11.7%
  • JavaScript 0.4%
Find a file
yurisasc 6e53fcb38a
All checks were successful
Deploy to Netlify / deploy (push) Successful in 2m44s
fix(nav): center pills on mobile with safe-center alignment
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).
2026-06-20 09:20:00 +07:00
.forgejo/workflows fix(ci): add --no-build to netlify deploy to prevent env-less rebuild 2026-06-20 02:02:46 +07:00
.hermes/bridge bridge: Issue #1 pull + resend plan, build-time env doc, hero image policy 2026-06-14 15:14:55 +00:00
public feat: make shipped stubs real and add web fundamentals 2026-06-19 22:57:08 +07:00
src fix(nav): center pills on mobile with safe-center alignment 2026-06-20 09:20:00 +07:00
.env.example Initial commit: Homegrown Infra Astro site 2026-05-30 11:50:13 +00:00
.gitignore ci: add Netlify deployment via Forgejo Actions 2026-05-30 13:03:35 +00:00
.npmrc chore: add pnpm-workspace.yaml config for pnpm v11 2026-05-30 12:01:12 +00:00
astro.config.mjs fix(deploy): switch to @astrojs/netlify adapter for Netlify hybrid 2026-06-20 01:13:09 +07:00
env.d.ts Initial commit: Homegrown Infra Astro site 2026-05-30 11:50:13 +00:00
netlify.toml ci: add Netlify deployment via Forgejo Actions 2026-05-30 13:03:35 +00:00
package.json fix(deploy): switch to @astrojs/netlify adapter for Netlify hybrid 2026-06-20 01:13:09 +07:00
pnpm-lock.yaml fix(deploy): switch to @astrojs/netlify adapter for Netlify hybrid 2026-06-20 01:13:09 +07:00
pnpm-workspace.yaml fix(deploy): switch to @astrojs/netlify adapter for Netlify hybrid 2026-06-20 01:13:09 +07:00
README.md feat: make shipped stubs real and add web fundamentals 2026-06-19 22:57:08 +07:00
tsconfig.json Initial commit: Homegrown Infra Astro site 2026-05-30 11:50:13 +00:00

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

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.


Built at git.nokopia.com/yuris/homegrown-infra