This repository contains the source code for the Opener Initiative's website.
The easiest way to get a working environment is the included dev container (VS Code → "Reopen in Container"), which provides Bun and all dependencies.
Otherwise, with Bun installed:
bun install # install dependencies
bun run dev # start Astro dev server at http://localhost:8080Other useful commands include:
bun run build # production build -> dist/
bun run preview # serve the production build locally
bun run check # type-check
bun run lint # lintThis project is built with:
- Astro
- TypeScript
- React
- shadcn-ui
- Tailwind CSS
├── public/ static files (favicon, robots.txt)
└── src/
├── assets/ logos and images
├── components/ Astro and React components
├── content/ news posts
├── layouts/ page shell
├── lib/ shared helpers
├── pages/ routes
├── content.config.ts news collection schema
└── index.css global styles and light/dark themes
Every post is a folder under src/content/news/, sorted into year and month (zero-padded):
src/content/news/2049/11/dect-world/
├── index.md the post
├── hero.png the cover picture
└── booth.png any other images
The folder name becomes the address, here /news/2049/11/dect-world/.
index.md starts with a header block between --- lines, followed by the post text in Markdown:
---
title: "DECT World 2049: A resounding success"
description: "A one-sentence summary. Shown on post cards and in the RSS feed."
pubDate: 2049-11-05
image: "./hero.png"
imageAlt: "Opener team members demoing the stack at DECT World 2049"
imageCredit: "(c) Opener Initiative"
draft: true
pinned: true
---
Post text. Start headings at `##`, and reference images like this:
Good to know:
- Only
title,description, andpubDateare required. All other fields are optional. pubDateis a plain date (YYYY-MM-DD) and orders the posts, newest first. It must match the post's year and month folders.imageis the post's cover picture andimageAltits description for screen readers. Make it 1200 × 630 pixels, or post cards and link previews will crop it. Leave both out for a text-only post, but never one of them.imageCreditadds an attribution below the cover picture.draft: truecan be used for news items that are not yet to be published. If set, the post is kept out of the build and the corresponding HTML page is not generated.pinned: truekeeps a post at the front of the landing page and the newsroom, ahead of newer entries, and puts a golden star on its card. If multiple entries are pinned, they are ordered bypubDate. The RSS feed ignores pins and stays strictly newest to oldest.- A post appears on the landing page, in the newsroom, and in the RSS feed automatically.
If something is wrong or missing, the build stops with a corresponding error message.