|
1 | 1 | ## Python Insider Blog |
2 | 2 |
|
3 | | -Blog for Python core team, mostly for blogging about releases. |
| 3 | +The official blog for the Python core team — mostly release announcements. |
4 | 4 |
|
5 | | -## About |
| 5 | +Built with [Astro](https://astro.build/) and [Keystatic](https://keystatic.com/) CMS. |
| 6 | +Content is plain Markdown, built statically at deploy time. |
6 | 7 |
|
7 | | -Uses keystatic for WYSIWYG editing. |
| 8 | +## Quickstart |
8 | 9 |
|
9 | | -Features some custom components like: |
| 10 | +### Prerequisites |
10 | 11 |
|
11 | | -- GitHub User, Repo |
12 | | -- PyPI Project |
13 | | -- CPython Docs |
| 12 | +**Bun** — the JavaScript runtime used for this project. |
14 | 13 |
|
15 | | -Utilizes Bun for builds. Uses Astro.js which builds statically at build time. |
16 | | -Pre-commit config, powered by Prek to do CI things and spellchecks. |
| 14 | +```bash |
| 15 | +# macOS |
| 16 | +brew install oven-sh/bun/bun |
17 | 17 |
|
18 | | -### From Blogger |
| 18 | +# Linux / WSL |
| 19 | +curl -fsSL https://bun.sh/install | bash |
19 | 20 |
|
20 | | -Migrated from Blogger with a field on new posts of "Previous Blogger URL" |
21 | | -so that we can more easily redirect. |
| 21 | +# Windows — use WSL, then the Linux command above |
| 22 | +``` |
22 | 23 |
|
23 | | -### Posts |
| 24 | +See [bun.sh/docs/installation](https://bun.sh/docs/installation) for other methods. |
24 | 25 |
|
25 | | -Posts are structured under `content/posts/`. |
26 | | -They have the directory named after the blog entry title. |
| 26 | +**prek** (optional) — runs pre-commit hooks locally. Only needed if you want |
| 27 | +to run linting/spellcheck before pushing. CI will catch these regardless. |
27 | 28 |
|
28 | | -Inside is the core markdown (index.md) and optionally the images |
29 | | -used in the blog entry. |
| 29 | +```bash |
| 30 | +# macOS |
| 31 | +brew install prefix-dev/prek/prek |
30 | 32 |
|
31 | | -### Authors |
| 33 | +# Linux / Windows (standalone installer) |
| 34 | +curl -fsSL https://prek.j178.dev/install.sh | bash |
| 35 | + |
| 36 | +# Or via cargo / pip / other methods |
| 37 | +cargo install prek |
| 38 | +``` |
| 39 | + |
| 40 | +See [prek.j178.dev/installation](https://prek.j178.dev/installation/#standalone-installer) |
| 41 | +for all installation options. |
| 42 | + |
| 43 | +> [!NOTE] |
| 44 | +> **Windows users**: The Makefile requires a Unix shell. Use |
| 45 | +> [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) or Git Bash. |
| 46 | +> Alternatively, skip `make` and run the bun commands directly (see table below). |
| 47 | +
|
| 48 | +### Setup |
| 49 | + |
| 50 | +```bash |
| 51 | +git clone https://github.com/python/python-insider-blog.git |
| 52 | +cd python-insider-blog |
| 53 | +make install # installs node_modules + git hooks |
| 54 | +make dev # starts dev server at http://127.0.0.1:4321 |
| 55 | +``` |
| 56 | + |
| 57 | +`make install` runs `bun install` (dependencies) and `prek install` (git hooks). |
| 58 | +If you don't have prek installed, the hook setup will fail but everything else |
| 59 | +still works — you can write and preview posts without it. |
32 | 60 |
|
33 | | -Authors are configured via `content/authors/`. |
| 61 | +## Writing a blog post |
34 | 62 |
|
35 | | -## Contributing |
| 63 | +### Option A: Use the Keystatic UI (recommended) |
36 | 64 |
|
37 | | -There are `Make` targets to get up and going, assuming you have the |
38 | | -tooling required (Bun, prek, etc.) |
| 65 | +1. Run `make dev` |
| 66 | +2. Open http://127.0.0.1:4321/keystatic in your browser |
| 67 | +3. Create or edit a post with the visual editor |
| 68 | +4. Commit and open a pull request |
39 | 69 |
|
40 | | -### Writing Blog Entries |
| 70 | +### Option B: Write Markdown directly |
41 | 71 |
|
42 | | -You can pull the repo, run `make dev`, and edit the page via Keystatic |
43 | | -with the nice UI or you can write markdown in your editor. |
| 72 | +Create a new directory under `content/posts/` named after your post slug, |
| 73 | +with an `index.md` inside: |
44 | 74 |
|
45 | | -Both should open a pull request to GitHub for review and CI checks. |
| 75 | +``` |
| 76 | +content/posts/python-31213-31115-31020/ |
| 77 | +└── index.md |
| 78 | +``` |
| 79 | + |
| 80 | +Frontmatter fields: |
| 81 | + |
| 82 | +```yaml |
| 83 | +--- |
| 84 | +title: "Python 3.12.13, 3.11.15, and 3.10.20 are now available" |
| 85 | +description: "Security fix release for Python 3.12, 3.11, and 3.10" |
| 86 | +authors: |
| 87 | + - thomas-wouters |
| 88 | +tags: |
| 89 | + - "3.12" |
| 90 | + - "3.11" |
| 91 | + - "3.10" |
| 92 | +pubDate: 2026-03-03 |
| 93 | +draft: false |
| 94 | +previousBloggerUrl: "" |
| 95 | +--- |
| 96 | +``` |
| 97 | + |
| 98 | +Then write the body in standard Markdown. Open a PR when done. |
| 99 | + |
| 100 | +> [!TIP] |
| 101 | +> Links to PEPs, CPython docs, PyPI, GitHub repos/issues, CVEs, and |
| 102 | +> python.org releases are automatically styled as inline reference badges. |
| 103 | +> Just use normal Markdown links — no special syntax needed. |
| 104 | +> |
| 105 | +> If you're using the Keystatic editor, you also have access to explicit |
| 106 | +> inline components: `{% GhUser name="hugovk" /%}`, `{% Pep number=649 /%}`, etc. |
| 107 | +
|
| 108 | +### Authors |
46 | 109 |
|
47 | | -> [!NOTE] |
48 | | -> You have access to a few custom components that can be used like |
49 | | -> `{% GhUser name="hugovk" /%}`, but PEPs, CPython docs, and GitHub links |
50 | | -> will automatically be picked up if you use standard markdown via the |
51 | | -> URL regex. |
| 110 | +Author profiles live in `content/authors/{id}.json`. If you're writing your |
| 111 | +first post, create one (or use the Make target): |
| 112 | + |
| 113 | +```bash |
| 114 | +make content-new-author ID=your-name NAME="Your Name" |
| 115 | +``` |
| 116 | + |
| 117 | +Then edit the JSON to add your GitHub handle, avatar URL, etc. |
| 118 | + |
| 119 | +## Development |
| 120 | + |
| 121 | +| Make target | Without make | What it does | |
| 122 | +| ------------------ | ------------------------ | ------------------------------------ | |
| 123 | +| `make install` | `bun install` | Install dependencies (+ git hooks) | |
| 124 | +| `make dev` | `bun run dev` | Start Astro dev server | |
| 125 | +| `make build` | `bun run build` | Production build | |
| 126 | +| `make preview` | `bun run preview` | Build and preview production locally | |
| 127 | +| `make check` | `bun run lint && bun run typecheck` | Run linter + type checker | |
| 128 | +| `make spellcheck` | — | Run typos spell checker (needs prek) | |
| 129 | +| `make clean` | — | Remove build artifacts and caches | |
| 130 | +| `make fresh` | — | Full clean reinstall | |
| 131 | + |
| 132 | +Run `make help` for the complete list. |
| 133 | + |
| 134 | +## Project structure |
| 135 | + |
| 136 | +``` |
| 137 | +content/ |
| 138 | + authors/ # Author profiles (JSON) |
| 139 | + posts/ # Blog posts (Markdown + images) |
| 140 | +src/ |
| 141 | + components/ # Astro/React components |
| 142 | + layouts/ # Page layouts |
| 143 | + pages/ # Astro routes |
| 144 | + plugins/ # Remark plugins (reference badges, etc.) |
| 145 | + assets/ # Styles, fonts |
| 146 | +``` |
0 commit comments