All Case Studies
Case Study April 2026 8–10 min read

West County Community Services: One Coordinated Sprint to Fix a Decayed Nonprofit Site

West County Community Services — the Sonoma County nonprofit behind the Russian River Senior Center, the Petaluma Peer Recovery Center, and a network of housing and outreach programs — was running on a site that had drifted. The homepage hero was broken above the fold. The legal pages predated CPRA. Roughly 20% of outbound links were dead. The generic page template rendered every non-custom page as an unstyled wall of text. North & Vine shipped the compliance-and-hygiene pass and the design upgrade as one coordinated sprint — so the chrome and the content landed together.

The Starting Point

WCCS serves West Sonoma County across senior services, peer recovery, housing, and community outreach. The live site had been running without active maintenance long enough that the problems had stacked: the homepage hero pointed at a missing image, the privacy policy pre-dated California’s CPRA, the terms of use referenced services that weren’t offered, about a fifth of outbound links were dead, and the server-level hardening had drifted from current defaults.

The engagement bundled a compliance-and-hygiene pass (ADA, privacy, TOS, security, link rot) with a design upgrade (palette extension, FSE block patterns, template visual interest) on the same theme, delivered in a single coordinated sprint. One pass, one deploy window, one narrative for the board — instead of three separate projects that would each reopen the site.

Accessibility (ADA)

There was no dedicated accessibility statement, no documented contact path for accommodation requests, and template-level issues: missing landmark structure on the page/post template, no visible focus styles on pager and tag links, and an image-only hero with no keyboard controls.

  • Wrote a new Accessibility Statement covering the conformance target (WCAG 2.1 AA), known limitations, a feedback channel, and assistive-tech compatibility.
  • Added aria-roledescription="carousel" and labelled prev/next/dot controls to the new homepage hero slideshow, so keyboard users can traverse slides.
  • Picked a darker gold (#b88914) for body-text-on-cream, with darker pink/teal pairings where needed, to clear WCAG AA contrast. The primary gold #FFC333 only ever renders as accent fill — never as body text.
  • Replaced the generic template’s bare <h1> with a true landmark header and a single <main id="main-content"> per page, so skip-links and screen-reader region navigation actually work.

Privacy & CPRA

The existing privacy policy didn’t reflect current third-party embeds, predated California’s CPRA, and had no opt-out or contact path. It was boilerplate that had outlived the surface it was documenting.

  • Rewrote the Privacy Policy around categories of data collected, sources, purposes, disclosure, retention, CPRA rights (know / delete / correct / opt-out), children’s privacy, and a named contact.
  • Aligned the policy with what the site actually does — newsletter signups, donation referrals, analytics, embedded maps — rather than defensive filler. Anything the site doesn’t do was cut, not left in as padding.
  • Confirmed via the broken-link audit that no tracking pixels pointed at dead endpoints — a small signal that the cleanup was consistent end-to-end.

Terms of Use

The old TOS was generic, referenced services WCCS doesn’t offer, and lacked clauses they actually need — acceptable-use for community comments, user-contributed imagery, a DMCA contact.

  • Rewrote Terms of Use: acceptable use, user-submitted content licence, trademark & copyright, disclaimers, indemnification, DMCA contact, governing law (California).
  • Kept it short and plain-language. This is a nonprofit, not an e-commerce platform — removing clauses that didn’t apply reduced the page by more than a third.

Security & Link Rot

Two parallel surfaces needed attention: link rot and dangling assets in published content, and server-level configuration drift on the host running the site.

Content-surface audit

Built a WP_Query + ACF walker that extracted every <img src>, <a href>, and ACF-stored URL rendered into templates. 559 URLs emitted, 349 unique after dedup. A 20-way parallel HEAD/GET probe produced:

280 URLs healthy (200 OK)
39 Hard 404s identified and queued
29 403 / 402 / 522 / 406 / network failures triaged
26 Flagged for author decision (delete / archive / replace)

Server-surface hardening

  • Captured pre-change .bak snapshots of sshd_config, the Apache vhost, php.ini, the system and root crontabs, and the coffee user’s sudoers drop-in before any modification — the forensic trail lives outside the WordPress tree so it’s not exposed via any misconfigured alias.
  • Current versions on the host are the hardened state; backups are scoped to this host.

Homepage Fix + FSE Block Patterns

The homepage hero was a single static ACF image field that had gone missing, leaving a broken image reference above the fold. Below the hero, the page was hand-coded with no way for non-developer staff to update it.

  • Replaced the single hero_photo ACF field with a hero_slides repeater (image + link + label, any number of slides). The production hero now runs three configured slides.
  • Rebuilt the hero block to render the first slide eagerly with fetchpriority="high", lazy-load subsequent slides, and expose prev/next buttons plus role-tablist dots. Works as a static first-slide hero with JavaScript off.
  • Developed the slideshow as a standalone HTML deliverable first, so markup/CSS/JS could be reviewed in isolation before integration.
  • Landed six WCCS block patterns — callout, stat row, two-column aside, wave divider, pull-quote, kicker heading — registered under a wccs category. That’s the FSE/block-editor foundation the site was missing: authors can compose future pages from the inserter without a new bespoke template every time.

Brand Palette Extension

The existing palette (teal + cream) was structurally sound but visually flat. No accent, no hierarchy signal, nothing to carry a reader’s eye down a long page. We extended the palette rather than replacing it, so the brand stayed continuous while the page gained texture.

Role Hex Use
Teal (kept)#014750Primary brand, headings, hero bands
Cream (kept)#FDFFF1Page background, alternating section band
Gold (new)#FFC333Accent — kickers, rules, bullets, stat figures
Pink (new)#EB3DA0Sparing emotional accent — pull-quotes, hover states
Darker gold#b88914Body text on cream where gold is needed at readable contrast
Body dark#133Body text baseline on cream

The chosen direction drives the Russian River Senior Center page redesign and the generic page/post template, so the whole site now shares one vocabulary of gold rules, cream/white banding, and pink pull-accents.

Russian River Senior Center Page Rebuild

The RRSC page was rendering a literal broken image tag with the string “March2020scoopfinal Page 2,” orphan stacked links, no hierarchy, and staff contacts as plain paragraph text. One of the most-visited pages on the site, and the least usable.

  • Wrote a design spec covering hero, About, How to Participate (three cards), Meet the Team, and Sponsors.
  • Explored three brand-element directions side-by-side; the “graphic moments” option was chosen for its hierarchy and restraint.
  • Rebuilt the page in native Gutenberg block markup. Content went from 3,989 bytes of plain paragraphs to 11,662 bytes of structured blocks — editable, composable, and navigable.
  • Captured desktop and mobile before/after screenshots for the hand-off, plus live post-deploy verification.

Template Visual Interest (page.php + single.php)

Every page and post that wasn’t on a custom template rendered as a plain <h1> over body text on cream — no band, no kicker, no scan-ability, nothing matching the home page’s personality. We delivered a three-layer redesign so new content would inherit design quality automatically.

Layer 1 — Title area

Teal band with gold kicker, serif H1, 48px gold rule under it, and a cream wave SVG feeding into the body. Optional full-bleed featured-image strip with gradient fade into the teal band. Applied to both page.php and single.php. The post kicker sources the primary category; the page kicker sources the parent page title or falls back to “West County Community Services.”

Layer 2 — Automatic body CSS

Roughly 700 new lines in assets/css/main.css (1,956 → 2,660) that restyle editor-emitted markup without author effort: H2s with gold rule, gold square bullets, teal blockquote border, gold-dot <hr>, striped tables, gold-underline inline links, caption styling, figure rules. Authors type a heading and get design.

Layer 3 — Opt-in block patterns

The same six WCCS patterns from the homepage work, available from the inserter. Authors pick them when a page needs medium or loud moments — and leave the defaults alone when it doesn’t.

Post- and page-specific adds

  • single.php gains meta in the hero (date + category), “Posted in” tag pills at body end, and prev/next pager cards with gold kicker.
  • page.php gains an automatic child-page grid for parent pages (skipped when there are no children) and a shared end-of-article share row (email / Facebook / copy-link) with no third-party widgets or tracking.

What This Case Study Demonstrates

The deliverable isn’t just a healed site. It’s a block-pattern library, an editor-emitted CSS layer, and a palette that every future page inherits for free. The next board-approved landing page doesn’t need a developer. That’s the scalable outcome — design quality that survives author turnover.

About North & Vine

North & Vine builds first-party data platforms, custom WordPress systems, and AI-powered experiences for destination marketers, travel brands, nonprofits, and category-defining web products. When a site has drifted, we fix the chrome, the content, and the compliance together — so the organization ships once and moves on.

Has your site drifted?

Accessibility, privacy, link rot, and template design tend to decay in parallel. We’ll audit and ship the fixes as one coordinated sprint — not three separate projects.

Start the Conversation