JekyllPortfolio

howdy-jekyll-theme — Jekyll Portfolio Template

By howdyitskyle

Howdy is a Jekyll theme for personal websites and portfolios, MIT licensed, with light/dark mode, project collections, paginated blog, and configuration for various third-party services.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-13View source

What stands out

A quick read of the recorded project description.

01

Distributed as a RubyGem, installed via Gemfile and the theme field in _config.yml

02

Supports light/dark mode toggle, with preference persisted and following system settings

03

Homepage hero supports single image or touch/swipe carousel with 2 or more images

04

Project collection sorted by year; blog uses jekyll-paginate-v2 pagination with category color tags

05

Integrates jekyll-seo-tag, jekyll-feed, jekyll-sitemap; optional Giscus/Disqus/Utterances comments and Mailchimp/Buttondown subscriptions

06

Provides Playwright end-to-end tests and Rake validation, Lighthouse audit tasks

Template Details

Howdy is a Jekyll theme for personal websites and portfolios, distributed as a RubyGem and installable into new or existing Jekyll sites via the Gemfile and the theme field in _config.yml. The theme provides a homepage hero carousel (single image or touch/swipe switching when 2 or more images are provided), a project collection sorted by year, a blog with pagination and category color tags, automatic table of contents, share buttons, a company logo marquee, and light/dark mode toggle (preference persisted and follows system settings). Content is managed through Markdown files in the _projects and _posts directories; page copy, navigation, social links, fonts, 404 page, and more are configured in _config.yml. The theme integrates jekyll-seo-tag, jekyll-feed, jekyll-sitemap, and jekyll-paginate-v2, and optionally supports Giscus/Disqus/Utterances comments, Mailchimp/Buttondown/custom form subscriptions, and Google Analytics or Plausible analytics. Styling can be customized by overriding _sass variables, _includes, and _layouts files; the accent color can be changed in colors.accent. The repository includes Playwright end-to-end tests and Rake tasks for HTML validation, configuration field checks, and Lighthouse audits; the README lists compatible versions for Chrome, Firefox, Safari, and Edge, along with several known browser differences. Before use, note: the theme code is MIT licensed, but third-party assets such as demo images, fonts, and icons require separate license verification; external services such as comments, subscriptions, and analytics may incur additional costs.

JekyllPortfolio

Is it right for your project?

Use Cases

  • Build a personal portfolio website, using the _projects collection to display projects sorted by year
  • Create a personal blog with pagination, categories, and automatic table of contents
  • Configure light/dark mode, social links, and share buttons for a personal site
  • Integrate third-party comments, email subscriptions, or analytics services into a static site

Suitable For

  • Individual developers or designers familiar with Jekyll and Markdown content management
  • Personal websites that need both a portfolio and a blog
  • Theme users who want to install via RubyGem and configure through _config.yml
  • Site builders who accept verifying licenses for third-party assets such as demo images and fonts themselves

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Ruby >= 3.0, Jekyll >= 3.9, and Bundler >= 2.4; Node.js >= 18 is only needed for Lighthouse CI

  2. 2

    For a new site, run jekyll new my-site --skip-bundle, then add gem "howdy-jekyll-theme" to the Gemfile and set theme: howdy-jekyll-theme in _config.yml

  3. 3

    For an existing site, remove the theme and remote_theme lines from _config.yml, and delete the _layouts, _includes, and _sass directories before installing

  4. 4

    If permission or system gem conflicts occur, first run bundle config --local path .bundle then bundle install

  5. 5

    External services such as comments, subscriptions, and analytics require filling in the corresponding provider and credentials in _config.yml, and may incur additional costs

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version from the public repository under the MIT license; the free scope is the code of this version and does not imply that external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution of this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked under their respective licenses; they cannot be assumed to be covered solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
  • The theme design is inspired by and adapted from axeltmpl's Framer template, which itself is not part of this repository's MIT code; users must verify the licensing status of its design source.
  • The SVG illustrations used in the demo are from Illustration Kit's Ven series, which are third-party assets; their license is independent of the theme's MIT code license and must be checked separately.
  • The Chaumont Script font used in the logo is provided by Måns Grebäck and is a third-party font asset; its font license must be verified before commercial use or redistribution.
  • Node.js 18 and above is only required for running Lighthouse CI audits; normal site building and deployment do not depend on Node.js.
  • Enabling email subscriptions requires configuring the provider and action_url for Mailchimp, Buttondown, or a custom form in _config.yml; this is an external service that may incur costs or require account registration.
  • Enabling comments requires configuring Giscus, Disqus, or Utterances and filling in credentials such as repository and category; it depends on GitHub or a third-party comment service.
  • Enabling analytics requires choosing Google Analytics or Plausible and filling in the corresponding domain or credentials; this is an external service that may incur costs.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

- **[axeltmpl](https://axeltmpl.framer.website/)** — Design inspired by and remixed from this Framer template

Original README

- **[Ven from Illustration Kit](https://illustrationkit.com/illustrations/ven)** — Free SVG illustrations

Original README

- **[Chaumont Script](https://fontmeme.com/fonts/chaumont-script-font/)** — by Måns Grebäck

Original README

| [Node.js](https://nodejs.org/) | >= 18 | For Lighthouse CI only |

Original README

newsletter: enabled: true provider: buttondown # mailchimp, buttondown, custom action_url: "https://..." # form action URL

Original README

comments: enabled: false provider: giscus # giscus, disqus, utterances giscus: repo: "user/repo" repo_id: "R_XXXXXXXX" category: "Announcements" category_id: "DIC_XXXXXXXX"

Original README

analytics: provider: plausible # google, plausible plausible_domain: "yoursite.com"

Original README
https://github.com/howdyitskyle/howdy-jekyll-theme/blob/main/LICENSEhttps://github.com/howdyitskyle/howdy-jekyll-theme/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-13. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 80 / 100
Technologies
Jekyll
Website type
Portfolio
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-14
Screenshot last checked
2026-10-13

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Jekyll as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-13

Inspect the recorded source material

SHA-256: 09a0e0f2b9635fad3b85afae1e566c4ec6dd046cfd60f7c78752c569a29445f2

2026-10-13T08:33:19.545Z

Source file / repository
# Howdy Jekyll Theme

> A clean, modern, and minimalist Jekyll theme for personal websites and portfolios.

[![Gem Version](https://img.shields.io/gem/v/howdy-jekyll-theme)](https://rubygems.org/gems/howdy-jekyll-theme)
[![Gem Downloads](https://img.shields.io/gem/dt/howdy-jekyll-theme)](https://rubygems.org/gems/howdy-jekyll-theme)
[![CI](https://github.com/howdyitskyle/howdy-jekyll-theme/actions/workflows/ci.yml/badge.svg)](https://github.com/howdyitskyle/howdy-jekyll-theme/actions/workflows/ci.yml)
[![Jekyll](https://img.shields.io/badge/jekyll-%E2%89%A53.9-008a1e)](https://jekyllrb.com/)
[![Ruby](https://img.shields.io/badge/ruby-%E2%89%A53.0-red)](https://www.ruby-lang.org/)
[![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
[![Lighthouse](https://img.shields.io/badge/lighthouse-all%20categories%20%E2%89%A50.9-008a1e)](lighthouserc.json)

[**Live Demo**](https://howdyitskyle.github.io/howdy-jekyll-theme/) · [**Installation**](#installation) · [**Configuration**](#configuration) · [**Contributing**](#contributing)

---

## Requirements

| Dependency | Version | Required |
|---|---|---|
| [Ruby](https://www.ruby-lang.org/) | >= 3.0 | Yes |
| [Jekyll](https://jekyllrb.com/) | >= 3.9 | Yes |
| [Bundler](https://bundler.io/) | >= 2.4 | Yes |
| [Node.js](https://nodejs.org/) | >= 18 | For Lighthouse CI only |

## Screenshots

| Light Mode | Dark Mode |
|---|---|
| ![Light mode](assets/images/howdy-theme-light.png) | ![Dark mode](assets/images/howdy-theme-dark.png) |

## Features

| Feature | Description |
|---|---|
| **Gem-based** | Easy installation via RubyGems |
| **Light & Dark** | Toggle with persistent preference, respects system preference |
| **Responsive** | Desktop, tablet, and mobile optimized |
| **Hero Carousel** | Touch/swipe-enabled, Swiper.js powered, fade transitions, autoplay |
| **Projects** | Portfolio collection sorted by year with dedicated layouts |
| **Blog** | jekyll-paginate-v2 powered with category color accents |
| **SEO** | jekyll-seo-tag integration |
| **RSS** | Automatic feed via jekyll-feed |
| **TOC** | Auto-generated table of contents with configurable heading levels |
| **Share** | Twitter, LinkedIn, Facebook, Reddit, Hacker News, WhatsApp, Telegram, Email, and copy-link buttons |
| **Newsletter** | Mailchimp, Buttondown, or custom form support |
| **Comments** | Giscus, Disqus, or Utterances |
| **Analytics** | Google Analytics or Plausible |
| **Company Logos** | Configurable marquee section |
| **Fonts** | Local DM Sans variable font + Chaumont Script logo font. Configurable via `fonts.primary` and `fonts.mono` |

## Browser Compatibility

| Browser | Version | Supported |
|---|---|---|
| Chrome | 120+ | ✅ |
| Firefox | 115+ | ✅ |
| Safari | 16+ | ✅ |
| Edge | 120+ | ✅ |

### Known Quirks

- **Firefox scrollbars**: Uses `scrollbar-color` and `scrollbar-width` (native thin scrollbars). `::-webkit-scrollbar` rules are ignored.
- **Safari `scroll-margin-top`**: Fully supported in Safari 15+. Older versions may require `padding-top` workaround on headings.
- **Safari SVG `loading="lazy"`**: SVG images do not support lazy loading in Safari; they load eagerly regardless of attribute.

## Automated Testing

This theme includes Playwright end-to-end tests covering:

| Test Suite | Coverage |
|---|---|
| `nav.spec.js` | Hamburger toggle, ESC/overlay close, desktop hide |
| `theme.spec.js` | Light/dark toggle, localStorage persistence, reload restore |
| `carousel.spec.js` | Dot navigation, swipe gestures, slide dimensions |
| `toc.spec.js` | Anchor scroll, scroll-margin offset, TOC presence |
| `transitions.spec.js` | Page fade-out, external/hash link exclusion |

```bash
npm test          # Run all tests
npm run test:ui   # Interactive UI mode
```

## Installation

### New Jekyll Site

```bash
jekyll new my-site --skip-bundle
cd my-site
```

### Add the Theme

Add to your `Gemfile`:

```ruby
gem "howdy-jekyll-theme"
```

Add to your `_config.yml`:

```yaml
theme: howdy-jekyll-theme
```

Then install:

```bash
bundle config --local path .bundle
bundle install
```

> **Troubleshooting:** If you run into permission issues or conflicts with system gems, run `bundle config --local path .bundle` before `bundle install`. This vendors all gems into the project's `.bundle/` directory, keeping your environment isolated.

### Existing Site

Remove any `theme:` and `remote_theme:` lines from `_config.yml`, delete `_layouts`, `_includes`, and `_sass` directories, then follow the steps above.

## Configuration

### Minimal Setup

```yaml
# _config.yml
title: "Your Name"
description: "Your site description"
lang: "en"
author: "Your Name"
email: "[email protected]"

url: "https://yoursite.com"
baseurl: ""

theme: howdy-jekyll-theme

plugins:
  - jekyll-seo-tag
  - jekyll-feed
  - jekyll-sitemap
  - jekyll-paginate-v2

collections:
  projects:
    output: true
    permalink: /projects/:slug/
    sort_by: year

pagination:
  enabled: true
  per_page: 5
  permalink: "/blog/page:num/"
  sort_reverse: true
```

### Hero Carousel

Single image or multi-image carousel:

```yaml
# Single image
hero_image: /assets/images/hero.png

# Carousel (2+ images enables touch/swipe)
hero_images:
  - /assets/images/hero-1.jpg
  - /assets/images/hero-2.jpg
  - /assets/images/hero-3.jpg
```

### Navigation

```yaml
navigation:
  - title: "Home"
    url: "/"
  - title: "Projects"
    url: "/projects/"
  - title: "Blog"
    url: "/blog/"
  - title: "About"
    url: "/about"
```

### Social Links

```yaml
social:
  github: "https://github.com/yourusername"
  twitter: "https://x.com/yourusername"
  linkedin: "https://linkedin.com/in/yourusername"
  instagram: "https://instagram.com/yourusername"
  dribbble: "https://dribbble.com/yourusername"
```

### Homepage Hero

```yaml
hero:
  headline: "I&nbsp;shape product&nbsp;strategy<br>&amp;&nbsp;design experiences<br><span class=\"text-muted\">at scale</span>"
  subtitle: "Your tagline or short description."
  cta_text: "View case studies"
  cta_url: "/projects/"
```

### About Page

```yaml
about_bio: "Your intro paragraph. <strong>HTML</strong> supported."
about_headline: "Building products that<br>sit at the intersection<br><span class=\"text-muted\">of design and intelligence</span>"
about_paragraph_2: "Your second paragraph."
about_paragraph_3: "Your third paragraph."
about_hero_image: "/assets/illustrations/designer.svg"
about_resume:
  enabled: true
  text: "Download Resume"
  url: "/assets/resume.pdf"

# Testimonials (shown on about page)
testimonials:
  - quote: "A great testimonial quote."
    name: "Jane Doe"
    role: "Title, Company"
```

### Pagination

```yaml
pagination:
  enabled: true
  per_page: 5
  permalink: "page:num/"
  sort_reverse: true
  prev_text: "Prev"
  next_text: "Next"
```

### 404 Page

```yaml
page_404:
  title: "Page Not Found"
  message: "The page you're looking for doesn't exist or has been moved."
  button_text: "Go Home"
  button_url: "/"
```

### Fonts

```yaml
fonts:
  primary: "DM Sans"      # DM Sans, Inter, Plus Jakarta Sans, Instrument Sans, Space Grotesk, Work Sans, Outfit, Manrope, Sora
  mono: "Fragment Mono"   # Fragment Mono, JetBrains Mono, Fira Code
```

### Company Logos Marquee

```yaml
company_logos:
  enabled: true
  items:
    - name: "Company 1"
      width: 120
      url: "https://company1.com"
    - name: "Company 2"
      width: 100
      url: "https://company2.com"
```

### Newsletter, Comments, Analytics

```yaml
# Newsletter
newsletter:
  enabled: true
  provider: buttondown      # mailchimp, buttondown, custom
  action_url: "https://..." # form action URL
  title: "Stay updated"

# Comments
comments:
  enabled: false
  provider: giscus          # giscus, disqus, utterances
  giscus:
    repo: "user/repo"
    repo_id: "R_XXXXXXXX"
    category: "Announcements"
    category_id: "DIC_XXXXXXXX"

# Analytics
analytics:
  provider: plausible       # google, plausible
  plausible_domain: "yoursite.com"
```

## Content Types

### Projects

Create files in `_projects/`:

```yaml
---
layout: project
title: "Project Name"
subtitle: "Brief description"
category: "Web Design"
year: "2025"
image: /assets/images/project.jpg
---
Project content with markdown...
```

### Blog Posts

Create files in `_posts/` with naming format `YYYY-MM-DD-slug.md`:

```yaml
---
layout: post
title: "Post Title"
category: "Tutorials"      # Tutorials, Inspiration, Freebies, Interviews
image: /assets/images/post.jpg
---
Post content...
```

> **Tip:** Use `<!--more-->` to define the excerpt shown on the blog index.

## Customization

### Override Styles

Create `assets/css/main.scss` in your site:

```scss
---
---
@use "variables";
@use "base";
@use "typography";
@use "layout";
@use "components";
@use "dark-mode";

// Your styles here
```

### Override Partials

Copy any `_includes/` or `_layouts/` file into your site's directory with the same path. Jekyll will use your version instead of the theme's.

### User Color Palette

Override the accent color in your `_config.yml`:

```yaml
colors:
  accent: "#e63946"
```

## Development

```bash
git clone https://github.com/howdyitskyle/howdy-jekyll-theme.git
cd howdy-jekyll-theme
bundle config --local path .bundle
bundle install
bundle exec jekyll serve
```

Visit `http://localhost:4000`.

### Testing

```bash
bundle exec rake test             # HTML validation (links, images, scripts)
bundle exec rake validate_config  # Config field checks
bundle exec rake lighthouse       # Performance & accessibility audits
bundle exec rake all              # All of the above
```

Lighthouse CI asserts accessibility >= 0.9 across 5 pages.

### Build the Gem

```bash
gem build howdy-jekyll-theme.gemspec
gem install ./howdy-jekyll-theme-1.0.0.gem
```

## File Structure

```
├── _includes/          # 12 partials (nav, hero-carousel, toc, share, etc.)
├── _layouts/           # 7 layouts (default, home, page, post, project, blog, collection)
├── _sass/              # 7 stylesheets (variables, base, typography, layout, components, dark-mode, user-colors)
├── assets/
│   ├── css/            # main.scss, swiper-bundle.min.css
│   ├── js/             # hero-carousel.js, mobile-nav.js, theme-toggle.js, swiper-bundle.min.js
│   ├── fonts/          # ChaumontScript-Regular.otf, DMSans-Variable.ttf, DMSans-Italic-Variable.ttf
│   ├── images/
│   └── illustrations/
├── _projects/          # Demo portfolio items
├── _posts/             # Demo blog posts
├── blog/               # Blog index with pagination
├── lib/                # Gem entry point
├── _config.yml         # Fully documented configuration
├── Rakefile            # Test runner
└── lighthouserc.json   # Lighthouse CI assertions
```

## Contributing

1. Fork the repo
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

Bug reports and feature requests are welcome at [Issues](https://github.com/howdyitskyle/howdy-jekyll-theme/issues).

## License

This theme is available under the [MIT License](LICENSE).

## Acknowledgments

- **[axeltmpl](https://axeltmpl.framer.website/)** — Design inspired by and remixed from this Framer template
- **[Ven from Illustration Kit](https://illustrationkit.com/illustrations/ven)** — Free SVG illustrations
- **[Swiper.js](https://swiperjs.com/)** — Touch-enabled carousel (MIT)
- **[Chaumont Script](https://fontmeme.com/fonts/chaumont-script-font/)** — by Måns Grebäck
- **[Jekyll](https://jekyllrb.com/)** — Static site generator
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.