This project was created by Oliver Steele (@osteele), and is currently maintained by Daniil Gentili (@danog).
Gojekyll is a partially-compatible clone of the Jekyll
static site generator, written in the Go programming
language. It provides build
and serve
commands, with directory watch and
live reload.
Gojekyll | Jekyll | Hugo | |
---|---|---|---|
Stable | ✓ | ✓ | |
Fast | ✓ (~20×Jekyll) |
✓ | |
Template language | Liquid | Liquid | Go, Ace and Amber templates |
SASS | ✓ | ✓ | ✓ |
Jekyll compatibility | partial | ✓ | |
Plugins | some | yes | shortcodes, theme components |
Windows support | ✓ | ✓ | ✓ |
Implementation language | Go | Ruby | Go |
gojekyll build # builds the site in the current directory into _site
gojekyll serve # serve the app at http://localhost:4000; reload on changes
gojekyll help
gojekyll help build
You can use gojekyll
with the official danog/gojekyll
image, for example to build the site in the current directory into _site
:
docker run --user $UID:$GID -v $PWD:/app --pull always --rm -it danog/gojekyll build -s /app
Another example, serve the website in the current directory on http://localhost:4040
, automatically reloading on changes:
docker run --user $UID:$GID -v $PWD:/app --pull always --network host --rm -it danog/gojekyll serve -s /app
Gemfile
that lists the theme., and
run bundle install
. The Jekyll theme
instructions provide more detail, and
should work for Gojekyll too.Pre-requisites:
brew install go
; or (2)
download.Then run:
go install github.com/osteele/gojekyll@latest
Add this to your .bashrc
or .zshrc
:
# Bash:
eval "$(gojekyll --completion-script-bash)"
# Zsh:
eval "$(gojekyll --completion-script-zsh)"
This project works on the GitHub Pages sites that I and other contributors care about. It looks credible on a spot-check of other Jekyll sites.
Missing features:
sassify
is not implementedmarkdown="span"
, markdown="block"
Also see the detailed status below.
These will probably not change:
By design:
_config.yml
file – for example, a list where a string is
expected, or vice versa – is generally an error.serve --watch
(the default) reloads the _config.yml
and data files too.serve
generates pages on the fly; it doesn't write to the file system./tmp/gojekyll-${USER}
, not ./.sass-cache
Upstream:
<
and >
inside markdown is interpreted as HTML. For example, This is <b>bold</b>
renders as bold. This behavior matches the Markdown
spec, but differs
from Jekyll's default Kramdown processor.## Title (<a href="https://example.com/path/to/details">ref</a>))
is #title-ref
,
not #title-https-example-path-to-details-ref
.## Either/or
is #either-or
not
#eitheror
; the id of ## I'm Lucky
is #i-m-lucky
not #im-lucky
.Muzukashii:
scssify
build
--source
, --destination
, --drafts
, --future
, --unpublished
--incremental
, --watch
, --force_polling
, JEKYLL_ENV=production
--baseurl
, --config
, --lsi
--limit-posts
clean
help
serve
--open-uri
, --host
, --port
--incremental
, –watch
, --force_polling
--baseurl
, --config
--detach
, --ssl
-* – not planneddoctor
, import
, new
, new-theme
– not plannedIf the error is "403 API rate limit exceeded", you are probably building a
repository that uses the jekyll-github-metadata
gem. Try setting the
JEKYLL_GITHUB_TOKEN
, JEKYLL_GITHUB_TOKEN
, or OCTOKIT_ACCESS_TOKEN
environment variable to the value of a GitHub personal access
token and trying again.
Thanks goes to these wonderful people (emoji key):
Oliver Steele 💻 🎨 📖 🤔 🚇 🚧 📆 👀 ⚠️ |
Bjørn Erik Pedersen 📖 |
Maurits van der Schee 💻 |
Daniil Gentili 💻 |
Cameron Elliott 🤔 |
This project follows the all-contributors specification. Contributions of any kind welcome!
Gojekyll uses these libraries:
Package | Author(s) | Usage | License |
---|---|---|---|
github.com/jaschaephraim/lrserver | Jascha Ephraim | Live Reload | MIT License |
github.com/kyokomi/emoji | kyokomi | jemoji plugin emulation |
MIT License |
github.com/osteele/liquid | yours truly | Liquid processor | MIT License |
github.com/pkg/browser | pkg | serve --open-url option |
BSD 2-clause "Simplified" License |
github.com/radovskyb/watcher | Benjamin Radovsky | Polling file watch (--force_polling ) |
BSD 3-clause "New" or "Revised" License |
github.com/danog/blackfriday | Russ Ross, Daniil Gentili | Markdown processing | Simplified BSD License |
github.com/sass/dart-sass | Listed here | The reference implementation of Sass, written in Dart. | MIT License |
github.com/tdewolff/minify | Taco de Wolff | CSS minimization | MIT License |
github.com/bep/godartsass | Drew Wells | Go API backed by the native Dart Sass Embedded executable. | MIT License |
github.com/alecthomas/kingpin/v2 | Alec Thomas | command-line arguments | MIT License |
github.com/alecthomas/chroma | Alec Thomas | Syntax highlighter | MIT License |
gopkg.in/yaml.v2 | Canonical | YAML support | Apache License 2.0 |
In addition, the following pieces of text were taken from Jekyll and its plugins. They are used under the terms of the MIT License.
Source | Use | Description |
---|---|---|
Jekyll template documentation | test cases | filter examples |
jekyll help command |
gojekyll help text |
help text |
jekyll-feed plugin |
plugin emulation | feed.xml template |
jekyll-redirect-from plugin |
plugin emulation | redirect page template |
jekyll-sitemap plugin |
plugin emulation | sitemap template |
jekyll-seo-tag plugin |
plugin emulation | feed template |
The theme for in-browser error reporting was adapted from facebookincubator/create-react-app.
The gopher image in the testdata
directory is from Wikimedia
Commons. It is used
under the Creative Commons Attribution-Share Alike 3.0 Unported
license.
In addition to being totally and obviously inspired by Jekyll and its plugins, Jekyll's solid documentation was indispensible --- especially since I wanted to implement Jekyll as documented, not port its source code. The Jekyll docs were always open in at least one tab during development.
Hugo is the pre-eminent Go static site generator. It isn't Jekyll-compatible (-), but it's highly polished, performant, and productized (+++).
Liquid is a pure Go implementation of Liquid templates. I created it in order to use in this project.
Jekyll, of course.
MIT