diff --git a/.github/actions/publish.mjs b/.github/actions/publish.mjs
new file mode 100644
index 0000000..c1b1459
--- /dev/null
+++ b/.github/actions/publish.mjs
@@ -0,0 +1,26 @@
+import { readFile } from "node:fs/promises";
+import { Octokit } from "@octokit/action";
+import GhostAdminAPI from '@tryghost/admin-api'
+
+const octokit = new Octokit();
+const ghost = new GhostAdminAPI({
+ url: "https://progsoc.org",
+ key: process.env.GHOST_ADMIN_API_KEY,
+ version: "v5.0",
+});
+
+const { data } = await octokit.request("POST /markdown", {
+ headers: { accept: "text/html" },
+ text: await readFile("CONSTITUTION.md", { encoding: "utf-8" }),
+});
+
+const html = data
+ .replace(/
/g, "")
+ .replace(/>(\d(?:\.\d)*)\.?/g, ">$1.");
+
+const { updated_at } = await ghost.pages.read({ id: "65d0046b07a6e4000144c4d2" });
+
+await ghost.pages.edit(
+ { id: "65d0046b07a6e4000144c4d2", updated_at, html, },
+ { source: "html" },
+);
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..4f1f5b3
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,19 @@
+name: Update Ghost Page
+on:
+ push:
+ branches:
+ - main
+jobs:
+ put-html:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - run: npm install @octokit/action@6.0.7
+ - run: npm install @tryghost/admin-api@1.13.11
+ - run: node .github/actions/publish.mjs
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GHOST_ADMIN_API_KEY: ${{ secrets.GHOST_ADMIN_API_KEY }}