catcrew

A light and modern lifestyle blog theme for Zola.

Live demo

Cat Crew theme demo landing page

Features

Installation

Requires Zola 0.23.4 or later; this demo is validated with 0.23.4.

From your Zola site's root, add the theme as a Git submodule:

git submodule add https://git.colorized.life/demo.catcrew.studio.git themes/catcrew

Alternatively, clone it into the same directory:

git clone https://git.colorized.life/demo.catcrew.studio.git themes/catcrew

Set the top-level theme = "catcrew" in your site's zola.toml, as shown below.

Minimal configuration

For a homepage-only consumer site, use this minimal zola.toml. Empty link arrays override the default navigation until you add the corresponding pages. Keep a content/ directory in your site; no demo content is inherited.

base_url = "https://example.com"
title = "My Site"
theme = "catcrew"
compile_sass = true

[extra]
nav_links = []
header_links = []
footer_links = []

Full options

These are the complete reusable [extra] theme defaults from theme.toml. Override them under [extra] in your site's zola.toml:

[extra]
site_title = "My Site"
copyright_holder = "Your Name"

header_links = [
  { name = "home", path = "/" },
  { name = "about", path = "/about" },
  { name = "blog", path = "/blog" },
  { name = "links", path = "/links" },
]

footer_links = [
  { name = "home", path = "/" },
  { name = "about", path = "/about" },
  { name = "blog", path = "/blog" },
  { name = "links", path = "/links" },
]

nav_links = [
  { name = "about", path = "/about" },
  { name = "blog", path = "/blog" },
  { name = "links", path = "/links" },
]

header_links, footer_links, and nav_links share the same { name, path } format. path may be a local path or an absolute URL. header_links controls navigation on interior pages, while nav_links controls the landing-page navigation and normally omits home because the visitor is already there. Sites with cross-host webserver routing can override the header and footer home paths independently, such as with /home.

copyright_url is an optional override; when omitted, the copyright link uses config.base_url. copyright_holder defaults to Your Name from the theme. The optional landing_lines and feed_path settings have no theme defaults.

Customization

Create the corresponding content before enabling the default links. The following routes and templates describe the branded demo:

RouteTemplateDescription
/index.htmlStacked wordmark and config-driven navigation
/aboutabout.htmlMobile-first editorial About page
/blogblog.htmlPaginated blog listing
/blog/*post.htmlIndividual blog post
/linkslinks.htmlExternal links (header nav)

The branded demo adds this source entry to footer_links under [extra] (merge it with the other entries you want to retain):

[extra]
footer_links = [
  { name = "source", path = "https://git.colorized.life/demo.catcrew.studio/about/" },
]

Because path accepts an absolute URL, this source link works directly without a deployment redirect. Navigation uses { name, path }; links-page items use { name, url } as documented below.

Consumer customization example for an optional copyright URL override:

[extra]
copyright_url = "https://example.com"

The landing page displays site_title by default. To replace it with a multi-line wordmark, define the optional landing_lines array. Each line accepts left, center, or right alignment. Consumer customization example:

[extra]
landing_lines = [
  { text = "example", align = "left" },
  { text = ".com", align = "right" },
]

Feeds

To show the Atom feed links, set feed_path to a feed-enabled section. For example, add feed_path = "/blog" under [extra], keep atom.xml in the top-level feed_filenames, and set generate_feeds = true in that section's front matter.

Images

Page-bundled images can be placed with the image component. Alt text is independent from the optional visible caption:

{{/* <image url="juniper.jpg" position="left" alt="Juniper sitting by a window" content_path={page.path} /> */}}

{{/* <image url="fig.jpg" position="right" alt="Fig asleep on a blanket" caption="Fig at rest" content_path={page.path} /> */}}

Components live in templates/components/image.html. Pass content_path={page.path} for page bundles or content_path={section.path} in section Markdown. The component has no implicit page or section context. Root-relative paths and external URLs do not require content_path.

ParameterDefaultDescription
urlRequiredImage path or URL
content_path""Prefix for relative image and thumbnail paths
url_min""Optional thumbnail; links to the full image
alt""Alternative text, separate from the caption
caption""Optional visible plain-text caption
position"full"Layout position

Local image URLs retain cache busting. HTTP, HTTPS, and protocol-relative URLs are used directly. Text and HTML attributes are escaped.

Supported positions are full (the default), center, left, and right. Every position uses a centered, contained medium width on mobile; position-based sizing and text wrapping begin at the desktop breakpoint.

Consumer links-page front matter example for a page using template = "links.html" (inside its +++ delimiters):

[[extra.links]]
name = "example.com"
url = "https://example.com"

The optional Linktree importer writes this front matter as a complete page:

python3 themes/catcrew/scripts/extract_linktree_links.py \
  https://linktr.ee/example --output content/links.md

Omit --output to print the generated page instead of replacing a file.

Color palette

TokenNameHexRole
textSoft Ink#26232AForeground
bgBone#F6F4F1Background
mutedWhiskey Grey#716B67Muted accent
glowSky#7EC8E8Primary accent, link hover background
accentWindow Blue#3C739CSecondary accent
tertiaryGround Nutmeg#9E593DTertiary accent

License

MIT; see LICENSE.