From Jekyll to Pressbin — what changes when you drop the build
Jekyll mattered. It convinced developers that a repository is a content
system, and GitHub Pages made that feel official: push Markdown, CI runs
jekyll build, the world sees HTML.
Years later, many of us still blog from repos — but the toolchain around Jekyll
aged. Ruby versions, gem bundles, Actions minutes, and _site/ artifacts in CI
logs are familiar friction.
Pressbin is a thought experiment turned binary: what if the server ingested Markdown directly and skipped the static compile step?
What Jekyll still does better
Credit where it is due:
- Free hosting on
*.github.iowithout maintaining a VPS - Liquid templates and a vast theme ecosystem
_drafts, collections, data files as first-class concepts- Pure static output — nothing to patch on the server because there is no server
If your requirements stop at “beautiful personal site on Pages,” Jekyll (or Hugo, or Eleventy) may already be finished work.
The hidden cost of “just push to main”
Even on Pages, each push triggers:
bundle install
jekyll build
# deploy _site/
Plugin compatibility breaks CI in exciting ways. Ruby 3.x vs 2.x drama visits
every upgrade cycle. Monorepo layouts confuse baseurl settings.
Pressbin’s CI is thinner:
pip install requests pyyaml
python3 .github/scripts/push.py posts/changed-file.md
The heavy lifting — Markdown parsing, HTML rendering, FTS index updates — happens inside the running binary when the API accepts the sync payload.
Repos stay clean
A Jekyll repo often debates:
- Commit
_site/or not? - Store build output in a
gh-pagesbranch? - Use Actions artifacts?
A Pressbin content repo holds Markdown and workflow files only. No generated HTML in Git. The database on your server is the rendered cache.
That separation matches how teams treat application code: source in Git, binaries elsewhere.
Features you might miss — and workarounds
| Jekyll feature | Pressbin approach |
|---|---|
| Liquid in templates | Default theme in binary; override path planned via config |
| Plugins | Pre-sync processing in CI if you must |
github-metadata |
Hard-code site.url in config.yml |
| Giscus comments | Front matter + theme hooks (comments config in example) |
Pressbin is opinionated: one default theme, fast path for essays. Customization goes through template overrides and CSS, not gem plugins.
Who should migrate
Good candidates:
- You moved off Pages because you wanted a custom domain and control
- You are tired of Ruby in CI for twelve posts a year
- You want search without adding Pagefind
- You already split “engine” and “content” mentally
Poor candidates:
- You rely on GitHub’s free static hosting and zero ops
- Your site is mostly Liquid wizardry and Jekyll plugins
A weekend migration plan
- Export posts to
posts/{slug}.mdwith front matter (title,date,tags,summary,slug) - Fork
pressbin_blog_templatefor.github/workflows/sync.yml - Deploy Pressbin on a VPS; save the first-run admin key
- Create a
pb_sync_key; add secrets to the content repo - Push — first sync uploads all posts; fix URLs with explicit
slugfields - Point DNS; keep the old site read-only for a month
Why this is not “anti-Jekyll”
Jekyll proved Git-backed writing works. Pressbin assumes you believe that and asks the next question: does the build step still earn its keep?
For many personal blogs, the answer became no. The build was ceremony between
git push and “it is live.” Pressbin removes the ceremony and keeps the Git
part — which was always the valuable half.