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
xcode-select --install.~/Projects/diray-Media. Then run npm install once in each folder.npx wrangler login from either repo, sign in as @diraymedia.com, confirm with npx wrangler whoami.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, runnpx wrangler loginagain with @diraymedia.com. - Build fails with missing modules. Run
npm installin 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, runnpm 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.