|
| 1 | +# CLAUDE.md |
| 2 | + |
| 3 | +This file gives Claude (and any other AI assistant) the working context required to safely edit the Umplify website. The site is a Jekyll project deployed via GitHub Pages at [https://umplify.com](https://umplify.com). |
| 4 | + |
| 5 | +## What this site is |
| 6 | + |
| 7 | +Umplify is a Toronto-based AI transformation and Azure cloud platform engineering partner. The website is a marketing and lead-generation site for software-led businesses, ISVs, scale-ups, and enterprise teams in Canada and the United States. |
| 8 | + |
| 9 | +Primary visitor goals (in priority order): |
| 10 | + |
| 11 | +1. Book a free discovery call (`/contact/`). |
| 12 | +2. Understand the AI transformation and Azure platform service offering. |
| 13 | +3. Read insight content on the blog at `/blog/`. |
| 14 | + |
| 15 | +## Tech stack |
| 16 | + |
| 17 | +- **Static site generator:** Jekyll, deployed via GitHub Pages. |
| 18 | +- **Theme:** [`mmistakes/minimal-mistakes`](https://github.com/mmistakes/minimal-mistakes) v4.24.0 via `remote_theme` (do not vendor the theme). |
| 19 | +- **Markdown:** kramdown with GFM input. |
| 20 | +- **Plugins (must stay GitHub Pages compatible):** |
| 21 | + - `jekyll-paginate` |
| 22 | + - `jekyll-sitemap` |
| 23 | + - `jekyll-gist` |
| 24 | + - `jekyll-feed` |
| 25 | + - `jekyll-include-cache` |
| 26 | + - `jekyll-redirect-from` |
| 27 | +- **Hosting:** GitHub Pages with custom domain via `CNAME`. |
| 28 | +- **Analytics:** Google gtag (`G-WSEKFYVPNE`) configured in `_config.yml`. |
| 29 | + |
| 30 | +If a change requires a plugin not on the GitHub Pages allow-list, do not add it. Find another approach. |
| 31 | + |
| 32 | +## Repository layout |
| 33 | + |
| 34 | +``` |
| 35 | +_config.yml Site config (title, plugins, defaults, analytics) |
| 36 | +_data/ |
| 37 | + navigation.yml Top nav order and labels |
| 38 | + ui-text.yml Theme UI strings (do not edit lightly) |
| 39 | +_includes/ Theme overrides and partials |
| 40 | + head/custom.html Custom head: favicon, OG tags, JSON-LD schemas |
| 41 | + masthead.html Top nav (overrides theme default) |
| 42 | + footer.html, etc. |
| 43 | +_layouts/ Theme layouts (single, splash, home, archive, etc.) |
| 44 | +_pages/ All non-blog pages (services, home, about, contact, faq) |
| 45 | +_posts/ Blog articles. Filename pattern: YYYY-MM-DD-slug.md |
| 46 | +_sass/ Theme SCSS overrides |
| 47 | +assets/ |
| 48 | + images/ |
| 49 | + revamp/ Current hero/diagram SVGs |
| 50 | + splash/ Feature-row icons |
| 51 | + logos/ Brand logos |
| 52 | +robots.txt Allows all, points to sitemap.xml |
| 53 | +CNAME umplify.com |
| 54 | +``` |
| 55 | + |
| 56 | +## Content authoring rules |
| 57 | + |
| 58 | +### Brand voice |
| 59 | + |
| 60 | +- **Plain, senior, production-first.** The reader is a CTO, VP Engineering, founder, or senior architect. Speak in their language. |
| 61 | +- **No fluff.** Every sentence either establishes credibility or drives a decision. |
| 62 | +- **No em dashes (—).** Use commas, periods, semicolons, parentheses, or restructure the sentence. (See `memory/feedback_no_em_dashes.md` in the user's memory.) |
| 63 | +- **Canadian English** spellings where they differ (e.g., "modernize" is fine, "centre" not "center" only in proper nouns; the site uses US-style "modernize/optimize"). |
| 64 | +- **Avoid hype words:** "revolutionary", "cutting-edge", "10x", "game-changer", "transformative" without proof. |
| 65 | +- **Outcomes before features.** Lead with what the reader gets, then explain how. |
| 66 | +- **CTA ladder.** Every important page should end with at least one primary CTA (`Book a free discovery call`) and one secondary (e.g., `How we engage`, `Read the FAQ`). |
| 67 | + |
| 68 | +### Page front matter conventions |
| 69 | + |
| 70 | +Service pages should look like this: |
| 71 | + |
| 72 | +```yaml |
| 73 | +--- |
| 74 | +title: "Service Name" |
| 75 | +permalink: /service-slug/ |
| 76 | +layout: single |
| 77 | +author_profile: false |
| 78 | +service_schema: true # renders Schema.org Service JSON-LD via _includes/head/custom.html |
| 79 | +excerpt: "One sentence used for meta description and OG/Twitter card." |
| 80 | +header: |
| 81 | + overlay_color: "#08142C" |
| 82 | + overlay_filter: "0.22" |
| 83 | + overlay_image: /assets/images/revamp/hero-ai.svg # AI pages |
| 84 | + # or /assets/images/revamp/hero-cloud.svg # platform/Azure pages |
| 85 | +redirect_from: # optional, requires jekyll-redirect-from |
| 86 | + - /old-url/ |
| 87 | +--- |
| 88 | +``` |
| 89 | + |
| 90 | +Landing pages (home, ai-transformation, cloud-solutions) use `layout: splash` and feature rows. See `_pages/home.md` for the canonical pattern. |
| 91 | + |
| 92 | +### Permalinks |
| 93 | + |
| 94 | +Service pages use top-level slugs (`/agentic-workflow-design/`). Legacy URLs under `/cloud-solutions/...` are kept as `redirect_to:` stubs for SEO continuity. Do not break existing permalinks. If a page is retired, replace its content with a stub: |
| 95 | + |
| 96 | +```yaml |
| 97 | +--- |
| 98 | +title: "..." |
| 99 | +permalink: /old/url/ |
| 100 | +sitemap: false |
| 101 | +redirect_to: /new/url/ |
| 102 | +--- |
| 103 | +``` |
| 104 | + |
| 105 | +### Internal linking |
| 106 | + |
| 107 | +Every service page should: |
| 108 | + |
| 109 | +1. Link to at least three related service pages. |
| 110 | +2. Link to `/contact/`. |
| 111 | +3. Link to `/how-we-engage/` if appropriate. |
| 112 | + |
| 113 | +Use markdown link syntax with leading slash: `[Label](/path/)`. |
| 114 | + |
| 115 | +### Images |
| 116 | + |
| 117 | +- Hero/header images live in `assets/images/revamp/`. |
| 118 | +- Feature row icons live in `assets/images/splash/`. |
| 119 | +- Always include alt text on ``. |
| 120 | +- SVG is preferred. Avoid raster heroes when an SVG exists. |
| 121 | +- The site `og_image` is `/assets/images/revamp/hero-ai.svg`. Some social platforms reject SVG OG images; prefer setting a page-specific `header.overlay_image` so the head template emits a usable URL. |
| 122 | + |
| 123 | +### SEO and structured data |
| 124 | + |
| 125 | +`_includes/head/custom.html` already emits: |
| 126 | + |
| 127 | +- `Organization` JSON-LD on every page. |
| 128 | +- `Service` JSON-LD when a page has `service_schema: true` in its front matter. |
| 129 | +- `FAQPage` JSON-LD on `/faq/` (kept in sync with `_pages/faq.md`). |
| 130 | +- `BlogPosting` JSON-LD on blog posts. |
| 131 | + |
| 132 | +If you add a new FAQ question on `_pages/faq.md`, also update the `FAQPage` JSON-LD block in `_includes/head/custom.html`. They must stay synchronized. |
| 133 | + |
| 134 | +If you add a new service page, set `service_schema: true` to get Service JSON-LD for free. |
| 135 | + |
| 136 | +### Navigation |
| 137 | + |
| 138 | +Top nav is driven by `_data/navigation.yml`. Keep the list short (target eight items or fewer). New service detail pages should be cross-linked from the relevant landing page (`/ai-transformation/` or `/cloud-solutions/`), not added to the top nav. |
| 139 | + |
| 140 | +## Blog posts |
| 141 | + |
| 142 | +Blog posts live in `_posts/` with filenames `YYYY-MM-DD-slug.md`. They are excluded from the audit process Claude runs on marketing pages. **Do not modify blog articles unless explicitly asked.** When writing new posts: |
| 143 | + |
| 144 | +- No em dashes (this is a project-wide rule, not blog-only). |
| 145 | +- Use the same kramdown/GFM conventions as existing posts. |
| 146 | +- Posts inherit `layout: single` and other defaults from `_config.yml`. |
| 147 | + |
| 148 | +## Local development |
| 149 | + |
| 150 | +```bash |
| 151 | +bundle install |
| 152 | +bundle exec jekyll serve |
| 153 | +# open http://127.0.0.1:4000/ |
| 154 | +``` |
| 155 | + |
| 156 | +Built output goes to `_site/`. **Never commit `_site/`.** |
| 157 | + |
| 158 | +## Things to avoid |
| 159 | + |
| 160 | +1. **Em dashes anywhere in site content.** |
| 161 | +2. Adding plugins outside the GitHub Pages allow-list. |
| 162 | +3. Editing files inside the `mmistakes/minimal-mistakes` theme directly. Override via `_includes/`, `_layouts/`, or `_sass/` instead. |
| 163 | +4. Changing existing permalinks without a `redirect_from:` (or `redirect_to:` stub) covering the old URL. |
| 164 | +5. Committing build artifacts (`_site/`, `.jekyll-cache/`, `.sass-cache/`). |
| 165 | +6. Hard-coding the site URL. Use `{{ site.url }}` or `| absolute_url` / `| relative_url` filters. |
| 166 | + |
| 167 | +## Useful tasks for Claude |
| 168 | + |
| 169 | +- **Add a new service page.** Copy the front matter pattern above, set `service_schema: true`, write the body, cross-link from `_pages/ai-transformation.md` or `_pages/cloud-solutions.md`, and link related pages from inside the new page. |
| 170 | +- **Retire a page.** Replace its content with the `redirect_to:` stub pattern shown above and verify nothing else in the repo links to it (`grep -r "/old-url/" _pages _data _includes`). |
| 171 | +- **Add a new FAQ question.** Edit both `_pages/faq.md` and the `FAQPage` JSON-LD block inside `_includes/head/custom.html`. |
| 172 | +- **Update the brand description.** Update `_config.yml` (`title`, `description`, `subtitle`) and re-check `_includes/head/custom.html` `Organization` JSON-LD if structural details change. |
| 173 | +- **Audit content for em dashes before commit.** `grep -rn "—" _pages _data _includes _config.yml _posts`. The result should be empty. |
| 174 | + |
| 175 | +## Contact for questions |
| 176 | + |
| 177 | +Repository owner: Arash Sabet (`arash.sabet@umplify.com`). The site reflects positioning that has been deliberately chosen; large strategic shifts (positioning, pricing language, ICP) should be confirmed before being shipped. |
0 commit comments