diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9a24d85 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,177 @@ +# CLAUDE.md + +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). + +## What this site is + +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. + +Primary visitor goals (in priority order): + +1. Book a free discovery call (`/contact/`). +2. Understand the AI transformation and Azure platform service offering. +3. Read insight content on the blog at `/blog/`. + +## Tech stack + +- **Static site generator:** Jekyll, deployed via GitHub Pages. +- **Theme:** [`mmistakes/minimal-mistakes`](https://github.com/mmistakes/minimal-mistakes) v4.24.0 via `remote_theme` (do not vendor the theme). +- **Markdown:** kramdown with GFM input. +- **Plugins (must stay GitHub Pages compatible):** + - `jekyll-paginate` + - `jekyll-sitemap` + - `jekyll-gist` + - `jekyll-feed` + - `jekyll-include-cache` + - `jekyll-redirect-from` +- **Hosting:** GitHub Pages with custom domain via `CNAME`. +- **Analytics:** Google gtag (`G-WSEKFYVPNE`) configured in `_config.yml`. + +If a change requires a plugin not on the GitHub Pages allow-list, do not add it. Find another approach. + +## Repository layout + +``` +_config.yml Site config (title, plugins, defaults, analytics) +_data/ + navigation.yml Top nav order and labels + ui-text.yml Theme UI strings (do not edit lightly) +_includes/ Theme overrides and partials + head/custom.html Custom head: favicon, OG tags, JSON-LD schemas + masthead.html Top nav (overrides theme default) + footer.html, etc. +_layouts/ Theme layouts (single, splash, home, archive, etc.) +_pages/ All non-blog pages (services, home, about, contact, faq) +_posts/ Blog articles. Filename pattern: YYYY-MM-DD-slug.md +_sass/ Theme SCSS overrides +assets/ + images/ + revamp/ Current hero/diagram SVGs + splash/ Feature-row icons + logos/ Brand logos +robots.txt Allows all, points to sitemap.xml +CNAME umplify.com +``` + +## Content authoring rules + +### Brand voice + +- **Plain, senior, production-first.** The reader is a CTO, VP Engineering, founder, or senior architect. Speak in their language. +- **No fluff.** Every sentence either establishes credibility or drives a decision. +- **No em dashes (—).** Use commas, periods, semicolons, parentheses, or restructure the sentence. (See `memory/feedback_no_em_dashes.md` in the user's memory.) +- **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"). +- **Avoid hype words:** "revolutionary", "cutting-edge", "10x", "game-changer", "transformative" without proof. +- **Outcomes before features.** Lead with what the reader gets, then explain how. +- **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`). + +### Page front matter conventions + +Service pages should look like this: + +```yaml +--- +title: "Service Name" +permalink: /service-slug/ +layout: single +author_profile: false +service_schema: true # renders Schema.org Service JSON-LD via _includes/head/custom.html +excerpt: "One sentence used for meta description and OG/Twitter card." +header: + overlay_color: "#08142C" + overlay_filter: "0.22" + overlay_image: /assets/images/revamp/hero-ai.svg # AI pages + # or /assets/images/revamp/hero-cloud.svg # platform/Azure pages +redirect_from: # optional, requires jekyll-redirect-from + - /old-url/ +--- +``` + +Landing pages (home, ai-transformation, cloud-solutions) use `layout: splash` and feature rows. See `_pages/home.md` for the canonical pattern. + +### Permalinks + +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: + +```yaml +--- +title: "..." +permalink: /old/url/ +sitemap: false +redirect_to: /new/url/ +--- +``` + +### Internal linking + +Every service page should: + +1. Link to at least three related service pages. +2. Link to `/contact/`. +3. Link to `/how-we-engage/` if appropriate. + +Use markdown link syntax with leading slash: `[Label](/path/)`. + +### Images + +- Hero/header images live in `assets/images/revamp/`. +- Feature row icons live in `assets/images/splash/`. +- Always include alt text on `![alt](path)`. +- SVG is preferred. Avoid raster heroes when an SVG exists. +- 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. + +### SEO and structured data + +`_includes/head/custom.html` already emits: + +- `Organization` JSON-LD on every page. +- `Service` JSON-LD when a page has `service_schema: true` in its front matter. +- `FAQPage` JSON-LD on `/faq/` (kept in sync with `_pages/faq.md`). +- `BlogPosting` JSON-LD on blog posts. + +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. + +If you add a new service page, set `service_schema: true` to get Service JSON-LD for free. + +### Navigation + +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. + +## Blog posts + +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: + +- No em dashes (this is a project-wide rule, not blog-only). +- Use the same kramdown/GFM conventions as existing posts. +- Posts inherit `layout: single` and other defaults from `_config.yml`. + +## Local development + +```bash +bundle install +bundle exec jekyll serve +# open http://127.0.0.1:4000/ +``` + +Built output goes to `_site/`. **Never commit `_site/`.** + +## Things to avoid + +1. **Em dashes anywhere in site content.** +2. Adding plugins outside the GitHub Pages allow-list. +3. Editing files inside the `mmistakes/minimal-mistakes` theme directly. Override via `_includes/`, `_layouts/`, or `_sass/` instead. +4. Changing existing permalinks without a `redirect_from:` (or `redirect_to:` stub) covering the old URL. +5. Committing build artifacts (`_site/`, `.jekyll-cache/`, `.sass-cache/`). +6. Hard-coding the site URL. Use `{{ site.url }}` or `| absolute_url` / `| relative_url` filters. + +## Useful tasks for Claude + +- **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. +- **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`). +- **Add a new FAQ question.** Edit both `_pages/faq.md` and the `FAQPage` JSON-LD block inside `_includes/head/custom.html`. +- **Update the brand description.** Update `_config.yml` (`title`, `description`, `subtitle`) and re-check `_includes/head/custom.html` `Organization` JSON-LD if structural details change. +- **Audit content for em dashes before commit.** `grep -rn "—" _pages _data _includes _config.yml _posts`. The result should be empty. + +## Contact for questions + +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. diff --git a/_config.yml b/_config.yml index a5468d6..5b2653d 100644 --- a/_config.yml +++ b/_config.yml @@ -11,11 +11,11 @@ minimal_mistakes_skin : "default" # Site Settings locale : "en-US" -title : "Umplify | AI Transformation and Cloud Platform Engineering" +title : "Umplify | AI Transformation and Azure Cloud Platform Engineering" title_separator : "|" -subtitle : "Your AI and Cloud transformation partner" +subtitle : "AI-ready systems. Production-grade Azure platforms." name : "Umplify Technologies Inc." -description : "Umplify helps businesses in the Greater Toronto Area and across Canada become AI-ready through AI transformation services, enterprise AI integration, agentic workflows, and Azure cloud platform engineering." +description : "Umplify is a Toronto-based AI transformation and Azure cloud platform engineering partner. We design agentic workflows, enterprise AI integrations, private knowledge systems, and production-grade Azure architecture for software-led businesses across Canada." url : "https://umplify.com" baseurl : repository : "Umplify/umplify" @@ -180,6 +180,7 @@ plugins: - jekyll-gist - jekyll-feed - jekyll-include-cache + - jekyll-redirect-from whitelist: - jekyll-paginate @@ -187,6 +188,7 @@ whitelist: - jekyll-gist - jekyll-feed - jekyll-include-cache + - jekyll-redirect-from category_archive: type: liquid diff --git a/_data/navigation.yml b/_data/navigation.yml index fd9cec0..96848f5 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -3,8 +3,10 @@ main: url: / - title: "AI Transformation" url: /ai-transformation/ - - title: "Cloud Platform Engineering" + - title: "Azure Platform" url: /cloud-solutions/ + - title: "How We Engage" + url: /how-we-engage/ - title: "Blog" url: /blog/ - title: "FAQ" diff --git a/_includes/head/custom.html b/_includes/head/custom.html index 04a8096..89a3682 100644 --- a/_includes/head/custom.html +++ b/_includes/head/custom.html @@ -25,12 +25,29 @@ "@context": "https://schema.org", "@type": "Organization", "name": "Umplify Technologies Inc.", + "alternateName": "Umplify", "url": "{{ site.url }}", "logo": "{{ absolute_logo }}", "description": "{{ site.description | escape }}", + "foundingLocation": { + "@type": "Place", + "name": "Toronto, Ontario, Canada" + }, "areaServed": [ {"@type": "AdministrativeArea", "name": "Greater Toronto Area"}, - {"@type": "Country", "name": "Canada"} + {"@type": "Country", "name": "Canada"}, + {"@type": "Country", "name": "United States"} + ], + "knowsAbout": [ + "AI Transformation", + "Agentic Workflows", + "Enterprise AI Integration", + "Microsoft Azure", + "Azure OpenAI", + "Cloud Platform Engineering", + "SaaS Architecture", + "DevOps", + "Infrastructure as Code" ], "address": { "@type": "PostalAddress", @@ -38,12 +55,56 @@ "addressRegion": "ON", "addressCountry": "CA" }, + "contactPoint": [ + { + "@type": "ContactPoint", + "contactType": "sales", + "email": "sales@umplify.com", + "areaServed": ["CA", "US"], + "availableLanguage": "en" + }, + { + "@type": "ContactPoint", + "contactType": "customer support", + "email": "support@umplify.com", + "areaServed": ["CA", "US"], + "availableLanguage": "en" + } + ], "sameAs": [ "https://github.com/Umplify/umplify" ] } +{% if page.service_schema %} + +{% endif %} + {% if page.url == '/faq/' %}