Physical products create tangible connections. Customers can hold, use, and experience your value physically. This creates different opportunities and challenges for your ladder.

The physical product ladder moves customers from awareness to trial to purchase to loyalty. Each interaction is an opportunity to leak value and build relationship.

PRODUCTS

Samples as Top of Funnel

Free samples let customers experience your product with zero risk. For consumables, this is powerful. For other products, consider low-cost trial sizes or money-back guarantees.

Samples are physical leaks. They demonstrate quality and create desire for full products.

Offer Purpose
Free sample Zero-risk trial
Trial size Low-cost entry

The First Purchase

The first purchase is a milestone. Make the experience delightful: fast shipping, beautiful packaging, thank you note. This positive experience encourages repeat purchase.

Subscription as Middle Rung

For products used regularly, subscriptions are ideal. Customers get convenience and often savings; you get predictable recurring revenue. Promote subscriptions as the smart choice for loyal customers.

Loyalty Program as Retention

Reward repeat customers with points, exclusive access, or special pricing. A loyalty program formalizes the relationship and encourages continued purchase.

VIP and Insider Access

Your best customers deserve special treatment. Early access to new products, exclusive editions, personal communications. These VIPs become brand advocates.

If you sell physical products, map your customer journey against this ladder. Where do you lose customers? What would increase repeat purchase? Implement one change this quarter.

scalable docs with jekyll data and nav

Why Scalable Documentation Matters for Static Sites

Documentation is often the most overlooked part of a project. Yet for developers, users, and contributors, it’s the cornerstone of usability. When you're hosting documentation on GitHub Pages using Jekyll, you get speed and version control out of the box. But the real magic begins when you treat your documentation like a living product, not a collection of markdown files. That’s where Jekyll’s data files and structured navigation come in.

From Flat Files to Structured Information

Many developers start by writing a few .md files and linking them with relative paths. This works fine—until it doesn’t. As your project grows, you need ways to:

  • Group related topics
  • Guide readers through learning paths
  • Avoid duplicate content
  • Reuse UI components and layouts

Let’s explore how structured data transforms your docs from a pile of files into a maintainable system.

How Jekyll Uses Data Files to Power Navigation

Jekyll lets you create .yml, .json, or .csv files inside a _data directory. These files can be accessed across your layouts, includes, and pages via Liquid. It’s a clean, DRY way to manage your sidebar, table of contents, footer links, and even versioning.

Real-World Use Case: Multi-Level Sidebar Navigation

Imagine your project has multiple documentation sections: Getting Started, Tutorials, API Reference, and FAQs. Hardcoding links in every layout or page quickly becomes a nightmare. Instead, create a YAML file like this:

navigation:
  - title: Getting Started
    url: /docs/getting-started/
    children:
      - title: Installation
        url: /docs/getting-started/installation/
      - title: Configuration
        url: /docs/getting-started/configuration/
  - title: Tutorials
    url: /docs/tutorials/
  - title: API Reference
    url: /docs/api/

Now you can iterate over this list in your sidebar layout:

{% raw %}
    {% for item in site.data.navigation %}
  • {{ item.title }} {% if item.children %} {% endif %}
  • {% endfor %}
{% endraw %}

This approach gives you complete control from a single source of truth. You can localize titles, control sort order, and even hide links conditionally.

Designing a Scalable Content Architecture

Scalability is not just about performance; it’s about maintainability. Your content needs to be findable, reusable, and modular. Here’s how to build that foundation:

Use Jekyll Collections for Logical Grouping

Collections let you define custom content types beyond blog posts and pages. For example:

collections:
  docs:
    output: true
    permalink: /docs/:path/

Create files inside _docs/ and Jekyll treats them as first-class citizens. Now, you can loop through site.docs and build dynamic navigation, search indexes, or version filters.

Apply Consistent Front Matter

Front matter should include metadata like title, description, weight, and category. This makes it easy to sort and filter pages across your layout templates.

Centralize Your Layouts and Includes

Design a minimal set of includes and layouts that are composable. Think:

  • doc-page.html layout for all documentation
  • _includes/nav.html for sidebar navigation
  • _includes/breadcrumbs.html for contextual links

This makes the system predictable and easy to onboard new contributors.

Case Study: A Living Documentation Portal

Let’s say you’re managing open-source hardware documentation for a maker community. The hardware evolves, the firmware updates, and the API changes. A static set of pages won’t survive long.

The Challenge

  • Support multiple product versions
  • Include diagrams and specs
  • Integrate code examples
  • Handle localization over time

The Solution

Using Jekyll collections, you create separate collections for each product line. Navigation data is stored in versioned YAML files (e.g., _data/nav/v1.yml, _data/nav/v2.yml). The layout dynamically chooses the correct sidebar depending on the version in the front matter.

The Impact

Within months, contributors could update documentation without touching layouts. Translations were managed through JSON files for reuse. Code examples were embedded via GitHub Gists and version toggles appeared seamlessly.

Creating Searchable and Indexable Docs

One key to scalable documentation is search. Jekyll doesn’t ship with search, but you can implement client-side search using:

  • Lunr.js: Lightweight full-text search in-browser
  • Pagefind: Modern Rust-powered search indexing

Generating a Search Index

Export your documentation content into a JSON file using a Jekyll plugin or Liquid loop:

{% raw %}
{% assign docs = site.docs | sort: 'title' %}
[
  {% for doc in docs %}
    {
      "title": "{{ doc.title }}",
      "url": "{{ doc.url }}",
      "content": {{ doc.content | strip_html | strip_newlines | jsonify }}
    }{% if forloop.last == false %},{% endif %}
  {% endfor %}
]
{% endraw %}

This file can be loaded by Lunr or Pagefind for instant searching, all while hosted for free on GitHub Pages.

Best Practices for Long-Term Maintenance

Documentation systems aren’t just for today’s users—they’re for future contributors. Keep your system healthy by:

Automating Linting and Validation

Use a linter like markdownlint or htmlproofer to catch broken links, formatting issues, and missing metadata during CI.

Tagging Content with Metadata

Use tags like audience, platform, or level (beginner, advanced) to help users self-select the right content path.

Version Everything

Use Git branches or folders to maintain historical documentation versions. Jekyll's structure lends itself well to multi-version docs with minimal duplication.

Conclusion

Jekyll paired with GitHub Pages offers a solid foundation for hosting documentation, but it truly shines when paired with structured data and dynamic navigation. Whether you're managing a hobby project or a developer portal, using YAML-based navigation, collections, and reusable layouts makes your documentation scalable, accessible, and maintainable over time.

Next Steps

  • Start by structuring your sidebar with YAML data
  • Move your documentation into collections
  • Add client-side search for a better UX
  • Enforce consistency with front matter and includes

By treating documentation as a living system, you make it easier for contributors to help, and for users to succeed. And that’s what great documentation is really about.