PHPackages                             cwmoss/slowfoot - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. cwmoss/slowfoot

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

cwmoss/slowfoot
===============

your friendly static site generator

064PHPCI passing

Since May 11Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/cwmoss/slowfoot)[ Packagist](https://packagist.org/packages/cwmoss/slowfoot)[ RSS](/packages/cwmoss-slowfoot/feed)WikiDiscussions main Synced yesterday

READMEChangelog (3)DependenciesVersions (1)Used By (0)

[![Make Doku](https://github.com/cwmoss/slowfoot/actions/workflows/doku.yml/badge.svg)](https://github.com/cwmoss/slowfoot/actions/workflows/doku.yml)

slowfoot W.I.P
==============

[](#slowfoot-wip)

requires php &gt;= 8.5

your content is data. slowfoot transforms it into beautiful websites.

how it works
------------

[](#how-it-works)

### fetching

[](#fetching)

you define your content sources. slowfoot fetches every source and creates a dataset of documents. the basic schema for documents is:

- string `_id` a global id of the document
- string `_type` a document type

### projection

[](#projection)

you define your web page paths per type. for every type, if there is a template, all documents are projected to web pages though the template. a document can have multiple paths/templates defined. example: you have a type `artist` and 2 pages: `{artist}/` with the bio and `{artist}/works/` with a list of works.

### templates

[](#templates)

with the templates, you define the output. default template engine is `phuety`. in your templates you can query all data that was previously fetched. slowfoot supports the generation of images and handling of css and javascript.

config
------

[](#config)

everything will change!

### sources

[](#sources)

content sources have a unique name, a source type and opts

included source loader

- dataset, json nd, load\_dataset()
- json, load\_json()
- directory, markdown/ frontmatter, load\_directory()

### types

[](#types)

types are content types with template, path pattern or path function

### hooks

[](#hooks)

available hooks

- on\_load(row) =&gt; row || null

pipeline
--------

[](#pipeline)

```
include src/helper.php => SLOWFOOT_BASE (project root directory)
read config.php => sources, types, hooks
| load_sources
| load template helper
=> dataset, paths
  | build pages from all types with defined templates
  | build pages from src/pages folder
  => website

```

asset references
----------------

[](#asset-references)

~/path/to.jpg relative to file-content-source-base ../parent/path/to.jpg relative to file-content-source-current-directory ./path/to.jpg relative to file-content-source-current-directory /path/to.jpg relative to project-source-directory

global cli
----------

[](#global-cli)

alias slowfoot="/Users/rw/dev/slowfoot/bin/slowfoot -d ."

docker
------

[](#docker)

docker run --rm -it -v ${PWD}:/project sft info

alias slowfoot="docker run --rm -it -p 1199:1199 -v ${PWD}:/project ghcr.io/cwmoss/slowfoot"

### control if page gets written

[](#control-if-page-gets-written)

option A

return null or empty array, while fetching the document. no data, no output. good use case are drafts for drafts you can also return a row with key `_draft`. the data will be only visible in development mode. it will not be added to the production dataset.

also if document contains key `_no_path`, no path will be created and no page will be created

option B

use a path function in config that returns null for a document. effective, but a litte bit more involved.

option C

template return empty string. easy for designer but maybe not the most efficient

#### todo

[](#todo)

resolve urls for pages, remove path\_page function

- fts (for dev)
- navigator: add links, add pagination
- phuety: control assets location
- refactor store
- refactor query lang
- refactor page query
- refactor pagination generator

remaining constants:

```
SLOWFOOT_START
SLOWFOOT_PREVIEW
SLOWFOOT_NO_DEBUG
? SLOWFOOT_WEBDEPLOY

```

env:

```
SLFT_BUILD_KEY
SLFT_PROJECT_DIR
SLFT_WRITE_PATH
SLFT_PATH_PREFIX
SLFT_PHP_BIN
SLFT_DEPLOYER_LBR
SLFT_WEBDEPLOY_ALLOWED_HOSTS

```

test requirements

```
collator_create Intl
iconv

```

TODO remove dependencies:

- front-yaml OK
- League CommonMark OK
- dotenv OK
- easydb OK
- ausi/slug-generator or jbroadway/urlify =&gt; OK jbroadway/urlify
- composer-runtime-api ?
- league/glide ?
- wrun =&gt; httpful ??

###  Health Score

22

—

LowBetter than 21% of packages

Maintenance59

Moderate activity, may be stable

Popularity8

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d448396576beaec8f896c46e121a942c2186e9798a4a84d1dba738ffe15bef28?d=identicon)[cwmoss](/maintainers/cwmoss)

---

Top Contributors

[![cwmoss](https://avatars.githubusercontent.com/u/16048828?v=4)](https://github.com/cwmoss "cwmoss (230 commits)")

### Embed Badge

![Health badge](/badges/cwmoss-slowfoot/health.svg)

```
[![Health](https://phpackages.com/badges/cwmoss-slowfoot/health.svg)](https://phpackages.com/packages/cwmoss-slowfoot)
```

###  Alternatives

[fetchleo/laravel-xml

Convert Eloquent models to XML, as well as normal objects.

104.2k](/packages/fetchleo-laravel-xml)[blesta/pricing

A library for handling pricing and pricing modifiers

131.1k](/packages/blesta-pricing)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
