Source code for jasoncookdesign.com, the professional portfolio and consulting brand website for Jason Cook Design. Deployed via GitHub Pages from the main branch of this repository.
Jason Cook Design is an Austin-based consultancy offering experience design, UX/UI, software architecture, business strategy, and interface engineering. This site serves as the primary inbound channel for consulting engagements.
- Static HTML5 — no build step, no framework, no CMS
- Bootstrap (bundled locally) — responsive grid and components
- jQuery + plugins — Owl Carousel, Magnific Popup
- Font Awesome + Themify Icons — icon sets (bundled locally)
- Custom CSS —
assets/css/app.css - Google Analytics (GA4) — tag
G-2ECQP0N7FX - Blog — Markdown posts rendered to committed static HTML by a small generator (no CMS, no build server, no CI); see Writing (Blog)
index.html Homepage (hero, services, work, pricing, calendar, contact)
cs01.html Case study: OSIsoft Enterprise UI Framework
cs02.html Case study: Ford Build and Price
cs03.html Case study: Qu POS
cs04.html Case study: Banco Azteca Network Operations Center
cs05.html Case study: Millennium Meevo
cs06.html Case study: Microsoft Surface
cs07.html Case study: Leading Hotels of the World
cs08.html Case study: Dell Unified Contact Us Experience
resume.pdf General resume
resume_designproduction.pdf Design production resume
404.html Custom 404 page
CNAME GitHub Pages custom domain config
assets/ CSS, JS, images, bundled plugin assets
calendar/ Legacy-compat redirects → Cal.com (see Scheduling)
archive/ Legacy assets (not linked from live site)
blog/ GENERATED blog — listing, per-post pages, RSS (do not hand-edit)
content/blog/ Blog post sources (Markdown + YAML frontmatter)
templates/blog/ Blog templates (post.html, index.html)
blog.config.json Blog generator config (paths + site metadata)
There is no build process. Edit HTML files directly.
All dependencies are bundled under assets/plugins/ — no npm, no package manager.
To preview locally, open any .html file in a browser or serve the directory:
python3 -m http.server 8000This repo is deployed via GitHub Pages. Merging to main on the canonical repo (jasoncookdesign/jasoncookdesign.github.io) publishes immediately to jasoncookdesign.com.
Contribution model: Submit PRs from the jcduser01 fork to the canonical jasoncookdesign upstream. Do not push directly to canonical main.
Booking is handled by Cal.com on the shared jasoncookdesign account (cal.com/jasoncookdesign). This replaces the previous Google Appointments redirect pages.
The homepage carries an always-visible booking widget in the #calendar section, between #pricing and the FAQ. The section is anchor-reachable at jasoncookdesign.com/#calendar — there is no nav entry.
Rather than the Cal.com profile (event-list) view, the widget uses a native button bar of hard-coded event types. Each button loads that event's Cal.com booking picker directly into an <iframe> below the bar (skipping the event-list view); exactly one type is selected at a time, defaulting to meeting on load. The buttons reuse the site's own .button classes (.button-dark marks the active type), and the event slugs are hard-coded — they don't change, so there's no profile lookup.
The picker iframe is loaded with ?embed=true&theme=light&brandColor=141414&hideEventTypeDetails=false&layout=month_view. theme=light and brandColor are set here only, so this embed stays visually independent of the Dyson Hope embed on the same shared Cal.com account.
Event types shown on this page (hard-coded button bar): meeting (15m / 30m / 60m), coffee (30m), breakfast (60m), lunch (60m), dinner (90m). The shared studio event (120m / 180m / 240m, also used by dysonhope.com) is intentionally omitted from the JCD button bar — it is not a JCD-facing offering. The legacy /calendar/studio/ route still redirects to it so existing direct links keep working.
The old /calendar/ pages are retained only as legacy-compatibility redirects (<meta http-equiv="refresh" content="0; ..."> plus a window.location.replace() JS fallback). The hub returns visitors to the on-site embed; per-type routes go straight to their specific Cal.com event to preserve booking intent from bookmarked or shared links. No Google Appointments URLs remain.
| Page | Redirect target |
|---|---|
calendar/index.html |
/#calendar |
calendar/30min/index.html |
https://cal.com/jasoncookdesign/meeting |
calendar/60min/index.html |
https://cal.com/jasoncookdesign/meeting |
calendar/coffee/index.html |
https://cal.com/jasoncookdesign/coffee |
calendar/breakfast/index.html |
https://cal.com/jasoncookdesign/breakfast |
calendar/lunch/index.html |
https://cal.com/jasoncookdesign/lunch |
calendar/dinner/index.html |
https://cal.com/jasoncookdesign/dinner |
calendar/studio/index.html |
https://cal.com/jasoncookdesign/studio |
- Duplicate an existing
csNN.html(e.g.,cp cs08.html cs09.html) - Update the title, meta description, and all content sections in the new file
- Add a card/link to the work grid in
index.html - Open a PR from the
jcduser01fork
The /blog/ section is long-form writing on design, technology, and AI, reachable from the Writing link in the main navigation. It keeps the site's "commit static HTML, no server" model: posts are authored in Markdown and rendered to static HTML by a small generator, and the rendered HTML is committed — there is no CMS, build server, or CI.
content/blog/<YYYY-MM-DD-slug>.md Post source (Markdown + YAML frontmatter)
templates/blog/post.html Per-post template (site chrome + typography)
templates/blog/index.html Listing template; the card between
<!-- BEGIN POST_CARD --> / <!-- END POST_CARD -->
repeats once per published post
blog/index.html GENERATED listing
blog/<slug>/index.html GENERATED post page
blog/feed.xml GENERATED RSS feed
blog.config.json Generator config (source/template/output paths + site metadata)
The blog/ directory is generated output — do not hand-edit it. Edit the Markdown source or the templates, then regenerate.
title: "Required — post title"
date: 2026-06-23 # required; ISO date; drives ordering + RSS
slug: optional # derived from the title if omitted
tags: [design, ai] # optional
excerpt: "One-line summary" # listing + meta description + og:description; auto-derived if omitted
draft: false # true = the post is skipped by the generator
cover_image: assets/blog/x.jpg # optional; used for the social/og:image
canonical_url: optional # optional; set when the post is also published elsewhere- Add
content/blog/<YYYY-MM-DD-slug>.mdwith frontmatter and a Markdown body. - Regenerate with the blog generator (Python; requires the
markdownandpyyamlpackages), pointing it atblog.config.json. It renders every non-draft post and (re)writes theblog/directory deterministically. - Commit the new Markdown and the regenerated
blog/files, then open a PR from thejcduser01fork. Merging to canonicalmainpublishes to jasoncookdesign.com/blog/.
Blog asset links are root-relative (/assets/...), so preview by serving the repo root and visiting /blog/:
python3 -m http.server 8000 # then open http://localhost:8000/blog/