09.06 · Governance / Publishing playbook

You run clients and strategy. This is how your work ships.

The publishing playbook for operators, not developers. Everything you change, a page of copy, a new article, a case study number, ships through the same four-move loop. Two apps do the work: GitHub Desktop for the loop, Terminal for previewing and deploying. Setup is once, at the bottom.

The loop: four moves, every time

This is the whole workflow. The rule behind it: work happens on a branch, never on main, so nothing goes live without a second look.

01 · Branch

Start a branch

In GitHub Desktop: Current Branch → New Branch. Name it you/what-it-is, like paige/fix-health-lede.

02 · Edit

Change it, see it live

Edit the file, then check it in your browser: run npm run dev in that repo's folder. Website at localhost:5273, library at localhost:5174.

03 · Send

Commit, push, PR

In GitHub Desktop: one line about what changed, click Commit, then Push origin, then Create Pull Request.

04 · Ship

Merge, then deploy

After the PR is merged on GitHub, anyone deploys with the two commands below, then hard-refreshes the live site to confirm.

The deploy, run from the repo you changed (swap the project name to diray-design-library for the library):

git checkout main && git pull && npm run build CLOUDFLARE_ACCOUNT_ID=d6c3b8e50caeab8aac8cabdeff6db2a3 npx wrangler pages deploy dist --project-name=diray-website --branch=main --commit-dirty=true

The plays: what you'll actually do

Every play is "do this, then run the loop." Pages live where their URLs say: the website's Who We Are page is who-we-are/index.html in the website repo, and library pages match their section folders.

Play 01 · most commonChange the words on a page

Open the page's file, find the sentence, change it, check it at localhost, run the loop. Voice rules to keep: the six outcomes are called Impacts, never Solutions; no em dashes; and article or case copy pulled from diraymedia.com stays verbatim, while the framing copy around it is yours to improve.

Play 02 · weeklyPublish a new article

Once the article is live on diraymedia.com, run node scripts/pull-news.mjs in the website repo. It fetches the article verbatim, formats it, adds SEO and the reading flow, and updates the newsroom. Then the loop.

Play 03Update a case study

Case pages are generated from one data file: scripts/generate-case-studies.mjs in the website repo. Edit the case's entry there, never the page files, then run node scripts/generate-case-studies.mjs and every card and detail page rebuilds consistently.

Play 04Add photography

Drop the image in the website repo's public/img/ folder, place it on a page, then in the library repo run node scripts/generate-photo-gallery.mjs so the photo library (08.05) catalogs it and tracks where it is used.

Play 05Refresh brand assets

Logos, color tokens, fonts, press copy, and social cards are generated packages. After any brand-source change, run python3 scripts/generate_brand_downloads.py in the library repo and the downloads page (08.07) rebuilds itself, versioned.

Play 06 · every shipRecord what shipped

Add a line to the change history, newest first, only for work that is live and checkable. When a wave finishes, the next numbered one-sheet condenses it for stakeholders.

Who owns what

Operators · client services, strategy, new business

  • Page copy, articles, case updates, photography
  • Keeping proof pages current with results
  • Opening PRs for everything above

Owner · Drew

  • Merges every PR
  • Brand, naming, and positioning calls
  • GitHub and Cloudflare invites

Anyone, after a merge

  • Runs the deploy commands
  • Verifies live with a hard refresh
  • Adds the changelog line

One-time setup ~15 minutes

Node.js. Install the LTS from nodejs.org (the big green button). If Terminal later says git is missing, run xcode-select --install.
GitHub Desktop. Download from desktop.github.com, drag to Applications, sign in with your GitHub account. No Homebrew, no admin password.
Invites. Accept the diray-media GitHub organization invite from your email and, if you will deploy, the Cloudflare invite for your @diraymedia.com account.
Clone both repos with GitHub Desktop (File → Clone Repository) into a folder that is not synced to OneDrive or iCloud, like ~/Projects/diray-Media. Then run npm install once in each folder.
Cloudflare login, deployers only: npx wrangler login from either repo, sign in as @diraymedia.com, confirm with npx wrangler whoami.
Orient. Read the latest one-sheet and the change history so you know the current state before your first play.

When something breaks

  • Push rejected on main. Working as intended. Make a branch (move 01) and open a PR.
  • Deploy says "Authentication error [code: 10000]". Wrangler is on the wrong account. Run npx wrangler whoami; if it shows a personal email, run npx wrangler login again with @diraymedia.com.
  • Build fails with missing modules. Run npm install in that repo and retry.
  • Dev server or preview fails and the project lives under OneDrive or iCloud. Re-clone both repos into a non-synced folder like ~/Projects/diray-Media, run npm install, delete the synced copies.
  • "brew install" fails with an ownership error. You do not need Homebrew for any of this; use GitHub Desktop.
  • The site looks old after a deploy. Hard-refresh (Cmd+Shift+R); the edge cache holds pages for a few minutes.